exporting_engine.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_EXPORTING_ENGINE_H
  3. #define NETDATA_EXPORTING_ENGINE_H 1
  4. #include "daemon/common.h"
  5. #include <uv.h>
  6. #define exporter_get(section, name, value) expconfig_get(&exporting_config, section, name, value)
  7. #define exporter_get_number(section, name, value) expconfig_get_number(&exporting_config, section, name, value)
  8. #define exporter_get_boolean(section, name, value) expconfig_get_boolean(&exporting_config, section, name, value)
  9. extern struct config exporting_config;
  10. #define EXPORTING_UPDATE_EVERY_OPTION_NAME "update every"
  11. #define EXPORTING_UPDATE_EVERY_DEFAULT 10
  12. typedef enum exporting_options {
  13. EXPORTING_OPTION_NON = 0,
  14. EXPORTING_SOURCE_DATA_AS_COLLECTED = (1 << 0),
  15. EXPORTING_SOURCE_DATA_AVERAGE = (1 << 1),
  16. EXPORTING_SOURCE_DATA_SUM = (1 << 2),
  17. EXPORTING_OPTION_SEND_CONFIGURED_LABELS = (1 << 3),
  18. EXPORTING_OPTION_SEND_AUTOMATIC_LABELS = (1 << 4),
  19. EXPORTING_OPTION_SEND_NAMES = (1 << 16)
  20. } EXPORTING_OPTIONS;
  21. #define EXPORTING_OPTIONS_SOURCE_BITS \
  22. (EXPORTING_SOURCE_DATA_AS_COLLECTED | EXPORTING_SOURCE_DATA_AVERAGE | EXPORTING_SOURCE_DATA_SUM)
  23. #define EXPORTING_OPTIONS_DATA_SOURCE(exporting_options) (exporting_options & EXPORTING_OPTIONS_SOURCE_BITS)
  24. #define sending_labels_configured(instance) \
  25. (instance->config.options & (EXPORTING_OPTION_SEND_CONFIGURED_LABELS | EXPORTING_OPTION_SEND_AUTOMATIC_LABELS))
  26. #define should_send_label(instance, label) \
  27. ((instance->config.options & EXPORTING_OPTION_SEND_CONFIGURED_LABELS && \
  28. label->label_source == LABEL_SOURCE_NETDATA_CONF) || \
  29. (instance->config.options & EXPORTING_OPTION_SEND_AUTOMATIC_LABELS && \
  30. label->label_source != LABEL_SOURCE_NETDATA_CONF))
  31. typedef enum exporting_connector_types {
  32. EXPORTING_CONNECTOR_TYPE_UNKNOWN, // Invalid type
  33. EXPORTING_CONNECTOR_TYPE_GRAPHITE, // Send plain text to Graphite
  34. EXPORTING_CONNECTOR_TYPE_OPENTSDB_USING_TELNET, // Send data to OpenTSDB using telnet API
  35. EXPORTING_CONNECTOR_TYPE_OPENTSDB_USING_HTTP, // Send data to OpenTSDB using HTTP API
  36. EXPORTING_CONNECTOR_TYPE_JSON, // Stores the data using JSON.
  37. EXPORTING_CONNECTOR_TYPE_PROMETHEUS_REMOTE_WRITE, // The user selected to use Prometheus backend
  38. EXPORTING_CONNECTOR_TYPE_KINESIS, // Send message to AWS Kinesis
  39. EXPORTING_CONNECTOR_TYPE_PUBSUB, // Send message to Google Cloud Pub/Sub
  40. EXPORTING_CONNECTOR_TYPE_MONGODB, // Send data to MongoDB collection
  41. EXPORTING_CONNECTOR_TYPE_NUM // Number of backend types
  42. } EXPORTING_CONNECTOR_TYPE;
  43. struct engine;
  44. struct instance_config {
  45. EXPORTING_CONNECTOR_TYPE type;
  46. const char *type_name;
  47. const char *name;
  48. const char *destination;
  49. int update_every;
  50. int buffer_on_failures;
  51. long timeoutms;
  52. EXPORTING_OPTIONS options;
  53. SIMPLE_PATTERN *charts_pattern;
  54. SIMPLE_PATTERN *hosts_pattern;
  55. void *connector_specific_config;
  56. };
  57. struct simple_connector_config {
  58. int default_port;
  59. };
  60. struct prometheus_remote_write_specific_config {
  61. char *remote_write_path;
  62. };
  63. struct aws_kinesis_specific_config {
  64. char *stream_name;
  65. char *auth_key_id;
  66. char *secure_key;
  67. };
  68. struct pubsub_specific_config {
  69. char *credentials_file;
  70. char *project_id;
  71. char *topic_id;
  72. };
  73. struct mongodb_specific_config {
  74. char *database;
  75. char *collection;
  76. };
  77. struct engine_config {
  78. const char *prefix;
  79. const char *hostname;
  80. int update_every;
  81. };
  82. struct stats {
  83. collected_number buffered_metrics;
  84. collected_number lost_metrics;
  85. collected_number sent_metrics;
  86. collected_number buffered_bytes;
  87. collected_number lost_bytes;
  88. collected_number sent_bytes;
  89. collected_number received_bytes;
  90. collected_number transmission_successes;
  91. collected_number data_lost_events;
  92. collected_number reconnects;
  93. collected_number transmission_failures;
  94. collected_number receptions;
  95. int initialized;
  96. RRDSET *st_metrics;
  97. RRDDIM *rd_buffered_metrics;
  98. RRDDIM *rd_lost_metrics;
  99. RRDDIM *rd_sent_metrics;
  100. RRDSET *st_bytes;
  101. RRDDIM *rd_buffered_bytes;
  102. RRDDIM *rd_lost_bytes;
  103. RRDDIM *rd_sent_bytes;
  104. RRDDIM *rd_received_bytes;
  105. RRDSET *st_ops;
  106. RRDDIM *rd_transmission_successes;
  107. RRDDIM *rd_data_lost_events;
  108. RRDDIM *rd_reconnects;
  109. RRDDIM *rd_transmission_failures;
  110. RRDDIM *rd_receptions;
  111. RRDSET *st_rusage;
  112. RRDDIM *rd_user;
  113. RRDDIM *rd_system;
  114. };
  115. struct instance {
  116. struct instance_config config;
  117. void *buffer;
  118. void (*worker)(void *instance_p);
  119. struct stats stats;
  120. int scheduled;
  121. int disabled;
  122. int skip_host;
  123. int skip_chart;
  124. BUFFER *labels;
  125. time_t after;
  126. time_t before;
  127. uv_thread_t thread;
  128. uv_mutex_t mutex;
  129. uv_cond_t cond_var;
  130. int (*start_batch_formatting)(struct instance *instance);
  131. int (*start_host_formatting)(struct instance *instance, RRDHOST *host);
  132. int (*start_chart_formatting)(struct instance *instance, RRDSET *st);
  133. int (*metric_formatting)(struct instance *instance, RRDDIM *rd);
  134. int (*end_chart_formatting)(struct instance *instance, RRDSET *st);
  135. int (*end_host_formatting)(struct instance *instance, RRDHOST *host);
  136. int (*end_batch_formatting)(struct instance *instance);
  137. int (*send_header)(int *sock, struct instance *instance);
  138. int (*check_response)(BUFFER *buffer, struct instance *instance);
  139. void *connector_specific_data;
  140. size_t index;
  141. struct instance *next;
  142. struct engine *engine;
  143. volatile sig_atomic_t exited;
  144. };
  145. struct engine {
  146. struct engine_config config;
  147. size_t instance_num;
  148. time_t now;
  149. int aws_sdk_initialized;
  150. int mongoc_initialized;
  151. struct instance *instance_root;
  152. volatile sig_atomic_t exit;
  153. };
  154. extern struct instance *prometheus_exporter_instance;
  155. void *exporting_main(void *ptr);
  156. struct engine *read_exporting_config();
  157. EXPORTING_CONNECTOR_TYPE exporting_select_type(const char *type);
  158. int init_connectors(struct engine *engine);
  159. int mark_scheduled_instances(struct engine *engine);
  160. void prepare_buffers(struct engine *engine);
  161. size_t exporting_name_copy(char *dst, const char *src, size_t max_len);
  162. int rrdhost_is_exportable(struct instance *instance, RRDHOST *host);
  163. int rrdset_is_exportable(struct instance *instance, RRDSET *st);
  164. calculated_number exporting_calculate_value_from_stored_data(
  165. struct instance *instance,
  166. RRDDIM *rd,
  167. time_t *last_timestamp);
  168. void start_batch_formatting(struct engine *engine);
  169. void start_host_formatting(struct engine *engine, RRDHOST *host);
  170. void start_chart_formatting(struct engine *engine, RRDSET *st);
  171. void metric_formatting(struct engine *engine, RRDDIM *rd);
  172. void end_chart_formatting(struct engine *engine, RRDSET *st);
  173. void end_host_formatting(struct engine *engine, RRDHOST *host);
  174. void end_batch_formatting(struct engine *engine);
  175. int flush_host_labels(struct instance *instance, RRDHOST *host);
  176. int simple_connector_update_buffered_bytes(struct instance *instance);
  177. int exporting_discard_response(BUFFER *buffer, struct instance *instance);
  178. void simple_connector_receive_response(int *sock, struct instance *instance);
  179. void simple_connector_send_buffer(int *sock, int *failures, struct instance *instance);
  180. void simple_connector_worker(void *instance_p);
  181. void create_main_rusage_chart(RRDSET **st_rusage, RRDDIM **rd_user, RRDDIM **rd_system);
  182. void send_main_rusage(RRDSET *st_rusage, RRDDIM *rd_user, RRDDIM *rd_system);
  183. void send_internal_metrics(struct instance *instance);
  184. extern void clean_instance(struct instance *ptr);
  185. static inline void disable_instance(struct instance *instance)
  186. {
  187. instance->disabled = 1;
  188. instance->scheduled = 0;
  189. uv_mutex_unlock(&instance->mutex);
  190. error("EXPORTING: Instance %s disabled", instance->config.name);
  191. }
  192. #include "exporting/prometheus/prometheus.h"
  193. #endif /* NETDATA_EXPORTING_ENGINE_H */