@cryptotaxi247 / netdata-1 / commits / 44a75ea99

Remove anomaly rates chart. (#13763)

vkalintiris committed Nov 9, 2022 at 11:02 UTC 44a75ea996268466c38b596294677f3b80350103
19 files changed +21 -190
database/rrd.h
+4 -7
@@ -529,21 +529,18 @@ typedef enum rrdset_flags {
529 RRDSET_FLAG_INDEXED_ID = (1 << 19), // the rrdset is indexed by its id
530 RRDSET_FLAG_INDEXED_NAME = (1 << 20), // the rrdset is indexed by its name
531
532 - RRDSET_FLAG_ANOMALY_RATE_CHART = (1 << 21), // the rrdset is for storing anomaly rates for all dimensions
533 - RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION = (1 << 22),
532 + RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION = (1 << 21),
533
535 - RRDSET_FLAG_SENDER_REPLICATION_FINISHED = (1 << 23), // the sending side has completed replication
536 - RRDSET_FLAG_RECEIVER_REPLICATION_FINISHED = (1 << 24), // the receiving side has completed replication
534 + RRDSET_FLAG_SENDER_REPLICATION_FINISHED = (1 << 22), // the sending side has completed replication
535 + RRDSET_FLAG_RECEIVER_REPLICATION_FINISHED = (1 << 23), // the receiving side has completed replication
536
538 - RRDSET_FLAG_UPSTREAM_SEND_VARIABLES = (1 << 25), // a custom variable has been updated and needs to be exposed to parent
537 + RRDSET_FLAG_UPSTREAM_SEND_VARIABLES = (1 << 24), // a custom variable has been updated and needs to be exposed to parent
538 } RRDSET_FLAGS;
539
540 #define rrdset_flag_check(st, flag) (__atomic_load_n(&((st)->flags), __ATOMIC_SEQ_CST) & (flag))
541 #define rrdset_flag_set(st, flag) __atomic_or_fetch(&((st)->flags), flag, __ATOMIC_SEQ_CST)
542 #define rrdset_flag_clear(st, flag) __atomic_and_fetch(&((st)->flags), ~(flag), __ATOMIC_SEQ_CST)
543
545 -#define rrdset_is_ar_chart(st) rrdset_flag_check(st, RRDSET_FLAG_ANOMALY_RATE_CHART)
546 -
544 struct rrdset {
545 uuid_t chart_uuid; // the global UUID for this chart
546
database/rrdcontext.c
+2 -5
@@ -768,7 +768,7 @@ static void rrdinstance_insert_callback(const DICTIONARY_ITEM *item __maybe_unus
768 }
769
770 if(ri->rrdset) {
771 - if(unlikely((rrdset_flag_check(ri->rrdset, RRDSET_FLAG_HIDDEN)) || rrdset_is_ar_chart(ri->rrdset)))
771 + if(unlikely(rrdset_flag_check(ri->rrdset, RRDSET_FLAG_HIDDEN)))
772 ri->flags |= RRD_FLAG_HIDDEN; // no need of atomics at the constructor
773 else
774 ri->flags &= ~RRD_FLAG_HIDDEN; // no need of atomics at the constructor
@@ -876,7 +876,7 @@ static bool rrdinstance_conflict_callback(const DICTIONARY_ITEM *item __maybe_un
876 }
877
878 if(ri->rrdset) {
879 - if(unlikely((rrdset_flag_check(ri->rrdset, RRDSET_FLAG_HIDDEN)) || rrdset_is_ar_chart(ri->rrdset)))
879 + if(unlikely(rrdset_flag_check(ri->rrdset, RRDSET_FLAG_HIDDEN)))
880 rrd_flag_set(ri, RRD_FLAG_HIDDEN);
881 else
882 rrd_flag_clear(ri, RRD_FLAG_HIDDEN);
@@ -2209,9 +2209,6 @@ DICTIONARY *rrdcontext_all_metrics_to_dict(RRDHOST *host, SIMPLE_PATTERN *contex
2209 if(rrd_flag_is_deleted(ri))
2210 continue;
2211
2212 - if(ri->rrdset && rrdset_is_ar_chart(ri->rrdset))
2213 - continue;
2214 -
2212 RRDMETRIC *rm;
2213 dfe_start_read(ri->rrdmetrics, rm) {
2214 if(rrd_flag_is_deleted(rm))
database/rrdcontext.h
-1
@@ -164,7 +164,6 @@ typedef struct query_target_request {
164 time_t before; // the requested timeframe
165 size_t points; // the requested number of points
166 time_t timeout; // the timeout of the query in seconds
167 - int max_anomaly_rates; // it only applies to anomaly rates chart - TODO - remove it
167 uint32_t format; // DATASOURCE_FORMAT
168 RRDR_OPTIONS options;
169 RRDR_GROUPING group_method;
database/rrddim.c
+8 -14
@@ -147,11 +147,9 @@ static void rrddim_insert_callback(const DICTIONARY_ITEM *item __maybe_unused, v
147 }
148 }
149
150 - if(!rrdset_is_ar_chart(st)) {
151 - rrddim_flag_set(rd, RRDDIM_FLAG_PENDING_HEALTH_INITIALIZATION);
152 - rrdset_flag_set(rd->rrdset, RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION);
153 - rrdhost_flag_set(rd->rrdset->rrdhost, RRDHOST_FLAG_PENDING_HEALTH_INITIALIZATION);
154 - }
150 + rrddim_flag_set(rd, RRDDIM_FLAG_PENDING_HEALTH_INITIALIZATION);
151 + rrdset_flag_set(rd->rrdset, RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION);
152 + rrdhost_flag_set(rd->rrdset->rrdhost, RRDHOST_FLAG_PENDING_HEALTH_INITIALIZATION);
153
154 // let the chart resync
155 rrdset_flag_set(st, RRDSET_FLAG_SYNC_CLOCK);
@@ -251,11 +249,10 @@ static bool rrddim_conflict_callback(const DICTIONARY_ITEM *item __maybe_unused,
249
250 if(rrddim_flag_check(rd, RRDDIM_FLAG_ARCHIVED)) {
251 rrddim_flag_clear(rd, RRDDIM_FLAG_ARCHIVED);
254 - if(!rrdset_is_ar_chart(st)) {
255 - rrddim_flag_set(rd, RRDDIM_FLAG_PENDING_HEALTH_INITIALIZATION);
256 - rrdset_flag_set(rd->rrdset, RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION);
257 - rrdhost_flag_set(rd->rrdset->rrdhost, RRDHOST_FLAG_PENDING_HEALTH_INITIALIZATION);
258 - }
252 +
253 + rrddim_flag_set(rd, RRDDIM_FLAG_PENDING_HEALTH_INITIALIZATION);
254 + rrdset_flag_set(rd->rrdset, RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION);
255 + rrdhost_flag_set(rd->rrdset->rrdhost, RRDHOST_FLAG_PENDING_HEALTH_INITIALIZATION);
256 }
257
258 if(unlikely(rc))
@@ -357,14 +354,11 @@ inline int rrddim_reset_name(RRDSET *st, RRDDIM *rd, const char *name) {
354 rd->name = rrd_string_strdupz(name);
355 string_freez(old);
356
360 - if (!rrdset_is_ar_chart(st))
361 - rrddimvar_rename_all(rd);
357 + rrddimvar_rename_all(rd);
358
359 rd->exposed = 0;
360 rrdset_flag_clear(st, RRDSET_FLAG_UPSTREAM_EXPOSED);
361
366 - ml_dimension_update_name(st, rd, name);
367 -
362 return 1;
363 }
364
database/rrdset.c
+1 -9
@@ -100,11 +100,6 @@ struct rrdset_constructor {
100
101 // the constructor - the dictionary is write locked while this runs
102 static void rrdset_insert_callback(const DICTIONARY_ITEM *item __maybe_unused, void *rrdset, void *constructor_data) {
103 - static STRING *anomaly_rates_chart = NULL;
104 -
105 - if(unlikely(!anomaly_rates_chart))
106 - anomaly_rates_chart = string_strdupz(ML_ANOMALY_RATES_CHART_ID);
107 -
103 struct rrdset_constructor *ctr = constructor_data;
104 RRDHOST *host = ctr->host;
105 RRDSET *st = rrdset;
@@ -145,9 +140,6 @@ static void rrdset_insert_callback(const DICTIONARY_ITEM *item __maybe_unused, v
140 if(host == localhost || !host->receiver || !stream_has_capability(host->receiver, STREAM_CAP_REPLICATION))
141 st->flags |= RRDSET_FLAG_RECEIVER_REPLICATION_FINISHED;
142
148 - if(unlikely(st->id == anomaly_rates_chart))
149 - st->flags |= RRDSET_FLAG_ANOMALY_RATE_CHART;
150 -
143 netdata_rwlock_init(&st->alerts.rwlock);
144
145 if(st->rrd_memory_mode == RRD_MEMORY_MODE_SAVE || st->rrd_memory_mode == RRD_MEMORY_MODE_MAP) {
@@ -355,7 +347,7 @@ static void rrdset_react_callback(const DICTIONARY_ITEM *item __maybe_unused, vo
347
348 st->last_accessed_time = now_realtime_sec();
349
358 - if((host->health_enabled && (ctr->react_action & (RRDSET_REACT_NEW | RRDSET_REACT_CHART_ACTIVATED))) && !rrdset_is_ar_chart(st)) {
350 + if(host->health_enabled && (ctr->react_action & (RRDSET_REACT_NEW | RRDSET_REACT_CHART_ACTIVATED))) {
351 rrdset_flag_set(st, RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION);
352 rrdhost_flag_set(st->rrdhost, RRDHOST_FLAG_PENDING_HEALTH_INITIALIZATION);
353 }
exporting/check_filters.c
-4
@@ -55,10 +55,6 @@ int rrdset_is_exportable(struct instance *instance, RRDSET *st)
55 RRDHOST *host = st->rrdhost;
56 #endif
57
58 - // Do not export anomaly rates charts.
59 - if (rrdset_is_ar_chart(st))
60 - return 0;
61 -
58 if (st->exporting_flags == NULL)
59 st->exporting_flags = callocz(instance->engine->instance_num, sizeof(size_t));
60
exporting/prometheus/prometheus.c
-4
@@ -28,10 +28,6 @@ inline int can_send_rrdset(struct instance *instance, RRDSET *st, SIMPLE_PATTERN
28 RRDHOST *host = st->rrdhost;
29 #endif
30
31 - // Do not send anomaly rates charts.
32 - if (rrdset_is_ar_chart(st))
33 - return 0;
34 -
31 if (unlikely(rrdset_flag_check(st, RRDSET_FLAG_EXPORTING_IGNORE)))
32 return 0;
33
health/health.c
-3
@@ -795,9 +795,6 @@ static void health_execute_delayed_initializations(RRDHOST *host) {
795 if(!rrdset_flag_check(st, RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION)) continue;
796 rrdset_flag_clear(st, RRDSET_FLAG_PENDING_HEALTH_INITIALIZATION);
797
798 - if(unlikely(rrdset_is_ar_chart(st)))
799 - continue;
800 -
798 worker_is_busy(WORKER_HEALTH_JOB_DELAYED_INIT_RRDSET);
799
800 if(!st->rrdfamily)
ml/Config.cc
-6
@@ -33,8 +33,6 @@ void Config::readMLConfig(void) {
33 unsigned TrainEvery = config_get_number(ConfigSectionML, "train every", 1 * 3600);
34 unsigned NumModelsToUse = config_get_number(ConfigSectionML, "number of models per dimension", 1 * 24);
35
36 - unsigned DBEngineAnomalyRateEvery = config_get_number(ConfigSectionML, "dbengine anomaly rate every", 30);
37 -
36 unsigned DiffN = config_get_number(ConfigSectionML, "num samples to diff", 1);
37 unsigned SmoothN = config_get_number(ConfigSectionML, "num samples to smooth", 3);
38 unsigned LagN = config_get_number(ConfigSectionML, "num samples to lag", 5);
@@ -57,8 +55,6 @@ void Config::readMLConfig(void) {
55 TrainEvery = clamp<unsigned>(TrainEvery, 1 * 3600, 6 * 3600);
56 NumModelsToUse = clamp<unsigned>(TrainEvery, 1, 7 * 24);
57
60 - DBEngineAnomalyRateEvery = clamp(DBEngineAnomalyRateEvery, 1 * 30u, 15 * 60u);
61 -
58 DiffN = clamp(DiffN, 0u, 1u);
59 SmoothN = clamp(SmoothN, 0u, 5u);
60 LagN = clamp(LagN, 1u, 5u);
@@ -93,8 +89,6 @@ void Config::readMLConfig(void) {
89 Cfg.TrainEvery = TrainEvery;
90 Cfg.NumModelsToUse = NumModelsToUse;
91
96 - Cfg.DBEngineAnomalyRateEvery = DBEngineAnomalyRateEvery;
97 -
92 Cfg.DiffN = DiffN;
93 Cfg.SmoothN = SmoothN;
94 Cfg.LagN = LagN;
ml/Dimension.cc
-10
@@ -167,16 +167,6 @@ bool Dimension::predict(CalculatedNumber Value, bool Exists) {
167 return true;
168 }
169
170 -void Dimension::updateAnomalyBitCounter(RRDSET *RS, unsigned Elapsed, bool IsAnomalous) {
171 - AnomalyBitCounter += IsAnomalous;
172 -
173 - if (Elapsed == Cfg.DBEngineAnomalyRateEvery) {
174 - double AR = static_cast<double>(AnomalyBitCounter) / Cfg.DBEngineAnomalyRateEvery;
175 - rrddim_set_by_pointer(RS, getAnomalyRateRD(), AR * 1000);
176 - AnomalyBitCounter = 0;
177 - }
178 -}
179 -
170 std::array<KMeans, 1> Dimension::getModels() {
171 std::unique_lock<std::mutex> Lock(Mutex);
172 return Models;
ml/Dimension.h
+2 -16
@@ -26,15 +26,13 @@ static inline std::string getMLDimensionID(RRDDIM *RD) {
26
27 class Dimension {
28 public:
29 - Dimension(RRDDIM *RD, RRDSET *AnomalyRateRS) :
29 + Dimension(RRDDIM *RD) :
30 RD(RD),
31 - AnomalyRateRD(rrddim_add(AnomalyRateRS, ml::getMLDimensionID(RD).c_str(), NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE)),
31 LastTrainedAt(Seconds(0)),
32 Trained(false),
33 ConstantModel(false),
34 AnomalyScore(0.0),
36 - AnomalyBit(0),
37 - AnomalyBitCounter(0)
35 + AnomalyBit(0)
36 { }
37
38 RRDDIM *getRD() const {
@@ -53,14 +51,6 @@ public:
51 return Query(RD).oldestTime();
52 }
53
56 - void setAnomalyRateRDName(const char *Name) const {
57 - rrddim_reset_name(AnomalyRateRD->rrdset, AnomalyRateRD, Name);
58 - }
59 -
60 - RRDDIM *getAnomalyRateRD() const {
61 - return AnomalyRateRD;
62 - }
63 -
54 bool isTrained() const {
55 return Trained;
56 }
@@ -77,8 +67,6 @@ public:
67
68 bool predict(CalculatedNumber Value, bool Exists);
69
80 - void updateAnomalyBitCounter(RRDSET *RS, unsigned Elapsed, bool IsAnomalous);
81 -
70 std::pair<bool, double> detect(size_t WindowLength, bool Reset);
71
72 std::array<KMeans, 1> getModels();
@@ -88,7 +76,6 @@ private:
76
77 public:
78 RRDDIM *RD;
91 - RRDDIM *AnomalyRateRD;
79
80 TimePoint LastTrainedAt;
81 std::atomic<bool> Trained;
@@ -96,7 +83,6 @@ public:
83
84 CalculatedNumber AnomalyScore;
85 std::atomic<bool> AnomalyBit;
99 - unsigned AnomalyBitCounter;
86
87 std::vector<CalculatedNumber> CNs;
88 std::array<KMeans, 1> Models;
ml/Host.cc
+1 -14
@@ -161,10 +161,6 @@ void DetectableHost::detectOnce() {
161 size_t NumTrainedDimensions = 0;
162 size_t NumActiveDimensions = 0;
163
164 - bool CollectAnomalyRates = (++AnomalyRateTimer == Cfg.DBEngineAnomalyRateEvery);
165 - if (CollectAnomalyRates)
166 - rrdset_next(AnomalyRateRS);
167 -
164 {
165 std::lock_guard<std::mutex> Lock(Mutex);
166
@@ -173,10 +169,8 @@ void DetectableHost::detectOnce() {
169
170 Dimension *D = DP.second;
171
176 - if (!D->isActive()) {
177 - D->updateAnomalyBitCounter(AnomalyRateRS, AnomalyRateTimer, false);
172 + if (!D->isActive())
173 continue;
179 - }
174
175 NumActiveDimensions++;
176 NumTrainedDimensions += D->isTrained();
@@ -184,7 +178,6 @@ void DetectableHost::detectOnce() {
178 bool IsAnomalous = D->isAnomalous();
179 if (IsAnomalous)
180 NumAnomalousDimensions += 1;
187 - D->updateAnomalyBitCounter(AnomalyRateRS, AnomalyRateTimer, IsAnomalous);
181 }
182
183 if (NumAnomalousDimensions)
@@ -195,12 +188,6 @@ void DetectableHost::detectOnce() {
188 NumNormalDimensions = NumActiveDimensions - NumAnomalousDimensions;
189 }
190
198 - if (CollectAnomalyRates) {
199 - worker_is_busy(WORKER_JOB_UPDATE_ANOMALY_RATES);
200 - AnomalyRateTimer = 0;
201 - rrdset_done(AnomalyRateRS);
202 - }
203 -
191 this->NumAnomalousDimensions = NumAnomalousDimensions;
192 this->NumNormalDimensions = NumNormalDimensions;
193 this->NumTrainedDimensions = NumTrainedDimensions;
ml/Host.h
+1 -26
@@ -13,25 +13,7 @@ namespace ml {
13
14 class RrdHost {
15 public:
16 - RrdHost(RRDHOST *RH) : RH(RH) {
17 - AnomalyRateRS = rrdset_create(
18 - RH,
19 - "anomaly_detection",
20 - "anomaly_rates",
21 - NULL, // name
22 - "anomaly_rates",
23 - NULL, // ctx
24 - "Average anomaly rate",
25 - "anomaly rate",
26 - "netdata",
27 - "ml",
28 - 39189,
29 - Cfg.DBEngineAnomalyRateEvery,
30 - RRDSET_TYPE_LINE
31 - );
32 -
33 - rrdset_flag_set(AnomalyRateRS, RRDSET_FLAG_HIDDEN);
34 - }
16 + RrdHost(RRDHOST *RH) : RH(RH) {};
17
18 RRDHOST *getRH() { return RH; }
19
@@ -43,10 +25,6 @@ public:
25 return S;
26 }
27
46 - RRDSET *getAnomalyRateRS() const {
47 - return AnomalyRateRS;
48 - }
49 -
28 void addDimension(Dimension *D);
29 void removeDimension(Dimension *D);
30
@@ -56,7 +34,6 @@ public:
34
35 protected:
36 RRDHOST *RH;
59 - RRDSET *AnomalyRateRS;
37
38 // Protect dimension and lock maps
39 std::mutex Mutex;
@@ -114,8 +91,6 @@ private:
91 size_t NumNormalDimensions{0};
92 size_t NumTrainedDimensions{0};
93 size_t NumActiveDimensions{0};
117 -
118 - unsigned AnomalyRateTimer{0};
94 };
95
96 using Host = DetectableHost;
ml/ml-dummy.c
-11
@@ -43,17 +43,6 @@ bool ml_is_anomalous(RRDDIM *RD, double Value, bool Exists) {
43 return false;
44 }
45
46 -void ml_process_rrdr(RRDR *R, int MaxAnomalyRates) {
47 - (void) R;
48 - (void) MaxAnomalyRates;
49 -}
50 -
51 -void ml_dimension_update_name(RRDSET *RS, RRDDIM *RD, const char *name) {
52 - (void) RS;
53 - (void) RD;
54 - (void) name;
55 -}
56 -
46 bool ml_streaming_enabled() {
47 return false;
48 }
ml/ml.cc
+1 -42
@@ -79,10 +79,7 @@ void ml_new_dimension(RRDDIM *RD) {
79 if (simple_pattern_matches(Cfg.SP_ChartsToSkip, rrdset_name(RS)))
80 return;
81
82 - if (rrdset_is_ar_chart(RS))
83 - return;
84 -
85 - Dimension *D = new Dimension(RD, H->getAnomalyRateRS());
82 + Dimension *D = new Dimension(RD);
83 RD->ml_dimension = static_cast<ml_dimension_t>(D);
84 H->addDimension(D);
85 }
@@ -147,44 +144,6 @@ bool ml_is_anomalous(RRDDIM *RD, double Value, bool Exists) {
144 return D->predict(Value, Exists);
145 }
146
150 -void ml_process_rrdr(RRDR *R, int MaxAnomalyRates) {
151 - if (R->rows != 1)
152 - return;
153 -
154 - if (MaxAnomalyRates < 1 || MaxAnomalyRates >= (int)R->d)
155 - return;
156 -
157 - NETDATA_DOUBLE *CNs = R->v;
158 - RRDR_DIMENSION_FLAGS *DimFlags = R->od;
159 -
160 - std::vector<std::pair<NETDATA_DOUBLE, int>> V;
161 -
162 - V.reserve(R->d);
163 - for (int Idx = 0; Idx != (int)R->d; Idx++)
164 - V.emplace_back(CNs[Idx], Idx);
165 -
166 - std::sort(V.rbegin(), V.rend());
167 -
168 - for (int Idx = MaxAnomalyRates; Idx != (int)R->d; Idx++) {
169 - int UnsortedIdx = V[Idx].second;
170 -
171 - int OldFlags = static_cast<int>(DimFlags[UnsortedIdx]);
172 - int NewFlags = OldFlags | RRDR_DIMENSION_HIDDEN;
173 -
174 - DimFlags[UnsortedIdx] = static_cast<rrdr_dimension_flag>(NewFlags);
175 - }
176 -}
177 -
178 -void ml_dimension_update_name(RRDSET *RS, RRDDIM *RD, const char *Name) {
179 - (void) RS;
180 -
181 - Dimension *D = static_cast<Dimension *>(RD->ml_dimension);
182 - if (!D)
183 - return;
184 -
185 - D->setAnomalyRateRDName(Name);
186 -}
187 -
147 bool ml_streaming_enabled() {
148 return Cfg.StreamADCharts;
149 }
ml/ml.h
-4
@@ -35,10 +35,6 @@ void ml_delete_dimension(RRDDIM *RD);
35
36 bool ml_is_anomalous(RRDDIM *RD, double value, bool exists);
37
38 -void ml_process_rrdr(RRDR *R, int MaxAnomalyRates);
39 -
40 -void ml_dimension_update_name(RRDSET *RS, RRDDIM *RD, const char *name);
41 -
38 bool ml_streaming_enabled();
39
40 #define ML_ANOMALY_RATES_CHART_ID "anomaly_detection.anomaly_rates"
streaming/rrdpush.c
+1 -5
@@ -168,11 +168,7 @@ static inline bool should_send_chart_matching(RRDSET *st, RRDSET_FLAGS flags) {
168 if(unlikely(!(flags & (RRDSET_FLAG_UPSTREAM_SEND | RRDSET_FLAG_UPSTREAM_IGNORE)))) {
169 RRDHOST *host = st->rrdhost;
170
171 - // Do not stream anomaly rates charts.
172 - if (unlikely(flags & RRDSET_FLAG_ANOMALY_RATE_CHART))
173 - rrdset_flag_set(st, RRDSET_FLAG_UPSTREAM_IGNORE);
174 -
175 - else if (flags & RRDSET_FLAG_ANOMALY_DETECTION) {
171 + if (flags & RRDSET_FLAG_ANOMALY_DETECTION) {
172 if(ml_streaming_enabled())
173 rrdset_flag_set(st, RRDSET_FLAG_UPSTREAM_SEND);
174 else
web/api/formatters/rrd2json.c
-3
@@ -153,9 +153,6 @@ int data_query_execute(ONEWAYALLOC *owa, BUFFER *wb, QUERY_TARGET *qt, time_t *l
153 return HTTP_RESP_BACKEND_FETCH_FAILED;
154 }
155
156 - if (qt->request.st && rrdset_is_ar_chart(qt->request.st))
157 - ml_process_rrdr(r, qt->request.max_anomaly_rates);
158 -
156 if(r->result_options & RRDR_RESULT_OPTION_RELATIVE)
157 buffer_no_cacheable(wb);
158 else if(r->result_options & RRDR_RESULT_OPTION_ABSOLUTE)
web/api/web_api_v1.c
-6
@@ -610,7 +610,6 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c
610 char *group_time_str = NULL;
611 char *points_str = NULL;
612 char *timeout_str = NULL;
613 - char *max_anomaly_rates_str = NULL;
613 char *context = NULL;
614 char *chart_label_key = NULL;
615 char *chart_labels_filter = NULL;
@@ -695,9 +694,6 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c
694 outFileName = tqx_value;
695 }
696 }
698 - else if(!strcmp(name, "max_anomaly_rates")) {
699 - max_anomaly_rates_str = value;
700 - }
697 else if(!strcmp(name, "tier")) {
698 tier = str2ul(value);
699 if(tier < storage_tiers)
@@ -734,7 +730,6 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c
730 int points = (points_str && *points_str)?str2i(points_str):0;
731 int timeout = (timeout_str && *timeout_str)?str2i(timeout_str): 0;
732 long group_time = (group_time_str && *group_time_str)?str2l(group_time_str):0;
737 - int max_anomaly_rates = (max_anomaly_rates_str && *max_anomaly_rates_str) ? str2i(max_anomaly_rates_str) : 0;
733
734 QUERY_TARGET_REQUEST qtr = {
735 .after = after,
@@ -746,7 +741,6 @@ inline int web_client_api_request_v1_data(RRDHOST *host, struct web_client *w, c
741 .charts = chart,
742 .dimensions = (dimensions)?buffer_tostring(dimensions):NULL,
743 .timeout = timeout,
749 - .max_anomaly_rates = max_anomaly_rates,
744 .points = points,
745 .format = format,
746 .options = options,