From c67634d0683a42c1e5457279de98958cbacc679d Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Sat, 16 Aug 2014 12:17:15 +0200 Subject: [PATCH] core: Introduced the concept of time-series. 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 | 4 +- src/core/plugin.c | 9 ++++ src/include/core/plugin.h | 24 +++++++++++ src/include/core/timeseries.h | 79 +++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/include/core/timeseries.h diff --git a/src/Makefile.am b/src/Makefile.am index 272533b..c7c53e3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/core/plugin.c b/src/core/plugin.c index 919df2b..85dd76f 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -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) { diff --git a/src/include/core/plugin.h b/src/include/core/plugin.h index f75788a..4ccc983 100644 --- a/src/include/core/plugin.h +++ b/src/include/core/plugin.h @@ -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 index 0000000..3a4029d --- /dev/null +++ b/src/include/core/timeseries.h @@ -0,0 +1,79 @@ +/* + * SysDB - src/include/core/timeseries.h + * Copyright (C) 2014 Sebastian 'tokkee' Harl + * 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 : */ + -- 2.30.2