aboutsummaryrefslogtreecommitdiff
path: root/plugin_export.c
diff options
context:
space:
mode:
authorLucas Castro <lucas@gnuabordo.com.br>2024-01-10 22:33:44 -0300
committerLucas Castro <lucas@gnuabordo.com.br>2024-01-10 22:33:44 -0300
commita4270020addc324fb60d2b1b446b41bc31e3baf8 (patch)
tree8708f08c66a63f08c0cd88ab1a46faadcd3f4706 /plugin_export.c
Import Upstream version 1.0.4upstream/1.0.4
Diffstat (limited to 'plugin_export.c')
-rw-r--r--plugin_export.c259
1 files changed, 259 insertions, 0 deletions
diff --git a/plugin_export.c b/plugin_export.c
new file mode 100644
index 0000000..b2a9f82
--- /dev/null
+++ b/plugin_export.c
@@ -0,0 +1,259 @@
+/*
+
+(C) 2013 Mika Ilmaranta <ilmis@nullnet.fi>
+
+License: GPLv2
+
+*/
+
+#ifndef NO_PLUGIN_EXPORT
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+#include <sys/time.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "plugin_export.h"
+#include "timecalc.h"
+#include "defs.h"
+#ifndef NO_PLUGIN_EXPORT_STATUS
+#include "globals.h"
+#endif
+
+#ifndef NO_PLUGIN_EXPORT_MUNIN
+static char *munin_data_src_name(const char *src);
+static void plugin_export_munin(CONFIG *first);
+#endif
+
+static struct timeval export_time = {0, 0};
+
+void plugin_export_init(void)
+{
+ gettimeofday(&export_time, NULL);
+}
+
+void plugin_export(CONFIG *first)
+{
+ struct timeval current_time = {0, 0};
+
+ gettimeofday(&current_time, NULL);
+
+ /* export every 300s */
+ if(timeval_diff_cmp(&current_time, &export_time, TIMEVAL_DIFF_CMP_GT, 300, 0) == FALSE) return;
+
+ /* next export after 300 sec */
+ timeval_add(&export_time, 300, 0);
+
+#ifndef NO_PLUGIN_EXPORT_MUNIN
+ plugin_export_munin(first);
+#endif
+}
+
+#ifndef NO_PLUGIN_EXPORT_MUNIN
+static void plugin_export_munin(CONFIG *first)
+{
+ FILE *fp;
+ char buf[BUFSIZ];
+ CONFIG *cur;
+ TARGET *t;
+
+ /* export avg_rtt graph config */
+ snprintf(buf, BUFSIZ - 1, "%s/%s", PLUGIN_EXPORT_DIR, "config.rtt");
+
+ if((fp = fopen(buf, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: %s: failed to open file %s for write", __FILE__, __FUNCTION__, buf);
+ return;
+ }
+
+ fprintf(fp, "graph_title LSM Average Ping Latency\n");
+ fprintf(fp, "graph_vlabel ms\n");
+ fprintf(fp, "graph_info This graph shows LSM status\n");
+ fprintf(fp, "graph_category network\n");
+ fprintf(fp, "graph_args --base 1000 -l 0\n");
+
+ for(cur = first; cur; cur = cur->next) {
+ char *name = munin_data_src_name(cur->name);
+
+ fprintf(fp, "%s_rtt.label %s rtt\n", name, cur->name);
+ fprintf(fp, "%s_rtt.type GAUGE\n", name);
+ }
+
+ fclose(fp);
+
+ /* export avg_rtt values */
+ snprintf(buf, BUFSIZ - 1, "%s/%s", PLUGIN_EXPORT_DIR, "status.rtt");
+
+ if((fp = fopen(buf, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: %s: failed to open file %s for write", __FILE__, __FUNCTION__, buf);
+ return;
+ }
+
+ for(cur = first; cur; cur = cur->next) {
+ char *name = munin_data_src_name(cur->name);
+ t = cur->data;
+
+ fprintf(fp, "%s_rtt.value %.2f\n", name, (t->status == DOWN || t->status == LONG_DOWN) ? 0.0 : t->avg_rtt / 1000.0);
+ }
+
+ fclose(fp);
+
+ /* export other counts config */
+ snprintf(buf, BUFSIZ - 1, "%s/%s", PLUGIN_EXPORT_DIR, "config.counts");
+
+ if((fp = fopen(buf, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: %s: failed to open file %s for write", __FILE__, __FUNCTION__, buf);
+ return;
+ }
+
+ fprintf(fp, "graph_title LSM packet counts\n");
+ fprintf(fp, "graph_vlabel percent\n");
+ fprintf(fp, "graph_info This graph shows LSM status\n");
+ fprintf(fp, "graph_category network\n");
+ fprintf(fp, "graph_args --base 1000 -l 0\n");
+
+ for(cur = first; cur; cur = cur->next) {
+ char *name = munin_data_src_name(cur->name);
+
+ fprintf(fp, "%s_timeout.label %s Timed out\n", name, cur->name);
+ fprintf(fp, "%s_timeout.type GAUGE\n", name);
+
+ fprintf(fp, "%s_replied.label %s Replied\n", name, cur->name);
+ fprintf(fp, "%s_replied.type GAUGE\n", name);
+
+ fprintf(fp, "%s_waiting.label %s Waiting\n", name, cur->name);
+ fprintf(fp, "%s_waiting.type GAUGE\n", name);
+
+ fprintf(fp, "%s_latereply.label %s Late replied\n", name, cur->name);
+ fprintf(fp, "%s_latereply.type GAUGE\n", name);
+
+ fprintf(fp, "%s_cwait.label %s Consecutive waiting\n", name, cur->name);
+ fprintf(fp, "%s_cwait.type GAUGE\n", name);
+
+ fprintf(fp, "%s_cmiss.label %s Consecutive missing\n", name, cur->name);
+ fprintf(fp, "%s_cmiss.type GAUGE\n", name);
+
+ fprintf(fp, "%s_crcvd.label %s Consecutive received\n", name, cur->name);
+ fprintf(fp, "%s_crcvd.type GAUGE\n", name);
+ }
+
+ fclose(fp);
+
+ /* export other counts values */
+ snprintf(buf, BUFSIZ - 1, "%s/%s", PLUGIN_EXPORT_DIR, "status.counts");
+
+ if((fp = fopen(buf, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: %s: failed to open file %s for write", __FILE__, __FUNCTION__, buf);
+ return;
+ }
+
+ for(cur = first; cur; cur = cur->next) {
+ char *name = munin_data_src_name(cur->name);
+ t = cur->data;
+
+ fprintf(fp, "%s_timeout.value %d\n", name, t->timeout);
+
+ fprintf(fp, "%s_replied.value %d\n", name, t->replied);
+
+ fprintf(fp, "%s_waiting.value %d\n", name, t->waiting);
+
+ fprintf(fp, "%s_latereply.value %d\n", name, t->reply_late);
+
+ fprintf(fp, "%s_cwait.value %d\n", name, t->consecutive_waiting);
+
+ fprintf(fp, "%s_cmiss.value %d\n", name, t->consecutive_missing);
+
+ fprintf(fp, "%s_crcvd.value %d\n", name, t->consecutive_rcvd);
+ }
+
+ fclose(fp);
+
+ /* export connection status config */
+ snprintf(buf, BUFSIZ - 1, "%s/%s", PLUGIN_EXPORT_DIR, "config.status");
+
+ if((fp = fopen(buf, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: %s: failed to open file %s for write", __FILE__, __FUNCTION__, buf);
+ return;
+ }
+
+ fprintf(fp, "graph_title LSM connection statuses\n");
+ fprintf(fp, "graph_vlabel Status\n");
+ fprintf(fp, "graph_info This graph shows LSM connection statuses\n");
+ fprintf(fp, "graph_category network\n");
+ fprintf(fp, "graph_info Status: 0 = DOWN, 1 = UP, 2 = UNKNOWN, 3 = LONG_DOWN\n");
+ fprintf(fp, "graph_args --base 1000 --lower-limit 0 --upper-limit 3\n");
+
+ for(cur = first; cur; cur = cur->next) {
+ char *name = munin_data_src_name(cur->name);
+
+ fprintf(fp, "%s_status.label %s Status\n", name, cur->name);
+ }
+
+ fclose(fp);
+
+ /* export connection status values */
+ snprintf(buf, BUFSIZ - 1, "%s/%s", PLUGIN_EXPORT_DIR, "status.status");
+
+ if((fp = fopen(buf, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: %s: failed to open file %s for write", __FILE__, __FUNCTION__, buf);
+ return;
+ }
+
+ for(cur = first; cur; cur = cur->next) {
+ char *name = munin_data_src_name(cur->name);
+ t = cur->data;
+
+ fprintf(fp, "%s_status.value %d\n", name, t->status);
+ }
+
+ fclose(fp);
+}
+#endif
+
+#ifndef NO_PLUGIN_EXPORT_STATUS
+void plugin_export_status(CONFIG *first)
+{
+ FILE *fp;
+ char buf[BUFSIZ];
+ CONFIG *cur;
+ TARGET *t;
+
+ snprintf(buf, BUFSIZ - 1, "%s/%s", PLUGIN_EXPORT_DIR, "status_export");
+
+ if((fp = fopen(buf, "w")) == NULL) {
+ syslog(LOG_ERR, "%s: %s: failed to open file %s for write", __FILE__, __FUNCTION__, buf);
+ return;
+ }
+
+ for(cur = first; cur; cur = cur->next) {
+ t = cur->data;
+
+ fprintf(fp, "%s %s\n", cur->name, get_status_str(t->status));
+ }
+
+ fclose(fp);
+}
+#endif
+
+#ifndef NO_PLUGIN_EXPORT_MUNIN
+static char *munin_data_src_name(const char *src)
+{
+ static char buf[BUFSIZ];
+ char *p;
+
+ strcpy(buf, "_");
+
+ strncat(buf, src, BUFSIZ - 1);
+
+ for(p = buf; *p; p++) {
+ if(*p == '-') *p = '_';
+ if(*p == ' ') *p = '_';
+ }
+ return(buf);
+}
+#endif
+
+#endif
+
+/* EOF */