Skip to content

Commit 9e97f81

Browse files
authored
Merge pull request #5424 from HofiOne/add-without-orphaned-option-to-stats
Add `without-orphaned-metrics` option to stats
2 parents 90011b2 + fafec98 commit 9e97f81

File tree

12 files changed

+102
-35
lines changed

12 files changed

+102
-35
lines changed

lib/logproto/logproto-http-scraper-responder-server.c

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,18 @@ _compose_response_body(LogProtoHTTPServer *s)
7272
{
7373
stats = g_string_new(NULL);
7474
gpointer args[] = {self, &stats};
75-
gboolean with_legacy = TRUE;
75+
gboolean with_legacy = self->options->stats_with_legacy;
76+
gboolean without_orphaned = self->options->stats_without_orphaned;
7677

7778
msg_trace("Generating stats", evt_tag_str("stat-format", stat_format),
78-
evt_tag_int("with-legacy", with_legacy));
79+
evt_tag_int("with-legacy", with_legacy),
80+
evt_tag_int("without-orphaned", without_orphaned));
7981
if (strcmp(stat_format, "prometheus") == 0)
80-
stats_generate_prometheus(_generate_batched_response, args, with_legacy, &cancelled);
82+
stats_generate_prometheus(_generate_batched_response, args, with_legacy, without_orphaned, &cancelled);
8183
else
8284
{
8385
gboolean csv = (strcmp(stat_format, "csv") == 0);
84-
stats_generate_csv_or_kv(_generate_batched_response, args, csv, FALSE, &cancelled);
86+
stats_generate_csv_or_kv(_generate_batched_response, args, csv, FALSE, without_orphaned, &cancelled);
8587
}
8688
}
8789
else
@@ -329,3 +331,21 @@ log_proto_http_scraper_responder_options_set_stat_format(LogProtoServerOptionsSt
329331
}
330332
return FALSE;
331333
}
334+
335+
void
336+
log_proto_http_scraper_responder_options_set_stats_without_orpaned(LogProtoServerOptionsStorage *options_storage,
337+
gboolean value)
338+
{
339+
LogProtoHTTPScraperResponderOptions *options = &((LogProtoHTTPScraperResponderOptionsStorage *)options_storage)->super;
340+
341+
options->stats_without_orphaned = value;
342+
}
343+
344+
void
345+
log_proto_http_scraper_responder_options_set_stats_with_legacy(LogProtoServerOptionsStorage *options_storage,
346+
gboolean value)
347+
{
348+
LogProtoHTTPScraperResponderOptions *options = &((LogProtoHTTPScraperResponderOptionsStorage *)options_storage)->super;
349+
350+
options->stats_with_legacy = value;
351+
}

lib/logproto/logproto-http-scraper-responder-server.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ typedef struct _LogProtoHTTPScraperResponderOptions
4040
gchar *stat_query;
4141
gchar *stat_format;
4242
gboolean single_instance;
43+
gboolean stats_without_orphaned;
44+
gboolean stats_with_legacy;
4345

4446
} LogProtoHTTPScraperResponderOptions;
4547

