rrd_api_stats.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "rrd_api_stats.h"
  3. static const char *const rrd_type = "netdata";
  4. static char **dim_db_timings_write, **dim_db_timings_rotate;
  5. extern bool logsmanagement_should_exit;
  6. static void stats_charts_update(void){
  7. /* Circular buffer total memory stats - update */
  8. lgs_mng_update_chart_begin(rrd_type, "circular_buffers_mem_total_cached");
  9. for(int i = 0; i < p_file_infos_arr->count; i++){
  10. struct File_info *p_file_info = p_file_infos_arr->data[i];
  11. if(!p_file_info->parser_config)
  12. continue;
  13. lgs_mng_update_chart_set(p_file_info->chartname,
  14. __atomic_load_n(&p_file_info->circ_buff->total_cached_mem, __ATOMIC_RELAXED));
  15. }
  16. lgs_mng_update_chart_end(0);
  17. /* Circular buffer number of items - update */
  18. lgs_mng_update_chart_begin(rrd_type, "circular_buffers_num_of_items");
  19. for(int i = 0; i < p_file_infos_arr->count; i++){
  20. struct File_info *p_file_info = p_file_infos_arr->data[i];
  21. if(!p_file_info->parser_config)
  22. continue;
  23. lgs_mng_update_chart_set(p_file_info->chartname, p_file_info->circ_buff->num_of_items);
  24. }
  25. lgs_mng_update_chart_end(0);
  26. /* Circular buffer uncompressed buffered items memory stats - update */
  27. lgs_mng_update_chart_begin(rrd_type, "circular_buffers_mem_uncompressed_used");
  28. for(int i = 0; i < p_file_infos_arr->count; i++){
  29. struct File_info *p_file_info = p_file_infos_arr->data[i];
  30. if(!p_file_info->parser_config)
  31. continue;
  32. lgs_mng_update_chart_set(p_file_info->chartname,
  33. __atomic_load_n(&p_file_info->circ_buff->text_size_total, __ATOMIC_RELAXED));
  34. }
  35. lgs_mng_update_chart_end(0);
  36. /* Circular buffer compressed buffered items memory stats - update */
  37. lgs_mng_update_chart_begin(rrd_type, "circular_buffers_mem_compressed_used");
  38. for(int i = 0; i < p_file_infos_arr->count; i++){
  39. struct File_info *p_file_info = p_file_infos_arr->data[i];
  40. if(!p_file_info->parser_config)
  41. continue;
  42. lgs_mng_update_chart_set(p_file_info->chartname,
  43. __atomic_load_n(&p_file_info->circ_buff->text_compressed_size_total, __ATOMIC_RELAXED));
  44. }
  45. lgs_mng_update_chart_end(0);
  46. /* Compression stats - update */
  47. lgs_mng_update_chart_begin(rrd_type, "average_compression_ratio");
  48. for(int i = 0; i < p_file_infos_arr->count; i++){
  49. struct File_info *p_file_info = p_file_infos_arr->data[i];
  50. if(!p_file_info->parser_config)
  51. continue;
  52. lgs_mng_update_chart_set(p_file_info->chartname,
  53. __atomic_load_n(&p_file_info->circ_buff->compression_ratio, __ATOMIC_RELAXED));
  54. }
  55. lgs_mng_update_chart_end(0);
  56. /* DB disk usage stats - update */
  57. lgs_mng_update_chart_begin(rrd_type, "database_disk_usage");
  58. for(int i = 0; i < p_file_infos_arr->count; i++){
  59. struct File_info *p_file_info = p_file_infos_arr->data[i];
  60. if(!p_file_info->parser_config)
  61. continue;
  62. lgs_mng_update_chart_set(p_file_info->chartname,
  63. __atomic_load_n(&p_file_info->blob_total_size, __ATOMIC_RELAXED));
  64. }
  65. lgs_mng_update_chart_end(0);
  66. /* DB timings - update */
  67. lgs_mng_update_chart_begin(rrd_type, "database_timings");
  68. for(int i = 0; i < p_file_infos_arr->count; i++){
  69. struct File_info *p_file_info = p_file_infos_arr->data[i];
  70. if(!p_file_info->parser_config)
  71. continue;
  72. lgs_mng_update_chart_set(dim_db_timings_write[i],
  73. __atomic_exchange_n(&p_file_info->db_write_duration, 0, __ATOMIC_RELAXED));
  74. lgs_mng_update_chart_set(dim_db_timings_rotate[i],
  75. __atomic_exchange_n(&p_file_info->db_rotate_duration, 0, __ATOMIC_RELAXED));
  76. }
  77. lgs_mng_update_chart_end(0);
  78. /* Query CPU time per byte (user) - update */
  79. lgs_mng_update_chart_begin(rrd_type, "query_cpu_time_per_MiB_user");
  80. for(int i = 0; i < p_file_infos_arr->count; i++){
  81. struct File_info *p_file_info = p_file_infos_arr->data[i];
  82. if(!p_file_info->parser_config)
  83. continue;
  84. lgs_mng_update_chart_set(p_file_info->chartname,
  85. __atomic_load_n(&p_file_info->cpu_time_per_mib.user, __ATOMIC_RELAXED));
  86. }
  87. lgs_mng_update_chart_end(0);
  88. /* Query CPU time per byte (user) - update */
  89. lgs_mng_update_chart_begin(rrd_type, "query_cpu_time_per_MiB_sys");
  90. for(int i = 0; i < p_file_infos_arr->count; i++){
  91. struct File_info *p_file_info = p_file_infos_arr->data[i];
  92. if(!p_file_info->parser_config)
  93. continue;
  94. lgs_mng_update_chart_set(p_file_info->chartname,
  95. __atomic_load_n(&p_file_info->cpu_time_per_mib.sys, __ATOMIC_RELAXED));
  96. }
  97. lgs_mng_update_chart_end(0);
  98. }
  99. void stats_charts_init(void *arg){
  100. netdata_mutex_t *p_stdout_mut = (netdata_mutex_t *) arg;
  101. netdata_mutex_lock(p_stdout_mut);
  102. int chart_prio = NETDATA_CHART_PRIO_LOGS_STATS_BASE;
  103. /* Circular buffer total memory stats - initialise */
  104. lgs_mng_create_chart(
  105. rrd_type // type
  106. , "circular_buffers_mem_total_cached" // id
  107. , "Circular buffers total cached memory" // title
  108. , "bytes" // units
  109. , "logsmanagement" // family
  110. , NULL // context
  111. , RRDSET_TYPE_STACKED_NAME // chart_type
  112. , ++chart_prio // priority
  113. , g_logs_manag_config.update_every // update_every
  114. );
  115. for(int i = 0; i < p_file_infos_arr->count; i++)
  116. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  117. /* Circular buffer number of items - initialise */
  118. lgs_mng_create_chart(
  119. rrd_type // type
  120. , "circular_buffers_num_of_items" // id
  121. , "Circular buffers number of items" // title
  122. , "items" // units
  123. , "logsmanagement" // family
  124. , NULL // context
  125. , RRDSET_TYPE_LINE_NAME // chart_type
  126. , ++chart_prio // priority
  127. , g_logs_manag_config.update_every // update_every
  128. );
  129. for(int i = 0; i < p_file_infos_arr->count; i++)
  130. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  131. /* Circular buffer uncompressed buffered items memory stats - initialise */
  132. lgs_mng_create_chart(
  133. rrd_type // type
  134. , "circular_buffers_mem_uncompressed_used" // id
  135. , "Circular buffers used memory for uncompressed logs" // title
  136. , "bytes" // units
  137. , "logsmanagement" // family
  138. , NULL // context
  139. , RRDSET_TYPE_STACKED_NAME // chart_type
  140. , ++chart_prio // priority
  141. , g_logs_manag_config.update_every // update_every
  142. );
  143. for(int i = 0; i < p_file_infos_arr->count; i++)
  144. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  145. /* Circular buffer compressed buffered items memory stats - initialise */
  146. lgs_mng_create_chart(
  147. rrd_type // type
  148. , "circular_buffers_mem_compressed_used" // id
  149. , "Circular buffers used memory for compressed logs" // title
  150. , "bytes" // units
  151. , "logsmanagement" // family
  152. , NULL // context
  153. , RRDSET_TYPE_STACKED_NAME // chart_type
  154. , ++chart_prio // priority
  155. , g_logs_manag_config.update_every // update_every
  156. );
  157. for(int i = 0; i < p_file_infos_arr->count; i++)
  158. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  159. /* Compression stats - initialise */
  160. lgs_mng_create_chart(
  161. rrd_type // type
  162. , "average_compression_ratio" // id
  163. , "Average compression ratio" // title
  164. , "uncompressed / compressed ratio" // units
  165. , "logsmanagement" // family
  166. , NULL // context
  167. , RRDSET_TYPE_LINE_NAME // chart_type
  168. , ++chart_prio // priority
  169. , g_logs_manag_config.update_every // update_every
  170. );
  171. for(int i = 0; i < p_file_infos_arr->count; i++)
  172. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  173. /* DB disk usage stats - initialise */
  174. lgs_mng_create_chart(
  175. rrd_type // type
  176. , "database_disk_usage" // id
  177. , "Database disk usage" // title
  178. , "bytes" // units
  179. , "logsmanagement" // family
  180. , NULL // context
  181. , RRDSET_TYPE_STACKED_NAME // chart_type
  182. , ++chart_prio // priority
  183. , g_logs_manag_config.update_every // update_every
  184. );
  185. for(int i = 0; i < p_file_infos_arr->count; i++)
  186. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  187. /* DB timings - initialise */
  188. lgs_mng_create_chart(
  189. rrd_type // type
  190. , "database_timings" // id
  191. , "Database timings" // title
  192. , "ns" // units
  193. , "logsmanagement" // family
  194. , NULL // context
  195. , RRDSET_TYPE_STACKED_NAME // chart_type
  196. , ++chart_prio // priority
  197. , g_logs_manag_config.update_every // update_every
  198. );
  199. for(int i = 0; i < p_file_infos_arr->count; i++){
  200. struct File_info *p_file_info = p_file_infos_arr->data[i];
  201. dim_db_timings_write = reallocz(dim_db_timings_write, (i + 1) * sizeof(char *));
  202. dim_db_timings_rotate = reallocz(dim_db_timings_rotate, (i + 1) * sizeof(char *));
  203. dim_db_timings_write[i] = mallocz(snprintf(NULL, 0, "%s_write", p_file_info->chartname) + 1);
  204. sprintf(dim_db_timings_write[i], "%s_write", p_file_info->chartname);
  205. lgs_mng_add_dim(dim_db_timings_write[i], RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  206. dim_db_timings_rotate[i] = mallocz(snprintf(NULL, 0, "%s_rotate", p_file_info->chartname) + 1);
  207. sprintf(dim_db_timings_rotate[i], "%s_rotate", p_file_info->chartname);
  208. lgs_mng_add_dim(dim_db_timings_rotate[i], RRD_ALGORITHM_ABSOLUTE_NAME, 1, 1);
  209. }
  210. /* Query CPU time per byte (user) - initialise */
  211. lgs_mng_create_chart(
  212. rrd_type // type
  213. , "query_cpu_time_per_MiB_user" // id
  214. , "CPU user time per MiB of query results" // title
  215. , "usec/MiB" // units
  216. , "logsmanagement" // family
  217. , NULL // context
  218. , RRDSET_TYPE_STACKED_NAME // chart_type
  219. , ++chart_prio // priority
  220. , g_logs_manag_config.update_every // update_every
  221. );
  222. for(int i = 0; i < p_file_infos_arr->count; i++)
  223. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  224. /* Query CPU time per byte (system) - initialise */
  225. lgs_mng_create_chart(
  226. rrd_type // type
  227. , "query_cpu_time_per_MiB_sys" // id
  228. , "CPU system time per MiB of query results" // title
  229. , "usec/MiB" // units
  230. , "logsmanagement" // family
  231. , NULL // context
  232. , RRDSET_TYPE_STACKED_NAME // chart_type
  233. , ++chart_prio // priority
  234. , g_logs_manag_config.update_every // update_every
  235. );
  236. for(int i = 0; i < p_file_infos_arr->count; i++)
  237. lgs_mng_add_dim(p_file_infos_arr->data[i]->chartname, RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  238. netdata_mutex_unlock(p_stdout_mut);
  239. heartbeat_t hb;
  240. heartbeat_init(&hb);
  241. usec_t step_ut = g_logs_manag_config.update_every * USEC_PER_SEC;
  242. while (0 == __atomic_load_n(&logsmanagement_should_exit, __ATOMIC_RELAXED)) {
  243. heartbeat_next(&hb, step_ut);
  244. netdata_mutex_lock(p_stdout_mut);
  245. stats_charts_update();
  246. fflush(stdout);
  247. netdata_mutex_unlock(p_stdout_mut);
  248. }
  249. collector_info("[stats charts]: thread exiting...");
  250. }