rrd.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #define NETDATA_RRD_INTERNALS 1
  3. #include "rrd.h"
  4. // ----------------------------------------------------------------------------
  5. // globals
  6. /*
  7. // if not zero it gives the time (in seconds) to remove un-updated dimensions
  8. // DO NOT ENABLE
  9. // if dimensions are removed, the chart generation will have to run again
  10. int rrd_delete_unupdated_dimensions = 0;
  11. */
  12. int default_rrd_update_every = UPDATE_EVERY;
  13. int default_rrd_history_entries = RRD_DEFAULT_HISTORY_ENTRIES;
  14. #ifdef ENABLE_DBENGINE
  15. RRD_MEMORY_MODE default_rrd_memory_mode = RRD_MEMORY_MODE_DBENGINE;
  16. #else
  17. RRD_MEMORY_MODE default_rrd_memory_mode = RRD_MEMORY_MODE_SAVE;
  18. #endif
  19. int gap_when_lost_iterations_above = 1;
  20. // ----------------------------------------------------------------------------
  21. // RRD - memory modes
  22. inline const char *rrd_memory_mode_name(RRD_MEMORY_MODE id) {
  23. switch(id) {
  24. case RRD_MEMORY_MODE_RAM:
  25. return RRD_MEMORY_MODE_RAM_NAME;
  26. case RRD_MEMORY_MODE_MAP:
  27. return RRD_MEMORY_MODE_MAP_NAME;
  28. case RRD_MEMORY_MODE_NONE:
  29. return RRD_MEMORY_MODE_NONE_NAME;
  30. case RRD_MEMORY_MODE_SAVE:
  31. return RRD_MEMORY_MODE_SAVE_NAME;
  32. case RRD_MEMORY_MODE_ALLOC:
  33. return RRD_MEMORY_MODE_ALLOC_NAME;
  34. case RRD_MEMORY_MODE_DBENGINE:
  35. return RRD_MEMORY_MODE_DBENGINE_NAME;
  36. }
  37. return RRD_MEMORY_MODE_SAVE_NAME;
  38. }
  39. RRD_MEMORY_MODE rrd_memory_mode_id(const char *name) {
  40. if(unlikely(!strcmp(name, RRD_MEMORY_MODE_RAM_NAME)))
  41. return RRD_MEMORY_MODE_RAM;
  42. else if(unlikely(!strcmp(name, RRD_MEMORY_MODE_MAP_NAME)))
  43. return RRD_MEMORY_MODE_MAP;
  44. else if(unlikely(!strcmp(name, RRD_MEMORY_MODE_NONE_NAME)))
  45. return RRD_MEMORY_MODE_NONE;
  46. else if(unlikely(!strcmp(name, RRD_MEMORY_MODE_ALLOC_NAME)))
  47. return RRD_MEMORY_MODE_ALLOC;
  48. else if(unlikely(!strcmp(name, RRD_MEMORY_MODE_DBENGINE_NAME)))
  49. return RRD_MEMORY_MODE_DBENGINE;
  50. return RRD_MEMORY_MODE_SAVE;
  51. }
  52. // ----------------------------------------------------------------------------
  53. // RRD - algorithms types
  54. RRD_ALGORITHM rrd_algorithm_id(const char *name) {
  55. if(strcmp(name, RRD_ALGORITHM_INCREMENTAL_NAME) == 0)
  56. return RRD_ALGORITHM_INCREMENTAL;
  57. else if(strcmp(name, RRD_ALGORITHM_ABSOLUTE_NAME) == 0)
  58. return RRD_ALGORITHM_ABSOLUTE;
  59. else if(strcmp(name, RRD_ALGORITHM_PCENT_OVER_ROW_TOTAL_NAME) == 0)
  60. return RRD_ALGORITHM_PCENT_OVER_ROW_TOTAL;
  61. else if(strcmp(name, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL_NAME) == 0)
  62. return RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL;
  63. else
  64. return RRD_ALGORITHM_ABSOLUTE;
  65. }
  66. const char *rrd_algorithm_name(RRD_ALGORITHM algorithm) {
  67. switch(algorithm) {
  68. case RRD_ALGORITHM_ABSOLUTE:
  69. default:
  70. return RRD_ALGORITHM_ABSOLUTE_NAME;
  71. case RRD_ALGORITHM_INCREMENTAL:
  72. return RRD_ALGORITHM_INCREMENTAL_NAME;
  73. case RRD_ALGORITHM_PCENT_OVER_ROW_TOTAL:
  74. return RRD_ALGORITHM_PCENT_OVER_ROW_TOTAL_NAME;
  75. case RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL:
  76. return RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL_NAME;
  77. }
  78. }
  79. // ----------------------------------------------------------------------------
  80. // RRD - chart types
  81. inline RRDSET_TYPE rrdset_type_id(const char *name) {
  82. if(unlikely(strcmp(name, RRDSET_TYPE_AREA_NAME) == 0))
  83. return RRDSET_TYPE_AREA;
  84. else if(unlikely(strcmp(name, RRDSET_TYPE_STACKED_NAME) == 0))
  85. return RRDSET_TYPE_STACKED;
  86. else // if(unlikely(strcmp(name, RRDSET_TYPE_LINE_NAME) == 0))
  87. return RRDSET_TYPE_LINE;
  88. }
  89. const char *rrdset_type_name(RRDSET_TYPE chart_type) {
  90. switch(chart_type) {
  91. case RRDSET_TYPE_LINE:
  92. default:
  93. return RRDSET_TYPE_LINE_NAME;
  94. case RRDSET_TYPE_AREA:
  95. return RRDSET_TYPE_AREA_NAME;
  96. case RRDSET_TYPE_STACKED:
  97. return RRDSET_TYPE_STACKED_NAME;
  98. }
  99. }
  100. // ----------------------------------------------------------------------------
  101. // RRD - cache directory
  102. char *rrdset_cache_dir(RRDHOST *host, const char *id, const char *config_section) {
  103. UNUSED(config_section);
  104. char *ret = NULL;
  105. char b[FILENAME_MAX + 1];
  106. char n[FILENAME_MAX + 1];
  107. rrdset_strncpyz_name(b, id, FILENAME_MAX);
  108. snprintfz(n, FILENAME_MAX, "%s/%s", host->cache_dir, b);
  109. ret = strdupz(n);
  110. if(host->rrd_memory_mode == RRD_MEMORY_MODE_MAP || host->rrd_memory_mode == RRD_MEMORY_MODE_SAVE) {
  111. int r = mkdir(ret, 0775);
  112. if(r != 0 && errno != EEXIST)
  113. error("Cannot create directory '%s'", ret);
  114. }
  115. return ret;
  116. }