@@ -85,6 +87,12 @@ void log_proto_http_scraper_responder_options_set_stat_query(
8587
gboolean log_proto_http_scraper_responder_options_set_stat_format(
8688
LogProtoServerOptionsStorage *options,
8789
const gchar *value);
90+
void log_proto_http_scraper_responder_options_set_stats_without_orpaned(
91+
LogProtoServerOptionsStorage *options_storage,
92+
gboolean value);
93+
void log_proto_http_scraper_responder_options_set_stats_with_legacy(
94+
LogProtoServerOptionsStorage *options_storage,
95+
gboolean value);
8896

8997
LogProtoServer *log_proto_http_scraper_responder_server_new(
9098
LogTransport *transport,

lib/logproto/tests/test-http-scraper-responder-server.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ test_empty_crnl_multiline_at_eof(LogTransportMockConstructor log_transport_mock_
136136
// Mock of LogProtoHTTPScraperResponder::stats_generate_prometheus
137137
void
138138
stats_generate_prometheus(StatsPrometheusRecordFunc process_record, gpointer user_data, gboolean with_legacy,
139-
gboolean *cancelled)
139+
gboolean without_orphaned, gboolean *cancelled)
140140
{
141141
gpointer *args = (gpointer *)user_data;
142142
GString *result = *(GString **)args[1];

lib/stats/stats-control.c

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,39 @@ static void
7878
control_connection_send_stats(ControlConnection *cc, GString *command, gpointer user_data, gboolean *cancelled)
7979
{
8080
gchar **cmds = g_strsplit(command->str, " ", 3);
81-
g_assert(g_str_equal(cmds[0], "STATS"));
82-
g_assert(cmds[1] != NULL && "STATS command must have at least one format argument");
81+
gsize cmd_ndx = 0;
82+
g_assert(g_str_equal(cmds[cmd_ndx], "STATS"));
83+
++cmd_ndx;
84+
g_assert(cmds[cmd_ndx] != NULL && "STATS command must have at least one format argument");
8385

8486
GString *response = NULL;
8587
gpointer args[] = {cc, &response};
8688

87-
if (strcmp(cmds[1], "PROMETHEUS") == 0)
89+
if (strcmp(cmds[cmd_ndx], "PROMETHEUS") == 0)
8890
{
89-
gboolean with_legacy = g_strcmp0(cmds[2], "WITH_LEGACY") == 0;
90-
stats_generate_prometheus(_send_batched_response, args, with_legacy, cancelled);
91+
gboolean with_legacy = g_strcmp0(cmds[cmd_ndx + 1], "WITH_LEGACY") == 0;
92+
if (with_legacy)
93+
++cmd_ndx;
94+
gboolean without_orphaned = g_strcmp0(cmds[cmd_ndx + 1], "WITHOUT_ORPHANED") == 0;
95+
// NOTE: do not forget to increment cmd_ndx if new commands added later
96+
// now just commented out to avoid compiler warning
97+
// if (without_orphaned)
98+
// ++cmd_ndx;
99+
stats_generate_prometheus(_send_batched_response, args, with_legacy, without_orphaned, cancelled);
91100
}
92101
else
93102
{
94-
gboolean csv = strcmp(cmds[1], "CSV") == 0;
95-
g_assert(csv || strcmp(cmds[1], "KV") == 0);
96-
gboolean without_header = g_strcmp0(cmds[2], "WITHOUT_HEADER") == 0;
97-
stats_generate_csv_or_kv(_send_batched_response, args, csv, FALSE == without_header, cancelled);
103+
gboolean csv = strcmp(cmds[cmd_ndx], "CSV") == 0;
104+
g_assert(csv || strcmp(cmds[cmd_ndx], "KV") == 0);
105+
gboolean without_header = g_strcmp0(cmds[cmd_ndx + 1], "WITHOUT_HEADER") == 0;
106+
if (without_header)
107+
++cmd_ndx;
108+
gboolean without_orphaned = g_strcmp0(cmds[cmd_ndx + 1], "WITHOUT_ORPHANED") == 0;
109+
// NOTE: do not forget to increment cmd_ndx if new commands added later
110+
// now just commented out to avoid compiler warning
111+
// if (without_orphaned)
112+
// ++cmd_ndx;
113+
stats_generate_csv_or_kv(_send_batched_response, args, csv, FALSE == without_header, without_orphaned, cancelled);
98114
}
99115

100116
if (response != NULL)

lib/stats/stats-csv.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ stats_format_csv_or_kv(StatsCluster *sc, gint type, StatsCounterItem *counter, g
9797
StatsCSVRecordFunc process_record = (StatsCSVRecordFunc) args[0];
9898
gpointer process_record_arg = args[1];
9999
gboolean csv = GPOINTER_TO_INT(args[2]);
100+
gboolean without_orphaned = GPOINTER_TO_INT(args[3]);
101+
102+
if (without_orphaned && stats_cluster_is_orphaned(sc))
103+
return;
100104

101105
ScratchBuffersMarker marker;
102106
scratch_buffers_mark(&marker);
@@ -119,7 +123,7 @@ stats_format_csv_or_kv(StatsCluster *sc, gint type, StatsCounterItem *counter, g
119123

120124
void
121125
stats_generate_csv_or_kv(StatsCSVRecordFunc process_record, gpointer user_data, gboolean csv, gboolean with_header,
122-
gboolean *cancelled)
126+
gboolean without_orphaned, gboolean *cancelled)
123127
{
124128
if (with_header && csv)
125129
{
@@ -130,7 +134,7 @@ stats_generate_csv_or_kv(StatsCSVRecordFunc process_record, gpointer user_data,
130134
process_record(header->str, user_data);
131135
g_string_free(header, TRUE);
132136
}
133-
gpointer format_args[] = {process_record, user_data, GINT_TO_POINTER(csv)};
137+
gpointer format_args[] = {process_record, user_data, GINT_TO_POINTER(csv), GINT_TO_POINTER(without_orphaned)};
134138
stats_lock();
135139
stats_foreach_legacy_counter(stats_format_csv_or_kv, format_args, cancelled);
136140
stats_unlock();

lib/stats/stats-csv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ typedef void (*StatsCSVRecordFunc)(const char *record, gpointer user_data);
3232
GString *stats_csv_format_counter(StatsCluster *sc, gint type, StatsCounterItem *counter);
3333

3434
void stats_generate_csv_or_kv(StatsCSVRecordFunc process_record, gpointer user_data, gboolean csv,
35-
gboolean with_header, gboolean *cancelled);
35+
gboolean with_header, gboolean without_orphaned, gboolean *cancelled);
3636

3737
#endif

lib/stats/stats-prometheus.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,11 +294,12 @@ stats_format_prometheus(StatsCluster *sc, gint type, StatsCounterItem *counter,
294294
StatsPrometheusRecordFunc process_record = (StatsPrometheusRecordFunc) args[0];
295295
gpointer process_record_arg = args[1];
296296
gboolean with_legacy = GPOINTER_TO_INT(args[2]);
297+
gboolean without_orphaned = GPOINTER_TO_INT(args[3]);
297298

298299
if (!sc->key.name && !with_legacy)
299300
return;
300301

301-
if (stats_cluster_is_orphaned(sc))
302+
if (without_orphaned && stats_cluster_is_orphaned(sc))
302303
return;
303304

304305
ScratchBuffersMarker marker;
@@ -314,9 +315,9 @@ stats_format_prometheus(StatsCluster *sc, gint type, StatsCounterItem *counter,
314315

315316
void
316317
stats_generate_prometheus(StatsPrometheusRecordFunc process_record, gpointer user_data, gboolean with_legacy,
317-
gboolean *cancelled)
318+
gboolean without_orphaned, gboolean *cancelled)
318319
{
319-
gpointer format_prometheus_args[] = {process_record, user_data, GINT_TO_POINTER(with_legacy)};
320+
gpointer format_prometheus_args[] = {process_record, user_data, GINT_TO_POINTER(with_legacy), GINT_TO_POINTER(without_orphaned)};
320321
stats_lock();
321322
stats_foreach_counter(stats_format_prometheus, format_prometheus_args, cancelled);
322323
stats_unlock();

lib/stats/stats-prometheus.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ typedef void (*StatsPrometheusRecordFunc)(const char *record, gpointer user_data
3333
GString *stats_prometheus_format_counter(StatsCluster *sc, gint type, StatsCounterItem *counter);
3434

3535
void stats_generate_prometheus(StatsPrometheusRecordFunc process_record, gpointer user_data, gboolean with_legacy,
36-
gboolean *cancelled);
36+
gboolean without_orphaned, gboolean *cancelled);
3737

3838
#endif

modules/afsocket/afsocket-grammar.ym

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ systemd_syslog_grammar_set_source_driver(SystemDSyslogSourceDriver *sd)
152152
%token KW_STAT_TYPE
153153
%token KW_STAT_QUERY
154154
%token KW_STAT_FORMAT
155+
%token KW_STATS_WITHOUT_ORPHANED
156+
%token KW_STATS_WITH_LEGACY
155157

156158
%token KW_IP_TTL
157159
%token KW_SO_BROADCAST
@@ -490,6 +492,8 @@ stats_option
490492
: KW_STAT_TYPE '(' string ')' { CHECK_ERROR(log_proto_http_scraper_responder_options_set_stat_type(last_proto_server_options, $3), @3, "Invalid prometheus scraper stat type: %s", $3); free($3); }
491493
| KW_STAT_QUERY '(' string ')' { log_proto_http_scraper_responder_options_set_stat_query(last_proto_server_options, $3); free($3); }
492494
| KW_STAT_FORMAT '(' string ')' { CHECK_ERROR(log_proto_http_scraper_responder_options_set_stat_format(last_proto_server_options, $3), @3, "Invalid prometheus scraper stat format: %s", $3); free($3); }
495+
| KW_STATS_WITHOUT_ORPHANED '(' yesno ')' { log_proto_http_scraper_responder_options_set_stats_without_orpaned(last_proto_server_options, $3); }
496+
| KW_STATS_WITH_LEGACY '(' yesno ')' { log_proto_http_scraper_responder_options_set_stats_with_legacy(last_proto_server_options, $3); }
493497
;
494498

495499
stats_options

modules/afsocket/afsocket-parser.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ int afsocket_parse(CfgLexer *lexer, LogDriver **instance, gpointer arg);
3232

3333
static CfgLexerKeyword afsocket_keywords[] =
3434
{
35-
{ "unix_dgram", KW_UNIX_DGRAM },
36-
{ "unix_stream", KW_UNIX_STREAM },
35+
{ "unix_dgram", KW_UNIX_DGRAM },
36+
{ "unix_stream", KW_UNIX_STREAM },
3737
{ "udp", KW_UDP },
3838
{ "tcp", KW_TCP },
3939
{ "syslog", KW_SYSLOG },
@@ -47,6 +47,8 @@ static CfgLexerKeyword afsocket_keywords[] =
4747
{ "stat_type", KW_STAT_TYPE},
4848
{ "stat_query", KW_STAT_QUERY},
4949
{ "stat_format", KW_STAT_FORMAT},
50+
{ "stats_without_orphaned", KW_STATS_WITHOUT_ORPHANED },
51+
{ "stats_with_legacy", KW_STATS_WITH_LEGACY },
5052

5153
#if SYSLOG_NG_ENABLE_IPV6
5254
{ "udp6", KW_UDP6 },

0 commit comments

Comments
 (0)