From: Florian Forster Date: Wed, 3 Nov 2010 14:19:26 +0000 (+0100) Subject: write_mongodb plugin: Rename the "write_mongo" plugin. X-Git-Tag: collectd-5.1.0~42^2~11 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;ds=sidebyside;h=e853b1cad4b79bcab0a2ba000ec78d97fee1b1f3;p=collectd.git write_mongodb plugin: Rename the "write_mongo" plugin. --- diff --git a/configure.in b/configure.in index 387c2201..bbdf2732 100644 --- a/configure.in +++ b/configure.in @@ -4688,7 +4688,7 @@ AC_PLUGIN([vserver], [$plugin_vserver], [Linux VServer statistics]) AC_PLUGIN([wireless], [$plugin_wireless], [Wireless statistics]) AC_PLUGIN([write_http], [$with_libcurl], [HTTP output plugin]) AC_PLUGIN([write_redis], [$with_libcredis], [Redis output plugin]) -AC_PLUGIN([write_mongo], [$with_libmongoc], [MongoDB output plugin]) +AC_PLUGIN([write_mongodb], [$with_libmongoc], [MongoDB output plugin]) AC_PLUGIN([xmms], [$with_libxmms], [XMMS statistics]) AC_PLUGIN([zfs_arc], [$plugin_zfs_arc], [ZFS ARC statistics]) @@ -5010,7 +5010,7 @@ Configuration: wireless . . . . . . $enable_wireless write_http . . . . . $enable_write_http write_redis . . . . . $enable_write_redis - write_mongo . . . . . $enable_write_mongo + write_mongodb . . . . $enable_write_mongodb xmms . . . . . . . . $enable_xmms zfs_arc . . . . . . . $enable_zfs_arc diff --git a/src/Makefile.am b/src/Makefile.am index 757efa22..40ab5382 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1243,13 +1243,13 @@ endif collectd_DEPENDENCIES += write_http.la endif -if BUILD_PLUGIN_WRITE_MONGO -pkglib_LTLIBRARIES += write_mongo.la -write_mongo_la_SOURCES = write_mongo.c -write_mongo_la_LDFLAGS = -module -avoid-version -write_mongo_la_LIBADD = -lmongoc -collectd_LDADD += "-dlopen" write_mongo.la -collectd_DEPENDENCIES += write_mongo.la +if BUILD_PLUGIN_WRITE_MONGODB +pkglib_LTLIBRARIES += write_mongodb.la +write_mongodb_la_SOURCES = write_mongodb.c +write_mongodb_la_LDFLAGS = -module -avoid-version +write_mongodb_la_LIBADD = -lmongoc +collectd_LDADD += "-dlopen" write_mongodb.la +collectd_DEPENDENCIES += write_mongodb.la endif if BUILD_PLUGIN_WRITE_REDIS diff --git a/src/write_mongo.c b/src/write_mongo.c deleted file mode 100644 index b20d0c9b..00000000 --- a/src/write_mongo.c +++ /dev/null @@ -1,239 +0,0 @@ -/** - * collectd - src/write_mongo.c - * Copyright (C) 2010 Florian Forster, Akkarit Sangpetch - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Authors: - * Florian Forster - * Akkarit Sangpetch - **/ - -#include "collectd.h" -#include "plugin.h" -#include "common.h" -#include "configfile.h" - -#include - -#if HAVE_STDINT_H -# define MONGO_HAVE_STDINT 1 -#else -# define MONGO_USE_LONG_LONG_INT 1 -#endif -#include - -struct wm_node_s -{ - char name[DATA_MAX_NAME_LEN]; - - char *host; - int port; - int timeout; - - int connected; - - mongo_connection conn[1]; - mongo_connection_options opts[1]; - pthread_mutex_t lock; -}; -typedef struct wm_node_s wm_node_t; - -/* - * Functions - */ -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]; - int status; - int i; - bson record; - bson_buffer record_buf; - - ssnprintf(collection_name, sizeof (collection_name), "collectd.%s", vl->plugin); - - bson_buffer_init(&record_buf); - bson_append_time_t(&record_buf,"ts",vl->time); - bson_append_string(&record_buf,"h",vl->host); - bson_append_string(&record_buf,"i",vl->plugin_instance); - bson_append_string(&record_buf,"t",vl->type); - bson_append_string(&record_buf,"ti",vl->type_instance); - - for (i = 0; i < ds->ds_num; i++) - { - if (ds->ds[i].type == DS_TYPE_COUNTER) - bson_append_long(&record_buf, ds->ds[i].name, vl->values[i].counter); - else if (ds->ds[i].type == DS_TYPE_GAUGE) - bson_append_double(&record_buf, ds->ds[i].name, vl->values[i].gauge); - else if (ds->ds[i].type == DS_TYPE_DERIVE) - bson_append_long(&record_buf, ds->ds[i].name, vl->values[i].derive); - else if (ds->ds[i].type == DS_TYPE_ABSOLUTE) - bson_append_long(&record_buf, ds->ds[i].name, vl->values[i].absolute); - else - assert (23 == 42); - } - - bson_from_buffer(&record,&record_buf); - - pthread_mutex_lock (&node->lock); - - if (node->connected == 0) - { - sstrncpy(node->opts->host, node->host, - sizeof (node->opts->host)); - node->opts->port = node->port; - - status = mongo_connect(node->conn,node->opts); - if (status!=mongo_conn_success) { - ERROR ("write_mongo plugin: Connecting to host \"%s\" (port %i) failed.", - (node->host != NULL) ? node->host : "localhost", - (node->port != 0) ? node->port : 27017); - mongo_destroy(node->conn); - pthread_mutex_unlock (&node->lock); - return (-1); - } else { - node->connected = 1; - } - } - - /* Assert if the connection has been established */ - assert (node->connected == 1); - - mongo_insert(node->conn,collection_name,&record); - - pthread_mutex_unlock (&node->lock); - - bson_buffer_destroy(&record_buf); - - return (0); -} /* }}} int wm_write */ - -static void wm_config_free (void *ptr) /* {{{ */ -{ - wm_node_t *node = ptr; - - if (node == NULL) - return; - - if (node->connected != 0) - { - mongo_destroy(node->conn); - node->connected = 0; - } - - sfree (node->host); - sfree (node); -} /* }}} void wm_config_free */ - -static int wm_config_node (oconfig_item_t *ci) /* {{{ */ -{ - wm_node_t *node; - int status; - int i; - - node = malloc (sizeof (*node)); - if (node == NULL) - return (ENOMEM); - memset (node, 0, sizeof (*node)); - node->host = NULL; - node->port = 0; - node->timeout = 1000; - node->connected = 0; - pthread_mutex_init (&node->lock, /* attr = */ NULL); - - status = cf_util_get_string_buffer (ci, node->name, sizeof (node->name)); - - if (status != 0) - { - sfree (node); - return (status); - } - - for (i = 0; i < ci->children_num; i++) - { - oconfig_item_t *child = ci->children + i; - - if (strcasecmp ("Host", child->key) == 0) - status = cf_util_get_string (child, &node->host); - else if (strcasecmp ("Port", child->key) == 0) - { - status = cf_util_get_port_number (child); - if (status > 0) - { - node->port = status; - status = 0; - } - } - else if (strcasecmp ("Timeout", child->key) == 0) - status = cf_util_get_int (child, &node->timeout); - else - WARNING ("write_mongo plugin: Ignoring unknown config option \"%s\".", - child->key); - - if (status != 0) - break; - } /* for (i = 0; i < ci->children_num; i++) */ - - if (status == 0) - { - char cb_name[DATA_MAX_NAME_LEN]; - user_data_t ud; - - ssnprintf (cb_name, sizeof (cb_name), "write_mongo/%s", node->name); - - ud.data = node; - ud.free_func = wm_config_free; - - status = plugin_register_write (cb_name, wm_write, &ud); - INFO ("write_mongo plugin: registered write plugin %s %d",cb_name,status); - } - - if (status != 0) - wm_config_free (node); - - return (status); -} /* }}} int wm_config_node */ - -static int wm_config (oconfig_item_t *ci) /* {{{ */ -{ - int i; - - for (i = 0; i < ci->children_num; i++) - { - oconfig_item_t *child = ci->children + i; - - if (strcasecmp ("Node", child->key) == 0) - wm_config_node (child); - else - WARNING ("write_mongo plugin: Ignoring unknown " - "configuration option \"%s\" at top level.", child->key); - } - - return (0); -} /* }}} int wm_config */ - -void module_register (void) -{ - plugin_register_complex_config ("write_mongo", wm_config); -} - -/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */ diff --git a/src/write_mongodb.c b/src/write_mongodb.c new file mode 100644 index 00000000..2b809215 --- /dev/null +++ b/src/write_mongodb.c @@ -0,0 +1,239 @@ +/** + * collectd - src/write_mongodb.c + * Copyright (C) 2010 Florian Forster, Akkarit Sangpetch + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Authors: + * Florian Forster + * Akkarit Sangpetch + **/ + +#include "collectd.h" +#include "plugin.h" +#include "common.h" +#include "configfile.h" + +#include + +#if HAVE_STDINT_H +# define MONGO_HAVE_STDINT 1 +#else +# define MONGO_USE_LONG_LONG_INT 1 +#endif +#include + +struct wm_node_s +{ + char name[DATA_MAX_NAME_LEN]; + + char *host; + int port; + int timeout; + + int connected; + + mongo_connection conn[1]; + mongo_connection_options opts[1]; + pthread_mutex_t lock; +}; +typedef struct wm_node_s wm_node_t; + +/* + * Functions + */ +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]; + int status; + int i; + bson record; + bson_buffer record_buf; + + ssnprintf(collection_name, sizeof (collection_name), "collectd.%s", vl->plugin); + + bson_buffer_init(&record_buf); + bson_append_time_t(&record_buf,"ts",vl->time); + bson_append_string(&record_buf,"h",vl->host); + bson_append_string(&record_buf,"i",vl->plugin_instance); + bson_append_string(&record_buf,"t",vl->type); + bson_append_string(&record_buf,"ti",vl->type_instance); + + for (i = 0; i < ds->ds_num; i++) + { + if (ds->ds[i].type == DS_TYPE_COUNTER) + bson_append_long(&record_buf, ds->ds[i].name, vl->values[i].counter); + else if (ds->ds[i].type == DS_TYPE_GAUGE) + bson_append_double(&record_buf, ds->ds[i].name, vl->values[i].gauge); + else if (ds->ds[i].type == DS_TYPE_DERIVE) + bson_append_long(&record_buf, ds->ds[i].name, vl->values[i].derive); + else if (ds->ds[i].type == DS_TYPE_ABSOLUTE) + bson_append_long(&record_buf, ds->ds[i].name, vl->values[i].absolute); + else + assert (23 == 42); + } + + bson_from_buffer(&record,&record_buf); + + pthread_mutex_lock (&node->lock); + + if (node->connected == 0) + { + sstrncpy(node->opts->host, node->host, + sizeof (node->opts->host)); + node->opts->port = node->port; + + status = mongo_connect(node->conn,node->opts); + if (status!=mongo_conn_success) { + ERROR ("write_mongodb plugin: Connecting to host \"%s\" (port %i) failed.", + (node->host != NULL) ? node->host : "localhost", + (node->port != 0) ? node->port : 27017); + mongo_destroy(node->conn); + pthread_mutex_unlock (&node->lock); + return (-1); + } else { + node->connected = 1; + } + } + + /* Assert if the connection has been established */ + assert (node->connected == 1); + + mongo_insert(node->conn,collection_name,&record); + + pthread_mutex_unlock (&node->lock); + + bson_buffer_destroy(&record_buf); + + return (0); +} /* }}} int wm_write */ + +static void wm_config_free (void *ptr) /* {{{ */ +{ + wm_node_t *node = ptr; + + if (node == NULL) + return; + + if (node->connected != 0) + { + mongo_destroy(node->conn); + node->connected = 0; + } + + sfree (node->host); + sfree (node); +} /* }}} void wm_config_free */ + +static int wm_config_node (oconfig_item_t *ci) /* {{{ */ +{ + wm_node_t *node; + int status; + int i; + + node = malloc (sizeof (*node)); + if (node == NULL) + return (ENOMEM); + memset (node, 0, sizeof (*node)); + node->host = NULL; + node->port = 0; + node->timeout = 1000; + node->connected = 0; + pthread_mutex_init (&node->lock, /* attr = */ NULL); + + status = cf_util_get_string_buffer (ci, node->name, sizeof (node->name)); + + if (status != 0) + { + sfree (node); + return (status); + } + + for (i = 0; i < ci->children_num; i++) + { + oconfig_item_t *child = ci->children + i; + + if (strcasecmp ("Host", child->key) == 0) + status = cf_util_get_string (child, &node->host); + else if (strcasecmp ("Port", child->key) == 0) + { + status = cf_util_get_port_number (child); + if (status > 0) + { + node->port = status; + status = 0; + } + } + else if (strcasecmp ("Timeout", child->key) == 0) + status = cf_util_get_int (child, &node->timeout); + else + WARNING ("write_mongodb plugin: Ignoring unknown config option \"%s\".", + child->key); + + if (status != 0) + break; + } /* for (i = 0; i < ci->children_num; i++) */ + + if (status == 0) + { + char cb_name[DATA_MAX_NAME_LEN]; + user_data_t ud; + + ssnprintf (cb_name, sizeof (cb_name), "write_mongodb/%s", node->name); + + ud.data = node; + ud.free_func = wm_config_free; + + status = plugin_register_write (cb_name, wm_write, &ud); + INFO ("write_mongodb plugin: registered write plugin %s %d",cb_name,status); + } + + if (status != 0) + wm_config_free (node); + + return (status); +} /* }}} int wm_config_node */ + +static int wm_config (oconfig_item_t *ci) /* {{{ */ +{ + int i; + + for (i = 0; i < ci->children_num; i++) + { + oconfig_item_t *child = ci->children + i; + + if (strcasecmp ("Node", child->key) == 0) + wm_config_node (child); + else + WARNING ("write_mongodb plugin: Ignoring unknown " + "configuration option \"%s\" at top level.", child->key); + } + + return (0); +} /* }}} int wm_config */ + +void module_register (void) +{ + plugin_register_complex_config ("write_mongodb", wm_config); +} + +/* vim: set sw=2 sts=2 tw=78 et fdm=marker : */