X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fpostgresql.c;h=bef3490ff0f16852d345c85bf8c167f851116597;hb=73de67494a4f5d9a698f2a5ab93f85e19bccb90a;hp=635abfca61bf5647b4d53cea55601a5182a8997e;hpb=2761756b5ad2c9a973b30540633218202860a4d7;p=collectd.git diff --git a/src/postgresql.c b/src/postgresql.c index 635abfca..bef3490f 100644 --- a/src/postgresql.c +++ b/src/postgresql.c @@ -135,6 +135,7 @@ typedef struct { /* writer "caching" settings */ cdtime_t commit_interval; cdtime_t next_commit; + cdtime_t expire_delay; char *host; char *port; @@ -257,6 +258,7 @@ static c_psql_database_t *c_psql_database_new (const char *name) db->commit_interval = 0; db->next_commit = 0; + db->expire_delay = 0; db->database = sstrdup (name); db->host = NULL; @@ -613,7 +615,7 @@ static int c_psql_read (user_data_t *ud) c_psql_database_t *db; int success = 0; - int i; + size_t i; if ((ud == NULL) || (ud->data == NULL)) { log_err ("c_psql_read: Invalid user data."); @@ -661,8 +663,7 @@ static char *values_name_to_sqlarray (const data_set_t *ds, { char *str_ptr; size_t str_len; - - int i; + size_t i; str_ptr = string; str_len = string_len; @@ -700,8 +701,7 @@ static char *values_type_to_sqlarray (const data_set_t *ds, { char *str_ptr; size_t str_len; - - int i; + size_t i; str_ptr = string; str_len = string_len; @@ -749,8 +749,7 @@ static char *values_to_sqlarray (const data_set_t *ds, const value_list_t *vl, size_t str_len; gauge_t *rates = NULL; - - int i; + size_t i; str_ptr = string; str_len = string_len; @@ -770,7 +769,7 @@ static char *values_to_sqlarray (const data_set_t *ds, const value_list_t *vl, if (ds->ds[i].type == DS_TYPE_GAUGE) status = ssnprintf (str_ptr, str_len, - ",%f", vl->values[i].gauge); + ","GAUGE_FORMAT, vl->values[i].gauge); else if (store_rates) { if (rates == NULL) rates = uc_get_rate (ds, vl); @@ -835,7 +834,7 @@ static int c_psql_write (const data_set_t *ds, const value_list_t *vl, const char *params[9]; int success = 0; - int i; + size_t i; if ((ud == NULL) || (ud->data == NULL)) { log_err ("c_psql_write: Invalid user data."); @@ -867,6 +866,12 @@ static int c_psql_write (const data_set_t *ds, const value_list_t *vl, #undef VALUE_OR_NULL + if( db->expire_delay > 0 && vl->time < (cdtime() - vl->interval - db->expire_delay) ) { + log_info ("c_psql_write: Skipped expired value @ %s - %s/%s-%s/%s-%s/%s", + params[0], params[1], params[2], params[3], params[4], params[5], params[6] ); + return 0; + } + pthread_mutex_lock (&db->db_lock); if (0 != c_psql_check_connection (db)) { @@ -1188,7 +1193,6 @@ static int c_psql_config_database (oconfig_item_t *ci) c_psql_database_t *db; char cb_name[DATA_MAX_NAME_LEN]; - struct timespec cb_interval = { 0, 0 }; user_data_t ud; static _Bool have_flush = 0; @@ -1236,6 +1240,8 @@ static int c_psql_config_database (oconfig_item_t *ci) cf_util_get_cdtime (c, &db->interval); else if (strcasecmp ("CommitInterval", c->key) == 0) cf_util_get_cdtime (c, &db->commit_interval); + else if (strcasecmp ("ExpireDelay", c->key) == 0) + cf_util_get_cdtime (c, &db->expire_delay); else log_warn ("Ignoring unknown config key \"%s\".", c->key); } @@ -1281,12 +1287,9 @@ static int c_psql_config_database (oconfig_item_t *ci) ssnprintf (cb_name, sizeof (cb_name), "postgresql-%s", db->instance); if (db->queries_num > 0) { - CDTIME_T_TO_TIMESPEC (db->interval, &cb_interval); - ++db->ref_cnt; plugin_register_complex_read ("postgresql", cb_name, c_psql_read, - /* interval = */ (db->interval > 0) ? &cb_interval : NULL, - &ud); + /* interval = */ db->interval, &ud); } if (db->writers_num > 0) { ++db->ref_cnt;