exporting_engine.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  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_USE_TLS = (1 << 5),
  20. EXPORTING_OPTION_SEND_NAMES = (1 << 16),
  21. EXPORTING_OPTION_SEND_VARIABLES = (1 << 17)
  22. } EXPORTING_OPTIONS;
  23. #define EXPORTING_OPTIONS_SOURCE_BITS \
  24. (EXPORTING_SOURCE_DATA_AS_COLLECTED | EXPORTING_SOURCE_DATA_AVERAGE | EXPORTING_SOURCE_DATA_SUM)
  25. #define EXPORTING_OPTIONS_DATA_SOURCE(exporting_options) ((exporting_options) & EXPORTING_OPTIONS_SOURCE_BITS)
  26. extern EXPORTING_OPTIONS global_exporting_options;
  27. extern const char *global_exporting_prefix;
  28. #define sending_labels_configured(instance) \
  29. ((instance)->config.options & (EXPORTING_OPTION_SEND_CONFIGURED_LABELS | EXPORTING_OPTION_SEND_AUTOMATIC_LABELS))
  30. #define should_send_label(instance, label_source) \
  31. (((instance)->config.options & EXPORTING_OPTION_SEND_CONFIGURED_LABELS && (label_source)&RRDLABEL_SRC_CONFIG) || \
  32. ((instance)->config.options & EXPORTING_OPTION_SEND_AUTOMATIC_LABELS && (label_source)&RRDLABEL_SRC_AUTO))
  33. #define should_send_variables(instance) ((instance)->config.options & EXPORTING_OPTION_SEND_VARIABLES)
  34. typedef enum exporting_connector_types {
  35. EXPORTING_CONNECTOR_TYPE_UNKNOWN, // Invalid type
  36. EXPORTING_CONNECTOR_TYPE_GRAPHITE, // Send plain text to Graphite
  37. EXPORTING_CONNECTOR_TYPE_GRAPHITE_HTTP, // Send data to Graphite using HTTP API
  38. EXPORTING_CONNECTOR_TYPE_JSON, // Send data in JSON format
  39. EXPORTING_CONNECTOR_TYPE_JSON_HTTP, // Send data in JSON format using HTTP API
  40. EXPORTING_CONNECTOR_TYPE_OPENTSDB, // Send data to OpenTSDB using telnet API
  41. EXPORTING_CONNECTOR_TYPE_OPENTSDB_HTTP, // Send data to OpenTSDB using HTTP API
  42. EXPORTING_CONNECTOR_TYPE_PROMETHEUS_REMOTE_WRITE, // Send data using Prometheus remote write protocol
  43. EXPORTING_CONNECTOR_TYPE_KINESIS, // Send message to AWS Kinesis
  44. EXPORTING_CONNECTOR_TYPE_PUBSUB, // Send message to Google Cloud Pub/Sub
  45. EXPORTING_CONNECTOR_TYPE_MONGODB, // Send data to MongoDB collection
  46. EXPORTING_CONNECTOR_TYPE_NUM // Number of exporting connector types
  47. } EXPORTING_CONNECTOR_TYPE;
  48. struct engine;
  49. struct instance_config {
  50. EXPORTING_CONNECTOR_TYPE type;
  51. const char *type_name;
  52. const char *name;
  53. const char *destination;
  54. const char *username;
  55. const char *password;
  56. const char *prefix;
  57. const char *label_prefix;
  58. const char *hostname;
  59. int update_every;
  60. int buffer_on_failures;
  61. long timeoutms;
  62. EXPORTING_OPTIONS options;
  63. SIMPLE_PATTERN *charts_pattern;
  64. SIMPLE_PATTERN *hosts_pattern;
  65. int initialized;
  66. void *connector_specific_config;
  67. };
  68. struct simple_connector_config {
  69. int default_port;
  70. };
  71. struct simple_connector_buffer {
  72. BUFFER *header;
  73. BUFFER *buffer;
  74. size_t buffered_metrics;
  75. size_t buffered_bytes;
  76. int used;
  77. struct simple_connector_buffer *next;
  78. };
  79. #define CONNECTED_TO_MAX 1024
  80. struct simple_connector_data {
  81. void *connector_specific_data;
  82. char connected_to[CONNECTED_TO_MAX];
  83. char *auth_string;
  84. size_t total_buffered_metrics;
  85. BUFFER *header;
  86. BUFFER *buffer;
  87. size_t buffered_metrics;
  88. size_t buffered_bytes;
  89. struct simple_connector_buffer *previous_buffer;
  90. struct simple_connector_buffer *first_buffer;
  91. struct simple_connector_buffer *last_buffer;
  92. #ifdef ENABLE_HTTPS
  93. NETDATA_SSL ssl;
  94. #endif
  95. };
  96. struct prometheus_remote_write_specific_config {
  97. char *remote_write_path;
  98. };
  99. struct aws_kinesis_specific_config {
  100. char *stream_name;
  101. char *auth_key_id;
  102. char *secure_key;
  103. };
  104. struct pubsub_specific_config {
  105. char *credentials_file;
  106. char *project_id;
  107. char *topic_id;
  108. };
  109. struct mongodb_specific_config {
  110. char *database;
  111. char *collection;
  112. };
  113. struct engine_config {
  114. const char *hostname;
  115. int update_every;
  116. };
  117. struct stats {
  118. collected_number buffered_metrics;
  119. collected_number lost_metrics;
  120. collected_number sent_metrics;
  121. collected_number buffered_bytes;
  122. collected_number lost_bytes;
  123. collected_number sent_bytes;
  124. collected_number received_bytes;
  125. collected_number transmission_successes;
  126. collected_number data_lost_events;
  127. collected_number reconnects;
  128. collected_number transmission_failures;
  129. collected_number receptions;
  130. int initialized;
  131. RRDSET *st_metrics;
  132. RRDDIM *rd_buffered_metrics;
  133. RRDDIM *rd_lost_metrics;
  134. RRDDIM *rd_sent_metrics;
  135. RRDSET *st_bytes;
  136. RRDDIM *rd_buffered_bytes;
  137. RRDDIM *rd_lost_bytes;
  138. RRDDIM *rd_sent_bytes;
  139. RRDDIM *rd_received_bytes;
  140. RRDSET *st_ops;
  141. RRDDIM *rd_transmission_successes;
  142. RRDDIM *rd_data_lost_events;
  143. RRDDIM *rd_reconnects;
  144. RRDDIM *rd_transmission_failures;
  145. RRDDIM *rd_receptions;
  146. RRDSET *st_rusage;
  147. RRDDIM *rd_user;
  148. RRDDIM *rd_system;
  149. };
  150. struct instance {
  151. struct instance_config config;
  152. void *buffer;
  153. void (*worker)(void *instance_p);
  154. struct stats stats;
  155. int scheduled;
  156. int disabled;
  157. int skip_host;
  158. int skip_chart;
  159. BUFFER *labels_buffer;
  160. time_t after;
  161. time_t before;
  162. uv_thread_t thread;
  163. uv_mutex_t mutex;
  164. uv_cond_t cond_var;
  165. int data_is_ready;
  166. int (*start_batch_formatting)(struct instance *instance);
  167. int (*start_host_formatting)(struct instance *instance, RRDHOST *host);
  168. int (*start_chart_formatting)(struct instance *instance, RRDSET *st);
  169. int (*metric_formatting)(struct instance *instance, RRDDIM *rd);
  170. int (*end_chart_formatting)(struct instance *instance, RRDSET *st);
  171. int (*variables_formatting)(struct instance *instance, RRDHOST *host);
  172. int (*end_host_formatting)(struct instance *instance, RRDHOST *host);
  173. int (*end_batch_formatting)(struct instance *instance);
  174. void (*prepare_header)(struct instance *instance);
  175. int (*check_response)(BUFFER *buffer, struct instance *instance);
  176. void *connector_specific_data;
  177. size_t index;
  178. struct instance *next;
  179. struct engine *engine;
  180. volatile sig_atomic_t exited;
  181. };
  182. struct engine {
  183. struct engine_config config;
  184. size_t instance_num;
  185. time_t now;
  186. int aws_sdk_initialized;
  187. int protocol_buffers_initialized;
  188. int mongoc_initialized;
  189. struct instance *instance_root;
  190. volatile sig_atomic_t exit;
  191. };
  192. extern struct instance *prometheus_exporter_instance;
  193. void *exporting_main(void *ptr);
  194. struct engine *read_exporting_config();
  195. EXPORTING_CONNECTOR_TYPE exporting_select_type(const char *type);
  196. int init_connectors(struct engine *engine);
  197. void simple_connector_init(struct instance *instance);
  198. int mark_scheduled_instances(struct engine *engine);
  199. void prepare_buffers(struct engine *engine);
  200. size_t exporting_name_copy(char *dst, const char *src, size_t max_len);
  201. int rrdhost_is_exportable(struct instance *instance, RRDHOST *host);
  202. int rrdset_is_exportable(struct instance *instance, RRDSET *st);
  203. EXPORTING_OPTIONS exporting_parse_data_source(const char *source, EXPORTING_OPTIONS exporting_options);
  204. NETDATA_DOUBLE
  205. exporting_calculate_value_from_stored_data(
  206. struct instance *instance,
  207. RRDDIM *rd,
  208. time_t *last_timestamp);
  209. void start_batch_formatting(struct engine *engine);
  210. void start_host_formatting(struct engine *engine, RRDHOST *host);
  211. void start_chart_formatting(struct engine *engine, RRDSET *st);
  212. void metric_formatting(struct engine *engine, RRDDIM *rd);
  213. void end_chart_formatting(struct engine *engine, RRDSET *st);
  214. void variables_formatting(struct engine *engine, RRDHOST *host);
  215. void end_host_formatting(struct engine *engine, RRDHOST *host);
  216. void end_batch_formatting(struct engine *engine);
  217. int flush_host_labels(struct instance *instance, RRDHOST *host);
  218. int simple_connector_end_batch(struct instance *instance);
  219. int exporting_discard_response(BUFFER *buffer, struct instance *instance);
  220. void simple_connector_receive_response(int *sock, struct instance *instance);
  221. void simple_connector_send_buffer(
  222. int *sock, int *failures, struct instance *instance, BUFFER *header, BUFFER *buffer, size_t buffered_metrics);
  223. void simple_connector_worker(void *instance_p);
  224. void create_main_rusage_chart(RRDSET **st_rusage, RRDDIM **rd_user, RRDDIM **rd_system);
  225. void send_main_rusage(RRDSET *st_rusage, RRDDIM *rd_user, RRDDIM *rd_system);
  226. void send_internal_metrics(struct instance *instance);
  227. void clean_instance(struct instance *ptr);
  228. void simple_connector_cleanup(struct instance *instance);
  229. static inline void disable_instance(struct instance *instance)
  230. {
  231. instance->disabled = 1;
  232. instance->scheduled = 0;
  233. uv_mutex_unlock(&instance->mutex);
  234. netdata_log_error("EXPORTING: Instance %s disabled", instance->config.name);
  235. }
  236. #include "exporting/prometheus/prometheus.h"
  237. #include "exporting/opentsdb/opentsdb.h"
  238. #ifdef ENABLE_PROMETHEUS_REMOTE_WRITE
  239. #include "exporting/prometheus/remote_write/remote_write.h"
  240. #endif
  241. #if HAVE_KINESIS
  242. #include "exporting/aws_kinesis/aws_kinesis.h"
  243. #endif
  244. #endif /* NETDATA_EXPORTING_ENGINE_H */