@cryptotaxi247 / netdata-1 / commits / 66e622a3f

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;