Skip to content

Commit ebe250e

Browse files
committed
out_syslog: support nested keys using record accessors
Signed-off-by: Simon Bouchard <sbouchard@rbbn.com>
1 parent c02e4a3 commit ebe250e

File tree

4 files changed

+448
-107
lines changed

4 files changed

+448
-107
lines changed

plugins/out_syslog/syslog.c

Lines changed: 128 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#include <fluent-bit/flb_pack.h>
2626
#include <fluent-bit/flb_sds.h>
2727
#include <fluent-bit/flb_log_event_decoder.h>
28+
#include <fluent-bit/flb_record_accessor.h>
29+
#include <fluent-bit/flb_ra_key.h>
2830

2931
#include "syslog_conf.h"
3032

@@ -545,100 +547,68 @@ static flb_sds_t msgpack_to_sd(struct flb_syslog *ctx,
545547
return *s;
546548
}
547549

550+
/* Use val array to return its string value unless its a string and return its pointer */
551+
static void extract_value_from_ra_result(struct flb_ra_value *rval, char** val,
552+
int val_size, int *val_len) {
553+
if (rval->o.type == MSGPACK_OBJECT_BOOLEAN) {
554+
*val = rval->o.via.boolean ? "true" : "false";
555+
*val_len = rval->o.via.boolean ? 4 : 5;
556+
}
557+
else if (rval->o.type == MSGPACK_OBJECT_POSITIVE_INTEGER) {
558+
*val_len = snprintf(*val, val_size - 1,
559+
"%" PRIu64, rval->o.via.u64);
560+
}
561+
else if (rval->o.type == MSGPACK_OBJECT_NEGATIVE_INTEGER) {
562+
*val_len = snprintf(*val, val_size - 1,
563+
"%" PRId64, rval->o.via.i64);
564+
}
565+
else if (rval->o.type == MSGPACK_OBJECT_FLOAT) {
566+
*val_len = snprintf(*val, val_size - 1,
567+
"%f", rval->o.via.f64);
568+
}
569+
else if (rval->o.type == MSGPACK_OBJECT_STR) {
570+
/* String value */
571+
*val = rval->o.via.str.ptr;
572+
*val_len = rval->o.via.str.size;
573+
}
574+
else if (rval->o.type == MSGPACK_OBJECT_BIN) {
575+
/* Bin value */
576+
*val = rval->o.via.bin.ptr;
577+
*val_len = rval->o.via.bin.size;
578+
}
579+
else {
580+
*val = NULL;
581+
*val_len = 0;
582+
}
583+
}
584+
548585
static int msgpack_to_syslog(struct flb_syslog *ctx, msgpack_object *o,
549586
struct syslog_msg *msg)
550587
{
551588
int i;
552-
int loop;
553589
struct mk_list *head;
554-
struct flb_config_map_val *mv;
590+
struct mk_list *tmp;
591+
struct flb_syslog_sd_key *sd_key_item;
592+
struct flb_ra_value *rval = NULL;
593+
char *val = NULL;
594+
int val_len = 0;
595+
char temp[48] = {0};
555596

556597
if (o == NULL) {
557598
return -1;
558599
}
559600

560-
loop = o->via.map.size;
561-
if (loop != 0) {
562-
msgpack_object_kv *p = o->via.map.ptr;
563-
564-
for (i = 0; i < loop; i++) {
565-
char temp[48] = {0};
566-
const char *key = NULL;
567-
int key_len = 0;
568-
const char *val = NULL;
569-
int val_len = 0;
570-
571-
msgpack_object *k = &p[i].key;
572-
msgpack_object *v = &p[i].val;
573-
574-
if (k->type != MSGPACK_OBJECT_BIN && k->type != MSGPACK_OBJECT_STR){
575-
continue;
576-
}
577-
578-
if (k->type == MSGPACK_OBJECT_STR) {
579-
key = k->via.str.ptr;
580-
key_len = k->via.str.size;
581-
}
582-
else {
583-
key = k->via.bin.ptr;
584-
key_len = k->via.bin.size;
585-
}
586-
587-
if (v->type == MSGPACK_OBJECT_MAP) {
588-
if (ctx->sd_keys) {
589-
flb_config_map_foreach(head, mv, ctx->sd_keys) {
590-
if ((key_len == flb_sds_len(mv->val.str)) &&
591-
strncmp(key, mv->val.str, flb_sds_len(mv->val.str)) == 0) {
592-
msgpack_to_sd(ctx, &(msg->sd), key, key_len, v);
593-
break;
594-
}
595-
}
596-
}
597-
continue;
598-
}
599-
600-
if (v->type == MSGPACK_OBJECT_BOOLEAN) {
601-
val = v->via.boolean ? "true" : "false";
602-
val_len = v->via.boolean ? 4 : 5;
603-
}
604-
else if (v->type == MSGPACK_OBJECT_POSITIVE_INTEGER) {
601+
if (ctx->ra_severity_key != NULL) {
602+
if (msg->severity == -1) {
603+
rval = flb_ra_get_value_object(ctx->ra_severity_key, *o);
604+
if (rval) {
605605
val = temp;
606-
val_len = snprintf(temp, sizeof(temp) - 1,
607-
"%" PRIu64, v->via.u64);
608-
}
609-
else if (v->type == MSGPACK_OBJECT_NEGATIVE_INTEGER) {
610-
val = temp;
611-
val_len = snprintf(temp, sizeof(temp) - 1,
612-
"%" PRId64, v->via.i64);
613-
}
614-
else if (v->type == MSGPACK_OBJECT_FLOAT) {
615-
val = temp;
616-
val_len = snprintf(temp, sizeof(temp) - 1,
617-
"%f", v->via.f64);
618-
}
619-
else if (v->type == MSGPACK_OBJECT_STR) {
620-
/* String value */
621-
val = v->via.str.ptr;
622-
val_len = v->via.str.size;
623-
}
624-
else if (v->type == MSGPACK_OBJECT_BIN) {
625-
/* Bin value */
626-
val = v->via.bin.ptr;
627-
val_len = v->via.bin.size;
628-
}
629-
630-
if (!val || !key) {
631-
continue;
632-
}
633-
634-
if ((ctx->severity_key != NULL) &&
635-
flb_sds_cmp(ctx->severity_key, key, key_len) == 0) {
636-
if (msg->severity == -1) {
606+
extract_value_from_ra_result(rval, &val, sizeof(temp) - 1, &val_len);
607+
if (val != NULL) {
637608
if ((val_len == 1) && (val[0] >= '0' && val[0] <= '7')) {
638609
msg->severity = val[0]-'0';
639610
}
640611
else {
641-
int i;
642612
for (i=0; syslog_severity[i].name != NULL; i++) {
643613
if ((syslog_severity[i].len == val_len) &&
644614
(!strncasecmp(syslog_severity[i].name, val, val_len))) {
@@ -651,10 +621,17 @@ static int msgpack_to_syslog(struct flb_syslog *ctx, msgpack_object *o,
651621
}
652622
}
653623
}
624+
flb_ra_key_value_destroy(rval);
654625
}
655-
else if ((ctx->facility_key != NULL) &&
656-
flb_sds_cmp(ctx->facility_key, key, key_len) == 0) {
657-
if (msg->facility == -1) {
626+
}
627+
}
628+
if (ctx->ra_facility_key != NULL) {
629+
if (msg->facility == -1) {
630+
rval = flb_ra_get_value_object(ctx->ra_facility_key, *o);
631+
if (rval) {
632+
val = temp;
633+
extract_value_from_ra_result(rval, &val, sizeof(temp) - 1, &val_len);
634+
if (val != NULL) {
658635
if ((val_len == 1) && (val[0] >= '0' && val[0] <= '9')) {
659636
msg->facility = val[0]-'0';
660637
}
@@ -670,7 +647,6 @@ static int msgpack_to_syslog(struct flb_syslog *ctx, msgpack_object *o,
670647
}
671648
}
672649
else {
673-
int i;
674650
for (i=0; syslog_facility[i].name != NULL; i++) {
675651
if ((syslog_facility[i].len == val_len) &&
676652
(!strncasecmp(syslog_facility[i].name, val, val_len))) {
@@ -683,36 +659,81 @@ static int msgpack_to_syslog(struct flb_syslog *ctx, msgpack_object *o,
683659
}
684660
}
685661
}
662+
flb_ra_key_value_destroy(rval);
686663
}
687-
else if ((ctx->hostname_key != NULL) &&
688-
flb_sds_cmp(ctx->hostname_key, key, key_len) == 0) {
689-
if (!msg->hostname) {
690-
msg->hostname = flb_sds_create_len(val, val_len);
691-
}
664+
}
665+
}
666+
667+
if (ctx->ra_hostname_key != NULL) {
668+
rval = flb_ra_get_value_object(ctx->ra_hostname_key, *o);
669+
if (rval) {
670+
val = temp;
671+
extract_value_from_ra_result(rval, &val, sizeof(temp) - 1, &val_len);
672+
if (!msg->hostname) {
673+
msg->hostname = flb_sds_create_len(val, val_len);
692674
}
693-
else if ((ctx->appname_key != NULL) &&
694-
flb_sds_cmp(ctx->appname_key, key, key_len) == 0) {
695-
if (!msg->appname) {
696-
msg->appname = flb_sds_create_len(val, val_len);
697-
}
675+
flb_ra_key_value_destroy(rval);
676+
}
677+
}
678+
679+
if (ctx->ra_appname_key != NULL) {
680+
rval = flb_ra_get_value_object(ctx->ra_appname_key, *o);
681+
if (rval) {
682+
val = temp;
683+
extract_value_from_ra_result(rval, &val, sizeof(temp) - 1, &val_len);
684+
if (!msg->appname) {
685+
msg->appname = flb_sds_create_len(val, val_len);
698686
}
699-
else if ((ctx->procid_key != NULL) &&
700-
flb_sds_cmp(ctx->procid_key, key, key_len) == 0) {
701-
if (!msg->procid) {
702-
msg->procid = flb_sds_create_len(val, val_len);
703-
}
687+
flb_ra_key_value_destroy(rval);
688+
}
689+
}
690+
691+
if (ctx->ra_procid_key != NULL) {
692+
rval = flb_ra_get_value_object(ctx->ra_procid_key, *o);
693+
if (rval) {
694+
val = temp;
695+
extract_value_from_ra_result(rval, &val, sizeof(temp) - 1, &val_len);
696+
if (!msg->procid) {
697+
msg->procid = flb_sds_create_len(val, val_len);
704698
}
705-
else if ((ctx->msgid_key != NULL) &&
706-
flb_sds_cmp(ctx->msgid_key, key, key_len) == 0) {
707-
if (!msg->msgid) {
708-
msg->msgid = flb_sds_create_len(val, val_len);
709-
}
699+
flb_ra_key_value_destroy(rval);
700+
}
701+
}
702+
703+
if (ctx->ra_msgid_key != NULL) {
704+
rval = flb_ra_get_value_object(ctx->ra_msgid_key, *o);
705+
if (rval) {
706+
val = temp;
707+
extract_value_from_ra_result(rval, &val, sizeof(temp) - 1, &val_len);
708+
if (!msg->msgid) {
709+
msg->msgid = flb_sds_create_len(val, val_len);
710+
}
711+
flb_ra_key_value_destroy(rval);
712+
}
713+
}
714+
715+
if (ctx->ra_message_key != NULL) {
716+
rval = flb_ra_get_value_object(ctx->ra_message_key, *o);
717+
if (rval) {
718+
val = temp;
719+
extract_value_from_ra_result(rval, &val, sizeof(temp) - 1, &val_len);
720+
if (!msg->message) {
721+
msg->message = flb_sds_create_len(val, val_len);
710722
}
711-
else if ((ctx->message_key != NULL) &&
712-
flb_sds_cmp(ctx->message_key, key, key_len) == 0) {
713-
if (!msg->message) {
714-
msg->message = flb_sds_create_len(val, val_len);
723+
flb_ra_key_value_destroy(rval);
724+
}
725+
}
726+
727+
if (ctx->ra_sd_keys != NULL) {
728+
mk_list_foreach_safe(head, tmp, ctx->ra_sd_keys) {
729+
sd_key_item = mk_list_entry(head, struct flb_syslog_sd_key, _head);
730+
rval = flb_ra_get_value_object(sd_key_item->ra_sd_key, *o);
731+
if (rval) {
732+
if (rval->o.type == MSGPACK_OBJECT_MAP) {
733+
msgpack_to_sd(ctx, &(msg->sd), sd_key_item->key_normalized,
734+
flb_sds_len(sd_key_item->key_normalized), &rval->o);
715735
}
736+
flb_ra_key_value_destroy(rval);
716737
}
717738
}
718739
}

0 commit comments

Comments
 (0)