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,