Group anomaly rate per chart context instead of type. (#20180)
vkalintiris committed
Apr 25, 2025 at 21:18 UTC
66e622a3f9416253e09b7fe8a4f35bf476c91aae
5 files changed
+43
-43
src/collectors/all.h
+1
-1
@@ -471,7 +471,7 @@
471
// [ml] charts
472
#define ML_CHART_PRIO_DIMENSIONS 39181
473
#define ML_CHART_PRIO_ANOMALY_RATE 39182
474
-#define ML_CHART_PRIO_TYPE_ANOMALY_RATE 39183
474
+#define ML_CHART_PRIO_CONTEXT_ANOMALY_RATE 39183
475
#define ML_CHART_PRIO_DETECTOR_EVENTS 39184
476
477
// [netdata.ml] charts
src/ml/ad_charts.cc
+30
-30
@@ -260,55 +260,55 @@ void ml_update_host_and_detection_rate_charts(ml_host_t *host, collected_number
260
}
261
262
/*
263
- * Type anomaly rate
263
+ * Context anomaly rate
264
*/
265
{
266
- if (!host->type_anomaly_rate_rs) {
266
+ if (!host->context_anomaly_rate_rs) {
267
char id_buf[1024];
268
char name_buf[1024];
269
270
- snprintfz(id_buf, 1024, "type_anomaly_rate_on_%s", localhost->machine_guid);
271
- snprintfz(name_buf, 1024, "type_anomaly_rate_on_%s", rrdhost_hostname(localhost));
270
+ snprintfz(id_buf, 1024, "context_anomaly_rate_on_%s", localhost->machine_guid);
271
+ snprintfz(name_buf, 1024, "context_anomaly_rate_on_%s", rrdhost_hostname(localhost));
272
273
- host->type_anomaly_rate_rs = rrdset_create(
273
+ host->context_anomaly_rate_rs = rrdset_create(
274
host->rh,
275
- "anomaly_detection", // type
276
- id_buf, // id
277
- name_buf, // name
278
- "anomaly_rate", // family
279
- "anomaly_detection.type_anomaly_rate", // ctx
280
- "Percentage of anomalous dimensions by type", // title
281
- "percentage", // units
282
- NETDATA_ML_PLUGIN, // plugin
283
- NETDATA_ML_MODULE_DETECTION, // module
284
- ML_CHART_PRIO_TYPE_ANOMALY_RATE, // priority
285
- localhost->rrd_update_every, // update_every
286
- RRDSET_TYPE_STACKED // chart_type
275
+ "anomaly_detection",
276
+ id_buf,
277
+ name_buf,
278
+ "anomaly_rate",
279
+ "anomaly_detection.context_anomaly_rate",
280
+ "Percentage of anomalous dimensions by context",
281
+ "percentage",
282
+ NETDATA_ML_PLUGIN,
283
+ NETDATA_ML_MODULE_DETECTION,
284
+ ML_CHART_PRIO_CONTEXT_ANOMALY_RATE,
285
+ localhost->rrd_update_every,
286
+ RRDSET_TYPE_STACKED
287
);
288
289
- rrdset_flag_set(host->type_anomaly_rate_rs, RRDSET_FLAG_ANOMALY_DETECTION);
289
+ rrdset_flag_set(host->context_anomaly_rate_rs, RRDSET_FLAG_ANOMALY_DETECTION);
290
}
291
292
- spinlock_lock(&host->type_anomaly_rate_spinlock);
293
- for (auto &entry : host->type_anomaly_rate) {
294
- ml_type_anomaly_rate_t &type_anomaly_rate = entry.second;
292
+ spinlock_lock(&host->context_anomaly_rate_spinlock);
293
+ for (auto &entry : host->context_anomaly_rate) {
294
+ ml_context_anomaly_rate_t &context_anomaly_rate = entry.second;
295
296
- if (!type_anomaly_rate.rd)
297
- type_anomaly_rate.rd = rrddim_add(host->type_anomaly_rate_rs, string2str(entry.first), NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
296
+ if (!context_anomaly_rate.rd)
297
+ context_anomaly_rate.rd = rrddim_add(host->context_anomaly_rate_rs, string2str(entry.first), NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
298
299
double ar = 0.0;
300
- size_t n = type_anomaly_rate.anomalous_dimensions + type_anomaly_rate.normal_dimensions;
300
+ size_t n = context_anomaly_rate.anomalous_dimensions + context_anomaly_rate.normal_dimensions;
301
if (n)
302
- ar = static_cast<double>(type_anomaly_rate.anomalous_dimensions) / n;
302
+ ar = static_cast<double>(context_anomaly_rate.anomalous_dimensions) / n;
303
304
- rrddim_set_by_pointer(host->type_anomaly_rate_rs, type_anomaly_rate.rd, ar * 10000.0);
304
+ rrddim_set_by_pointer(host->context_anomaly_rate_rs, context_anomaly_rate.rd, ar * 10000.0);
305
306
- type_anomaly_rate.anomalous_dimensions = 0;
307
- type_anomaly_rate.normal_dimensions = 0;
306
+ context_anomaly_rate.anomalous_dimensions = 0;
307
+ context_anomaly_rate.normal_dimensions = 0;
308
}
309
- spinlock_unlock(&host->type_anomaly_rate_spinlock);
309
+ spinlock_unlock(&host->context_anomaly_rate_spinlock);
310
311
- rrdset_done(host->type_anomaly_rate_rs);
311
+ rrdset_done(host->context_anomaly_rate_rs);
312
}
313
314
/*
src/ml/ml.cc
+7
-7
@@ -889,13 +889,13 @@ ml_host_detect_once(ml_host_t *host)
889
host->mls.num_anomalous_dimensions += chart_mls.num_anomalous_dimensions;
890
host->mls.num_normal_dimensions += chart_mls.num_normal_dimensions;
891
892
- if (spinlock_trylock(&host->type_anomaly_rate_spinlock))
892
+ if (spinlock_trylock(&host->context_anomaly_rate_spinlock))
893
{
894
- STRING *key = rs->parts.type;
895
- auto &um = host->type_anomaly_rate;
894
+ STRING *key = rs->context;
895
+ auto &um = host->context_anomaly_rate;
896
auto it = um.find(key);
897
if (it == um.end()) {
898
- um[key] = ml_type_anomaly_rate_t {
898
+ um[key] = ml_context_anomaly_rate_t {
899
.rd = NULL,
900
.normal_dimensions = 0,
901
.anomalous_dimensions = 0
@@ -905,7 +905,7 @@ ml_host_detect_once(ml_host_t *host)
905
906
it->second.anomalous_dimensions += chart_mls.num_anomalous_dimensions;
907
it->second.normal_dimensions += chart_mls.num_normal_dimensions;
908
- spinlock_unlock(&host->type_anomaly_rate_spinlock);
908
+ spinlock_unlock(&host->context_anomaly_rate_spinlock);
909
}
910
}
911
rrdset_foreach_done(rsp);
@@ -927,9 +927,9 @@ ml_host_detect_once(ml_host_t *host)
927
} else {
928
host->host_anomaly_rate = 0.0;
929
930
- auto &um = host->type_anomaly_rate;
930
+ auto &um = host->context_anomaly_rate;
931
for (auto &entry: um) {
932
- entry.second = ml_type_anomaly_rate_t {
932
+ entry.second = ml_context_anomaly_rate_t {
933
.rd = NULL,
934
.normal_dimensions = 0,
935
.anomalous_dimensions = 0
src/ml/ml_host.h
+4
-4
@@ -33,7 +33,7 @@ typedef struct {
33
RRDDIM *rd;
34
size_t normal_dimensions;
35
size_t anomalous_dimensions;
36
-} ml_type_anomaly_rate_t;
36
+} ml_context_anomaly_rate_t;
37
38
typedef struct {
39
RRDHOST *rh;
@@ -81,9 +81,9 @@ typedef struct {
81
RRDDIM *detector_events_above_threshold_rd;
82
RRDDIM *detector_events_new_anomaly_event_rd;
83
84
- RRDSET *type_anomaly_rate_rs;
85
- SPINLOCK type_anomaly_rate_spinlock;
86
- std::unordered_map<STRING *, ml_type_anomaly_rate_t> type_anomaly_rate;
84
+ RRDSET *context_anomaly_rate_rs;
85
+ SPINLOCK context_anomaly_rate_spinlock;
86
+ std::unordered_map<STRING *, ml_context_anomaly_rate_t> context_anomaly_rate;
87
} ml_host_t;
88
89
#endif /* NETDATA_ML_HOST_H */
src/ml/ml_public.cc
+1
-1
@@ -48,7 +48,7 @@ void ml_host_new(RRDHOST *rh)
48
host->queue = Cfg.workers[times_called++ % Cfg.num_worker_threads].queue;
49
50
netdata_mutex_init(&host->mutex);
51
- spinlock_init(&host->type_anomaly_rate_spinlock);
51
+ spinlock_init(&host->context_anomaly_rate_spinlock);
52
53
host->ml_running = false;
54
rh->ml_host = (rrd_ml_host_t *) host;