rrd_api_kernel.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "rrd_api_kernel.h"
  3. void kernel_chart_init(struct File_info *p_file_info){
  4. p_file_info->chart_meta->chart_data_kernel = callocz(1, sizeof (struct Chart_data_kernel));
  5. chart_data_kernel_t *chart_data = p_file_info->chart_meta->chart_data_kernel;
  6. chart_data->last_update = now_realtime_sec(); // initial value shouldn't be 0
  7. long chart_prio = p_file_info->chart_meta->base_prio;
  8. lgs_mng_do_num_of_logs_charts_init(p_file_info, chart_prio);
  9. /* Syslog severity level (== Systemd priority) - initialise */
  10. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_SEVER){
  11. lgs_mng_create_chart(
  12. (char *) p_file_info->chartname // type
  13. , "severity_levels" // id
  14. , "Severity Levels" // title
  15. , "severity levels" // units
  16. , "severity" // family
  17. , NULL // context
  18. , RRDSET_TYPE_AREA_NAME // chart_type
  19. , ++chart_prio // priority
  20. , p_file_info->update_every // update_every
  21. );
  22. for(int i = 0; i < SYSLOG_SEVER_ARR_SIZE; i++)
  23. lgs_mng_add_dim(dim_sever_str[i], RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  24. }
  25. /* Subsystem - initialise */
  26. if(p_file_info->parser_config->chart_config & CHART_KMSG_SUBSYSTEM){
  27. chart_data->cs_subsys = lgs_mng_create_chart(
  28. (char *) p_file_info->chartname // type
  29. , "subsystems" // id
  30. , "Subsystems" // title
  31. , "subsystems" // units
  32. , "subsystem" // family
  33. , NULL // context
  34. , RRDSET_TYPE_AREA_NAME // chart_type
  35. , ++chart_prio // priority
  36. , p_file_info->update_every // update_every
  37. );
  38. }
  39. /* Device - initialise */
  40. if(p_file_info->parser_config->chart_config & CHART_KMSG_DEVICE){
  41. chart_data->cs_device = lgs_mng_create_chart(
  42. (char *) p_file_info->chartname // type
  43. , "devices" // id
  44. , "Devices" // title
  45. , "devices" // units
  46. , "device" // family
  47. , NULL // context
  48. , RRDSET_TYPE_AREA_NAME // chart_type
  49. , ++chart_prio // priority
  50. , p_file_info->update_every // update_every
  51. );
  52. }
  53. lgs_mng_do_custom_charts_init(p_file_info);
  54. }
  55. void kernel_chart_update(struct File_info *p_file_info){
  56. chart_data_kernel_t *chart_data = p_file_info->chart_meta->chart_data_kernel;
  57. if(chart_data->last_update != p_file_info->parser_metrics->last_update){
  58. time_t lag_in_sec = p_file_info->parser_metrics->last_update - chart_data->last_update - 1;
  59. lgs_mng_do_num_of_logs_charts_update(p_file_info, lag_in_sec, chart_data);
  60. /* Syslog severity level (== Systemd priority) - update */
  61. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_SEVER){
  62. for(time_t sec = p_file_info->parser_metrics->last_update - lag_in_sec;
  63. sec < p_file_info->parser_metrics->last_update;
  64. sec++){
  65. lgs_mng_update_chart_begin(p_file_info->chartname, "severity_levels");
  66. for(int idx = 0; idx < SYSLOG_SEVER_ARR_SIZE; idx++)
  67. lgs_mng_update_chart_set(dim_sever_str[idx], chart_data->num_sever[idx]);
  68. lgs_mng_update_chart_end(sec);
  69. }
  70. lgs_mng_update_chart_begin(p_file_info->chartname, "severity_levels");
  71. for(int idx = 0; idx < SYSLOG_SEVER_ARR_SIZE; idx++){
  72. chart_data->num_sever[idx] = p_file_info->parser_metrics->kernel->sever[idx];
  73. lgs_mng_update_chart_set(dim_sever_str[idx], chart_data->num_sever[idx]);
  74. }
  75. lgs_mng_update_chart_end(p_file_info->parser_metrics->last_update);
  76. }
  77. /* Subsystem - update */
  78. if(p_file_info->parser_config->chart_config & CHART_KMSG_SUBSYSTEM){
  79. metrics_dict_item_t *it;
  80. for(time_t sec = p_file_info->parser_metrics->last_update - lag_in_sec;
  81. sec < p_file_info->parser_metrics->last_update;
  82. sec++){
  83. lgs_mng_update_chart_begin(p_file_info->chartname, "subsystems");
  84. dfe_start_read(p_file_info->parser_metrics->kernel->subsystem, it){
  85. if(it->dim_initialized)
  86. lgs_mng_update_chart_set(it_dfe.name, (collected_number) it->num);
  87. }
  88. dfe_done(it);
  89. lgs_mng_update_chart_end(sec);
  90. }
  91. dfe_start_write(p_file_info->parser_metrics->kernel->subsystem, it){
  92. if(!it->dim_initialized){
  93. it->dim_initialized = true;
  94. lgs_mng_add_dim_post_init( &chart_data->cs_subsys, it_dfe.name,
  95. RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  96. }
  97. }
  98. dfe_done(it);
  99. lgs_mng_update_chart_begin(p_file_info->chartname, "subsystems");
  100. dfe_start_write(p_file_info->parser_metrics->kernel->subsystem, it){
  101. it->num = it->num_new;
  102. lgs_mng_update_chart_set(it_dfe.name, (collected_number) it->num);
  103. }
  104. dfe_done(it);
  105. lgs_mng_update_chart_end(p_file_info->parser_metrics->last_update);
  106. }
  107. /* Device - update */
  108. if(p_file_info->parser_config->chart_config & CHART_KMSG_DEVICE){
  109. metrics_dict_item_t *it;
  110. for(time_t sec = p_file_info->parser_metrics->last_update - lag_in_sec;
  111. sec < p_file_info->parser_metrics->last_update;
  112. sec++){
  113. lgs_mng_update_chart_begin(p_file_info->chartname, "devices");
  114. dfe_start_read(p_file_info->parser_metrics->kernel->device, it){
  115. if(it->dim_initialized)
  116. lgs_mng_update_chart_set(it_dfe.name, (collected_number) it->num);
  117. }
  118. dfe_done(it);
  119. lgs_mng_update_chart_end(sec);
  120. }
  121. dfe_start_write(p_file_info->parser_metrics->kernel->device, it){
  122. if(!it->dim_initialized){
  123. it->dim_initialized = true;
  124. lgs_mng_add_dim_post_init( &chart_data->cs_device, it_dfe.name,
  125. RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  126. }
  127. }
  128. dfe_done(it);
  129. lgs_mng_update_chart_begin(p_file_info->chartname, "devices");
  130. dfe_start_write(p_file_info->parser_metrics->kernel->device, it){
  131. it->num = it->num_new;
  132. lgs_mng_update_chart_set(it_dfe.name, (collected_number) it->num);
  133. }
  134. dfe_done(it);
  135. lgs_mng_update_chart_end(p_file_info->parser_metrics->last_update);
  136. }
  137. lgs_mng_do_custom_charts_update(p_file_info, lag_in_sec);
  138. chart_data->last_update = p_file_info->parser_metrics->last_update;
  139. }
  140. }