eliminated unecessary index lookups from netdata internal stats
Costa Tsaousis (ktsaou) committed
Oct 15, 2017 at 02:30 UTC
744b18ba2dd1bbbc2c4c12f5934d5438a2fb30f2
1 file changed
+247
-216
src/global_statistics.c
+247
-216
@@ -122,14 +122,6 @@ void global_statistics_charts(void) {
122
static collected_number compression_ratio = -1,
123
average_response_time = -1;
124
125
- static RRDSET *stcpu = NULL,
126
- *stcpu_thread = NULL,
127
- *stclients = NULL,
128
- *streqs = NULL,
129
- *stbytes = NULL,
130
- *stduration = NULL,
131
- *stcompression = NULL;
132
-
125
struct global_statistics gs;
126
struct rusage me, thread;
127
@@ -137,241 +129,280 @@ void global_statistics_charts(void) {
129
getrusage(RUSAGE_THREAD, &thread);
130
getrusage(RUSAGE_SELF, &me);
131
132
+ {
133
+ static RRDSET *st_cpu_thread = NULL;
134
+ static RRDDIM *rd_cpu_thread_user = NULL,
135
+ *rd_cpu_thread_system = NULL;
136
+
137
#ifdef __FreeBSD__
141
- if (unlikely(!stcpu_thread)) {
142
- stcpu_thread = rrdset_create_localhost(
143
- "netdata"
144
- , "plugin_freebsd_cpu"
145
- , NULL
146
- , "freebsd"
147
- , NULL
148
- , "NetData FreeBSD Plugin CPU usage"
149
- , "milliseconds/s"
150
- , "netdata"
151
- , "stats"
152
- , 132000
153
- , localhost->rrd_update_every
154
- , RRDSET_TYPE_STACKED
155
- );
138
+ if (unlikely(!st_cpu_thread)) {
139
+ st_cpu_thread = rrdset_create_localhost(
140
+ "netdata"
141
+ , "plugin_freebsd_cpu"
142
+ , NULL
143
+ , "freebsd"
144
+ , NULL
145
+ , "NetData FreeBSD Plugin CPU usage"
146
+ , "milliseconds/s"
147
+ , "netdata"
148
+ , "stats"
149
+ , 132000
150
+ , localhost->rrd_update_every
151
+ , RRDSET_TYPE_STACKED
152
+ );
153
#else
157
- if (unlikely(!stcpu_thread)) {
158
- stcpu_thread = rrdset_create_localhost(
159
- "netdata"
160
- , "plugin_proc_cpu"
161
- , NULL
162
- , "proc"
163
- , NULL
164
- , "NetData Proc Plugin CPU usage"
165
- , "milliseconds/s"
166
- , "netdata"
167
- , "stats"
168
- , 132000
169
- , localhost->rrd_update_every
170
- , RRDSET_TYPE_STACKED
171
- );
154
+ if (unlikely(!st_cpu_thread)) {
155
+ st_cpu_thread = rrdset_create_localhost(
156
+ "netdata"
157
+ , "plugin_proc_cpu"
158
+ , NULL
159
+ , "proc"
160
+ , NULL
161
+ , "NetData Proc Plugin CPU usage"
162
+ , "milliseconds/s"
163
+ , "netdata"
164
+ , "stats"
165
+ , 132000
166
+ , localhost->rrd_update_every
167
+ , RRDSET_TYPE_STACKED
168
+ );
169
#endif
170
174
- rrddim_add(stcpu_thread, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
175
- rrddim_add(stcpu_thread, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
176
- }
177
- else
178
- rrdset_next(stcpu_thread);
171
+ rd_cpu_thread_user = rrddim_add(st_cpu_thread, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
172
+ rd_cpu_thread_system = rrddim_add(st_cpu_thread, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
173
+ }
174
+ else
175
+ rrdset_next(st_cpu_thread);
176
180
- rrddim_set(stcpu_thread, "user", thread.ru_utime.tv_sec * 1000000ULL + thread.ru_utime.tv_usec);
181
- rrddim_set(stcpu_thread, "system", thread.ru_stime.tv_sec * 1000000ULL + thread.ru_stime.tv_usec);
182
- rrdset_done(stcpu_thread);
177
+ rrddim_set_by_pointer(st_cpu_thread, rd_cpu_thread_user, thread.ru_utime.tv_sec * 1000000ULL + thread.ru_utime.tv_usec);
178
+ rrddim_set_by_pointer(st_cpu_thread, rd_cpu_thread_system, thread.ru_stime.tv_sec * 1000000ULL + thread.ru_stime.tv_usec);
179
+ rrdset_done(st_cpu_thread);
180
+ }
181
182
// ----------------------------------------------------------------
183
186
- if (unlikely(!stcpu)) {
187
- stcpu = rrdset_create_localhost(
188
- "netdata"
189
- , "server_cpu"
190
- , NULL
191
- , "netdata"
192
- , NULL
193
- , "NetData CPU usage"
194
- , "milliseconds/s"
195
- , "netdata"
196
- , "stats"
197
- , 130000
198
- , localhost->rrd_update_every
199
- , RRDSET_TYPE_STACKED
200
- );
201
-
202
- rrddim_add(stcpu, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
203
- rrddim_add(stcpu, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
184
+ {
185
+ static RRDSET *st_cpu = NULL;
186
+ static RRDDIM *rd_cpu_user = NULL,
187
+ *rd_cpu_system = NULL;
188
+
189
+ if (unlikely(!st_cpu)) {
190
+ st_cpu = rrdset_create_localhost(
191
+ "netdata"
192
+ , "server_cpu"
193
+ , NULL
194
+ , "netdata"
195
+ , NULL
196
+ , "NetData CPU usage"
197
+ , "milliseconds/s"
198
+ , "netdata"
199
+ , "stats"
200
+ , 130000
201
+ , localhost->rrd_update_every
202
+ , RRDSET_TYPE_STACKED
203
+ );
204
+
205
+ rd_cpu_user = rrddim_add(st_cpu, "user", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
206
+ rd_cpu_system = rrddim_add(st_cpu, "system", NULL, 1, 1000, RRD_ALGORITHM_INCREMENTAL);
207
+ }
208
+ else
209
+ rrdset_next(st_cpu);
210
+
211
+ rrddim_set_by_pointer(st_cpu, rd_cpu_user, me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec);
212
+ rrddim_set_by_pointer(st_cpu, rd_cpu_system, me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec);
213
+ rrdset_done(st_cpu);
214
}
205
- else
206
- rrdset_next(stcpu);
207
-
208
- rrddim_set(stcpu, "user", me.ru_utime.tv_sec * 1000000ULL + me.ru_utime.tv_usec);
209
- rrddim_set(stcpu, "system", me.ru_stime.tv_sec * 1000000ULL + me.ru_stime.tv_usec);
210
- rrdset_done(stcpu);
215
216
// ----------------------------------------------------------------
217
214
- if (unlikely(!stclients)) {
215
- stclients = rrdset_create_localhost(
216
- "netdata"
217
- , "clients"
218
- , NULL
219
- , "netdata"
220
- , NULL
221
- , "NetData Web Clients"
222
- , "connected clients"
223
- , "netdata"
224
- , "stats"
225
- , 130200
226
- , localhost->rrd_update_every
227
- , RRDSET_TYPE_LINE
228
- );
229
-
230
- rrddim_add(stclients, "clients", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
218
+ {
219
+ static RRDSET *st_clients = NULL;
220
+ static RRDDIM *rd_clients = NULL;
221
+
222
+ if (unlikely(!st_clients)) {
223
+ st_clients = rrdset_create_localhost(
224
+ "netdata"
225
+ , "clients"
226
+ , NULL
227
+ , "netdata"
228
+ , NULL
229
+ , "NetData Web Clients"
230
+ , "connected clients"
231
+ , "netdata"
232
+ , "stats"
233
+ , 130200
234
+ , localhost->rrd_update_every
235
+ , RRDSET_TYPE_LINE
236
+ );
237
+
238
+ rd_clients = rrddim_add(st_clients, "clients", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
239
+ }
240
+ else
241
+ rrdset_next(st_clients);
242
+
243
+ rrddim_set_by_pointer(st_clients, rd_clients, gs.connected_clients);
244
+ rrdset_done(st_clients);
245
}
232
- else
233
- rrdset_next(stclients);
234
-
235
- rrddim_set(stclients, "clients", gs.connected_clients);
236
- rrdset_done(stclients);
246
247
// ----------------------------------------------------------------
248
240
- if (unlikely(!streqs)) {
241
- streqs = rrdset_create_localhost(
242
- "netdata"
243
- , "requests"
244
- , NULL
245
- , "netdata"
246
- , NULL
247
- , "NetData Web Requests"
248
- , "requests/s"
249
- , "netdata"
250
- , "stats"
251
- , 130300
252
- , localhost->rrd_update_every
253
- , RRDSET_TYPE_LINE
254
- );
255
-
256
- rrddim_add(streqs, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
249
+ {
250
+ static RRDSET *st_reqs = NULL;
251
+ static RRDDIM *rd_requests = NULL;
252
+
253
+ if (unlikely(!st_reqs)) {
254
+ st_reqs = rrdset_create_localhost(
255
+ "netdata"
256
+ , "requests"
257
+ , NULL
258
+ , "netdata"
259
+ , NULL
260
+ , "NetData Web Requests"
261
+ , "requests/s"
262
+ , "netdata"
263
+ , "stats"
264
+ , 130300
265
+ , localhost->rrd_update_every
266
+ , RRDSET_TYPE_LINE
267
+ );
268
+
269
+ rd_requests = rrddim_add(st_reqs, "requests", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
270
+ }
271
+ else
272
+ rrdset_next(st_reqs);
273
+
274
+ rrddim_set_by_pointer(st_reqs, rd_requests, (collected_number) gs.web_requests);
275
+ rrdset_done(st_reqs);
276
}
258
- else
259
- rrdset_next(streqs);
260
-
261
- rrddim_set(streqs, "requests", (collected_number) gs.web_requests);
262
- rrdset_done(streqs);
277
278
// ----------------------------------------------------------------
279
266
- if (unlikely(!stbytes)) {
267
- stbytes = rrdset_create_localhost(
268
- "netdata"
269
- , "net"
270
- , NULL
271
- , "netdata"
272
- , NULL
273
- , "NetData Network Traffic"
274
- , "kilobits/s"
275
- , "netdata"
276
- , "stats"
277
- , 130000
278
- , localhost->rrd_update_every
279
- , RRDSET_TYPE_AREA
280
- );
281
-
282
- rrddim_add(stbytes, "in", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
283
- rrddim_add(stbytes, "out", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
280
+ {
281
+ static RRDSET *st_bytes = NULL;
282
+ static RRDDIM *rd_in = NULL,
283
+ *rd_out = NULL;
284
+
285
+ if (unlikely(!st_bytes)) {
286
+ st_bytes = rrdset_create_localhost(
287
+ "netdata"
288
+ , "net"
289
+ , NULL
290
+ , "netdata"
291
+ , NULL
292
+ , "NetData Network Traffic"
293
+ , "kilobits/s"
294
+ , "netdata"
295
+ , "stats"
296
+ , 130000
297
+ , localhost->rrd_update_every
298
+ , RRDSET_TYPE_AREA
299
+ );
300
+
301
+ rd_in = rrddim_add(st_bytes, "in", NULL, 8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
302
+ rd_out = rrddim_add(st_bytes, "out", NULL, -8, BITS_IN_A_KILOBIT, RRD_ALGORITHM_INCREMENTAL);
303
+ }
304
+ else
305
+ rrdset_next(st_bytes);
306
+
307
+ rrddim_set_by_pointer(st_bytes, rd_in, (collected_number) gs.bytes_received);
308
+ rrddim_set_by_pointer(st_bytes, rd_out, (collected_number) gs.bytes_sent);
309
+ rrdset_done(st_bytes);
310
}
285
- else
286
- rrdset_next(stbytes);
287
-
288
- rrddim_set(stbytes, "in", (collected_number) gs.bytes_received);
289
- rrddim_set(stbytes, "out", (collected_number) gs.bytes_sent);
290
- rrdset_done(stbytes);
311
312
// ----------------------------------------------------------------
313
294
- if (unlikely(!stduration)) {
295
- stduration = rrdset_create_localhost(
296
- "netdata"
297
- , "response_time"
298
- , NULL
299
- , "netdata"
300
- , NULL
301
- , "NetData API Response Time"
302
- , "ms/request"
303
- , "netdata"
304
- , "stats"
305
- , 130400
306
- , localhost->rrd_update_every
307
- , RRDSET_TYPE_LINE
308
- );
309
-
310
- rrddim_add(stduration, "average", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
311
- rrddim_add(stduration, "max", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
314
+ {
315
+ static RRDSET *st_duration = NULL;
316
+ static RRDDIM *rd_average = NULL,
317
+ *rd_max = NULL;
318
+
319
+ if (unlikely(!st_duration)) {
320
+ st_duration = rrdset_create_localhost(
321
+ "netdata"
322
+ , "response_time"
323
+ , NULL
324
+ , "netdata"
325
+ , NULL
326
+ , "NetData API Response Time"
327
+ , "ms/request"
328
+ , "netdata"
329
+ , "stats"
330
+ , 130400
331
+ , localhost->rrd_update_every
332
+ , RRDSET_TYPE_LINE
333
+ );
334
+
335
+ rd_average = rrddim_add(st_duration, "average", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
336
+ rd_max = rrddim_add(st_duration, "max", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
337
+ }
338
+ else
339
+ rrdset_next(st_duration);
340
+
341
+ uint64_t gweb_usec = gs.web_usec;
342
+ uint64_t gweb_requests = gs.web_requests;
343
+
344
+ uint64_t web_usec = (gweb_usec >= old_web_usec) ? gweb_usec - old_web_usec : 0;
345
+ uint64_t web_requests = (gweb_requests >= old_web_requests) ? gweb_requests - old_web_requests : 0;
346
+
347
+ old_web_usec = gweb_usec;
348
+ old_web_requests = gweb_requests;
349
+
350
+ if (web_requests)
351
+ average_response_time = (collected_number) (web_usec / web_requests);
352
+
353
+ if (unlikely(average_response_time != -1))
354
+ rrddim_set_by_pointer(st_duration, rd_average, average_response_time);
355
+ else
356
+ rrddim_set_by_pointer(st_duration, rd_average, 0);
357
+
358
+ rrddim_set_by_pointer(st_duration, rd_max, ((gs.web_usec_max)?(collected_number)gs.web_usec_max:average_response_time));
359
+ rrdset_done(st_duration);
360
}
313
- else
314
- rrdset_next(stduration);
315
-
316
- uint64_t gweb_usec = gs.web_usec;
317
- uint64_t gweb_requests = gs.web_requests;
318
-
319
- uint64_t web_usec = (gweb_usec >= old_web_usec) ? gweb_usec - old_web_usec : 0;
320
- uint64_t web_requests = (gweb_requests >= old_web_requests) ? gweb_requests - old_web_requests : 0;
321
-
322
- old_web_usec = gweb_usec;
323
- old_web_requests = gweb_requests;
324
-
325
- if (web_requests)
326
- average_response_time = (collected_number) (web_usec / web_requests);
327
-
328
- if (unlikely(average_response_time != -1))
329
- rrddim_set(stduration, "average", average_response_time);
330
- else
331
- rrddim_set(stduration, "average", 0);
332
-
333
- rrddim_set(stduration, "max", ((gs.web_usec_max)?(collected_number)gs.web_usec_max:average_response_time));
334
- rrdset_done(stduration);
361
362
// ----------------------------------------------------------------
363
338
- if (unlikely(!stcompression)) {
339
- stcompression = rrdset_create_localhost(
340
- "netdata"
341
- , "compression_ratio"
342
- , NULL
343
- , "netdata"
344
- , NULL
345
- , "NetData API Responses Compression Savings Ratio"
346
- , "percentage"
347
- , "netdata"
348
- , "stats"
349
- , 130500
350
- , localhost->rrd_update_every
351
- , RRDSET_TYPE_LINE
352
- );
353
-
354
- rrddim_add(stcompression, "savings", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
364
+ {
365
+ static RRDSET *st_compression = NULL;
366
+ static RRDDIM *rd_savings = NULL;
367
+
368
+ if (unlikely(!st_compression)) {
369
+ st_compression = rrdset_create_localhost(
370
+ "netdata"
371
+ , "compression_ratio"
372
+ , NULL
373
+ , "netdata"
374
+ , NULL
375
+ , "NetData API Responses Compression Savings Ratio"
376
+ , "percentage"
377
+ , "netdata"
378
+ , "stats"
379
+ , 130500
380
+ , localhost->rrd_update_every
381
+ , RRDSET_TYPE_LINE
382
+ );
383
+
384
+ rd_savings = rrddim_add(st_compression, "savings", NULL, 1, 1000, RRD_ALGORITHM_ABSOLUTE);
385
+ }
386
+ else
387
+ rrdset_next(st_compression);
388
+
389
+ // since we don't lock here to read the global statistics
390
+ // read the smaller value first
391
+ unsigned long long gcompressed_content_size = gs.compressed_content_size;
392
+ unsigned long long gcontent_size = gs.content_size;
393
+
394
+ unsigned long long compressed_content_size = gcompressed_content_size - old_compressed_content_size;
395
+ unsigned long long content_size = gcontent_size - old_content_size;
396
+
397
+ old_compressed_content_size = gcompressed_content_size;
398
+ old_content_size = gcontent_size;
399
+
400
+ if (content_size && content_size >= compressed_content_size)
401
+ compression_ratio = ((content_size - compressed_content_size) * 100 * 1000) / content_size;
402
+
403
+ if (compression_ratio != -1)
404
+ rrddim_set_by_pointer(st_compression, rd_savings, compression_ratio);
405
+
406
+ rrdset_done(st_compression);
407
}
356
- else
357
- rrdset_next(stcompression);
358
-
359
- // since we don't lock here to read the global statistics
360
- // read the smaller value first
361
- unsigned long long gcompressed_content_size = gs.compressed_content_size;
362
- unsigned long long gcontent_size = gs.content_size;
363
-
364
- unsigned long long compressed_content_size = gcompressed_content_size - old_compressed_content_size;
365
- unsigned long long content_size = gcontent_size - old_content_size;
366
-
367
- old_compressed_content_size = gcompressed_content_size;
368
- old_content_size = gcontent_size;
369
-
370
- if (content_size && content_size >= compressed_content_size)
371
- compression_ratio = ((content_size - compressed_content_size) * 100 * 1000) / content_size;
372
-
373
- if (compression_ratio != -1)
374
- rrddim_set(stcompression, "savings", compression_ratio);
375
-
376
- rrdset_done(stcompression);
408
}