rrd_api_systemd.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "rrd_api_systemd.h"
  3. const char *dim_sever_str[SYSLOG_SEVER_ARR_SIZE] = {
  4. "0:Emergency",
  5. "1:Alert",
  6. "2:Critical",
  7. "3:Error",
  8. "4:Warning",
  9. "5:Notice",
  10. "6:Informational",
  11. "7:Debug",
  12. "uknown"
  13. };
  14. static const char *dim_facil_str[SYSLOG_FACIL_ARR_SIZE] = {
  15. "0:kernel",
  16. "1:user-level",
  17. "2:mail",
  18. "3:system",
  19. "4:sec/auth",
  20. "5:syslog",
  21. "6:lpd/printer",
  22. "7:news/nntp",
  23. "8:uucp",
  24. "9:time",
  25. "10:sec/auth",
  26. "11:ftp",
  27. "12:ntp",
  28. "13:logaudit",
  29. "14:logalert",
  30. "15:clock",
  31. "16:local0",
  32. "17:local1",
  33. "18:local2",
  34. "19:local3",
  35. "20:local4",
  36. "21:local5",
  37. "22:local6",
  38. "23:local7",
  39. "uknown"
  40. };
  41. void systemd_chart_init(struct File_info *p_file_info){
  42. p_file_info->chart_meta->chart_data_systemd = callocz(1, sizeof (struct Chart_data_systemd));
  43. chart_data_systemd_t *chart_data = p_file_info->chart_meta->chart_data_systemd;
  44. chart_data->last_update = now_realtime_sec(); // initial value shouldn't be 0
  45. long chart_prio = p_file_info->chart_meta->base_prio;
  46. lgs_mng_do_num_of_logs_charts_init(p_file_info, chart_prio);
  47. /* Syslog priority value - initialise */
  48. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_PRIOR){
  49. lgs_mng_create_chart(
  50. (char *) p_file_info->chartname // type
  51. , "priority_values" // id
  52. , "Priority Values" // title
  53. , "priority values" // units
  54. , "priority" // family
  55. , NULL // context
  56. , RRDSET_TYPE_AREA_NAME // chart_type
  57. , ++chart_prio // priority
  58. , p_file_info->update_every // update_every
  59. );
  60. for(int i = 0; i < SYSLOG_PRIOR_ARR_SIZE - 1; i++){
  61. char dim_id[4];
  62. snprintfz(dim_id, 4, "%d", i);
  63. chart_data->dim_prior[i] = strdupz(dim_id);
  64. lgs_mng_add_dim(chart_data->dim_prior[i], RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  65. }
  66. chart_data->dim_prior[SYSLOG_PRIOR_ARR_SIZE - 1] = "uknown";
  67. lgs_mng_add_dim(chart_data->dim_prior[SYSLOG_PRIOR_ARR_SIZE - 1],
  68. RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  69. }
  70. /* Syslog severity level (== Systemd priority) - initialise */
  71. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_SEVER){
  72. lgs_mng_create_chart(
  73. (char *) p_file_info->chartname // type
  74. , "severity_levels" // id
  75. , "Severity Levels" // title
  76. , "severity levels" // units
  77. , "priority" // family
  78. , NULL // context
  79. , RRDSET_TYPE_AREA_NAME // chart_type
  80. , ++chart_prio // priority
  81. , p_file_info->update_every // update_every
  82. );
  83. for(int i = 0; i < SYSLOG_SEVER_ARR_SIZE; i++)
  84. lgs_mng_add_dim(dim_sever_str[i], RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  85. }
  86. /* Syslog facility level - initialise */
  87. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_FACIL){
  88. lgs_mng_create_chart(
  89. (char *) p_file_info->chartname // type
  90. , "facility_levels" // id
  91. , "Facility Levels" // title
  92. , "facility levels" // units
  93. , "priority" // family
  94. , NULL // context
  95. , RRDSET_TYPE_AREA_NAME // chart_type
  96. , ++chart_prio // priority
  97. , p_file_info->update_every // update_every
  98. );
  99. for(int i = 0; i < SYSLOG_FACIL_ARR_SIZE; i++)
  100. lgs_mng_add_dim(dim_facil_str[i], RRD_ALGORITHM_INCREMENTAL_NAME, 1, 1);
  101. }
  102. lgs_mng_do_custom_charts_init(p_file_info);
  103. }
  104. void systemd_chart_update(struct File_info *p_file_info){
  105. chart_data_systemd_t *chart_data = p_file_info->chart_meta->chart_data_systemd;
  106. if(chart_data->last_update != p_file_info->parser_metrics->last_update){
  107. time_t lag_in_sec = p_file_info->parser_metrics->last_update - chart_data->last_update - 1;
  108. lgs_mng_do_num_of_logs_charts_update(p_file_info, lag_in_sec, chart_data);
  109. /* Syslog priority value - update */
  110. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_PRIOR){
  111. for(time_t sec = p_file_info->parser_metrics->last_update - lag_in_sec;
  112. sec < p_file_info->parser_metrics->last_update;
  113. sec++){
  114. lgs_mng_update_chart_begin(p_file_info->chartname, "priority_values");
  115. for(int idx = 0; idx < SYSLOG_PRIOR_ARR_SIZE; idx++){
  116. if(chart_data->num_prior[idx])
  117. lgs_mng_update_chart_set(chart_data->dim_prior[idx], chart_data->num_prior[idx]);
  118. }
  119. lgs_mng_update_chart_end(sec);
  120. }
  121. lgs_mng_update_chart_begin(p_file_info->chartname, "priority_values");
  122. for(int idx = 0; idx < SYSLOG_PRIOR_ARR_SIZE; idx++){
  123. if(p_file_info->parser_metrics->systemd->prior[idx]){
  124. chart_data->num_prior[idx] = p_file_info->parser_metrics->systemd->prior[idx];
  125. lgs_mng_update_chart_set(chart_data->dim_prior[idx], chart_data->num_prior[idx]);
  126. }
  127. }
  128. lgs_mng_update_chart_end(p_file_info->parser_metrics->last_update);
  129. }
  130. /* Syslog severity level (== Systemd priority) - update chart */
  131. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_SEVER){
  132. for(time_t sec = p_file_info->parser_metrics->last_update - lag_in_sec;
  133. sec < p_file_info->parser_metrics->last_update;
  134. sec++){
  135. lgs_mng_update_chart_begin(p_file_info->chartname, "severity_levels");
  136. for(int idx = 0; idx < SYSLOG_SEVER_ARR_SIZE; idx++){
  137. if(chart_data->num_sever[idx])
  138. lgs_mng_update_chart_set(dim_sever_str[idx], chart_data->num_sever[idx]);
  139. }
  140. lgs_mng_update_chart_end(sec);
  141. }
  142. lgs_mng_update_chart_begin(p_file_info->chartname, "severity_levels");
  143. for(int idx = 0; idx < SYSLOG_SEVER_ARR_SIZE; idx++){
  144. if(p_file_info->parser_metrics->systemd->sever[idx]){
  145. chart_data->num_sever[idx] = p_file_info->parser_metrics->systemd->sever[idx];
  146. lgs_mng_update_chart_set(dim_sever_str[idx], chart_data->num_sever[idx]);
  147. }
  148. }
  149. lgs_mng_update_chart_end(p_file_info->parser_metrics->last_update);
  150. }
  151. /* Syslog facility value - update chart */
  152. if(p_file_info->parser_config->chart_config & CHART_SYSLOG_FACIL){
  153. for(time_t sec = p_file_info->parser_metrics->last_update - lag_in_sec;
  154. sec < p_file_info->parser_metrics->last_update;
  155. sec++){
  156. lgs_mng_update_chart_begin(p_file_info->chartname, "facility_levels");
  157. for(int idx = 0; idx < SYSLOG_FACIL_ARR_SIZE; idx++){
  158. if(chart_data->num_facil[idx])
  159. lgs_mng_update_chart_set(dim_facil_str[idx], chart_data->num_facil[idx]);
  160. }
  161. lgs_mng_update_chart_end(sec);
  162. }
  163. lgs_mng_update_chart_begin(p_file_info->chartname, "facility_levels");
  164. for(int idx = 0; idx < SYSLOG_FACIL_ARR_SIZE; idx++){
  165. if(p_file_info->parser_metrics->systemd->facil[idx]){
  166. chart_data->num_facil[idx] = p_file_info->parser_metrics->systemd->facil[idx];
  167. lgs_mng_update_chart_set(dim_facil_str[idx], chart_data->num_facil[idx]);
  168. }
  169. }
  170. lgs_mng_update_chart_end(p_file_info->parser_metrics->last_update);
  171. }
  172. lgs_mng_do_custom_charts_update(p_file_info, lag_in_sec);
  173. chart_data->last_update = p_file_info->parser_metrics->last_update;
  174. }
  175. }