Skip to content

Commit 60c0047

Browse files
authored
logs enhancements (netdata#20027)
* allow filtering on fields, without making them facets * show all values on histogram * histogram now has both ids and names for dimensions * added colors for PRIORITY on linux and LEVEL on windows * Revert "added colors for PRIORITY on linux and LEVEL on windows" This reverts commit f93ce72.
1 parent b70a62a commit 60c0047

3 files changed

Lines changed: 72 additions & 49 deletions

File tree

src/libnetdata/facets/facets.c

Lines changed: 69 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,7 +1067,7 @@ static inline void facets_key_value_transformed(FACETS *facets, FACET_KEY *k, FA
10671067
buffer_strcat(dst, facets_key_value_cached(k, v, facets->report.used_hashes_registry));
10681068
}
10691069

1070-
static inline void facets_histogram_value_names(BUFFER *wb, FACETS *facets __maybe_unused, FACET_KEY *k, const char *key, const char *first_key) {
1070+
static inline void facets_histogram_value_ids(BUFFER *wb, FACETS *facets __maybe_unused, FACET_KEY *k, const char *key, const char *first_key) {
10711071
CLEAN_BUFFER *tb = buffer_create(0, NULL);
10721072

10731073
buffer_json_member_add_array(wb, key);
@@ -1078,9 +1078,25 @@ static inline void facets_histogram_value_names(BUFFER *wb, FACETS *facets __may
10781078
if(k && k->values.enabled) {
10791079
FACET_VALUE *v;
10801080
foreach_value_in_key(k, v) {
1081-
if (unlikely(!v->histogram))
1082-
continue;
1081+
buffer_json_add_array_item_string(wb, facets_key_value_id(k ,v));
1082+
}
1083+
foreach_value_in_key_done(v);
1084+
}
1085+
}
1086+
buffer_json_array_close(wb); // key
1087+
}
1088+
1089+
static inline void facets_histogram_value_names(BUFFER *wb, FACETS *facets __maybe_unused, FACET_KEY *k, const char *key, const char *first_key) {
1090+
CLEAN_BUFFER *tb = buffer_create(0, NULL);
10831091

1092+
buffer_json_member_add_array(wb, key);
1093+
{
1094+
if(first_key)
1095+
buffer_json_add_array_item_string(wb, first_key);
1096+
1097+
if(k && k->values.enabled) {
1098+
FACET_VALUE *v;
1099+
foreach_value_in_key(k, v) {
10841100
facets_key_value_transformed(facets, k, v, tb, FACETS_TRANSFORM_HISTOGRAM);
10851101
buffer_json_add_array_item_string(wb, buffer_tostring(tb));
10861102
}
@@ -1096,9 +1112,6 @@ static inline void facets_histogram_value_colors(BUFFER *wb, FACETS *facets __ma
10961112
if(k && k->values.enabled) {
10971113
FACET_VALUE *v;
10981114
foreach_value_in_key(k, v) {
1099-
if (unlikely(!v->histogram))
1100-
continue;
1101-
11021115
buffer_json_add_array_item_string(wb, v->color);
11031116
}
11041117
foreach_value_in_key_done(v);
@@ -1113,9 +1126,6 @@ static inline void facets_histogram_value_units(BUFFER *wb, FACETS *facets __may
11131126
if(k && k->values.enabled) {
11141127
FACET_VALUE *v;
11151128
foreach_value_in_key(k, v) {
1116-
if (unlikely(!v->histogram))
1117-
continue;
1118-
11191129
buffer_json_add_array_item_string(wb, "events");
11201130
}
11211131
foreach_value_in_key_done(v);
@@ -1130,9 +1140,6 @@ static inline void facets_histogram_value_min(BUFFER *wb, FACETS *facets __maybe
11301140
if(k && k->values.enabled) {
11311141
FACET_VALUE *v;
11321142
foreach_value_in_key(k, v) {
1133-
if (unlikely(!v->histogram))
1134-
continue;
1135-
11361143
buffer_json_add_array_item_uint64(wb, v->min);
11371144
}
11381145
foreach_value_in_key_done(v);
@@ -1147,9 +1154,6 @@ static inline void facets_histogram_value_max(BUFFER *wb, FACETS *facets __maybe
11471154
if(k && k->values.enabled) {
11481155
FACET_VALUE *v;
11491156
foreach_value_in_key(k, v) {
1150-
if (unlikely(!v->histogram))
1151-
continue;
1152-
11531157
buffer_json_add_array_item_uint64(wb, v->max);
11541158
}
11551159
foreach_value_in_key_done(v);
@@ -1164,9 +1168,6 @@ static inline void facets_histogram_value_avg(BUFFER *wb, FACETS *facets __maybe
11641168
if(k && k->values.enabled) {
11651169
FACET_VALUE *v;
11661170
foreach_value_in_key(k, v) {
1167-
if (unlikely(!v->histogram))
1168-
continue;
1169-
11701171
buffer_json_add_array_item_double(wb, (double) v->sum / (double) facets->histogram.slots);
11711172
}
11721173
foreach_value_in_key_done(v);
@@ -1181,9 +1182,6 @@ static inline void facets_histogram_value_arp(BUFFER *wb, FACETS *facets __maybe
11811182
if(k && k->values.enabled) {
11821183
FACET_VALUE *v;
11831184
foreach_value_in_key(k, v) {
1184-
if (unlikely(!v->histogram))
1185-
continue;
1186-
11871185
buffer_json_add_array_item_uint64(wb, 0);
11881186
}
11891187
foreach_value_in_key_done(v);
@@ -1198,10 +1196,10 @@ static inline void facets_histogram_value_con(BUFFER *wb, FACETS *facets __maybe
11981196
if(k && k->values.enabled) {
11991197
FACET_VALUE *v;
12001198
foreach_value_in_key(k, v) {
1201-
if (unlikely(!v->histogram))
1202-
continue;
1203-
1204-
buffer_json_add_array_item_double(wb, (double) v->sum * 100.0 / (double) sum);
1199+
if(sum)
1200+
buffer_json_add_array_item_double(wb, (double) v->sum * 100.0 / (double) sum);
1201+
else
1202+
buffer_json_add_array_item_double(wb, 0.0);
12051203
}
12061204
foreach_value_in_key_done(v);
12071205
}
@@ -1218,8 +1216,10 @@ static void facets_histogram_generate(FACETS *facets, FACET_KEY *k, BUFFER *wb)
12181216
if(k && k->values.enabled) {
12191217
FACET_VALUE *v;
12201218
foreach_value_in_key(k, v) {
1221-
if (unlikely(!v->histogram))
1219+
if (unlikely(!v->histogram)) {
1220+
v->min = v->max = v->sum = 0;
12221221
continue;
1222+
}
12231223

12241224
dimensions++;
12251225

@@ -1377,25 +1377,41 @@ static void facets_histogram_generate(FACETS *facets, FACET_KEY *k, BUFFER *wb)
13771377
FACET_VALUE *v;
13781378

13791379
foreach_value_in_key(k, v) {
1380-
if(unlikely(!v->histogram))
1381-
continue;
1380+
uint64_t d_sl, d_qr;
1381+
uint64_t d_min, d_max;
1382+
double d_avg, d_con;
1383+
1384+
if(likely(v->histogram)) {
1385+
d_sl = d_qr = 1;
1386+
d_min = v->min;
1387+
d_max = v->max;
1388+
d_avg = (double) v->sum / (double) facets->histogram.slots;
1389+
d_con = (double) v->sum * 100.0 / (double) sum;
1390+
}
1391+
else {
1392+
d_sl = d_qr = 0;
1393+
d_min = d_max = 0;
1394+
d_avg = d_con = 0.0;
1395+
}
13821396

13831397
buffer_json_add_array_item_object(wb); // dimension
13841398
{
1399+
buffer_json_member_add_string(wb, "id", facets_key_value_id(k, v));
1400+
13851401
facets_key_value_transformed(facets, k, v, tmp, FACETS_TRANSFORM_HISTOGRAM);
1386-
buffer_json_member_add_string(wb, "id", buffer_tostring(tmp));
1402+
buffer_json_member_add_string(wb, "nm", buffer_tostring(tmp));
13871403
buffer_json_member_add_object(wb, "ds");
13881404
{
1389-
buffer_json_member_add_uint64(wb, "sl", 1);
1390-
buffer_json_member_add_uint64(wb, "qr", 1);
1405+
buffer_json_member_add_uint64(wb, "sl", d_sl);
1406+
buffer_json_member_add_uint64(wb, "qr", d_qr);
13911407
}
13921408
buffer_json_object_close(wb); // ds
13931409
buffer_json_member_add_object(wb, "sts");
13941410
{
1395-
buffer_json_member_add_uint64(wb, "min", v->min);
1396-
buffer_json_member_add_uint64(wb, "max", v->max);
1397-
buffer_json_member_add_double(wb, "avg", (double)v->sum / (double)facets->histogram.slots);
1398-
buffer_json_member_add_double(wb, "con", (double)v->sum * 100.0 / (double)sum);
1411+
buffer_json_member_add_uint64(wb, "min", d_min);
1412+
buffer_json_member_add_uint64(wb, "max", d_max);
1413+
buffer_json_member_add_double(wb, "avg", d_avg);
1414+
buffer_json_member_add_double(wb, "con", d_con);
13991415
}
14001416
buffer_json_object_close(wb); // sts
14011417
buffer_json_member_add_uint64(wb, "pri", pri++);
@@ -1469,12 +1485,13 @@ static void facets_histogram_generate(FACETS *facets, FACET_KEY *k, BUFFER *wb)
14691485

14701486
FACET_VALUE *v;
14711487
foreach_value_in_key(k, v) {
1472-
if (unlikely(!v->histogram))
1473-
continue;
1474-
14751488
buffer_json_add_array_item_array(wb); // point
14761489

1477-
buffer_json_add_array_item_uint64(wb, v->histogram[i]);
1490+
if(v->histogram)
1491+
buffer_json_add_array_item_uint64(wb, v->histogram[i]);
1492+
else
1493+
buffer_json_add_array_item_double(wb, NAN);
1494+
14781495
buffer_json_add_array_item_uint64(wb, 0); // arp - anomaly rate
14791496
buffer_json_add_array_item_uint64(wb, 0); // pa - point annotation
14801497

@@ -1501,7 +1518,8 @@ static void facets_histogram_generate(FACETS *facets, FACET_KEY *k, BUFFER *wb)
15011518
buffer_json_member_add_string(wb, "units", "events");
15021519
buffer_json_member_add_object(wb, "dimensions");
15031520
{
1504-
facets_histogram_value_names(wb, facets, k, "ids", NULL);
1521+
facets_histogram_value_ids(wb, facets, k, "ids", NULL);
1522+
facets_histogram_value_names(wb, facets, k, "names", NULL);
15051523
facets_histogram_value_units(wb, facets, k, "units");
15061524

15071525
buffer_json_member_add_object(wb, "sts");
@@ -1555,7 +1573,7 @@ static void facets_histogram_generate(FACETS *facets, FACET_KEY *k, BUFFER *wb)
15551573
}
15561574
buffer_json_array_close(wb); // grouped_by
15571575

1558-
facets_histogram_value_names(wb, facets, k, "ids", NULL);
1576+
facets_histogram_value_ids(wb, facets, k, "ids", NULL);
15591577
facets_histogram_value_names(wb, facets, k, "names", NULL);
15601578
facets_histogram_value_colors(wb, facets, k, "colors");
15611579
facets_histogram_value_units(wb, facets, k, "units");
@@ -1840,17 +1858,21 @@ inline FACET_KEY *facets_register_facet_id(FACETS *facets, const char *key_id, F
18401858

18411859
void facets_register_facet_filter_id(FACETS *facets, const char *key_id, const char *value_id, FACET_KEY_OPTIONS options) {
18421860
FACET_KEY *k = facets_register_facet_id(facets, key_id, options);
1843-
if(k) {
1844-
if(is_valid_string_hash(value_id)) {
1845-
k->default_selected_for_values = false;
1846-
FACET_VALUE_ADD_OR_UPDATE_SELECTED(k, NULL, str_to_facets_hash(value_id));
1847-
}
1861+
if(k && is_valid_string_hash(value_id)) {
1862+
if(!(k->options & FACET_KEY_OPTION_FACET))
1863+
k->options |= FACET_KEY_OPTION_FILTER_ONLY;
1864+
1865+
k->default_selected_for_values = false;
1866+
FACET_VALUE_ADD_OR_UPDATE_SELECTED(k, NULL, str_to_facets_hash(value_id));
18481867
}
18491868
}
18501869

18511870
void facets_register_facet_filter(FACETS *facets, const char *key, const char *value, FACET_KEY_OPTIONS options) {
18521871
FACET_KEY *k = facets_register_facet(facets, key, options);
18531872
if(k) {
1873+
if(!(k->options & FACET_KEY_OPTION_FACET))
1874+
k->options |= FACET_KEY_OPTION_FILTER_ONLY;
1875+
18541876
FACETS_HASH hash = FACETS_HASH_FUNCTION(value, strlen(value));
18551877
k->default_selected_for_values = false;
18561878
FACET_VALUE_ADD_OR_UPDATE_SELECTED(k, value, hash);
@@ -2591,7 +2613,7 @@ void facets_report(FACETS *facets, BUFFER *wb, DICTIONARY *used_hashes_registry)
25912613
CLEAN_BUFFER *tb = buffer_create(0, NULL);
25922614
FACET_KEY *k;
25932615
foreach_key_in_facets(facets, k) {
2594-
if(!k->values.enabled || k->options & FACET_KEY_OPTION_HIDDEN)
2616+
if(!k->values.enabled || k->options & (FACET_KEY_OPTION_HIDDEN|FACET_KEY_OPTION_FILTER_ONLY))
25952617
continue;
25962618

25972619
facets_sort_and_reorder_values(k);

src/libnetdata/facets/facets.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ typedef enum __attribute__((packed)) {
3838
FACET_KEY_OPTION_EXPANDED_FILTER = (1 << 11), // the presentation should have this filter expanded by default
3939
FACET_KEY_OPTION_PRETTY_XML = (1 << 12), // instruct the UI to parse this as an XML document
4040
FACET_KEY_OPTION_HIDDEN = (1 << 13), // do not include this field in the response
41+
FACET_KEY_OPTION_FILTER_ONLY = (1 << 14), // the key is filterable, but not to be exposed as facet
4142
} FACET_KEY_OPTIONS;
4243

4344
typedef enum __attribute__((packed)) {

src/libnetdata/facets/logs_query_status.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ static inline bool lqs_request_parse_json_payload(json_object *jobj, void *data,
442442
else {
443443
// Call facets_register_facet_id_filter for each value
444444
facets_register_facet_filter(
445-
facets, key, value, FACET_KEY_OPTION_FACET | FACET_KEY_OPTION_FTS | FACET_KEY_OPTION_REORDER);
445+
facets, key, value, FACET_KEY_OPTION_FTS | FACET_KEY_OPTION_REORDER);
446446

447447
rq->filters++;
448448
}
@@ -643,7 +643,7 @@ static inline bool lqs_request_parse_GET(LOGS_QUERY_STATUS *lqs, BUFFER *wb, cha
643643

644644
facets_register_facet_filter_id(
645645
facets, keyword, value,
646-
FACET_KEY_OPTION_FACET | FACET_KEY_OPTION_FTS | FACET_KEY_OPTION_REORDER);
646+
FACET_KEY_OPTION_FTS | FACET_KEY_OPTION_REORDER);
647647

648648
buffer_json_add_array_item_string(wb, value);
649649
rq->filters++;

0 commit comments

Comments
 (0)