Skip to content

Commit 87194d7

Browse files
braydonkedsiper
authored andcommitted
parser: add support for time_system_timezone
Signed-off-by: Eduardo Silva <[email protected]>
1 parent 1009138 commit 87194d7

File tree

6 files changed

+35
-9
lines changed

6 files changed

+35
-9
lines changed

include/fluent-bit/flb_parser.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct flb_parser {
4848
char *time_fmt_full; /* original given time format */
4949
char *time_key; /* field name that contains the time */
5050
int time_offset; /* fixed UTC offset */
51+
int time_system_timezone; /* use the system timezone as a fallback */
5152
int time_keep; /* keep time field */
5253
int time_strict; /* parse time field strictly */
5354
int logfmt_no_bare_keys; /* in logfmt parsers, require all keys to have values */
@@ -74,13 +75,18 @@ enum {
7475
FLB_PARSER_TYPE_HEX,
7576
};
7677

77-
static inline time_t flb_parser_tm2time(const struct flb_tm *src)
78+
static inline time_t flb_parser_tm2time(const struct flb_tm *src,
79+
int use_system_timezone)
7880
{
7981
struct tm tmp;
8082
time_t res;
8183

8284
tmp = src->tm;
83-
res = timegm(&tmp) - flb_tm_gmtoff(src);
85+
if (use_system_timezone) {
86+
res = mktime(&tmp);
87+
} else {
88+
res = timegm(&tmp) - flb_tm_gmtoff(src);
89+
}
8490
return res;
8591
}
8692

@@ -92,6 +98,7 @@ struct flb_parser *flb_parser_create(const char *name, const char *format,
9298
const char *time_offset,
9399
int time_keep,
94100
int time_strict,
101+
int time_system_timezone,
95102
int logfmt_no_bare_keys,
96103
struct flb_parser_types *types,
97104
int types_len,

src/flb_parser.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ struct flb_parser *flb_parser_create(const char *name, const char *format,
152152
const char *time_offset,
153153
int time_keep,
154154
int time_strict,
155+
int time_system_timezone,
155156
int logfmt_no_bare_keys,
156157
struct flb_parser_types *types,
157158
int types_len,
@@ -312,8 +313,17 @@ struct flb_parser *flb_parser_create(const char *name, const char *format,
312313
p->time_frac_secs = (tmp + 2);
313314
}
314315

315-
/* Optional fixed timezone offset */
316-
if (time_offset) {
316+
/*
317+
* Fall back to the system timezone
318+
* if there is no zone parsed from the log.
319+
*/
320+
p->time_system_timezone = time_system_timezone;
321+
322+
/*
323+
* Optional fixed timezone offset, only applied if
324+
* not falling back to system timezone.
325+
*/
326+
if (!p->time_system_timezone && time_offset) {
317327
diff = 0;
318328
len = strlen(time_offset);
319329
ret = flb_parser_tzone_offset(time_offset, len, &diff);
@@ -487,6 +497,7 @@ static int parser_conf_file(const char *cfg, struct flb_cf *cf,
487497
int skip_empty;
488498
int time_keep;
489499
int time_strict;
500+
int time_system_timezone;
490501
int logfmt_no_bare_keys;
491502
int types_len;
492503
struct mk_list *head;
@@ -561,6 +572,13 @@ static int parser_conf_file(const char *cfg, struct flb_cf *cf,
561572
flb_sds_destroy(tmp_str);
562573
}
563574

575+
time_system_timezone = FLB_FALSE;
576+
tmp_str = get_parser_key(config, cf, s, "time_system_timezone");
577+
if (tmp_str) {
578+
time_system_timezone = flb_utils_bool(tmp_str);
579+
flb_sds_destroy(tmp_str);
580+
}
581+
564582
/* time_offset (UTC offset) */
565583
time_offset = get_parser_key(config, cf, s, "time_offset");
566584

@@ -587,7 +605,8 @@ static int parser_conf_file(const char *cfg, struct flb_cf *cf,
587605
/* Create the parser context */
588606
if (!flb_parser_create(name, format, regex, skip_empty,
589607
time_fmt, time_key, time_offset, time_keep, time_strict,
590-
logfmt_no_bare_keys, types, types_len, decoders, config)) {
608+
time_system_timezone, logfmt_no_bare_keys, types, types_len,
609+
decoders, config)) {
591610
goto fconf_error;
592611
}
593612

src/flb_parser_json.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ int flb_parser_json_do(struct flb_parser *parser,
207207
skip = map_size;
208208
}
209209
else {
210-
time_lookup = flb_parser_tm2time(&tm);
210+
time_lookup = flb_parser_tm2time(&tm, parser->time_system_timezone);
211211
}
212212

213213
/* Compose a new map without the time_key field */

src/flb_parser_logfmt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ static int logfmt_parser(struct flb_parser *parser,
166166
parser->name, parser->time_fmt_full);
167167
return -1;
168168
}
169-
*time_lookup = flb_parser_tm2time(&tm);
169+
*time_lookup = flb_parser_tm2time(&tm, parser->time_system_timezone);
170170
}
171171
time_found = FLB_TRUE;
172172
}

src/flb_parser_ltsv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ static int ltsv_parser(struct flb_parser *parser,
139139
parser->name, parser->time_fmt_full);
140140
return -1;
141141
}
142-
*time_lookup = flb_parser_tm2time(&tm);
142+
*time_lookup = flb_parser_tm2time(&tm, parser->time_system_timezone);
143143
}
144144
time_found = FLB_TRUE;
145145
}

src/flb_parser_regex.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ static void cb_results(const char *name, const char *value,
8787
}
8888

8989
pcb->time_frac = frac;
90-
pcb->time_lookup = flb_parser_tm2time(&tm);
90+
pcb->time_lookup = flb_parser_tm2time(&tm, parser->time_system_timezone);
9191

9292
if (parser->time_keep == FLB_FALSE) {
9393
pcb->num_skipped++;

0 commit comments

Comments
 (0)