A simple library for pushing data into FIVIS from a C client.
The FIVIS provides a REST endpoint which accepts JSON payload with signal data. The library uses libcurl to perform HTTPS requests on the API end point.
The provided FIVIS API is simple, and to make clear separation between
what is needed by the FIVIS API and the example projects, the source
code in the src
directory has been split into multiple subprojects.
-
src/fivis
contains the files needed for the FIVIS API. -
src/common
contains the files needed by both examples. -
src/mksigset
is a trivial example using the FIVIS API to create an empty signal set with several signals of different types. -
src/cpumon
is a more complex example implementing a simple CPU monitor which uses the FIVIS API to push data into FIVIS. Thecpumon
periodically collects CPU usage data and sends batch updates to the FIVIS server. It keeps trying to send data when it encounters transient (network) errors.
The project requires the libcurl
library and whatever dependencies libcurl
requires. On package-based
Linux distributions, this typically requires installing a package such
as libcurl-devel
(Fedora) or similar.
The project expects to find libcurl
include files and libraries in
default system directories, so that including curl/curl.h
and linking
with -lcurl
works out of the box.
If necessary, modify the include directories in the Makefiles.
Regarding CURL features, the project requires the CURL library to only support the 'SSL', 'libz', and 'HTTPS-Proxy' features.
The examples in src/mksigset
and src/cpumon
need to be configured to
enable access to partner-specific FIVIS API.
Consequently, each of the projects contains config.h
, which needs to
define the values of FIVIS_API_HOST
, FIVIS_API_TOKEN
, FIVIS_PARTNER_ID
,
and FIVIS_SIGNAL_SET_ID
. Make sure to update config.h
in each example
that you want to try.
Alternatively, you can define these macros using compiler flags.
Simply run make
in this directory. This should produce two executable
files in the build
directory: mksigset
and cpumon
.
The FIVIS library will be in src/fivis/build
, in both static (fivis.a
)
and shared (libfivis.so
) form.
The FIVIS client API can be found in the src/fivis
directory. The API
itself is relatively small (see fivis.h
and fivis.c
), but it does make
use of other modules: it needs support for formatting strings into a growable
buffer in sbuf.c
and sbuf.h
, makes use of a linked list from list.h
, and
uses type-specific entry formatters from entry.h
and entry.c
.
The API is currently represented by the following functions:
-
fivis_global_init
, which must be called once per program execution. It has a corresponding clean-up function,fivis_global_cleanup
, which should be called before program exit to release resources. -
fivis_init
creates an instance of FIVIS context for a given API endpoint and API token. The corresponding clean-up function isfivis_cleanup
. -
fivis_signals_format_request
is one of the two main functions. This one formats the request to be sent to the FIVIS signals API. It requires partner and signal set identifiers. Theschema
attribute of the request is optional if the signal set definition remains unchanged. The function accepts schema as a list ofstruct entry
instances, ifNULL
is passed as scheme, theschema
attribute is not generated in the request.For the
data
attribute, the function requires a separate signal representing the implicitid
attribute and a list ofstruct entry
instances representing the other signals in the signal set. When this function generates data records, it repeatedly iterates over the list of signals for as long as thenext_value
functions returns non-NULL values. Whenever the end of thesignals
list is reached, new data record is created.The
next_value
function together with thenext_value_state
parameter represent a simple iterator so that the request formatting function can be provide with data without depending on particular data structure. The caller is required to provide thenext_value
function and its state objects innext_value_state
, which is passed to the function on each invocation. When thenext_value
fuction returnsNULL
, the iteraiton ends. -
fivis_signals_perform_request
is the second of the two main functions. This one sends a formatted request to the FIVIS signals API endpoint. -
fivis_last_error
provides a string representing the last error encountered during execution of the functions from the FIVIS module. The caller MUST NOT free the memory occupied by the returned string.