X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Fcore%2Fstore.c;h=764c7c7a0e7604177f18a570d68529b0aba1caed;hp=a1cf8f6bc44b6ba816fc66ee729189c4371da07d;hb=08d98ffdb21f7fb57cc1e49aac72223bc9fb2eea;hpb=2a0b199b7aac87fee49ebefe69d6f94a9045f4b8 diff --git a/src/core/store.c b/src/core/store.c index a1cf8f6..764c7c7 100644 --- a/src/core/store.c +++ b/src/core/store.c @@ -57,10 +57,10 @@ static pthread_rwlock_t host_lock = PTHREAD_RWLOCK_INITIALIZER; * private types */ -static sdb_type_t sdb_host_type; -static sdb_type_t sdb_service_type; -static sdb_type_t sdb_metric_type; -static sdb_type_t sdb_attribute_type; +static sdb_type_t host_type; +static sdb_type_t service_type; +static sdb_type_t metric_type; +static sdb_type_t attribute_type; static int store_obj_init(sdb_object_t *obj, va_list ap) @@ -96,7 +96,7 @@ store_obj_destroy(sdb_object_t *obj) } /* store_obj_destroy */ static int -sdb_host_init(sdb_object_t *obj, va_list ap) +host_init(sdb_object_t *obj, va_list ap) { sdb_host_t *sobj = HOST(obj); int ret; @@ -116,10 +116,10 @@ sdb_host_init(sdb_object_t *obj, va_list ap) if (! sobj->attributes) return -1; return 0; -} /* sdb_host_init */ +} /* host_init */ static void -sdb_host_destroy(sdb_object_t *obj) +host_destroy(sdb_object_t *obj) { sdb_host_t *sobj = HOST(obj); assert(obj); @@ -132,10 +132,10 @@ sdb_host_destroy(sdb_object_t *obj) sdb_avltree_destroy(sobj->metrics); if (sobj->attributes) sdb_avltree_destroy(sobj->attributes); -} /* sdb_host_destroy */ +} /* host_destroy */ static int -sdb_service_init(sdb_object_t *obj, va_list ap) +service_init(sdb_object_t *obj, va_list ap) { sdb_service_t *sobj = SVC(obj); int ret; @@ -149,10 +149,10 @@ sdb_service_init(sdb_object_t *obj, va_list ap) if (! sobj->attributes) return -1; return 0; -} /* sdb_service_init */ +} /* service_init */ static void -sdb_service_destroy(sdb_object_t *obj) +service_destroy(sdb_object_t *obj) { sdb_service_t *sobj = SVC(obj); assert(obj); @@ -161,10 +161,10 @@ sdb_service_destroy(sdb_object_t *obj) if (sobj->attributes) sdb_avltree_destroy(sobj->attributes); -} /* sdb_service_destroy */ +} /* service_destroy */ static int -sdb_metric_init(sdb_object_t *obj, va_list ap) +metric_init(sdb_object_t *obj, va_list ap) { sdb_metric_t *sobj = METRIC(obj); int ret; @@ -180,10 +180,10 @@ sdb_metric_init(sdb_object_t *obj, va_list ap) sobj->store.type = sobj->store.id = NULL; return 0; -} /* sdb_metric_init */ +} /* metric_init */ static void -sdb_metric_destroy(sdb_object_t *obj) +metric_destroy(sdb_object_t *obj) { sdb_metric_t *sobj = METRIC(obj); assert(obj); @@ -197,10 +197,10 @@ sdb_metric_destroy(sdb_object_t *obj) free(sobj->store.type); if (sobj->store.id) free(sobj->store.id); -} /* sdb_metric_destroy */ +} /* metric_destroy */ static int -sdb_attr_init(sdb_object_t *obj, va_list ap) +attr_init(sdb_object_t *obj, va_list ap) { const sdb_data_t *value; int ret; @@ -216,39 +216,39 @@ sdb_attr_init(sdb_object_t *obj, va_list ap) if (sdb_data_copy(&ATTR(obj)->value, value)) return -1; return 0; -} /* sdb_attr_init */ +} /* attr_init */ static void -sdb_attr_destroy(sdb_object_t *obj) +attr_destroy(sdb_object_t *obj) { assert(obj); store_obj_destroy(obj); sdb_data_free_datum(&ATTR(obj)->value); -} /* sdb_attr_destroy */ +} /* attr_destroy */ -static sdb_type_t sdb_host_type = { - sizeof(sdb_host_t), - sdb_host_init, - sdb_host_destroy +static sdb_type_t host_type = { + /* size = */ sizeof(sdb_host_t), + /* init = */ host_init, + /* destroy = */ host_destroy }; -static sdb_type_t sdb_service_type = { - sizeof(sdb_service_t), - sdb_service_init, - sdb_service_destroy +static sdb_type_t service_type = { + /* size = */ sizeof(sdb_service_t), + /* init = */ service_init, + /* destroy = */ service_destroy }; -static sdb_type_t sdb_metric_type = { - sizeof(sdb_metric_t), - sdb_metric_init, - sdb_metric_destroy +static sdb_type_t metric_type = { + /* size = */ sizeof(sdb_metric_t), + /* init = */ metric_init, + /* destroy = */ metric_destroy }; -static sdb_type_t sdb_attribute_type = { - sizeof(sdb_attribute_t), - sdb_attr_init, - sdb_attr_destroy +static sdb_type_t attribute_type = { + /* size = */ sizeof(sdb_attribute_t), + /* init = */ attr_init, + /* destroy = */ attr_destroy }; /* @@ -353,16 +353,16 @@ store_obj(sdb_store_obj_t *parent, sdb_avltree_t *parent_tree, else { if (type == SDB_ATTRIBUTE) { /* the value will be updated by the caller */ - new = STORE_OBJ(sdb_object_create(name, sdb_attribute_type, + new = STORE_OBJ(sdb_object_create(name, attribute_type, type, last_update, NULL)); } else { sdb_type_t t; t = type == SDB_HOST - ? sdb_host_type + ? host_type : type == SDB_SERVICE - ? sdb_service_type - : sdb_metric_type; + ? service_type + : metric_type; new = STORE_OBJ(sdb_object_create(name, t, type, last_update)); } @@ -423,6 +423,37 @@ store_attr(sdb_store_obj_t *parent, sdb_avltree_t *attributes, return status; } /* store_attr */ +static int +store_metric_store(sdb_metric_t *metric, sdb_metric_store_t *store) +{ + char *type = metric->store.type; + char *id = metric->store.id; + + if ((! metric->store.type) || strcasecmp(metric->store.type, store->type)) { + if (! (type = strdup(store->type))) + return -1; + } + if ((! metric->store.id) || strcasecmp(metric->store.id, store->id)) { + if (! (id = strdup(store->id))) { + if (type != metric->store.type) + free(type); + return -1; + } + } + + if (type != metric->store.type) { + if (metric->store.type) + free(metric->store.type); + metric->store.type = type; + } + if (id != metric->store.id) { + if (metric->store.id) + free(metric->store.id); + metric->store.id = id; + } + return 0; +} /* store_metric_store */ + /* The host_lock has to be acquired before calling this function. */ static sdb_avltree_t * get_host_children(sdb_host_t *host, int type) @@ -457,12 +488,10 @@ ts_tojson(sdb_timeseries_t *ts, sdb_strbuf_t *buf) size_t i; /* TODO: make time format configurable */ - if (! sdb_strftime(start_str, sizeof(start_str), - "%F %T %z", ts->start)) + if (! sdb_strftime(start_str, sizeof(start_str), ts->start)) snprintf(start_str, sizeof(start_str), ""); start_str[sizeof(start_str) - 1] = '\0'; - if (! sdb_strftime(end_str, sizeof(end_str), - "%F %T %z", ts->end)) + if (! sdb_strftime(end_str, sizeof(end_str), ts->end)) snprintf(end_str, sizeof(end_str), ""); end_str[sizeof(end_str) - 1] = '\0'; @@ -476,8 +505,7 @@ ts_tojson(sdb_timeseries_t *ts, sdb_strbuf_t *buf) for (j = 0; j < ts->data_len; ++j) { char time_str[64]; - if (! sdb_strftime(time_str, sizeof(time_str), - "%F %T %z", ts->data[i][j].timestamp)) + if (! sdb_strftime(time_str, sizeof(time_str), ts->data[i][j].timestamp)) snprintf(time_str, sizeof(time_str), ""); time_str[sizeof(time_str) - 1] = '\0'; @@ -609,6 +637,7 @@ sdb_store_service(const char *hostname, const char *name, { sdb_host_t *host; sdb_avltree_t *services; + sdb_data_t d; int status = 0; @@ -631,8 +660,17 @@ sdb_store_service(const char *hostname, const char *name, sdb_object_deref(SDB_OBJ(host)); pthread_rwlock_unlock(&host_lock); + if (status) + return status; + if (sdb_plugin_store_service(hostname, name, last_update)) status = -1; + + /* record the hostname as an attribute */ + d.type = SDB_TYPE_STRING; + d.data.string = SDB_OBJ(host)->name; + if (sdb_store_service_attr(hostname, name, "hostname", &d, last_update)) + status = -1; return status; } /* sdb_store_service */ @@ -687,6 +725,7 @@ sdb_store_metric(const char *hostname, const char *name, sdb_store_obj_t *obj = NULL; sdb_host_t *host; sdb_metric_t *metric; + sdb_data_t d; sdb_avltree_t *metrics; @@ -716,7 +755,7 @@ sdb_store_metric(const char *hostname, const char *name, name, last_update, &obj); sdb_object_deref(SDB_OBJ(host)); - if (status || (! store)) { + if (status) { pthread_rwlock_unlock(&host_lock); return status; } @@ -724,29 +763,19 @@ sdb_store_metric(const char *hostname, const char *name, assert(obj); metric = METRIC(obj); - if ((! metric->store.type) || strcasecmp(metric->store.type, store->type)) { - if (metric->store.type) - free(metric->store.type); - metric->store.type = strdup(store->type); - } - if ((! metric->store.id) || strcasecmp(metric->store.id, store->id)) { - if (metric->store.id) - free(metric->store.id); - metric->store.id = strdup(store->id); - } - - if ((! metric->store.type) || (! metric->store.id)) { - if (metric->store.type) - free(metric->store.type); - if (metric->store.id) - free(metric->store.id); - metric->store.type = metric->store.id = NULL; - status = -1; - } + if (store) + if (store_metric_store(metric, store)) + status = -1; pthread_rwlock_unlock(&host_lock); if (sdb_plugin_store_metric(hostname, name, store, last_update)) status = -1; + + /* record the hostname as an attribute */ + d.type = SDB_TYPE_STRING; + d.data.string = SDB_OBJ(host)->name; + if (sdb_store_metric_attr(hostname, name, "hostname", &d, last_update)) + status = -1; return status; } /* sdb_store_metric */ @@ -914,6 +943,11 @@ sdb_store_get_field(sdb_store_obj_t *obj, int field, sdb_data_t *res) if (! res) return 0; return sdb_data_copy(res, &ATTR(obj)->value); + case SDB_FIELD_TIMESERIES: + if (obj->type != SDB_METRIC) + return -1; + tmp.type = SDB_TYPE_BOOLEAN; + tmp.data.boolean = METRIC(obj)->store.type != NULL; default: return -1; }