**/
#include "collectd.h"
+
#include "common.h"
#include "plugin.h"
#include "utils_tail_match.h"
+#include "utils_latency_config.h"
/*
* <Plugin tail>
char *type;
char *type_instance;
cdtime_t interval;
+ latency_config_t latency;
};
typedef struct ctail_config_match_s ctail_config_match_t;
-cu_tail_match_t **tail_match_list = NULL;
-size_t tail_match_list_num = 0;
-cdtime_t tail_match_list_intervals[255];
+static cu_tail_match_t **tail_match_list = NULL;
+static size_t tail_match_list_num = 0;
+static cdtime_t tail_match_list_intervals[255];
static int ctail_config_add_match_dstype (ctail_config_match_t *cm,
oconfig_item_t *ci)
cm->flags |= UTILS_MATCH_CF_GAUGE_INC;
else if (strcasecmp ("GaugeAdd", ci->values[0].value.string) == 0)
cm->flags |= UTILS_MATCH_CF_GAUGE_ADD;
+ else if (strcasecmp ("GaugePersist", ci->values[0].value.string) == 0)
+ cm->flags |= UTILS_MATCH_CF_GAUGE_PERSIST;
else
cm->flags = 0;
}
+ else if (strcasecmp ("Latency", ci->values[0].value.string) == 0)
+ {
+ cm->flags = UTILS_MATCH_DS_TYPE_GAUGE | UTILS_MATCH_CF_GAUGE_LATENCY;
+ }
else if (strncasecmp ("Counter", ci->values[0].value.string, strlen ("Counter")) == 0)
{
cm->flags = UTILS_MATCH_DS_TYPE_COUNTER;
static int ctail_config_add_match (cu_tail_match_t *tm,
const char *plugin_instance, oconfig_item_t *ci, cdtime_t interval)
{
- ctail_config_match_t cm;
+ ctail_config_match_t cm = { 0 };
int status;
- int i;
-
- memset (&cm, '\0', sizeof (cm));
if (ci->values_num != 0)
{
}
status = 0;
- for (i = 0; i < ci->children_num; i++)
+ for (int i = 0; i < ci->children_num; i++)
{
oconfig_item_t *option = ci->children + i;
status = cf_util_get_string (option, &cm.type);
else if (strcasecmp ("Instance", option->key) == 0)
status = cf_util_get_string (option, &cm.type_instance);
+ else if (strncasecmp ("Latency", option->key, strlen ("Latency")) == 0)
+ {
+ if (strcasecmp ("LatencyPercentile", option->key) == 0)
+ status = latency_config_add_percentile ("tail", &cm.latency, option);
+ else if (strcasecmp ("LatencyPercentileType", option->key) == 0)
+ status = cf_util_get_string (option, &cm.latency.percentile_type);
+ else if (strcasecmp ("LatencyRate", option->key) == 0)
+ status = latency_config_add_rate ("tail", &cm.latency, option);
+ else if (strcasecmp ("LatencyRateType", option->key) == 0)
+ status = cf_util_get_string (option, &cm.latency.rates_type);
+ else if (strcasecmp ("LatencyLower", option->key) == 0)
+ status = cf_util_get_boolean (option, &cm.latency.lower);
+ else if (strcasecmp ("LatencyUpper", option->key) == 0)
+ status = cf_util_get_boolean (option, &cm.latency.upper);
+ else if (strcasecmp ("LatencyAvg", option->key) == 0)
+ status = cf_util_get_boolean (option, &cm.latency.avg);
+ else
+ {
+ WARNING ("tail plugin: Option `%s' not allowed here.", option->key);
+ status = -1;
+ }
+ }
else
{
WARNING ("tail plugin: Option `%s' not allowed here.", option->key);
break;
}
+ if ((cm.flags & UTILS_MATCH_DS_TYPE_GAUGE)
+ && (cm.flags & UTILS_MATCH_CF_GAUGE_LATENCY))
+ {
+
+ if (cm.type_instance != NULL)
+ {
+ WARNING ("tail plugin: `DSType Latency' and `Instance %s' in `Match' "
+ "block could not be used together.", cm.type_instance);
+ status = -1;
+ break;
+ }
+
+ if (cm.latency.percentile_num == 0 && cm.latency.rates_num == 0)
+ {
+ WARNING ("tail plugin: `Match' with `DSType Latency' has no "
+ "`LatencyPercentile' or `LatencyRate' options.");
+ status = -1;
+ break;
+ }
+ }
+
break;
} /* while (status == 0) */
if (status == 0)
{
status = tail_match_add_match_simple (tm, cm.regex, cm.excluderegex,
- cm.flags, "tail", plugin_instance, cm.type, cm.type_instance, interval);
+ cm.flags, "tail", plugin_instance, cm.type, cm.type_instance,
+ cm.latency, interval);
if (status != 0)
{
sfree (cm.excluderegex);
sfree (cm.type);
sfree (cm.type_instance);
+ latency_config_free(cm.latency);
return (status);
} /* int ctail_config_add_match */
cdtime_t interval = 0;
char *plugin_instance = NULL;
int num_matches = 0;
- int i;
if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_STRING))
{
return (-1);
}
- for (i = 0; i < ci->children_num; i++)
+ for (int i = 0; i < ci->children_num; i++)
{
oconfig_item_t *option = ci->children + i;
int status = 0;
{
cu_tail_match_t **temp;
- temp = (cu_tail_match_t **) realloc (tail_match_list,
+ temp = realloc (tail_match_list,
sizeof (cu_tail_match_t *) * (tail_match_list_num + 1));
if (temp == NULL)
{
static int ctail_config (oconfig_item_t *ci)
{
- int i;
-
- for (i = 0; i < ci->children_num; i++)
+ for (int i = 0; i < ci->children_num; i++)
{
oconfig_item_t *option = ci->children + i;
static int ctail_init (void)
{
- struct timespec cb_interval;
char str[255];
- user_data_t ud;
- size_t i;
if (tail_match_list_num == 0)
{
return (-1);
}
- memset(&ud, '\0', sizeof(ud));
-
- for (i = 0; i < tail_match_list_num; i++)
+ for (size_t i = 0; i < tail_match_list_num; i++)
{
- ud.data = (void *)tail_match_list[i];
ssnprintf(str, sizeof(str), "tail-%zu", i);
- CDTIME_T_TO_TIMESPEC (tail_match_list_intervals[i], &cb_interval);
- plugin_register_complex_read (NULL, str, ctail_read, &cb_interval, &ud);
+
+ plugin_register_complex_read (NULL, str, ctail_read, tail_match_list_intervals[i],
+ &(user_data_t) {
+ .data = tail_match_list[i],
+ });
}
return (0);
static int ctail_shutdown (void)
{
- size_t i;
-
- for (i = 0; i < tail_match_list_num; i++)
+ for (size_t i = 0; i < tail_match_list_num; i++)
{
tail_match_destroy (tail_match_list[i]);
tail_match_list[i] = NULL;