Config.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "ml-private.h"
  3. /*
  4. * Global configuration instance to be shared between training and
  5. * prediction threads.
  6. */
  7. ml_config_t Cfg;
  8. template <typename T>
  9. static T clamp(const T& Value, const T& Min, const T& Max) {
  10. return std::max(Min, std::min(Value, Max));
  11. }
  12. /*
  13. * Initialize global configuration variable.
  14. */
  15. void ml_config_load(ml_config_t *cfg) {
  16. const char *config_section_ml = CONFIG_SECTION_ML;
  17. bool enable_anomaly_detection = config_get_boolean(config_section_ml, "enabled", true);
  18. /*
  19. * Read values
  20. */
  21. unsigned max_train_samples = config_get_number(config_section_ml, "maximum num samples to train", 4 * 3600);
  22. unsigned min_train_samples = config_get_number(config_section_ml, "minimum num samples to train", 1 * 900);
  23. unsigned train_every = config_get_number(config_section_ml, "train every", 1 * 3600);
  24. unsigned num_models_to_use = config_get_number(config_section_ml, "number of models per dimension", 1);
  25. unsigned diff_n = config_get_number(config_section_ml, "num samples to diff", 1);
  26. unsigned smooth_n = config_get_number(config_section_ml, "num samples to smooth", 3);
  27. unsigned lag_n = config_get_number(config_section_ml, "num samples to lag", 5);
  28. double random_sampling_ratio = config_get_float(config_section_ml, "random sampling ratio", 1.0 / lag_n);
  29. unsigned max_kmeans_iters = config_get_number(config_section_ml, "maximum number of k-means iterations", 1000);
  30. double dimension_anomaly_rate_threshold = config_get_float(config_section_ml, "dimension anomaly score threshold", 0.99);
  31. double host_anomaly_rate_threshold = config_get_float(config_section_ml, "host anomaly rate threshold", 1.0);
  32. std::string anomaly_detection_grouping_method = config_get(config_section_ml, "anomaly detection grouping method", "average");
  33. time_t anomaly_detection_query_duration = config_get_number(config_section_ml, "anomaly detection grouping duration", 5 * 60);
  34. /*
  35. * Clamp
  36. */
  37. max_train_samples = clamp<unsigned>(max_train_samples, 1 * 3600, 24 * 3600);
  38. min_train_samples = clamp<unsigned>(min_train_samples, 1 * 900, 6 * 3600);
  39. train_every = clamp<unsigned>(train_every, 1 * 3600, 6 * 3600);
  40. num_models_to_use = clamp<unsigned>(num_models_to_use, 1, 7 * 24);
  41. diff_n = clamp(diff_n, 0u, 1u);
  42. smooth_n = clamp(smooth_n, 0u, 5u);
  43. lag_n = clamp(lag_n, 1u, 5u);
  44. random_sampling_ratio = clamp(random_sampling_ratio, 0.2, 1.0);
  45. max_kmeans_iters = clamp(max_kmeans_iters, 500u, 1000u);
  46. dimension_anomaly_rate_threshold = clamp(dimension_anomaly_rate_threshold, 0.01, 5.00);
  47. host_anomaly_rate_threshold = clamp(host_anomaly_rate_threshold, 0.1, 10.0);
  48. anomaly_detection_query_duration = clamp<time_t>(anomaly_detection_query_duration, 60, 15 * 60);
  49. /*
  50. * Validate
  51. */
  52. if (min_train_samples >= max_train_samples) {
  53. error("invalid min/max train samples found (%u >= %u)", min_train_samples, max_train_samples);
  54. min_train_samples = 1 * 3600;
  55. max_train_samples = 4 * 3600;
  56. }
  57. /*
  58. * Assign to config instance
  59. */
  60. cfg->enable_anomaly_detection = enable_anomaly_detection;
  61. cfg->max_train_samples = max_train_samples;
  62. cfg->min_train_samples = min_train_samples;
  63. cfg->train_every = train_every;
  64. cfg->num_models_to_use = num_models_to_use;
  65. cfg->diff_n = diff_n;
  66. cfg->smooth_n = smooth_n;
  67. cfg->lag_n = lag_n;
  68. cfg->random_sampling_ratio = random_sampling_ratio;
  69. cfg->max_kmeans_iters = max_kmeans_iters;
  70. cfg->host_anomaly_rate_threshold = host_anomaly_rate_threshold;
  71. cfg->anomaly_detection_grouping_method =
  72. time_grouping_parse(anomaly_detection_grouping_method.c_str(), RRDR_GROUPING_AVERAGE);
  73. cfg->anomaly_detection_query_duration = anomaly_detection_query_duration;
  74. cfg->dimension_anomaly_score_threshold = dimension_anomaly_rate_threshold;
  75. cfg->hosts_to_skip = config_get(config_section_ml, "hosts to skip from training", "!*");
  76. cfg->sp_host_to_skip = simple_pattern_create(cfg->hosts_to_skip.c_str(), NULL, SIMPLE_PATTERN_EXACT, true);
  77. // Always exclude anomaly_detection charts from training.
  78. cfg->charts_to_skip = "anomaly_detection.* ";
  79. cfg->charts_to_skip += config_get(config_section_ml, "charts to skip from training", "netdata.*");
  80. cfg->sp_charts_to_skip = simple_pattern_create(cfg->charts_to_skip.c_str(), NULL, SIMPLE_PATTERN_EXACT, true);
  81. cfg->stream_anomaly_detection_charts = config_get_boolean(config_section_ml, "stream anomaly detection charts", true);
  82. }