rrdpush.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_RRDPUSH_H
  3. #define NETDATA_RRDPUSH_H 1
  4. #include "../database/rrd.h"
  5. #include "../libnetdata/libnetdata.h"
  6. #include "web/server/web_client.h"
  7. #include "daemon/common.h"
  8. #define CONNECTED_TO_SIZE 100
  9. // #define STREAMING_PROTOCOL_CURRENT_VERSION (uint32_t)4 Gap-filling
  10. #define STREAMING_PROTOCOL_CURRENT_VERSION (uint32_t)3
  11. #define VERSION_GAP_FILLING 4
  12. #define STREAM_VERSION_CLAIM 3
  13. #define STREAMING_PROTOCOL_VERSION "1.1"
  14. #define START_STREAMING_PROMPT "Hit me baby, push them over..."
  15. #define START_STREAMING_PROMPT_V2 "Hit me baby, push them over and bring the host labels..."
  16. #define START_STREAMING_PROMPT_VN "Hit me baby, push them over with the version="
  17. #define HTTP_HEADER_SIZE 8192
  18. typedef enum {
  19. RRDPUSH_MULTIPLE_CONNECTIONS_ALLOW,
  20. RRDPUSH_MULTIPLE_CONNECTIONS_DENY_NEW
  21. } RRDPUSH_MULTIPLE_CONNECTIONS_STRATEGY;
  22. typedef struct {
  23. char *os_name;
  24. char *os_id;
  25. char *os_version;
  26. char *kernel_name;
  27. char *kernel_version;
  28. } stream_encoded_t;
  29. // Thread-local storage
  30. // Metric transmission: collector threads asynchronously fill the buffer, sender thread uses it.
  31. struct sender_state {
  32. RRDHOST *host;
  33. pid_t task_id;
  34. unsigned int overflow:1;
  35. int timeout, default_port;
  36. usec_t reconnect_delay;
  37. char connected_to[CONNECTED_TO_SIZE + 1]; // We don't know which proxy we connect to, passed back from socket.c
  38. size_t begin;
  39. size_t reconnects_counter;
  40. size_t sent_bytes;
  41. size_t sent_bytes_on_this_connection;
  42. size_t send_attempts;
  43. time_t last_sent_t;
  44. size_t not_connected_loops;
  45. // Metrics are collected asynchronously by collector threads calling rrdset_done_push(). This can also trigger
  46. // the lazy creation of the sender thread - both cases (buffer access and thread creation) are guarded here.
  47. netdata_mutex_t mutex;
  48. struct circular_buffer *buffer;
  49. BUFFER *build;
  50. char read_buffer[512];
  51. int read_len;
  52. int32_t version;
  53. };
  54. struct receiver_state {
  55. RRDHOST *host;
  56. netdata_thread_t thread;
  57. int fd;
  58. char *key;
  59. char *hostname;
  60. char *registry_hostname;
  61. char *machine_guid;
  62. char *os;
  63. char *timezone; // Unused?
  64. char *tags;
  65. char *client_ip; // Duplicated in pluginsd
  66. char *client_port; // Duplicated in pluginsd
  67. char *program_name; // Duplicated in pluginsd
  68. char *program_version;
  69. struct rrdhost_system_info *system_info;
  70. int update_every;
  71. uint32_t stream_version;
  72. time_t last_msg_t;
  73. char read_buffer[1024]; // Need to allow RRD_ID_LENGTH_MAX * 4 + the other fields
  74. int read_len;
  75. #ifdef ENABLE_HTTPS
  76. struct netdata_ssl ssl;
  77. #endif
  78. unsigned int shutdown:1; // Tell the thread to exit
  79. unsigned int exited; // Indicates that the thread has exited (NOT A BITFIELD!)
  80. };
  81. extern unsigned int default_rrdpush_enabled;
  82. extern char *default_rrdpush_destination;
  83. extern char *default_rrdpush_api_key;
  84. extern char *default_rrdpush_send_charts_matching;
  85. extern unsigned int remote_clock_resync_iterations;
  86. extern void sender_init(struct sender_state *s, RRDHOST *parent);
  87. void sender_start(struct sender_state *s);
  88. void sender_commit(struct sender_state *s);
  89. extern int rrdpush_init();
  90. extern int configured_as_parent();
  91. extern void rrdset_done_push(RRDSET *st);
  92. extern void rrdset_push_chart_definition_now(RRDSET *st);
  93. extern void *rrdpush_sender_thread(void *ptr);
  94. extern void rrdpush_send_labels(RRDHOST *host);
  95. extern void rrdpush_claimed_id(RRDHOST *host);
  96. extern int rrdpush_receiver_thread_spawn(struct web_client *w, char *url);
  97. extern void rrdpush_sender_thread_stop(RRDHOST *host);
  98. extern void rrdpush_sender_send_this_host_variable_now(RRDHOST *host, RRDVAR *rv);
  99. extern void log_stream_connection(const char *client_ip, const char *client_port, const char *api_key, const char *machine_guid, const char *host, const char *msg);
  100. #endif //NETDATA_RRDPUSH_H