Skip to content

Commit

Permalink
lib: add new API flb_service_set(flb_ctx_t *ctx, ...)
Browse files Browse the repository at this point in the history
User can set a global properties of the service with new API. (e.g. Flush)
  flb_service_set(ctx, Flush, 1, NULL);

Signed-off-by: Takahiro YAMASHITA <[email protected]>
  • Loading branch information
nokute78 committed Aug 30, 2016
1 parent d22cb98 commit a0a41a5
Show file tree
Hide file tree
Showing 5 changed files with 190 additions and 1 deletion.
27 changes: 27 additions & 0 deletions include/fluent-bit/flb_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,5 +120,32 @@ struct flb_config {
struct flb_config *flb_config_init();
void flb_config_exit(struct flb_config *config);
char *flb_config_prop_get(char *key, struct mk_list *list);
int flb_config_set_property(struct flb_config *config,
char *k, char *v);
struct flb_service_config {
char *key;
int type;
size_t offset;
};

enum conf_type {
FLB_CONF_TYPE_INT,
FLB_CONF_TYPE_BOOL,
FLB_CONF_TYPE_STR,
FLB_CONF_TYPE_OTHER,
};

#define FLB_CONF_STR_FLUSH "Flush"
#define FLB_CONF_STR_DAEMON "Daemon"
#define FLB_CONF_STR_LOGLEVEL "Log_Level"
#ifdef FLB_HAVE_HTTP
#define FLB_CONF_STR_HTTP_MONITOR "HTTP_Monitor"
#define FLB_CONF_STR_HTTP_PORT "HTTP_Port"
#endif /* FLB_HAVE_HTTP */
#ifdef FLB_HAVE_BUFFERING
#define FLB_CONF_STR_BUF_PATH "Buffer_Path"
#define FLB_CONF_STR_BUF_WORKERS "Buffer_Workers"
#endif /*FLB_HAVE_BUFFERING*/


#endif
1 change: 1 addition & 0 deletions include/fluent-bit/flb_lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ FLB_EXPORT flb_input_t *flb_input(flb_ctx_t *ctx, char *input, void *data);
FLB_EXPORT flb_output_t *flb_output(flb_ctx_t *ctx, char *output, void *data);
FLB_EXPORT int flb_input_set(flb_input_t *input, ...);
FLB_EXPORT int flb_output_set(flb_output_t *output, ...);
FLB_EXPORT int flb_service_set(flb_ctx_t *ctx, ...);

/* start stop the engine */
FLB_EXPORT int flb_start(flb_ctx_t *ctx);
Expand Down
131 changes: 131 additions & 0 deletions src/flb_config.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <stddef.h>

#include <fluent-bit/flb_info.h>
#include <fluent-bit/flb_macros.h>
Expand All @@ -29,6 +30,43 @@
#include <fluent-bit/flb_io_tls.h>
#include <fluent-bit/flb_kernel.h>

struct flb_service_config service_configs[] = {
{FLB_CONF_STR_FLUSH,
FLB_CONF_TYPE_INT,
offsetof(struct flb_config, flush)},

{FLB_CONF_STR_DAEMON,
FLB_CONF_TYPE_BOOL,
offsetof(struct flb_config, daemon)},

{FLB_CONF_STR_LOGLEVEL,
FLB_CONF_TYPE_STR,
offsetof(struct flb_config, log)},

#ifdef FLB_HAVE_HTTP
{FLB_CONF_STR_HTTP_MONITOR,
FLB_CONF_TYPE_BOOL,
offsetof(struct flb_config, http_server)},

{FLB_CONF_STR_HTTP_PORT,
FLB_CONF_TYPE_STR,
offsetof(struct flb_config, http_port)},
#endif

#ifdef FLB_HAVE_BUFFERING
{FLB_CONF_STR_BUFFER_PATH,
FLB_CONF_TYPE_STR,
offsetof(struct flb_config, buffer_path)},

{FLB_CONF_STR_BUFFER_WORKERS,
FLB_CONF_TYPE_INT,
offsetof(struct flb_config, buffer_workers)},
#endif

{NULL, FLB_CONF_TYPE_OTHER, 0} /* end of array */
};


struct flb_config *flb_config_init()
{
struct flb_config *config;
Expand Down Expand Up @@ -175,3 +213,96 @@ char *flb_config_prop_get(char *key, struct mk_list *list)

return NULL;
}

static inline int prop_key_check(char *key, char *kv, int k_len)
{
size_t len;

len = strnlen(key,256);
if (strncasecmp(key, kv, k_len) == 0 && len == k_len) {
return 0;
}
return -1;
}

static int set_log_level(struct flb_config *config, char *v_str)
{
if (v_str != NULL && config->log != NULL) {
if (strcasecmp(v_str, "error") == 0) {
config->log->level = 1;
}
else if (strcasecmp(v_str, "warning") == 0) {
config->log->level = 2;
}
else if (strcasecmp(v_str, "info") == 0) {
config->log->level = 3;
}
else if (strcasecmp(v_str, "debug") == 0) {
config->log->level = 4;
}
else if (strcasecmp(v_str, "trace") == 0) {
config->log->level = 5;
}
else {
return -1;
}
}else{
flb_error("Not set log level");
}
return 0;
}

static inline int atobool(char*v)
{
return (strncasecmp("true", v, 256) == 0)
? FLB_TRUE
: FLB_FALSE;
}

int flb_config_set_property(struct flb_config *config,
char *k, char *v)
{
int i=0;
int ret = -1;
int* i_val = NULL;
char* s_val = NULL;
size_t len = strnlen(k, 256);
char* key = service_configs[0].key;

while( key != NULL ){
if ( prop_key_check(key, k,len) == 0) {
if ( !strncasecmp(key, FLB_CONF_STR_LOGLEVEL ,256) ) {
ret = set_log_level(config, v);
}else{
ret = 0;
switch(service_configs[i].type){
case FLB_CONF_TYPE_INT:
i_val = (char*)config + service_configs[i].offset;
*i_val = atoi(v);
break;

case FLB_CONF_TYPE_BOOL:
i_val = (char*)config+service_configs[i].offset;
*i_val = atobool(v);
break;

case FLB_CONF_TYPE_STR:
s_val = (char*)config+service_configs[i].offset;
s_val = strdup(v);
break;

default:
ret = -1;
}
}

if (ret < 0) {
flb_error("config parameter error");
return -1;
}
return 0;
}
key = service_configs[++i].key;
}
return 0;
}
28 changes: 28 additions & 0 deletions src/flb_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,34 @@ int flb_output_set(flb_output_t *output, ...)
return 0;
}

