author | Florian Forster <octo@collectd.org> | |
Fri, 7 Oct 2016 06:51:29 +0000 (08:51 +0200) | ||
committer | Florian Forster <octo@collectd.org> | |
Fri, 7 Oct 2016 06:51:29 +0000 (08:51 +0200) |
index e1b89f6c110c2953d37dae987690310a804c10a3..ab3ec2fd383df59a5f4c6624ee1d79a554c09fc5 100644 (file)
/* it is strongly recommended to use a type defined in the types.db file
* instead of a custom type */
- sstrncpy (vl.type, "myplugin", sizeof (vl.plugin));
+ sstrncpy (vl.type, "myplugin", sizeof (vl.type));
/* optionally set vl.plugin_instance and vl.type_instance to reasonable
* values (default: "") */
/* A return value != 0 indicates an error and the plugin will be skipped
* for an increasing amount of time. */
- return 0;
+ return 0;
} /* static int my_read (void) */
/*
diff --git a/src/daemon/common.c b/src/daemon/common.c
index 05b119901ce2bf9a606a4e07c1ed45b7c2d78ce7..7898ffba502b6ca144c9454734b46818e3818b67 100644 (file)
--- a/src/daemon/common.c
+++ b/src/daemon/common.c
}
if (value == endptr) {
- ERROR ("parse_value: Failed to parse string as %s: %s.",
+ ERROR ("parse_value: Failed to parse string as %s: \"%s\".",
DS_TYPE_TO_STRING (ds_type), value);
sfree (value);
return -1;
index f905eb2a09a3f0bfcd2a8be817a05d57b9728e7b..0aac41e296cb5c87681e3ce41372afbaeea9617d 100644 (file)
</Query>
<Query query_plans>
- Statement "SELECT sum(seq_scan) AS seq, \
- sum(seq_tup_read) AS seq_tup_read, \
- sum(idx_scan) AS idx, \
- sum(idx_tup_fetch) AS idx_tup_fetch \
+ Statement "SELECT coalesce(sum(seq_scan), 0) AS seq, \
+ coalesce(sum(seq_tup_read), 0) AS seq_tup_read, \
+ coalesce(sum(idx_scan), 0) AS idx, \
+ coalesce(sum(idx_tup_fetch), 0) AS idx_tup_fetch \
FROM pg_stat_user_tables;"
<Result>
<Query query_plans_by_table>
Statement "SELECT schemaname, relname, \
- seq_scan AS seq, \
- seq_tup_read AS seq_tup_read, \
- idx_scan AS idx, \
- idx_tup_fetch AS idx_tup_fetch \
+ coalesce(seq_scan, 0) AS seq, \
+ coalesce(seq_tup_read, 0) AS seq_tup_read, \
+ coalesce(idx_scan, 0) AS idx, \
+ coalesce(idx_tup_fetch, 0) AS idx_tup_fetch \
FROM pg_stat_user_tables;"
<Result>
diff --git a/src/rrdcached.c b/src/rrdcached.c
index 0425419445d738a6e80992c77c51b229112ca173..0b9040536ecc165f0b9a85ea7bacd1d5866358d6 100644 (file)
--- a/src/rrdcached.c
+++ b/src/rrdcached.c
return (0);
} /* int rc_config */
+static int try_reconnect (void)
+{
+ int status;
+
+ rrdc_disconnect ();
+
+ rrd_clear_error ();
+ status = rrdc_connect (daemon_address);
+ if (status != 0)
+ {
+ ERROR ("rrdcached plugin: Failed to reconnect to RRDCacheD "
+ "at %s: %s (status=%d)", daemon_address, rrd_get_error (), status);
+ return (-1);
+ }
+
+ INFO ("rrdcached plugin: Successfully reconnected to RRDCacheD "
+ "at %s", daemon_address);
+ return (0);
+} /* int try_reconnect */
+
static int rc_read (void)
{
int status;
rrdc_stats_t *head;
+ _Bool retried = 0;
value_t values[1];
value_list_t vl = VALUE_LIST_INIT;
sstrncpy (vl.host, daemon_address, sizeof (vl.host));
sstrncpy (vl.plugin, "rrdcached", sizeof (vl.plugin));
+ rrd_clear_error ();
status = rrdc_connect (daemon_address);
if (status != 0)
{
- ERROR ("rrdcached plugin: rrdc_connect (%s) failed with status %i.",
- daemon_address, status);
+ ERROR ("rrdcached plugin: Failed to connect to RRDCacheD "
+ "at %s: %s (status=%d)", daemon_address, rrd_get_error (), status);
return (-1);
}
- head = NULL;
- status = rrdc_stats_get (&head);
- if (status != 0)
+ while (42)
{
- ERROR ("rrdcached plugin: rrdc_stats_get failed with status %i.", status);
+ /* The RRD client lib does not provide any means for checking a
+ * connection, hence we'll have to retry upon failed operations. */
+ head = NULL;
+ rrd_clear_error ();
+ status = rrdc_stats_get (&head);
+ if (status == 0)
+ break;
+
+ if (!retried)
+ {
+ retried = 1;
+ if (try_reconnect () == 0)
+ continue;
+ /* else: report the error and fail */
+ }
+
+ ERROR ("rrdcached plugin: rrdc_stats_get failed: %s (status=%i).",
+ rrd_get_error (), status);
return (-1);
}
char values[512];
char *values_array[2];
int status;
+ _Bool retried = 0;
if (daemon_address == NULL)
{
}
}
+ rrd_clear_error ();
status = rrdc_connect (daemon_address);
if (status != 0)
{
- ERROR ("rrdcached plugin: rrdc_connect (%s) failed with status %i.",
- daemon_address, status);
+ ERROR ("rrdcached plugin: Failed to connect to RRDCacheD "
+ "at %s: %s (status=%d)", daemon_address, rrd_get_error (), status);
return (-1);
}
- status = rrdc_update (filename, /* values_num = */ 1, (void *) values_array);
- if (status != 0)
+ while (42)
{
- ERROR ("rrdcached plugin: rrdc_update (%s, [%s], 1) failed with "
- "status %i.",
- filename, values_array[0], status);
+ /* The RRD client lib does not provide any means for checking a
+ * connection, hence we'll have to retry upon failed operations. */
+ rrd_clear_error ();
+ status = rrdc_update (filename, /* values_num = */ 1, (void *) values_array);
+ if (status == 0)
+ break;
+
+ if (!retried)
+ {
+ retried = 1;
+ if (try_reconnect () == 0)
+ continue;
+ /* else: report the error and fail */
+ }
+
+ ERROR ("rrdcached plugin: rrdc_update (%s, [%s], 1) failed: %s (status=%i)",
+ filename, values_array[0], rrd_get_error (), status);
return (-1);
}
{
char filename[PATH_MAX + 1];
int status;
+ _Bool retried = 0;
if (identifier == NULL)
return (EINVAL);
else
ssnprintf (filename, sizeof (filename), "%s.rrd", identifier);
+ rrd_clear_error ();
status = rrdc_connect (daemon_address);
if (status != 0)
{
- ERROR ("rrdcached plugin: rrdc_connect (%s) failed with status %i.",
- daemon_address, status);
+ ERROR ("rrdcached plugin: Failed to connect to RRDCacheD "
+ "at %s: %s (status=%d)", daemon_address, rrd_get_error (), status);
return (-1);
}
- status = rrdc_flush (filename);
- if (status != 0)
+ while (42)
{
- ERROR ("rrdcached plugin: rrdc_flush (%s) failed with status %i.",
- filename, status);
+ /* The RRD client lib does not provide any means for checking a
+ * connection, hence we'll have to retry upon failed operations. */
+ rrd_clear_error ();
+ status = rrdc_flush (filename);
+ if (status == 0)
+ break;
+
+ if (!retried)
+ {
+ retried = 1;
+ if (try_reconnect () == 0)
+ continue;
+ /* else: report the error and fail */
+ }
+
+ ERROR ("rrdcached plugin: rrdc_flush (%s) failed: %s (status=%i).",
+ filename, rrd_get_error (), status);
return (-1);
}
DEBUG ("rrdcached plugin: rrdc_flush (%s): Success.", filename);
diff --git a/src/vserver.c b/src/vserver.c
index a730593654bb79c3c0d6b58d69aef812ef2cb838..806fd921a7fca07dd531a91d0819c3c9d2126505 100644 (file)
--- a/src/vserver.c
+++ b/src/vserver.c
static int vserver_read (void)
{
-#if NAME_MAX < 1024
-# define DIRENT_BUFFER_SIZE (sizeof (struct dirent) + 1024 + 1)
-#else
-# define DIRENT_BUFFER_SIZE (sizeof (struct dirent) + NAME_MAX + 1)
-#endif
-
- DIR *proc;
- struct dirent *dent; /* 42 */
- char dirent_buffer[DIRENT_BUFFER_SIZE];
+ DIR *proc;
errno = 0;
proc = opendir (PROCDIR);
while (42)
{
+ struct dirent *dent;
int len;
char file[BUFSIZE];
int status;
- status = readdir_r (proc, (struct dirent *) dirent_buffer, &dent);
- if (status != 0)
+ errno = 0;
+ dent = readdir (proc);
+ if (dent == NULL)
{
char errbuf[4096];
- ERROR ("vserver plugin: readdir_r failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
+
+ if (errno == 0) /* end of directory */
+ break;
+
+ ERROR ("vserver plugin: failed to read directory %s: %s",
+ PROCDIR, sstrerror (errno, errbuf, sizeof (errbuf)));
closedir (proc);
return (-1);
}
- else if (dent == NULL)
- {
- /* end of directory */
- break;
- }
if (dent->d_name[0] == '.')
continue;