send_internal_metrics.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "exporting_engine.h"
  3. /**
  4. * Create a chart for the main exporting thread CPU usage
  5. *
  6. * @param st_rusage the thead CPU usage chart
  7. * @param rd_user a dimension for user CPU usage
  8. * @param rd_system a dimension for system CPU usage
  9. */
  10. void create_main_rusage_chart(RRDSET **st_rusage, RRDDIM **rd_user, RRDDIM **rd_system)
  11. {
  12. if (*st_rusage && *rd_user && *rd_system)
  13. return;
  14. *st_rusage = rrdset_create_localhost(
  15. "netdata", "exporting_main_thread_cpu", NULL, "exporting", "exporting_cpu_usage", "Netdata Main Exporting Thread CPU Usage",
  16. "milliseconds/s", "exporting", NULL, 130600, localhost->rrd_update_every, RRDSET_TYPE_STACKED);
  17. *rd_user = rrddim_add(*st_rusage, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
  18. *rd_system = rrddim_add(*st_rusage, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
  19. }
  20. /**
  21. * Send the main exporting thread CPU usage
  22. *
  23. * @param st_rusage a thead CPU usage chart
  24. * @param rd_user a dimension for user CPU usage
  25. * @param rd_system a dimension for system CPU usage
  26. */
  27. void send_main_rusage(RRDSET *st_rusage, RRDDIM *rd_user, RRDDIM *rd_system)
  28. {
  29. struct rusage thread;
  30. getrusage(RUSAGE_THREAD, &thread);
  31. if (likely(st_rusage->counter_done))
  32. rrdset_next(st_rusage);
  33. rrddim_set_by_pointer(st_rusage, rd_user, thread.ru_utime.tv_sec * 1000000ULL + thread.ru_utime.tv_usec);
  34. rrddim_set_by_pointer(st_rusage, rd_system, thread.ru_stime.tv_sec * 1000000ULL + thread.ru_stime.tv_usec);
  35. rrdset_done(st_rusage);
  36. }
  37. /**
  38. * Send internal metrics for an instance
  39. *
  40. * Send performance metrics for the operation of exporting engine itself to the Netdata database.
  41. *
  42. * @param instance an instance data structure.
  43. */
  44. void send_internal_metrics(struct instance *instance)
  45. {
  46. struct stats *stats = &instance->stats;
  47. // ------------------------------------------------------------------------
  48. // create charts for monitoring the exporting operations
  49. if (!stats->initialized) {
  50. char id[RRD_ID_LENGTH_MAX + 1];
  51. BUFFER *family = buffer_create(0);
  52. buffer_sprintf(family, "exporting_%s", instance->config.name);
  53. snprintf(id, RRD_ID_LENGTH_MAX, "exporting_%s_metrics", instance->config.name);
  54. netdata_fix_chart_id(id);
  55. stats->st_metrics = rrdset_create_localhost(
  56. "netdata", id, NULL, buffer_tostring(family), "exporting_buffer", "Netdata Buffered Metrics", "metrics", "exporting", NULL,
  57. 130610, instance->config.update_every, RRDSET_TYPE_LINE);
  58. stats->rd_buffered_metrics = rrddim_add(stats->st_metrics, "buffered", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  59. stats->rd_lost_metrics = rrddim_add(stats->st_metrics, "lost", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  60. stats->rd_sent_metrics = rrddim_add(stats->st_metrics, "sent", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  61. // ------------------------------------------------------------------------
  62. snprintf(id, RRD_ID_LENGTH_MAX, "exporting_%s_bytes", instance->config.name);
  63. netdata_fix_chart_id(id);
  64. stats->st_bytes = rrdset_create_localhost(
  65. "netdata", id, NULL, buffer_tostring(family), "exporting_data_size", "Netdata Exporting Data Size", "KiB", "exporting", NULL,
  66. 130620, instance->config.update_every, RRDSET_TYPE_AREA);
  67. stats->rd_buffered_bytes = rrddim_add(stats->st_bytes, "buffered", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  68. stats->rd_lost_bytes = rrddim_add(stats->st_bytes, "lost", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  69. stats->rd_sent_bytes = rrddim_add(stats->st_bytes, "sent", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  70. stats->rd_received_bytes = rrddim_add(stats->st_bytes, "received", NULL, 1, 1024, RRD_ALGORITHM_ABSOLUTE);
  71. // ------------------------------------------------------------------------
  72. snprintf(id, RRD_ID_LENGTH_MAX, "exporting_%s_ops", instance->config.name);
  73. netdata_fix_chart_id(id);
  74. stats->st_ops = rrdset_create_localhost(
  75. "netdata", id, NULL, buffer_tostring(family), "exporting_operations", "Netdata Exporting Operations", "operations", "exporting",
  76. NULL, 130630, instance->config.update_every, RRDSET_TYPE_LINE);
  77. stats->rd_transmission_successes = rrddim_add(stats->st_ops, "write", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  78. stats->rd_data_lost_events = rrddim_add(stats->st_ops, "discard", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  79. stats->rd_reconnects = rrddim_add(stats->st_ops, "reconnect", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  80. stats->rd_transmission_failures = rrddim_add(stats->st_ops, "failure", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  81. stats->rd_receptions = rrddim_add(stats->st_ops, "read", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  82. // ------------------------------------------------------------------------
  83. snprintf(id, RRD_ID_LENGTH_MAX, "exporting_%s_thread_cpu", instance->config.name);
  84. netdata_fix_chart_id(id);
  85. stats->st_rusage = rrdset_create_localhost(
  86. "netdata", id, NULL, buffer_tostring(family), "exporting_instance", "Netdata Exporting Instance Thread CPU Usage",
  87. "milliseconds/s", "exporting", NULL, 130640, instance->config.update_every, RRDSET_TYPE_STACKED);
  88. stats->rd_user = rrddim_add(stats->st_rusage, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
  89. stats->rd_system = rrddim_add(stats->st_rusage, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
  90. buffer_free(family);
  91. stats->initialized = 1;
  92. }
  93. // ------------------------------------------------------------------------
  94. // update the monitoring charts
  95. if (likely(stats->st_metrics->counter_done))
  96. rrdset_next(stats->st_metrics);
  97. rrddim_set_by_pointer(stats->st_metrics, stats->rd_buffered_metrics, stats->buffered_metrics);
  98. rrddim_set_by_pointer(stats->st_metrics, stats->rd_lost_metrics, stats->lost_metrics);
  99. rrddim_set_by_pointer(stats->st_metrics, stats->rd_sent_metrics, stats->sent_metrics);
  100. rrdset_done(stats->st_metrics);
  101. // ------------------------------------------------------------------------
  102. if (likely(stats->st_bytes->counter_done))
  103. rrdset_next(stats->st_bytes);
  104. rrddim_set_by_pointer(stats->st_bytes, stats->rd_buffered_bytes, stats->buffered_bytes);
  105. rrddim_set_by_pointer(stats->st_bytes, stats->rd_lost_bytes, stats->lost_bytes);
  106. rrddim_set_by_pointer(stats->st_bytes, stats->rd_sent_bytes, stats->sent_bytes);
  107. rrddim_set_by_pointer(stats->st_bytes, stats->rd_received_bytes, stats->received_bytes);
  108. rrdset_done(stats->st_bytes);
  109. // ------------------------------------------------------------------------
  110. if (likely(stats->st_ops->counter_done))
  111. rrdset_next(stats->st_ops);
  112. rrddim_set_by_pointer(stats->st_ops, stats->rd_transmission_successes, stats->transmission_successes);
  113. rrddim_set_by_pointer(stats->st_ops, stats->rd_data_lost_events, stats->data_lost_events);
  114. rrddim_set_by_pointer(stats->st_ops, stats->rd_reconnects, stats->reconnects);
  115. rrddim_set_by_pointer(stats->st_ops, stats->rd_transmission_failures, stats->transmission_failures);
  116. rrddim_set_by_pointer(stats->st_ops, stats->rd_receptions, stats->receptions);
  117. rrdset_done(stats->st_ops);
  118. // ------------------------------------------------------------------------
  119. struct rusage thread;
  120. getrusage(RUSAGE_THREAD, &thread);
  121. if (likely(stats->st_rusage->counter_done))
  122. rrdset_next(stats->st_rusage);
  123. rrddim_set_by_pointer(stats->st_rusage, stats->rd_user, thread.ru_utime.tv_sec * 1000000ULL + thread.ru_utime.tv_usec);
  124. rrddim_set_by_pointer(stats->st_rusage, stats->rd_system, thread.ru_stime.tv_sec * 1000000ULL + thread.ru_stime.tv_usec);
  125. rrdset_done(stats->st_rusage);
  126. }