An Overview of the architecture of a collectd plugin exists here: https://collectd.org/wiki/index.php/Plugin_architecture
To start off creating a plugin, create a c file under the src directory in collectd, the c file should have:
- A config function
- An init function
- A read function
- A shutdown function
- A function to register callbacks for all the functions above.
#include "collectd.h" #include "common.h" #define PLUGIN_NAME "my_plugin" static _Bool g_enable_option1; static char g_option2 [DATA_MAX_NAME_LEN]; static int my_config_function(oconfig_item_t *ci) { int ret = 0; INFO (PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__); for (int i = 0; i < ci->children_num; i++) { oconfig_item_t *child = ci->children + i; if (strcasecmp("Option1", child->key) == 0) { ret = cf_util_get_boolean(child, & g_enable_option1); } else if (strcasecmp("Option2 ", child->key) == 0) { ret = cf_util_get_string_buffer(child, g_option2, sizeof(g_option2)); }else { ERROR(PLUGIN_NAME ": Unknown configuration parameter \"%s\".", child->key); ret = (-1); } if (ret != 0) { INFO (PLUGIN_NAME ": %s:%d ret=%d", __FUNCTION__, __LINE__, ret); return ret; } } return (0); } static int my_read_function(__attribute__((unused)) user_data_t *ud) { INFO (PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__); return (0); } static int my_shutdown_function (void) { INFO (PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__); return (0); } static my_init_function(void) { INFO(PLUGIN_NAME ": %s:%d", __FUNCTION__, __LINE__); return (0); } void module_register(void) { plugin_register_init("my_plugin", my_init_function); plugin_register_complex_config("my_plugin", my_config_function); plugin_register_complex_read(NULL, "my_plugin", my_read_function, 0, NULL); plugin_register_shutdown("my_plugin", my_shutdown_function); }
Modify the Makefile.am file to build your plugin
if BUILD_PLUGIN_MY_PLUGIN pkglib_LTLIBRARIES += my_plugin.la my_plugin_la_SOURCES = src/my_plugin.c my_plugin_la_CFLAGS = $(AM_CFLAGS) my_plugin_la_LDFLAGS = $(PLUGIN_LDFLAGS) endif
Modify the configure.ac file to include your plugin (search for plugin_ascent="no" and add it in the correct place alphpbetically), and set it to disabled (so it doesn’t build on all platforms):
plugin_my_plugin="no"
configure (in configure.ac) your plugin so that it’s enabled on linux under:
# Linux if test "x$ac_system" = "xLinux"; then plugin_my_plugin="yes"
Configure (in configure.ac) your plugin to report if it’s enabled or not:
AC_PLUGIN([my_plugin], [$plugin_my_plugin], [plugin desc])
In configure.ac under: “AC_MSG_RESULT([ Modules:])”, enable reporting on the plugin status from the configuration step:
AC_MSG_RESULT([ my_plugin. . . . . . $enable_my_plugin])
Finally it’s time to configure the configuration stanzas for your new plugin. By modifygin collectd.conf.in to include:
#@BUILD_PLUGIN_MY_PLUGIN _TRUE@LoadPlugin my_plugin #<Plugin my_plugin> # Option1 true # Option2 “example” #</Plugin>
Update the plugin configuration description in collectd.conf.pod
=head2 Plugin C<my_plugin> The I< my_plugin > plugin collects TBD. B<Synopsis:> <Plugin my_plugin> Option1 true Option2 “example” </Plugin> B<Options:> =over 2 =item B<Option1> B<false>|B<true> TBD. =item B< Option2> I<some_string> TBD. =back
you should now be able to build your simple collectd plugin:
$ ./build.sh $ ./configure --prefix=$HOME/clct $ make $ make -j install
Extra bit of homework:
- Try to add a double plugin configuration option and read it in with: cf_util_get_double
- Write the configuration parameters to the collectd logfile