Skip to content

Instantly share code, notes, and snippets.

@saiarcot895
Last active April 4, 2017 02:41
Show Gist options
  • Save saiarcot895/de4046a803c428ffb25dac296c7f2022 to your computer and use it in GitHub Desktop.
Save saiarcot895/de4046a803c428ffb25dac296c7f2022 to your computer and use it in GitHub Desktop.
Support for libmongoc 1.0
Index: collectd-5.5.1/configure.ac
===================================================================
--- collectd-5.5.1.orig/configure.ac
+++ collectd-5.5.1/configure.ac
@@ -2618,9 +2618,10 @@ AC_ARG_WITH(libmongoc, [AS_HELP_STRING([
[
if test "x$withval" = "xyes"
then
- with_libmongoc="yes"
+ with_libmongoc="yes"
else if test "x$withval" = "xno"
then
+ echo "in there"
with_libmongoc="no"
else
with_libmongoc="yes"
@@ -2633,6 +2634,15 @@ AC_ARG_WITH(libmongoc, [AS_HELP_STRING([
SAVE_CPPFLAGS="$CPPFLAGS"
SAVE_LDFLAGS="$LDFLAGS"
+if test "x$with_libmongoc" = "xyes"
+then
+ if test "x$PKG_CONFIG" != "x"
+ then
+ LIBMONGOC_CPPFLAGS="$LIBMONGOC_CPPFLAGS `$PKG_CONFIG --cflags libmongoc-1.0`"
+ LIBMONGOC_LDFLAGS="$LIBMONGOC_LDFLAGS `$PKG_CONFIG --libs libmongoc-1.0`"
+ fi
+fi
+
CPPFLAGS="$CPPFLAGS $LIBMONGOC_CPPFLAGS"
LDFLAGS="$LDFLAGS $LIBMONGOC_LDFLAGS"
@@ -2642,9 +2652,9 @@ then
then
AC_MSG_NOTICE([libmongoc CPPFLAGS: $LIBMONGOC_CPPFLAGS])
fi
- AC_CHECK_HEADERS(mongo.h,
+ AC_CHECK_HEADERS(mongoc.h,
[with_libmongoc="yes"],
- [with_libmongoc="no ('mongo.h' not found)"],
+ [with_libmongoc="no ('mongoc.h' not found)"],
[#if HAVE_STDINT_H
# define MONGO_HAVE_STDINT 1
#else
@@ -2658,9 +2668,9 @@ then
then
AC_MSG_NOTICE([libmongoc LDFLAGS: $LIBMONGOC_LDFLAGS])
fi
- AC_CHECK_LIB(mongoc, mongo_run_command,
+ AC_CHECK_LIB(mongoc-1.0, mongoc_init,
[with_libmongoc="yes"],
- [with_libmongoc="no (symbol 'mongo_run_command' not found)"])
+ [with_libmongoc="no (symbol 'mongoc_init' not found)"])
fi
CPPFLAGS="$SAVE_CPPFLAGS"
Index: collectd-5.5.1/src/Makefile.am
===================================================================
--- collectd-5.5.1.orig/src/Makefile.am
+++ collectd-5.5.1/src/Makefile.am
@@ -1209,7 +1209,6 @@ pkglib_LTLIBRARIES += write_mongodb.la
write_mongodb_la_SOURCES = write_mongodb.c
write_mongodb_la_CPPFLAGS = $(AM_CPPFLAGS) $(BUILD_WITH_LIBMONGOC_CPPFLAGS)
write_mongodb_la_LDFLAGS = $(PLUGIN_LDFLAGS) $(BUILD_WITH_LIBMONGOC_LDFLAGS)
-write_mongodb_la_LIBADD = -lmongoc
endif
if BUILD_PLUGIN_WRITE_REDIS
Index: collectd-5.5.1/src/write_mongodb.c
===================================================================
--- collectd-5.5.1.orig/src/write_mongodb.c
+++ collectd-5.5.1/src/write_mongodb.c
@@ -41,12 +41,13 @@
#else
# define MONGO_USE_LONG_LONG_INT 1
#endif
-#include <mongo.h>
+#include <mongoc.h>
+
+// #if (MONGO_MAJOR == 0) && (MONGO_MINOR < 8)
+// # define bson_alloc() bson_create()
+// # define bson_dealloc(b) bson_dispose(b)
+// #endif
-#if (MONGO_MAJOR == 0) && (MONGO_MINOR < 8)
-# define bson_alloc() bson_create()
-# define bson_dealloc(b) bson_dispose(b)
-#endif
struct wm_node_s
{
@@ -62,8 +63,10 @@ struct wm_node_s
char *passwd;
_Bool store_rates;
+ bool connected;
- mongo conn[1];
+ mongoc_client_t *client;
+ mongoc_database_t *database;
pthread_mutex_t lock;
};
typedef struct wm_node_s wm_node_t;
@@ -71,21 +74,15 @@ typedef struct wm_node_s wm_node_t;
/*
* Functions
*/
-static bson *wm_create_bson (const data_set_t *ds, /* {{{ */
+static bson_t *wm_create_bson (const data_set_t *ds, /* {{{ */
const value_list_t *vl,
_Bool store_rates)
{
- bson *ret;
+ bson_t *ret;
+ bson_t subarray;
gauge_t *rates;
int i;
- ret = bson_alloc (); /* matched by bson_dealloc() */
- if (ret == NULL)
- {
- ERROR ("write_mongodb plugin: bson_create failed.");
- return (NULL);
- }
-
if (store_rates)
{
rates = uc_get_rate (ds, vl);
@@ -100,15 +97,21 @@ static bson *wm_create_bson (const data_
rates = NULL;
}
- bson_init (ret); /* matched by bson_destroy() */
- bson_append_date (ret, "time", (bson_date_t) CDTIME_T_TO_MS (vl->time));
- bson_append_string (ret, "host", vl->host);
- bson_append_string (ret, "plugin", vl->plugin);
- bson_append_string (ret, "plugin_instance", vl->plugin_instance);
- bson_append_string (ret, "type", vl->type);
- bson_append_string (ret, "type_instance", vl->type_instance);
+ ret = bson_new(); /* matched by bson_free() */
+ if (ret == NULL)
+ {
+ ERROR ("write_mongodb plugin: bson_new failed.");
+ return (NULL);
+ }
+
+ BSON_APPEND_DATE_TIME(ret, "time", CDTIME_T_TO_MS(vl->time));
+ BSON_APPEND_UTF8(ret, "host", vl->host);
+ BSON_APPEND_UTF8(ret, "plugin", vl->plugin);
+ BSON_APPEND_UTF8(ret, "plugin_instance", vl->plugin_instance);
+ BSON_APPEND_UTF8(ret, "type", vl->type);
+ BSON_APPEND_UTF8(ret, "type_instance", vl->type_instance);
- bson_append_start_array (ret, "values"); /* {{{ */
+ bson_append_array_begin (ret, "values", -1, &subarray); /* {{{ */
for (i = 0; i < ds->ds_num; i++)
{
char key[16];
@@ -116,21 +119,21 @@ static bson *wm_create_bson (const data_
ssnprintf (key, sizeof (key), "%i", i);
if (ds->ds[i].type == DS_TYPE_GAUGE)
- bson_append_double(ret, key, vl->values[i].gauge);
+ BSON_APPEND_DOUBLE(&subarray, key, vl->values[i].gauge);
else if (store_rates)
- bson_append_double(ret, key, (double) rates[i]);
+ BSON_APPEND_DOUBLE(&subarray, key, (double) rates[i]);
else if (ds->ds[i].type == DS_TYPE_COUNTER)
- bson_append_long(ret, key, vl->values[i].counter);
+ BSON_APPEND_INT64(&subarray, key, vl->values[i].counter);
else if (ds->ds[i].type == DS_TYPE_DERIVE)
- bson_append_long(ret, key, vl->values[i].derive);
+ BSON_APPEND_INT64(&subarray, key, vl->values[i].derive);
else if (ds->ds[i].type == DS_TYPE_ABSOLUTE)
- bson_append_long(ret, key, vl->values[i].absolute);
+ BSON_APPEND_INT64(&subarray, key, vl->values[i].absolute);
else
assert (23 == 42);
}
- bson_append_finish_array (ret); /* }}} values */
+ bson_append_array_end(ret, &subarray); /* }}} values */
- bson_append_start_array (ret, "dstypes"); /* {{{ */
+ bson_append_array_begin (ret, "dstypes", -1, &subarray); /* {{{ */
for (i = 0; i < ds->ds_num; i++)
{
char key[16];
@@ -138,118 +141,165 @@ static bson *wm_create_bson (const data_
ssnprintf (key, sizeof (key), "%i", i);
if (store_rates)
- bson_append_string (ret, key, "gauge");
+ BSON_APPEND_UTF8 (&subarray, key, "gauge");
else
- bson_append_string (ret, key, DS_TYPE_TO_STRING (ds->ds[i].type));
+ BSON_APPEND_UTF8 (&subarray, key, DS_TYPE_TO_STRING (ds->ds[i].type) );
}
- bson_append_finish_array (ret); /* }}} dstypes */
+ bson_append_array_end(ret, &subarray); /* }}} dstypes */
- bson_append_start_array (ret, "dsnames"); /* {{{ */
+ bson_append_array_begin (ret, "dsnames", -1, &subarray); /* {{{ */
for (i = 0; i < ds->ds_num; i++)
{
char key[16];
ssnprintf (key, sizeof (key), "%i", i);
- bson_append_string (ret, key, ds->ds[i].name);
+ BSON_APPEND_UTF8 (&subarray, key, ds->ds[i].name);
}
- bson_append_finish_array (ret); /* }}} dsnames */
-
- bson_finish (ret);
+ bson_append_array_end (ret, &subarray); /* }}} dsnames */
sfree (rates);
return (ret);
} /* }}} bson *wm_create_bson */
-static int wm_write (const data_set_t *ds, /* {{{ */
- const value_list_t *vl,
- user_data_t *ud)
-{
- wm_node_t *node = ud->data;
- char collection_name[512];
- bson *bson_record;
- int status;
-
- ssnprintf (collection_name, sizeof (collection_name), "collectd.%s",
- vl->plugin);
+static int wm_initialize(wm_node_t *node) {
+ char* uri;
+ int uri_length;
+ char* format_string;
- bson_record = wm_create_bson (ds, vl, node->store_rates);
- if (bson_record == NULL)
- return (ENOMEM);
-
- pthread_mutex_lock (&node->lock);
-
- if (!mongo_is_connected (node->conn))
+ if (!node->connected)
{
INFO ("write_mongodb plugin: Connecting to [%s]:%i",
(node->host != NULL) ? node->host : "localhost",
- (node->port != 0) ? node->port : MONGO_DEFAULT_PORT);
- status = mongo_connect (node->conn, node->host, node->port);
- if (status != MONGO_OK) {
- ERROR ("write_mongodb plugin: Connecting to [%s]:%i failed.",
- (node->host != NULL) ? node->host : "localhost",
- (node->port != 0) ? node->port : MONGO_DEFAULT_PORT);
- mongo_destroy (node->conn);
- pthread_mutex_unlock (&node->lock);
- return (-1);
- }
+ (node->port != 0) ? node->port : MONGOC_DEFAULT_PORT);
if ((node->db != NULL) && (node->user != NULL) && (node->passwd != NULL))
{
- status = mongo_cmd_authenticate (node->conn,
- node->db, node->user, node->passwd);
- if (status != MONGO_OK)
+ format_string = "mongodb://%s:%s@%s:%d/?authSource=%s";
+ uri_length = strlen(format_string) + strlen(node->user) + strlen(node->passwd)
+ + strlen(node->host) + 5 + strlen(node->db) + 1;
+ if ((uri = malloc(sizeof(char) * uri_length)) == NULL) {
+ ERROR ("write_mongodb plugin: Not enough memory to assemble authentication "
+ "string.");
+ mongoc_client_destroy (node->client);
+ node->client = NULL;
+ node->connected = 0;
+ pthread_mutex_unlock (&node->lock);
+ return (-1);
+ }
+ snprintf(uri, uri_length, format_string, node->user, node->passwd, node->host,
+ node->port, node->db);
+
+ node->client = mongoc_client_new(uri);
+ if (!node->client)
{
ERROR ("write_mongodb plugin: Authenticating to [%s]%i for database "
"\"%s\" as user \"%s\" failed.",
- (node->host != NULL) ? node->host : "localhost",
- (node->port != 0) ? node->port : MONGO_DEFAULT_PORT,
- node->db, node->user);
- mongo_destroy (node->conn);
+ (node->host != NULL) ? node->host : "localhost",
+ (node->port != 0) ? node->port : MONGOC_DEFAULT_PORT,
+ node->db, node->user);
+ node->connected = 0;
+ free(uri);
+ uri = NULL;
pthread_mutex_unlock (&node->lock);
return (-1);
}
- }
+ } else {
+ format_string = "mongodb://%s:%d";
+ uri_length = strlen(format_string) + strlen(node->host) + 5 + 1;
+ if ((uri = malloc(sizeof(char) * uri_length)) == NULL) {
+ ERROR ("write_mongodb plugin: Not enough memory to assemble authentication "
+ "string.");
+ mongoc_client_destroy (node->client);
+ node->client = NULL;
+ node->connected = 0;
+ pthread_mutex_unlock (&node->lock);
+ return (-1);
+ }
+ snprintf(uri, uri_length, format_string, node->host, node->port);
- if (node->timeout > 0) {
- status = mongo_set_op_timeout (node->conn, node->timeout);
- if (status != MONGO_OK) {
- WARNING ("write_mongodb plugin: mongo_set_op_timeout(%i) failed: %s",
- node->timeout, node->conn->errstr);
+ node->client = mongoc_client_new (uri);
+ if (!node->client) {
+ ERROR ("write_mongodb plugin: Connecting to [%s]:%i failed.",
+ (node->host != NULL) ? node->host : "localhost",
+ (node->port != 0) ? node->port : MONGOC_DEFAULT_PORT);
+ node->connected = 0;
+ free(uri);
+ uri = NULL;
+ pthread_mutex_unlock (&node->lock);
+ return (-1);
}
}
+ free(uri);
+ /*
+ if (node->timeout > 0) {
+ status = mongo_set_op_timeout (node->client, node->timeout);
+ if (status) {
+ WARNING ("write_mongodb plugin: mongo_set_op_timeout(%i) failed: %s",
+ node->timeout, node->client->errstr);
+ }
+ }
+ */
+
+ node->database = mongoc_client_get_database(node->client, "collectd");
+ if (!node->database)
+ {
+ ERROR ( "write_mongodb plugin: error creating/getting database");
+ mongoc_client_destroy (node->client);
+ node->client = NULL;
+ node->connected = 0;
+ pthread_mutex_unlock (&node->lock);
+ return -1;
+ }
}
+ node->connected = 1;
+ return 0;
+}
- /* Assert if the connection has been established */
- assert (mongo_is_connected (node->conn));
+static int wm_write (const data_set_t *ds, /* {{{ */
+ const value_list_t *vl,
+ user_data_t *ud)
+{
+ wm_node_t *node = ud->data;
+ mongoc_collection_t *collection = NULL;
+ bson_t *bson_record = NULL;
+ bson_error_t error;
+ int status;
- #if MONGO_MINOR >= 6
- /* There was an API change in 0.6.0 as linked below */
- /* https://github.com/mongodb/mongo-c-driver/blob/master/HISTORY.md */
- status = mongo_insert (node->conn, collection_name, bson_record, NULL);
- #else
- status = mongo_insert (node->conn, collection_name, bson_record);
- #endif
-
- if (status != MONGO_OK)
- {
- ERROR ( "write_mongodb plugin: error inserting record: %d", node->conn->err);
- if (node->conn->err != MONGO_BSON_INVALID)
- ERROR ("write_mongodb plugin: %s", node->conn->errstr);
- else
- ERROR ("write_mongodb plugin: Invalid BSON structure, error = %#x",
- (unsigned int) bson_record->err);
+ bson_record = wm_create_bson (ds, vl, node->store_rates);
+ if (bson_record == NULL)
+ return (ENOMEM);
- /* Disconnect except on data errors. */
- if ((node->conn->err != MONGO_BSON_INVALID)
- && (node->conn->err != MONGO_BSON_NOT_FINISHED))
- mongo_destroy (node->conn);
+ pthread_mutex_lock (&node->lock);
+ wm_initialize(node);
+
+ collection = mongoc_client_get_collection (node->client, "collectd", vl->plugin);
+ if (!collection)
+ {
+ ERROR ( "write_mongodb plugin: error creating/getting collection");
+ mongoc_database_destroy(node->database);
+ mongoc_client_destroy (node->client);
+ node->database = NULL;
+ node->client = NULL;
+ node->connected = 0;
+ }
+
+ status = mongoc_collection_insert (collection, MONGOC_INSERT_NONE, bson_record, NULL, &error);
+
+ if (!status)
+ {
+ ERROR ( "write_mongodb plugin: error inserting record: %s", error.message);
+ mongoc_database_destroy(node->database);
+ mongoc_client_destroy (node->client);
+ node->database = NULL;
+ node->client = NULL;
+ node->connected = 0;
}
pthread_mutex_unlock (&node->lock);
/* free our resource as not to leak memory */
- bson_destroy (bson_record); /* matches bson_init() */
- bson_dealloc (bson_record); /* matches bson_alloc() */
+ mongoc_collection_destroy(collection);
+ bson_free (bson_record); /* matches bson_new() */
return (0);
} /* }}} int wm_write */
@@ -261,8 +311,11 @@ static void wm_config_free (void *ptr) /
if (node == NULL)
return;
- if (mongo_is_connected (node->conn))
- mongo_destroy (node->conn);
+ mongoc_database_destroy(node->database);
+ mongoc_client_destroy (node->client);
+ node->database = NULL;
+ node->client = NULL;
+ node->connected = 0;
sfree (node->host);
sfree (node);
@@ -278,7 +331,7 @@ static int wm_config_node (oconfig_item_
if (node == NULL)
return (ENOMEM);
memset (node, 0, sizeof (*node));
- mongo_init (node->conn);
+ mongoc_init ();
node->host = NULL;
node->store_rates = 1;
pthread_mutex_init (&node->lock, /* attr = */ NULL);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment