diff options
Diffstat (limited to 'src/plugins/influxdb.c')
-rw-r--r-- | src/plugins/influxdb.c | 110 |
1 files changed, 14 insertions, 96 deletions
diff --git a/src/plugins/influxdb.c b/src/plugins/influxdb.c index 17c140d..8a8a112 100644 --- a/src/plugins/influxdb.c +++ b/src/plugins/influxdb.c @@ -16,8 +16,10 @@ */ #define _GNU_SOURCE -#include <string.h> +#include <fcntl.h> #include <stdio.h> +#include <unistd.h> +#include <string.h> #include "tsdb.h" #include "wrap-json.h" @@ -49,36 +51,7 @@ int create_database() return ret; } -void influxdb_cb(void *closure, int status, CURL *curl, const char *result, size_t size) -{ - struct afb_req *req = (struct afb_req*)closure; - long rep_code = curl_wrap_response_code_get(curl); - switch(rep_code) { - case 204: - AFB_DEBUG("Request correctly written"); - afb_req_success(*req, NULL, "Request has been successfully writen"); - break; - case 400: - afb_req_fail(*req, "Bad request", result); - break; - case 401: - afb_req_fail(*req, "Unauthorized access", result); - break; - case 404: - afb_req_fail(*req, "Not found", result); - AFB_NOTICE("Attempt to create the DB '"DEFAULT_DB"'"); - create_database(); - break; - case 500: - afb_req_fail_f(*req, "Timeout", "Overloaded server: %s", result); - break; - default: - afb_req_fail(*req, "Failure", "Unexpected behavior."); - break; - } -} - -int unpack_metric(json_object *m, const char **name, const char **source, const char **unit, const char **identity, json_object **jv, uint64_t *timestamp) +int unpack_metric_from_binding(json_object *m, const char **name, const char **source, const char **unit, const char **identity, json_object **jv, uint64_t *timestamp) { if (wrap_json_unpack(m, "{ss,s?s,s?s,s?s,so,sI!}", "name", name, @@ -103,75 +76,20 @@ void concatenate(char* dest, const char* source, const char *sep) strncat(dest, source, strlen(source)); } -char *format_write_query(char *query, const char *name, const char *source, const char *unit, const char *identity, json_object *jv, uint64_t timestamp) +size_t make_url(char *url, size_t l_url, const char *host, const char *port, const char *endpoint) { - char *ts; - memset(query, 0, URL_MAXIMUM_LENGTH); - - strncat(query, name, strlen(name)); - if (source) { - concatenate(query, source, ","); - } - if (unit) { - concatenate(query, unit, ","); - } - if (identity) { - concatenate(query, identity, ","); - } - - concatenate(query, "value", " "); - concatenate(query, json_object_to_json_string(jv), "="); - asprintf(&ts, "%lu", timestamp); - concatenate(query, ts, " "); - - return query; -} - -CURL *make_curl_write_post(const char *url, struct json_object *metric) -{ - CURL *curl; - const char *name = NULL, - *source = NULL, - *unit = NULL, - *identity = NULL; - - size_t lpd = json_object_is_type(metric, json_type_array) ? - json_object_array_length(metric) + 1 : 2; - - char **post_data; - post_data = malloc(lpd); - - char query[URL_MAXIMUM_LENGTH]; - bzero(query, URL_MAXIMUM_LENGTH); - - json_object *jv = NULL; - uint64_t timestamp = 0; - - if(unpack_metric(metric, &name, &source, &unit, &identity, &jv, ×tamp)) { - AFB_ERROR("ERROR unpacking metric. %s", json_object_to_json_string(metric)); - curl = NULL; - } - else { - for(long unsigned int i = lpd; i != 0; i--) { - format_write_query(query, name, source, unit, identity, jv, timestamp); - post_data[i] = i == lpd ? NULL : query; - } - curl = curl_wrap_prepare_post(url, NULL, 1, (const char * const*)post_data); - } - - return curl; -} - -CURL *influxdb_write(const char* host, int port, json_object *metric) -{ - char url[URL_MAXIMUM_LENGTH]; /* Safe limit for most popular web browser */ - memset(url, 0, sizeof(url)); + bzero(url, l_url); /* Handle default host and port */ host = host ? host : DEFAULT_DBHOST; - port = port > 0 ? port : atoi(DEFAULT_DBPORT); + port = port ? port : DEFAULT_DBPORT; strncat(url, host, strlen(host)); - strncat(url, ":"DEFAULT_DBPORT"/write?db="DEFAULT_DB, strlen(":"DEFAULT_DBPORT"/write?db="DEFAULT_DB)); - return make_curl_write_post(url, metric); + strncat(url, ":", 1); + strncat(url, port, strlen(port)); + strncat(url, "/", 1); + strncat(url, endpoint, strlen(endpoint)); + strncat(url, "?db="DEFAULT_DB, strlen("?db="DEFAULT_DB)); + + return strlen(url); } |