aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/influxdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/influxdb.c')
-rw-r--r--src/plugins/influxdb.c110
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, &timestamp)) {
- 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);
}