summaryrefslogtreecommitdiffstats
path: root/ml/Chart.h
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 */