rrdpush.h 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #ifndef NETDATA_RRDPUSH_H
  3. #define NETDATA_RRDPUSH_H 1
  4. #include "libnetdata/libnetdata.h"
  5. #include "daemon/common.h"
  6. #include "web/server/web_client.h"
  7. #include "database/rrdfunctions.h"
  8. #include "database/rrd.h"
  9. #define CONNECTED_TO_SIZE 100
  10. #define CBUFFER_INITIAL_SIZE (16 * 1024)
  11. #define THREAD_BUFFER_INITIAL_SIZE (CBUFFER_INITIAL_SIZE / 2)
  12. // ----------------------------------------------------------------------------
  13. // obsolete versions - do not use anymore
  14. #define STREAM_OLD_VERSION_CLAIM 3
  15. #define STREAM_OLD_VERSION_CLABELS 4
  16. #define STREAM_OLD_VERSION_LZ4 5
  17. // ----------------------------------------------------------------------------
  18. // capabilities negotiation
  19. typedef enum {
  20. STREAM_CAP_NONE = 0,
  21. // do not use the first 3 bits
  22. // they used to be versions 1, 2 and 3
  23. // before we introduce capabilities
  24. STREAM_CAP_V1 = (1 << 3), // v1 = the oldest protocol
  25. STREAM_CAP_V2 = (1 << 4), // v2 = the second version of the protocol (with host labels)
  26. STREAM_CAP_VN = (1 << 5), // version negotiation supported (for versions 3, 4, 5 of the protocol)
  27. // v3 = claiming supported
  28. // v4 = chart labels supported
  29. // v5 = lz4 compression supported
  30. STREAM_CAP_VCAPS = (1 << 6), // capabilities negotiation supported
  31. STREAM_CAP_HLABELS = (1 << 7), // host labels supported
  32. STREAM_CAP_CLAIM = (1 << 8), // claiming supported
  33. STREAM_CAP_CLABELS = (1 << 9), // chart labels supported
  34. STREAM_CAP_LZ4 = (1 << 10), // lz4 compression supported
  35. STREAM_CAP_FUNCTIONS = (1 << 11), // plugin functions supported
  36. STREAM_CAP_REPLICATION = (1 << 12), // replication supported
  37. STREAM_CAP_BINARY = (1 << 13), // streaming supports binary data
  38. STREAM_CAP_INTERPOLATED = (1 << 14), // streaming supports interpolated streaming of values
  39. STREAM_CAP_IEEE754 = (1 << 15), // streaming supports binary/hex transfer of double values
  40. STREAM_CAP_DATA_WITH_ML = (1 << 16), // streaming supports transferring anomaly bit
  41. STREAM_CAP_DYNCFG = (1 << 17), // dynamic configuration of plugins trough streaming
  42. STREAM_CAP_SLOTS = (1 << 18), // the sender can appoint a unique slot for each chart
  43. STREAM_CAP_ZSTD = (1 << 19), // ZSTD compression supported
  44. STREAM_CAP_GZIP = (1 << 20), // GZIP compression supported
  45. STREAM_CAP_BROTLI = (1 << 21), // BROTLI compression supported
  46. STREAM_CAP_INVALID = (1 << 30), // used as an invalid value for capabilities when this is set
  47. // this must be signed int, so don't use the last bit
  48. // needed for negotiating errors between parent and child
  49. } STREAM_CAPABILITIES;
  50. #ifdef ENABLE_LZ4
  51. #define STREAM_CAP_LZ4_AVAILABLE STREAM_CAP_LZ4
  52. #else
  53. #define STREAM_CAP_LZ4_AVAILABLE 0
  54. #endif // ENABLE_LZ4
  55. #ifdef ENABLE_ZSTD
  56. #define STREAM_CAP_ZSTD_AVAILABLE STREAM_CAP_ZSTD
  57. #else
  58. #define STREAM_CAP_ZSTD_AVAILABLE 0
  59. #endif // ENABLE_ZSTD
  60. #ifdef ENABLE_BROTLI
  61. #define STREAM_CAP_BROTLI_AVAILABLE STREAM_CAP_BROTLI
  62. #else
  63. #define STREAM_CAP_BROTLI_AVAILABLE 0
  64. #endif // ENABLE_BROTLI
  65. #define STREAM_CAP_COMPRESSIONS_AVAILABLE (STREAM_CAP_LZ4_AVAILABLE|STREAM_CAP_ZSTD_AVAILABLE|STREAM_CAP_BROTLI_AVAILABLE|STREAM_CAP_GZIP)
  66. extern STREAM_CAPABILITIES globally_disabled_capabilities;
  67. STREAM_CAPABILITIES stream_our_capabilities(RRDHOST *host, bool sender);
  68. #define stream_has_capability(rpt, capability) ((rpt) && ((rpt)->capabilities & (capability)) == (capability))
  69. static inline bool stream_has_more_than_one_capability_of(STREAM_CAPABILITIES caps, STREAM_CAPABILITIES mask) {
  70. STREAM_CAPABILITIES common = (STREAM_CAPABILITIES)(caps & mask);
  71. return (common & (common - 1)) != 0 && common != 0;
  72. }
  73. // ----------------------------------------------------------------------------
  74. // stream handshake
  75. #define HTTP_HEADER_SIZE 8192
  76. #define STREAMING_PROTOCOL_VERSION "1.1"
  77. #define START_STREAMING_PROMPT_V1 "Hit me baby, push them over..."
  78. #define START_STREAMING_PROMPT_V2 "Hit me baby, push them over and bring the host labels..."
  79. #define START_STREAMING_PROMPT_VN "Hit me baby, push them over with the version="
  80. #define START_STREAMING_ERROR_SAME_LOCALHOST "Don't hit me baby, you are trying to stream my localhost back"
  81. #define START_STREAMING_ERROR_ALREADY_STREAMING "This GUID is already streaming to this server"
  82. #define START_STREAMING_ERROR_NOT_PERMITTED "You are not permitted to access this. Check the logs for more info."
  83. #define START_STREAMING_ERROR_BUSY_TRY_LATER "The server is too busy now to accept this request. Try later."
  84. #define START_STREAMING_ERROR_INTERNAL_ERROR "The server encountered an internal error. Try later."
  85. #define START_STREAMING_ERROR_INITIALIZATION "The server is initializing. Try later."
  86. #define RRDPUSH_STATUS_CONNECTED "CONNECTED"
  87. #define RRDPUSH_STATUS_ALREADY_CONNECTED "ALREADY CONNECTED"
  88. #define RRDPUSH_STATUS_DISCONNECTED "DISCONNECTED"
  89. #define RRDPUSH_STATUS_RATE_LIMIT "RATE LIMIT TRY LATER"
  90. #define RRDPUSH_STATUS_INITIALIZATION_IN_PROGRESS "INITIALIZATION IN PROGRESS RETRY LATER"
  91. #define RRDPUSH_STATUS_INTERNAL_SERVER_ERROR "INTERNAL SERVER ERROR DROPPING CONNECTION"
  92. #define RRDPUSH_STATUS_DUPLICATE_RECEIVER "DUPLICATE RECEIVER DROPPING CONNECTION"
  93. #define RRDPUSH_STATUS_CANT_REPLY "CANT REPLY DROPPING CONNECTION"
  94. #define RRDPUSH_STATUS_NO_HOSTNAME "NO HOSTNAME PERMISSION DENIED"
  95. #define RRDPUSH_STATUS_NO_API_KEY "NO API KEY PERMISSION DENIED"
  96. #define RRDPUSH_STATUS_INVALID_API_KEY "INVALID API KEY PERMISSION DENIED"
  97. #define RRDPUSH_STATUS_NO_MACHINE_GUID "NO MACHINE GUID PERMISSION DENIED"
  98. #define RRDPUSH_STATUS_MACHINE_GUID_DISABLED "MACHINE GUID DISABLED PERMISSION DENIED"
  99. #define RRDPUSH_STATUS_INVALID_MACHINE_GUID "INVALID MACHINE GUID PERMISSION DENIED"
  100. #define RRDPUSH_STATUS_API_KEY_DISABLED "API KEY DISABLED PERMISSION DENIED"
  101. #define RRDPUSH_STATUS_NOT_ALLOWED_IP "NOT ALLOWED IP PERMISSION DENIED"
  102. #define RRDPUSH_STATUS_LOCALHOST "LOCALHOST PERMISSION DENIED"
  103. #define RRDPUSH_STATUS_PERMISSION_DENIED "PERMISSION DENIED"
  104. #define RRDPUSH_STATUS_BAD_HANDSHAKE "BAD HANDSHAKE"
  105. #define RRDPUSH_STATUS_TIMEOUT "TIMEOUT"
  106. #define RRDPUSH_STATUS_CANT_UPGRADE_CONNECTION "CANT UPGRADE CONNECTION"
  107. #define RRDPUSH_STATUS_SSL_ERROR "SSL ERROR"
  108. #define RRDPUSH_STATUS_INVALID_SSL_CERTIFICATE "INVALID SSL CERTIFICATE"
  109. #define RRDPUSH_STATUS_CANT_ESTABLISH_SSL_CONNECTION "CANT ESTABLISH SSL CONNECTION"
  110. typedef enum {
  111. STREAM_HANDSHAKE_OK_V3 = 3, // v3+
  112. STREAM_HANDSHAKE_OK_V2 = 2, // v2
  113. STREAM_HANDSHAKE_OK_V1 = 1, // v1
  114. STREAM_HANDSHAKE_NEVER = 0, // never tried to connect
  115. STREAM_HANDSHAKE_ERROR_BAD_HANDSHAKE = -1,
  116. STREAM_HANDSHAKE_ERROR_LOCALHOST = -2,
  117. STREAM_HANDSHAKE_ERROR_ALREADY_CONNECTED = -3,
  118. STREAM_HANDSHAKE_ERROR_DENIED = -4,
  119. STREAM_HANDSHAKE_ERROR_SEND_TIMEOUT = -5,
  120. STREAM_HANDSHAKE_ERROR_RECEIVE_TIMEOUT = -6,
  121. STREAM_HANDSHAKE_ERROR_INVALID_CERTIFICATE = -7,
  122. STREAM_HANDSHAKE_ERROR_SSL_ERROR = -8,
  123. STREAM_HANDSHAKE_ERROR_CANT_CONNECT = -9,
  124. STREAM_HANDSHAKE_BUSY_TRY_LATER = -10,
  125. STREAM_HANDSHAKE_INTERNAL_ERROR = -11,
  126. STREAM_HANDSHAKE_INITIALIZATION = -12,
  127. STREAM_HANDSHAKE_DISCONNECT_HOST_CLEANUP = -13,
  128. STREAM_HANDSHAKE_DISCONNECT_STALE_RECEIVER = -14,
  129. STREAM_HANDSHAKE_DISCONNECT_SHUTDOWN = -15,
  130. STREAM_HANDSHAKE_DISCONNECT_NETDATA_EXIT = -16,
  131. STREAM_HANDSHAKE_DISCONNECT_PARSER_EXIT = -17,
  132. STREAM_HANDSHAKE_DISCONNECT_UNKNOWN_SOCKET_READ_ERROR = -18,
  133. STREAM_HANDSHAKE_DISCONNECT_PARSER_FAILED = -19,
  134. STREAM_HANDSHAKE_DISCONNECT_RECEIVER_LEFT = -20,
  135. STREAM_HANDSHAKE_DISCONNECT_ORPHAN_HOST = -21,
  136. STREAM_HANDSHAKE_NON_STREAMABLE_HOST = -22,
  137. STREAM_HANDSHAKE_DISCONNECT_NOT_SUFFICIENT_READ_BUFFER = -23,
  138. STREAM_HANDSHAKE_DISCONNECT_SOCKET_EOF = -24,
  139. STREAM_HANDSHAKE_DISCONNECT_SOCKET_READ_FAILED = -25,
  140. STREAM_HANDSHAKE_DISCONNECT_SOCKET_READ_TIMEOUT = -26,
  141. STREAM_HANDSHAKE_ERROR_HTTP_UPGRADE = -27,
  142. } STREAM_HANDSHAKE;
  143. // ----------------------------------------------------------------------------
  144. typedef struct {
  145. char *os_name;
  146. char *os_id;
  147. char *os_version;
  148. char *kernel_name;
  149. char *kernel_version;
  150. } stream_encoded_t;
  151. #include "compression.h"
  152. // Thread-local storage
  153. // Metric transmission: collector threads asynchronously fill the buffer, sender thread uses it.
  154. typedef enum __attribute__((packed)) {
  155. STREAM_TRAFFIC_TYPE_REPLICATION = 0,
  156. STREAM_TRAFFIC_TYPE_FUNCTIONS,
  157. STREAM_TRAFFIC_TYPE_METADATA,
  158. STREAM_TRAFFIC_TYPE_DATA,
  159. STREAM_TRAFFIC_TYPE_DYNCFG,
  160. // terminator
  161. STREAM_TRAFFIC_TYPE_MAX,
  162. } STREAM_TRAFFIC_TYPE;
  163. typedef enum __attribute__((packed)) {
  164. SENDER_FLAG_OVERFLOW = (1 << 0), // The buffer has been overflown
  165. } SENDER_FLAGS;
  166. struct function_payload_state {
  167. BUFFER *payload;
  168. char *txid;
  169. char *fn_name;
  170. char *timeout;
  171. };
  172. struct sender_state {
  173. RRDHOST *host;
  174. pid_t tid; // the thread id of the sender, from gettid()
  175. SENDER_FLAGS flags;
  176. int timeout;
  177. int default_port;
  178. uint32_t reconnect_delay;
  179. char connected_to[CONNECTED_TO_SIZE + 1]; // We don't know which proxy we connect to, passed back from socket.c
  180. size_t begin;
  181. size_t reconnects_counter;
  182. size_t sent_bytes;
  183. size_t sent_bytes_on_this_connection;
  184. size_t send_attempts;
  185. time_t last_traffic_seen_t;
  186. time_t last_state_since_t; // the timestamp of the last state (online/offline) change
  187. size_t not_connected_loops;
  188. // Metrics are collected asynchronously by collector threads calling rrdset_done_push(). This can also trigger
  189. // the lazy creation of the sender thread - both cases (buffer access and thread creation) are guarded here.
  190. SPINLOCK spinlock;
  191. struct circular_buffer *buffer;
  192. char read_buffer[PLUGINSD_LINE_MAX + 1];
  193. ssize_t read_len;
  194. STREAM_CAPABILITIES capabilities;
  195. STREAM_CAPABILITIES disabled_capabilities;
  196. size_t sent_bytes_on_this_connection_per_type[STREAM_TRAFFIC_TYPE_MAX];
  197. int rrdpush_sender_pipe[2]; // collector to sender thread signaling
  198. int rrdpush_sender_socket;
  199. int receiving_function_payload;
  200. struct function_payload_state function_payload; // state when receiving function with payload
  201. uint16_t hops;
  202. struct line_splitter line;
  203. struct compressor_state compressor;
  204. #ifdef NETDATA_LOG_STREAM_SENDER
  205. FILE *stream_log_fp;
  206. #endif
  207. #ifdef ENABLE_HTTPS
  208. NETDATA_SSL ssl; // structure used to encrypt the connection
  209. #endif
  210. struct {
  211. bool shutdown;
  212. STREAM_HANDSHAKE reason;
  213. } exit;
  214. struct {
  215. DICTIONARY *requests; // de-duplication of replication requests, per chart
  216. time_t oldest_request_after_t; // the timestamp of the oldest replication request
  217. time_t latest_completed_before_t; // the timestamp of the latest replication request
  218. struct {
  219. size_t pending_requests; // the currently outstanding replication requests
  220. size_t charts_replicating; // the number of unique charts having pending replication requests (on every request one is added and is removed when we finish it - it does not track completion of the replication for this chart)
  221. bool reached_max; // true when the sender buffer should not get more replication responses
  222. } atomic;
  223. } replication;
  224. struct {
  225. bool pending_data;
  226. size_t buffer_used_percentage; // the current utilization of the sending buffer
  227. usec_t last_flush_time_ut; // the last time the sender flushed the sending buffer in USEC
  228. time_t last_buffer_recreate_s; // true when the sender buffer should be re-created
  229. } atomic;
  230. int parent_using_h2o;
  231. };
  232. #define sender_lock(sender) spinlock_lock(&(sender)->spinlock)
  233. #define sender_unlock(sender) spinlock_unlock(&(sender)->spinlock)
  234. #define rrdpush_sender_pipe_has_pending_data(sender) __atomic_load_n(&(sender)->atomic.pending_data, __ATOMIC_RELAXED)
  235. #define rrdpush_sender_pipe_set_pending_data(sender) __atomic_store_n(&(sender)->atomic.pending_data, true, __ATOMIC_RELAXED)
  236. #define rrdpush_sender_pipe_clear_pending_data(sender) __atomic_store_n(&(sender)->atomic.pending_data, false, __ATOMIC_RELAXED)
  237. #define rrdpush_sender_last_buffer_recreate_get(sender) __atomic_load_n(&(sender)->atomic.last_buffer_recreate_s, __ATOMIC_RELAXED)
  238. #define rrdpush_sender_last_buffer_recreate_set(sender, value) __atomic_store_n(&(sender)->atomic.last_buffer_recreate_s, value, __ATOMIC_RELAXED)
  239. #define rrdpush_sender_replication_buffer_full_set(sender, value) __atomic_store_n(&((sender)->replication.atomic.reached_max), value, __ATOMIC_SEQ_CST)
  240. #define rrdpush_sender_replication_buffer_full_get(sender) __atomic_load_n(&((sender)->replication.atomic.reached_max), __ATOMIC_SEQ_CST)
  241. #define rrdpush_sender_set_buffer_used_percent(sender, value) __atomic_store_n(&((sender)->atomic.buffer_used_percentage), value, __ATOMIC_RELAXED)
  242. #define rrdpush_sender_get_buffer_used_percent(sender) __atomic_load_n(&((sender)->atomic.buffer_used_percentage), __ATOMIC_RELAXED)
  243. #define rrdpush_sender_set_flush_time(sender) __atomic_store_n(&((sender)->atomic.last_flush_time_ut), now_realtime_usec(), __ATOMIC_RELAXED)
  244. #define rrdpush_sender_get_flush_time(sender) __atomic_load_n(&((sender)->atomic.last_flush_time_ut), __ATOMIC_RELAXED)
  245. #define rrdpush_sender_replicating_charts(sender) __atomic_load_n(&((sender)->replication.atomic.charts_replicating), __ATOMIC_RELAXED)
  246. #define rrdpush_sender_replicating_charts_plus_one(sender) __atomic_add_fetch(&((sender)->replication.atomic.charts_replicating), 1, __ATOMIC_RELAXED)
  247. #define rrdpush_sender_replicating_charts_minus_one(sender) __atomic_sub_fetch(&((sender)->replication.atomic.charts_replicating), 1, __ATOMIC_RELAXED)
  248. #define rrdpush_sender_replicating_charts_zero(sender) __atomic_store_n(&((sender)->replication.atomic.charts_replicating), 0, __ATOMIC_RELAXED)
  249. #define rrdpush_sender_pending_replication_requests(sender) __atomic_load_n(&((sender)->replication.atomic.pending_requests), __ATOMIC_RELAXED)
  250. #define rrdpush_sender_pending_replication_requests_plus_one(sender) __atomic_add_fetch(&((sender)->replication.atomic.pending_requests), 1, __ATOMIC_RELAXED)
  251. #define rrdpush_sender_pending_replication_requests_minus_one(sender) __atomic_sub_fetch(&((sender)->replication.atomic.pending_requests), 1, __ATOMIC_RELAXED)
  252. #define rrdpush_sender_pending_replication_requests_zero(sender) __atomic_store_n(&((sender)->replication.atomic.pending_requests), 0, __ATOMIC_RELAXED)
  253. /*
  254. typedef enum {
  255. STREAM_NODE_INSTANCE_FEATURE_CLOUD_ONLINE = (1 << 0),
  256. STREAM_NODE_INSTANCE_FEATURE_VIRTUAL_HOST = (1 << 1),
  257. STREAM_NODE_INSTANCE_FEATURE_HEALTH_ENABLED = (1 << 2),
  258. STREAM_NODE_INSTANCE_FEATURE_ML_SELF = (1 << 3),
  259. STREAM_NODE_INSTANCE_FEATURE_ML_RECEIVED = (1 << 4),
  260. STREAM_NODE_INSTANCE_FEATURE_SSL = (1 << 5),
  261. } STREAM_NODE_INSTANCE_FEATURES;
  262. typedef struct stream_node_instance {
  263. uuid_t uuid;
  264. STRING *agent;
  265. STREAM_NODE_INSTANCE_FEATURES features;
  266. uint32_t hops;
  267. // receiver information on that agent
  268. int32_t capabilities;
  269. uint32_t local_port;
  270. uint32_t remote_port;
  271. STRING *local_ip;
  272. STRING *remote_ip;
  273. } STREAM_NODE_INSTANCE;
  274. */
  275. struct receiver_state {
  276. RRDHOST *host;
  277. pid_t tid;
  278. netdata_thread_t thread;
  279. int fd;
  280. char *key;
  281. char *hostname;
  282. char *registry_hostname;
  283. char *machine_guid;
  284. char *os;
  285. char *timezone; // Unused?
  286. char *abbrev_timezone;
  287. int32_t utc_offset;
  288. char *tags;
  289. char *client_ip; // Duplicated in pluginsd
  290. char *client_port; // Duplicated in pluginsd
  291. char *program_name; // Duplicated in pluginsd
  292. char *program_version;
  293. struct rrdhost_system_info *system_info;
  294. STREAM_CAPABILITIES capabilities;
  295. time_t last_msg_t;
  296. struct buffered_reader reader;
  297. uint16_t hops;
  298. struct {
  299. bool shutdown; // signal the streaming parser to exit
  300. STREAM_HANDSHAKE reason;
  301. } exit;
  302. struct {
  303. RRD_MEMORY_MODE mode;
  304. int history;
  305. int update_every;
  306. int health_enabled; // CONFIG_BOOLEAN_YES, CONFIG_BOOLEAN_NO, CONFIG_BOOLEAN_AUTO
  307. time_t alarms_delay;
  308. uint32_t alarms_history;
  309. int rrdpush_enabled;
  310. char *rrdpush_api_key; // DONT FREE - it is allocated in appconfig
  311. char *rrdpush_send_charts_matching; // DONT FREE - it is allocated in appconfig
  312. bool rrdpush_enable_replication;
  313. time_t rrdpush_seconds_to_replicate;
  314. time_t rrdpush_replication_step;
  315. char *rrdpush_destination; // DONT FREE - it is allocated in appconfig
  316. unsigned int rrdpush_compression;
  317. STREAM_CAPABILITIES compression_priorities[COMPRESSION_ALGORITHM_MAX];
  318. } config;
  319. #ifdef ENABLE_HTTPS
  320. NETDATA_SSL ssl;
  321. #endif
  322. time_t replication_first_time_t;
  323. struct decompressor_state decompressor;
  324. /*
  325. struct {
  326. uint32_t count;
  327. STREAM_NODE_INSTANCE *array;
  328. } instances;
  329. */
  330. #ifdef ENABLE_H2O
  331. void *h2o_ctx;
  332. #endif
  333. };
  334. #ifdef ENABLE_H2O
  335. #define is_h2o_rrdpush(x) ((x)->h2o_ctx != NULL)
  336. #define unless_h2o_rrdpush(x) if(!is_h2o_rrdpush(x))
  337. #endif
  338. struct rrdpush_destinations {
  339. STRING *destination;
  340. bool ssl;
  341. uint32_t attempts;
  342. time_t since;
  343. time_t postpone_reconnection_until;
  344. STREAM_HANDSHAKE reason;
  345. struct rrdpush_destinations *prev;
  346. struct rrdpush_destinations *next;
  347. };
  348. extern unsigned int default_rrdpush_enabled;
  349. extern unsigned int default_rrdpush_compression_enabled;
  350. extern char *default_rrdpush_destination;
  351. extern char *default_rrdpush_api_key;
  352. extern char *default_rrdpush_send_charts_matching;
  353. extern bool default_rrdpush_enable_replication;
  354. extern time_t default_rrdpush_seconds_to_replicate;
  355. extern time_t default_rrdpush_replication_step;
  356. extern unsigned int remote_clock_resync_iterations;
  357. void rrdpush_destinations_init(RRDHOST *host);
  358. void rrdpush_destinations_free(RRDHOST *host);
  359. BUFFER *sender_start(struct sender_state *s);
  360. void sender_commit(struct sender_state *s, BUFFER *wb, STREAM_TRAFFIC_TYPE type);
  361. int rrdpush_init();
  362. bool rrdpush_receiver_needs_dbengine();
  363. int configured_as_parent();
  364. typedef struct rrdset_stream_buffer {
  365. STREAM_CAPABILITIES capabilities;
  366. bool v2;
  367. bool begin_v2_added;
  368. time_t wall_clock_time;
  369. uint64_t rrdset_flags; // RRDSET_FLAGS
  370. time_t last_point_end_time_s;
  371. BUFFER *wb;
  372. } RRDSET_STREAM_BUFFER;
  373. RRDSET_STREAM_BUFFER rrdset_push_metric_initialize(RRDSET *st, time_t wall_clock_time);
  374. void rrdset_push_metrics_v1(RRDSET_STREAM_BUFFER *rsb, RRDSET *st);
  375. void rrdset_push_metrics_finished(RRDSET_STREAM_BUFFER *rsb, RRDSET *st);
  376. void rrddim_push_metrics_v2(RRDSET_STREAM_BUFFER *rsb, RRDDIM *rd, usec_t point_end_time_ut, NETDATA_DOUBLE n, SN_FLAGS flags);
  377. bool rrdset_push_chart_definition_now(RRDSET *st);
  378. void *rrdpush_sender_thread(void *ptr);
  379. void rrdpush_send_host_labels(RRDHOST *host);
  380. void rrdpush_send_claimed_id(RRDHOST *host);
  381. void rrdpush_send_global_functions(RRDHOST *host);
  382. void rrdpush_send_dyncfg(RRDHOST *host);
  383. #define THREAD_TAG_STREAM_RECEIVER "RCVR" // "[host]" is appended
  384. #define THREAD_TAG_STREAM_SENDER "SNDR" // "[host]" is appended
  385. int rrdpush_receiver_thread_spawn(struct web_client *w, char *decoded_query_string, void *h2o_ctx);
  386. void rrdpush_sender_thread_stop(RRDHOST *host, STREAM_HANDSHAKE reason, bool wait);
  387. void rrdpush_sender_send_this_host_variable_now(RRDHOST *host, const RRDVAR_ACQUIRED *rva);
  388. int connect_to_one_of_destinations(
  389. RRDHOST *host,
  390. int default_port,
  391. struct timeval *timeout,
  392. size_t *reconnects_counter,
  393. char *connected_to,
  394. size_t connected_to_size,
  395. struct rrdpush_destinations **destination);
  396. void rrdpush_signal_sender_to_wake_up(struct sender_state *s);
  397. void rrdpush_reset_destinations_postpone_time(RRDHOST *host);
  398. const char *stream_handshake_error_to_string(STREAM_HANDSHAKE handshake_error);
  399. void stream_capabilities_to_json_array(BUFFER *wb, STREAM_CAPABILITIES caps, const char *key);
  400. void rrdpush_receive_log_status(struct receiver_state *rpt, const char *msg, const char *status, ND_LOG_FIELD_PRIORITY priority);
  401. void log_receiver_capabilities(struct receiver_state *rpt);
  402. void log_sender_capabilities(struct sender_state *s);
  403. STREAM_CAPABILITIES convert_stream_version_to_capabilities(int32_t version, RRDHOST *host, bool sender);
  404. int32_t stream_capabilities_to_vn(uint32_t caps);
  405. void stream_capabilities_to_string(BUFFER *wb, STREAM_CAPABILITIES caps);
  406. void receiver_state_free(struct receiver_state *rpt);
  407. bool stop_streaming_receiver(RRDHOST *host, STREAM_HANDSHAKE reason);
  408. void sender_thread_buffer_free(void);
  409. #include "replication.h"
  410. typedef enum __attribute__((packed)) {
  411. RRDHOST_DB_STATUS_INITIALIZING = 0,
  412. RRDHOST_DB_STATUS_QUERYABLE,
  413. } RRDHOST_DB_STATUS;
  414. static inline const char *rrdhost_db_status_to_string(RRDHOST_DB_STATUS status) {
  415. switch(status) {
  416. default:
  417. case RRDHOST_DB_STATUS_INITIALIZING:
  418. return "initializing";
  419. case RRDHOST_DB_STATUS_QUERYABLE:
  420. return "online";
  421. }
  422. }
  423. typedef enum __attribute__((packed)) {
  424. RRDHOST_DB_LIVENESS_STALE = 0,
  425. RRDHOST_DB_LIVENESS_LIVE,
  426. } RRDHOST_DB_LIVENESS;
  427. static inline const char *rrdhost_db_liveness_to_string(RRDHOST_DB_LIVENESS status) {
  428. switch(status) {
  429. default:
  430. case RRDHOST_DB_LIVENESS_STALE:
  431. return "stale";
  432. case RRDHOST_DB_LIVENESS_LIVE:
  433. return "live";
  434. }
  435. }
  436. typedef enum __attribute__((packed)) {
  437. RRDHOST_INGEST_STATUS_ARCHIVED = 0,
  438. RRDHOST_INGEST_STATUS_INITIALIZING,
  439. RRDHOST_INGEST_STATUS_REPLICATING,
  440. RRDHOST_INGEST_STATUS_ONLINE,
  441. RRDHOST_INGEST_STATUS_OFFLINE,
  442. } RRDHOST_INGEST_STATUS;
  443. static inline const char *rrdhost_ingest_status_to_string(RRDHOST_INGEST_STATUS status) {
  444. switch(status) {
  445. case RRDHOST_INGEST_STATUS_ARCHIVED:
  446. return "archived";
  447. case RRDHOST_INGEST_STATUS_INITIALIZING:
  448. return "initializing";
  449. case RRDHOST_INGEST_STATUS_REPLICATING:
  450. return "replicating";
  451. case RRDHOST_INGEST_STATUS_ONLINE:
  452. return "online";
  453. default:
  454. case RRDHOST_INGEST_STATUS_OFFLINE:
  455. return "offline";
  456. }
  457. }
  458. typedef enum __attribute__((packed)) {
  459. RRDHOST_INGEST_TYPE_LOCALHOST = 0,
  460. RRDHOST_INGEST_TYPE_VIRTUAL,
  461. RRDHOST_INGEST_TYPE_CHILD,
  462. RRDHOST_INGEST_TYPE_ARCHIVED,
  463. } RRDHOST_INGEST_TYPE;
  464. static inline const char *rrdhost_ingest_type_to_string(RRDHOST_INGEST_TYPE type) {
  465. switch(type) {
  466. case RRDHOST_INGEST_TYPE_LOCALHOST:
  467. return "localhost";
  468. case RRDHOST_INGEST_TYPE_VIRTUAL:
  469. return "virtual";
  470. case RRDHOST_INGEST_TYPE_CHILD:
  471. return "child";
  472. default:
  473. case RRDHOST_INGEST_TYPE_ARCHIVED:
  474. return "archived";
  475. }
  476. }
  477. typedef enum __attribute__((packed)) {
  478. RRDHOST_STREAM_STATUS_DISABLED = 0,
  479. RRDHOST_STREAM_STATUS_REPLICATING,
  480. RRDHOST_STREAM_STATUS_ONLINE,
  481. RRDHOST_STREAM_STATUS_OFFLINE,
  482. } RRDHOST_STREAMING_STATUS;
  483. static inline const char *rrdhost_streaming_status_to_string(RRDHOST_STREAMING_STATUS status) {
  484. switch(status) {
  485. case RRDHOST_STREAM_STATUS_DISABLED:
  486. return "disabled";
  487. case RRDHOST_STREAM_STATUS_REPLICATING:
  488. return "replicating";
  489. case RRDHOST_STREAM_STATUS_ONLINE:
  490. return "online";
  491. default:
  492. case RRDHOST_STREAM_STATUS_OFFLINE:
  493. return "offline";
  494. }
  495. }
  496. typedef enum __attribute__((packed)) {
  497. RRDHOST_ML_STATUS_DISABLED = 0,
  498. RRDHOST_ML_STATUS_OFFLINE,
  499. RRDHOST_ML_STATUS_RUNNING,
  500. } RRDHOST_ML_STATUS;
  501. static inline const char *rrdhost_ml_status_to_string(RRDHOST_ML_STATUS status) {
  502. switch(status) {
  503. case RRDHOST_ML_STATUS_RUNNING:
  504. return "online";
  505. case RRDHOST_ML_STATUS_OFFLINE:
  506. return "offline";
  507. default:
  508. case RRDHOST_ML_STATUS_DISABLED:
  509. return "disabled";
  510. }
  511. }
  512. typedef enum __attribute__((packed)) {
  513. RRDHOST_ML_TYPE_DISABLED = 0,
  514. RRDHOST_ML_TYPE_SELF,
  515. RRDHOST_ML_TYPE_RECEIVED,
  516. } RRDHOST_ML_TYPE;
  517. static inline const char *rrdhost_ml_type_to_string(RRDHOST_ML_TYPE type) {
  518. switch(type) {
  519. case RRDHOST_ML_TYPE_SELF:
  520. return "self";
  521. case RRDHOST_ML_TYPE_RECEIVED:
  522. return "received";
  523. default:
  524. case RRDHOST_ML_TYPE_DISABLED:
  525. return "disabled";
  526. }
  527. }
  528. typedef enum __attribute__((packed)) {
  529. RRDHOST_HEALTH_STATUS_DISABLED = 0,
  530. RRDHOST_HEALTH_STATUS_INITIALIZING,
  531. RRDHOST_HEALTH_STATUS_RUNNING,
  532. } RRDHOST_HEALTH_STATUS;
  533. static inline const char *rrdhost_health_status_to_string(RRDHOST_HEALTH_STATUS status) {
  534. switch(status) {
  535. default:
  536. case RRDHOST_HEALTH_STATUS_DISABLED:
  537. return "disabled";
  538. case RRDHOST_HEALTH_STATUS_INITIALIZING:
  539. return "initializing";
  540. case RRDHOST_HEALTH_STATUS_RUNNING:
  541. return "online";
  542. }
  543. }
  544. typedef struct rrdhost_status {
  545. RRDHOST *host;
  546. time_t now;
  547. struct {
  548. RRDHOST_DB_STATUS status;
  549. RRDHOST_DB_LIVENESS liveness;
  550. RRD_MEMORY_MODE mode;
  551. time_t first_time_s;
  552. time_t last_time_s;
  553. size_t metrics;
  554. size_t instances;
  555. size_t contexts;
  556. } db;
  557. struct {
  558. RRDHOST_ML_STATUS status;
  559. RRDHOST_ML_TYPE type;
  560. struct ml_metrics_statistics metrics;
  561. } ml;
  562. struct {
  563. size_t hops;
  564. RRDHOST_INGEST_TYPE type;
  565. RRDHOST_INGEST_STATUS status;
  566. SOCKET_PEERS peers;
  567. bool ssl;
  568. STREAM_CAPABILITIES capabilities;
  569. uint32_t id;
  570. time_t since;
  571. STREAM_HANDSHAKE reason;
  572. struct {
  573. bool in_progress;
  574. NETDATA_DOUBLE completion;
  575. size_t instances;
  576. } replication;
  577. } ingest;
  578. struct {
  579. size_t hops;
  580. RRDHOST_STREAMING_STATUS status;
  581. SOCKET_PEERS peers;
  582. bool ssl;
  583. bool compression;
  584. STREAM_CAPABILITIES capabilities;
  585. uint32_t id;
  586. time_t since;
  587. STREAM_HANDSHAKE reason;
  588. struct {
  589. bool in_progress;
  590. NETDATA_DOUBLE completion;
  591. size_t instances;
  592. } replication;
  593. size_t sent_bytes_on_this_connection_per_type[STREAM_TRAFFIC_TYPE_MAX];
  594. } stream;
  595. struct {
  596. RRDHOST_HEALTH_STATUS status;
  597. struct {
  598. uint32_t undefined;
  599. uint32_t uninitialized;
  600. uint32_t clear;
  601. uint32_t warning;
  602. uint32_t critical;
  603. } alerts;
  604. } health;
  605. } RRDHOST_STATUS;
  606. void rrdhost_status(RRDHOST *host, time_t now, RRDHOST_STATUS *s);
  607. bool rrdhost_state_cloud_emulation(RRDHOST *host);
  608. void rrdpush_send_job_status_update(RRDHOST *host, const char *plugin_name, const char *module_name, struct job *job);
  609. void rrdpush_send_job_deleted(RRDHOST *host, const char *plugin_name, const char *module_name, const char *job_name);
  610. void rrdpush_send_dyncfg_enable(RRDHOST *host, const char *plugin_name);
  611. void rrdpush_send_dyncfg_reg_module(RRDHOST *host, const char *plugin_name, const char *module_name, enum module_type type);
  612. void rrdpush_send_dyncfg_reg_job(RRDHOST *host, const char *plugin_name, const char *module_name, const char *job_name, enum job_type type, uint32_t flags);
  613. void rrdpush_send_dyncfg_reset(RRDHOST *host, const char *plugin_name);
  614. bool rrdpush_compression_initialize(struct sender_state *s);
  615. bool rrdpush_decompression_initialize(struct receiver_state *rpt);
  616. void rrdpush_parse_compression_order(struct receiver_state *rpt, const char *order);
  617. void rrdpush_select_receiver_compression_algorithm(struct receiver_state *rpt);
  618. void rrdpush_compression_deactivate(struct sender_state *s);
  619. #endif //NETDATA_RRDPUSH_H