blob: dbd6a910f90fbec9658e40698d037e536a5e96aa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// SPDX-License-Identifier: GPL-3.0-or-later
#ifndef ML_CHART_H
#define ML_CHART_H
#include "Config.h"
#include "Dimension.h"
#include "ml-private.h"
#include "json/single_include/nlohmann/json.hpp"
namespace ml
{
class Chart {
public:
Chart(RRDSET *RS) :
RS(RS),
MLS()
{ }
RRDSET *getRS() const {
return RS;
}
bool isAvailableForML() {
return rrdset_is_available_for_exporting_and_alarms(RS);
}
void addDimension(Dimension *D) {
std::lock_guard<Mutex> L(M);
Dimensions[D->getRD()] = D;
}
void removeDimension(Dimension *D) {
std::lock_guard<Mutex> L(M);
Dimensions.erase(D->getRD());
}
void getModelsAsJson(nlohmann::json &Json) {
std::lock_guard<Mutex> L(M);
for (auto &DP : Dimensions) {
Dimension *D = DP.second;
nlohmann::json JsonArray = nlohmann::json::array();
for (const KMeans &KM : D->getModels()) {
nlohmann::json J;
KM.toJson(J);
JsonArray.push_back(J);
}
Json[getMLDimensionID(D->getRD())] = JsonArray;
}
}
void updateBegin() {
M.lock();
MLS = {};
}
void updateDimension(Dimension *D, bool IsAnomalous) {
switch (D->getMLS()) {
case MachineLearningStatus::DisabledDueToUniqueUpdateEvery:
MLS.NumMachineLearningStatusDisabledUE++;
return;
case MachineLearningStatus::DisabledDueToExcludedChart:
MLS.NumMachineLearningStatusDisabledSP++;
return;
case MachineLearningStatus::Enabled: {
MLS.NumMachineLearningStatusEnabled++;
switch (D->getMT()) {
case MetricType::Constant:
MLS.NumMetricTypeConstant++;
MLS.NumTrainingStatusTrained++;
MLS.NumNormalDimensions++;
return;
case MetricType::Variable:
MLS.NumMetricTypeVariable++;
break;
}
switch (D->getTS()) {
case TrainingStatus::Untrained:
MLS.NumTrainingStatusUntrained++;
return;
case TrainingStatus::PendingWithoutModel:
MLS.NumTrainingStatusPendingWithoutModel++;
return;
case TrainingStatus::Trained:
MLS.NumTrainingStatusTrained++;
MLS.NumAnomalousDimensions += IsAnomalous;
MLS.NumNormalDimensions += !IsAnomalous;
return;
case TrainingStatus::PendingWithModel:
MLS.NumTrainingStatusPendingWithModel++;
MLS.NumAnomalousDimensions += IsAnomalous;
MLS.NumNormalDimensions += !IsAnomalous;
return;
}
return;
}
}
}
void updateEnd() {
M.unlock();
}
MachineLearningStats getMLS() {
std::lock_guard<Mutex> L(M);
return MLS;
}
private:
RRDSET *RS;
MachineLearningStats MLS;
Mutex M;
std::unordered_map<RRDDIM *, Dimension *> Dimensions;
};
} // namespace ml
#endif /* ML_CHART_H */
|