Native C client and library for Riemann
Chekout the [wiki]! [wiki]: https://github.com/gkos/riemann-c-client/wiki
- TCP and UDP support for sending events
- TCP support for quering
- Timeout support, enabling blocking and non-blocking calls on same function. (Can be disabled at compile time --disable-timeout. Enabled by default.)
- Support for tags and attributes
- Support for sending multiple events in one shot
- Google protobuf-c library
- libtoolize
On OS X, this can be installed with:
brew protobuf-c libtool
Use --with-protobuf-c-dir=/usr/local/Cellar/protobuf-c/0.15
as arguments to ./configure
below.
- Improve error signaling, return kind of errno
- Autotools
- Implement an alternative to getaddrinfo(), (gethostbyname!?) at compile time.
- Write INSTALL and README
- Doxygen?
- Create a wiki for better documentin
- Test on this enviroments
- AIX
- Solaris
- FreeBSD
- OpenBSD
WARNING: This is in really early stages, and was not fully tested.
- Clone
# git clone 'https://github.com/gkos/riemann-c-client.git'
# cd riemann-c-client
- Build
# ./build.sh
# ./configure --with-protobuf-c-dir=/root/usr/protobuf-c
# make
- Install
# sudo make install
Checkout the [wiki] for distro specific instructions [wiki]: https://github.com/gkos/riemann-c-client/wiki
Include the headers
#include <riemann/event.h>
#include <riemann/message.h>
#include <riemann/client.h>
Create messages. Queries and Events are send attached in messages. Also create a client, this will be your connection to riemann server. riemann_client_connect() returns non-zero on failure.
int error;
riemann_message_t msg = RIEMANN_MSG_INIT;
riemann_client_t cli;
If you'll send events create the events and alloc them. There no simpler way to send a sigle event. Check the returned pointers. NULL means that malloc failed. Then set the event fields.
riemann_event_t **events;
events = riemann_event_alloc_events(1);
events[0] = riemann_event_alloc_event();
riemann_event_set_host(events[0], "batcave");
riemann_event_set_service(events[0], "batservice");
riemann_event_set_metric_f(events[0], 1);
riemann_event_set_state(events[0], "ok");
Attach events to message:
riemann_message_set_events(&msg, events, 1);
Send the message! 3th parameter is flags to be passed to send() call, 4th parameter is a timeout struct(struct timeval). Passing 0 on both fields yield a non-blocking call, otherwise the call waits until timeout. If NULL is passed the call blocks undefinately.
error = riemann_client_init(&cli);
error = riemann_client_connect(&cli, RIEMANN_TCP,
"riemann.batmansion.org,
5555);
error = riemann_client_send_message(&cli, &msg, 0, NULL);
If you want to make sure that server received your events, ask it for a response:
riemann_message_t *resp = NULL;
resp = riemann_client_recv_message(&cli, 0, NULL);
if (resp->ok)
puts("SUCCESS"); /* your message was received with success */
Responses need to be freed. Also events and clients.
riemann_message_free(resp);
riemann_events_free(events, n_events);
riemann_client_free(&cli);
When compiling your code, link it against libriemann_client:
# cc -o your_program your_code.c -lriemann_c_client -L/usr/local/lib -I/usr/local/include
For complete examples look at src/examples directory.