/* Set a service property */
int flb_service_set(flb_ctx_t *ctx, ...)
{
int ret;
char *key;
char *value;
va_list va;

va_start(va, ctx);

while ((key = va_arg(va, char *))) {
value = va_arg(va, char *);
if (!value) {
/* Wrong parameter */
return -1;
}

ret = flb_config_set_property(ctx->config, key, value);
if (ret != 0) {
va_end(va);
return -1;
}
}

va_end(va);
return 0;
}

/* Load a configuration file that may be used by the input or output plugin */
int flb_lib_config_file(struct flb_lib_ctx *ctx, char *path)
{
Expand Down
4 changes: 3 additions & 1 deletion tests/flb_test_engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,14 @@ int check_routing(const char* tag, const char* match, bool expect)
EXPECT_TRUE(output != NULL);
flb_output_set(output, "match", match, NULL);

flb_service_set(ctx, "Flush", "1", "Daemon", "false", NULL);

ret = flb_start(ctx);
EXPECT_EQ(ret, 0);

/* start test */
flb_lib_push(input, str, strlen(str));
sleep(5);/*waiting flush*/
sleep(1);/*waiting flush*/

pthread_mutex_lock(&result_mutex);
ret = result;
Expand Down

0 comments on commit a0a41a5

Please sign in to comment.