Chart.h 3.4 KB

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