Code

core: Introduced the concept of time-series.
authorSebastian Harl <sh@tokkee.org>
Sat, 16 Aug 2014 10:17:15 +0000 (12:17 +0200)
committerSebastian Harl <sh@tokkee.org>
Sat, 16 Aug 2014 10:17:15 +0000 (12:17 +0200)
A timeseries describes one or multiple sequences of data-points where each
data-point is a timestamp and a value.

A new type of plugin, "time-series fetchers", has been introduced to access
time-series information from arbitrary data-stores.

src/Makefile.am
src/core/plugin.c
src/include/core/plugin.h
src/include/core/timeseries.h [new file with mode: 0644]

index 272533b0951f0ff23532de6bceb93f240a992422..c7c53e3289189d9fbb7a67ba4cd7151b18ba1758 100644 (file)
@@ -21,7 +21,8 @@ pkgcoreinclude_HEADERS = \
                include/core/object.h \
                include/core/plugin.h \
                include/core/store.h \
-               include/core/time.h
+               include/core/time.h \
+               include/core/timeseries.h
 pkgfeincludedir = $(pkgincludedir)/frontend
 pkgfeinclude_HEADERS = \
                include/frontend/connection.h \
@@ -73,6 +74,7 @@ libsysdb_la_SOURCES = \
                core/store_expr.c \
                core/store_lookup.c \
                core/data.c include/core/data.h \
+               include/core/timeseries.h \
                frontend/connection.c include/frontend/connection.h \
                frontend/connection-private.h \
                frontend/parser.c include/frontend/parser.h \
index 919df2b3c982fed934b0495849817936907d9253..85dd76f410dbccfdb27f6bbf9fff3c0ee4653f27 100644 (file)
@@ -118,6 +118,7 @@ static sdb_llist_t      *collector_list = NULL;
 static sdb_llist_t      *cname_list = NULL;
 static sdb_llist_t      *shutdown_list = NULL;
 static sdb_llist_t      *log_list = NULL;
+static sdb_llist_t      *ts_fetcher_list = NULL;
 
 static struct {
        const char   *type;
@@ -786,6 +787,14 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback
        return 0;
 } /* sdb_plugin_register_collector */
 
+int
+sdb_plugin_register_ts_fetcher(const char *name,
+               sdb_plugin_fetch_ts_cb callback, sdb_object_t *user_data)
+{
+       return plugin_add_callback(&ts_fetcher_list, "time-series fetcher",
+                       name, callback, user_data);
+} /* sdb_plugin_register_ts_fetcher */
+
 sdb_plugin_ctx_t
 sdb_plugin_get_ctx(void)
 {
index f75788ad2359a479c5be92d276366d41bf2fa21b..4ccc983c446551db07ec729b4c7b26cfc8161b8b 100644 (file)
@@ -31,6 +31,7 @@
 #include "sysdb.h"
 #include "core/object.h"
 #include "core/time.h"
+#include "core/timeseries.h"
 
 #include "liboconfig/oconfig.h"
 
@@ -120,6 +121,9 @@ typedef int (*sdb_plugin_shutdown_cb)(sdb_object_t *user_data);
 typedef int (*sdb_plugin_log_cb)(int prio, const char *msg,
                sdb_object_t *user_data);
 
+typedef sdb_timeseries_t *(*sdb_plugin_fetch_ts_cb)(const char *id,
+               sdb_timeseries_opts_t *opts, sdb_object_t *user_data);
+
 /*
  * sdb_plugin_register_config:
  * Register a "config" function. This will be used to pass on the
@@ -233,6 +237,26 @@ int
 sdb_plugin_register_log(const char *name, sdb_plugin_log_cb callback,
                sdb_object_t *user_data);
 
+/*
+ * sdb_plugin_register_ts_fetcher:
+ * Register a "time-series fetcher" function to be called whenever retrieving
+ * a time-series from a data-store. The callback will receive an identifier
+ * describing where to retrieve the data from (e.g. a filename or some kind of
+ * URL) and options which further describe the query.
+ *
+ * The name is used literally (without prepending the plugin name) to look up
+ * the appropriate fetcher callback.
+ *
+ * Arguments:
+ *  - user_data: If specified, this will be passed on to each call of the
+ *    callback. The function will take ownership of the object, that is,
+ *    increment the reference count by one. In case the caller does not longer
+ *    use the object for other purposes, it should thus deref it.
+ */
+int
+sdb_plugin_register_ts_fetcher(const char *name,
+               sdb_plugin_fetch_ts_cb callback, sdb_object_t *user_data);
+
 /*
  * sdb_plugin_get_ctx, sdb_plugin_set_ctx:
  * The plugin context defines a set of settings that are available whenever a
diff --git a/src/include/core/timeseries.h b/src/include/core/timeseries.h
new file mode 100644 (file)
index 0000000..3a4029d
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * SysDB - src/include/core/timeseries.h
+ * Copyright (C) 2014 Sebastian 'tokkee' Harl <sh@tokkee.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef SDB_CORE_TIMESERIES_H
+#define SDB_CORE_TIMESERIES_H 1
+
+#include "sysdb.h"
+#include "core/time.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * A data-point describes a datum at a certain point of time.
+ */
+typedef struct {
+       sdb_time_t timestamp;
+       double value;
+} sdb_data_point_t;
+
+/*
+ * A timeseries describes one or more sequences of data-points. Multiple
+ * sequences will have a name each and share the same start and end times and
+ * number of data points.
+ *
+ * Start and end times may diverge slightly from the requested start and end
+ * times depending on the resolution available in the backend data-store.
+ */
+typedef struct {
+       sdb_time_t start;
+       sdb_time_t end;
+
+       sdb_data_point_t **data;
+       char **data_names;
+       size_t data_len;
+} sdb_timeseries_t;
+
+/*
+ * Time-series options specify generic parameters to be used when fetching
+ * time-series data from a data-store.
+ */
+typedef struct {
+       sdb_time_t start;
+       sdb_time_t end;
+} sdb_timeseries_opts_t;
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* ! SDB_CORE_TIMESERIES_H */
+
+/* vim: set tw=78 sw=4 ts=4 noexpandtab : */
+