push chart local variables upstream
Costa Tsaousis (ktsaou) committed
Oct 17, 2017 at 01:59 UTC
e745a0455a5897f1e98af00b6801e078c5d1363e
4 files changed
+47
-14
src/health.h
+2
-1
@@ -412,7 +412,8 @@ extern void rrdcalc_unlink_and_free(RRDHOST *host, RRDCALC *rc);
412
extern void rrdcalctemplate_free(RRDCALCTEMPLATE *rt);
413
extern void rrdcalctemplate_unlink_and_free(RRDHOST *host, RRDCALCTEMPLATE *rt);
414
415
-extern int rrdvar_callback_for_all_variables(RRDHOST *host, int (*callback)(void *rrdvar, void *data), void *data);
415
+extern int rrdvar_callback_for_all_host_variables(RRDHOST *host, int (*callback)(void *rrdvar, void *data), void *data);
416
+extern int rrdvar_callback_for_all_chart_variables(RRDSET *st, int (*callback)(void *rrdvar, void *data), void *data);
417
418
#ifdef NETDATA_HEALTH_INTERNALS
419
#define RRDVAR_MAX_LENGTH 1024
src/rrdpush.c
+38
-10
@@ -77,6 +77,29 @@ static inline int need_to_send_chart_definition(RRDSET *st) {
77
return 0;
78
}
79
80
+static int rrdpush_sender_add_chart_variable_to_buffer_nolock(void *rrdvar_ptr, void *rrdset_ptr) {
81
+ RRDVAR *rv = (RRDVAR *)rrdvar_ptr;
82
+
83
+ if(unlikely(rv->type == RRDVAR_TYPE_CALCULATED_ALLOCATED)) {
84
+ RRDSET *st = (RRDSET *)rrdset_ptr;
85
+
86
+ calculated_number *value = (calculated_number *) rv->value;
87
+
88
+ buffer_sprintf(
89
+ st->rrdhost->rrdpush_sender_buffer
90
+ , "VARIABLE CHART %s = " CALCULATED_NUMBER_FORMAT "\n"
91
+ , rv->name
92
+ , *value
93
+ );
94
+
95
+ debug(D_STREAM, "RRDVAR pushed CHART VARIABLE %s = " CALCULATED_NUMBER_FORMAT, rv->name, *value);
96
+
97
+ return 1;
98
+ }
99
+
100
+ return 0;
101
+}
102
+
103
// sends the current chart definition
104
static inline void rrdpush_send_chart_definition_nolock(RRDSET *st) {
105
rrdset_flag_set(st, RRDSET_FLAG_EXPOSED_UPSTREAM);
@@ -117,6 +140,10 @@ static inline void rrdpush_send_chart_definition_nolock(RRDSET *st) {
140
}
141
142
st->upstream_resync_time = st->last_collected_time.tv_sec + (remote_clock_resync_iterations * st->update_every);
143
+
144
+ int ret = rrdvar_callback_for_all_chart_variables(st, rrdpush_sender_add_chart_variable_to_buffer_nolock, st);
145
+ debug(D_STREAM, "RRDVAR sent %d VARIABLES", ret);
146
+
147
}
148
149
// sends the current chart dimensions
@@ -188,33 +215,33 @@ void rrdset_done_push(RRDSET *st) {
215
// ----------------------------------------------------------------------------
216
// rrdpush sender thread
217
191
-static inline void rrdpush_sender_add_variable_to_buffer_nolock(RRDHOST *host, RRDVAR *rv) {
218
+static inline void rrdpush_sender_add_host_variable_to_buffer_nolock(RRDHOST *host, RRDVAR *rv) {
219
calculated_number *value = (calculated_number *)rv->value;
220
221
buffer_sprintf(
222
host->rrdpush_sender_buffer
196
- , "VARIABLE %s = " CALCULATED_NUMBER_FORMAT "\n"
223
+ , "VARIABLE HOST %s = " CALCULATED_NUMBER_FORMAT "\n"
224
, rv->name
225
, *value
226
);
227
201
- debug(D_STREAM, "RRDVAR pushed VARIABLE %s = " CALCULATED_NUMBER_FORMAT, rv->name, *value);
228
+ debug(D_STREAM, "RRDVAR pushed HOST VARIABLE %s = " CALCULATED_NUMBER_FORMAT, rv->name, *value);
229
}
230
204
-void rrdpush_sender_send_this_variable_now(RRDHOST *host, RRDVAR *rv) {
231
+void rrdpush_sender_send_this_host_variable_now(RRDHOST *host, RRDVAR *rv) {
232
if(host->rrdpush_send_enabled && host->rrdpush_sender_spawn && host->rrdpush_sender_connected) {
233
rrdpush_buffer_lock(host);
207
- rrdpush_sender_add_variable_to_buffer_nolock(host, rv);
234
+ rrdpush_sender_add_host_variable_to_buffer_nolock(host, rv);
235
rrdpush_buffer_unlock(host);
236
}
237
}
238
212
-static int rrdpush_sender_thread_custom_variables_callback(void *rrdvar_ptr, void *host_ptr) {
239
+static int rrdpush_sender_thread_custom_host_variables_callback(void *rrdvar_ptr, void *host_ptr) {
240
RRDVAR *rv = (RRDVAR *)rrdvar_ptr;
241
RRDHOST *host = (RRDHOST *)host_ptr;
242
243
if(unlikely(rv->type == RRDVAR_TYPE_CALCULATED_ALLOCATED)) {
217
- rrdpush_sender_add_variable_to_buffer_nolock(host, rv);
244
+ rrdpush_sender_add_host_variable_to_buffer_nolock(host, rv);
245
246
// return 1, so that the traversal will return the number of variables sent
247
return 1;
@@ -224,8 +251,8 @@ static int rrdpush_sender_thread_custom_variables_callback(void *rrdvar_ptr, voi
251
return 0;
252
}
253
227
-static void rrdpush_sender_thread_send_custom_variables(RRDHOST *host) {
228
- int ret = rrdvar_callback_for_all_variables(host, rrdpush_sender_thread_custom_variables_callback, host);
254
+static void rrdpush_sender_thread_send_custom_host_variables(RRDHOST *host) {
255
+ int ret = rrdvar_callback_for_all_host_variables(host, rrdpush_sender_thread_custom_host_variables_callback, host);
256
debug(D_STREAM, "RRDVAR sent %d VARIABLES", ret);
257
}
258
@@ -236,6 +263,7 @@ static void rrdpush_sender_thread_reset_all_charts(RRDHOST *host) {
263
264
RRDSET *st;
265
rrdset_foreach_read(st, host) {
266
+ rrdset_flag_clear(st, RRDSET_FLAG_EXPOSED_UPSTREAM);
267
268
st->upstream_resync_time = 0;
269
@@ -260,7 +288,7 @@ static inline void rrdpush_sender_thread_data_flush(RRDHOST *host) {
288
buffer_flush(host->rrdpush_sender_buffer);
289
290
rrdpush_sender_thread_reset_all_charts(host);
263
- rrdpush_sender_thread_send_custom_variables(host);
291
+ rrdpush_sender_thread_send_custom_host_variables(host);
292
293
rrdpush_buffer_unlock(host);
294
}
src/rrdpush.h
+1
-1
@@ -14,6 +14,6 @@ extern void *rrdpush_sender_thread(void *ptr);
14
extern int rrdpush_receiver_thread_spawn(RRDHOST *host, struct web_client *w, char *url);
15
extern void rrdpush_sender_thread_stop(RRDHOST *host);
16
17
-extern void rrdpush_sender_send_this_variable_now(RRDHOST *host, RRDVAR *rv);
17
+extern void rrdpush_sender_send_this_host_variable_now(RRDHOST *host, RRDVAR *rv);
18
19
#endif //NETDATA_RRDPUSH_H
src/rrdvar.c
+6
-2
@@ -117,10 +117,14 @@ void rrdvar_free_remaining_variables(RRDHOST *host, avl_tree_lock *tree_lock) {
117
// ----------------------------------------------------------------------------
118
// CUSTOM VARIABLES
119
120
-inline int rrdvar_callback_for_all_variables(RRDHOST *host, int (*callback)(void *rrdvar, void *data), void *data) {
120
+inline int rrdvar_callback_for_all_host_variables(RRDHOST *host, int (*callback)(void *rrdvar, void *data), void *data) {
121
return avl_traverse_lock(&host->rrdvar_root_index, callback, data);
122
}
123
124
+inline int rrdvar_callback_for_all_chart_variables(RRDSET *st, int (*callback)(void *rrdvar, void *data), void *data) {
125
+ return avl_traverse_lock(&st->rrdhost->rrdvar_root_index, callback, data);
126
+}
127
+
128
static RRDVAR *rrdvar_custom_variable_create(const char *scope, avl_tree_lock *tree_lock, const char *name) {
129
calculated_number *v = callocz(1, sizeof(calculated_number));
130
*v = NAN;
@@ -159,7 +163,7 @@ void rrdvar_custom_host_variable_set(RRDHOST *host, RRDVAR *rv, calculated_numbe
163
*v = value;
164
165
// if the host is streaming, send this variable upstream immediately
162
- rrdpush_sender_send_this_variable_now(host, rv);
166
+ rrdpush_sender_send_this_host_variable_now(host, rv);
167
}
168
}
169
}