Add Intel CPU temperature chart to FreeBSD plugin
Vladimir Kobal committed
Aug 15, 2017 at 00:44 UTC
911dec2ba824511845bd751d099cf5b71e64b8b9
3 files changed
+66
src/freebsd_sysctl.c
+64
@@ -372,6 +372,70 @@ int do_kern_cp_times(int update_every, usec_t dt) {
372
return 0;
373
}
374
375
+// --------------------------------------------------------------------------------------------------------------------
376
+// dev.cpu.temperature
377
+
378
+int do_dev_cpu_temperature(int update_every, usec_t dt) {
379
+ (void)dt;
380
+
381
+ int i;
382
+ static int mib[4] = {0, 0, 0, 0};
383
+ static long *pcpu_temperature = NULL;
384
+ static int old_number_of_cpus = 0;
385
+ char char_mib[MAX_INT_DIGITS + 21];
386
+ char char_rd[MAX_INT_DIGITS + 9];
387
+
388
+ if(unlikely(number_of_cpus != old_number_of_cpus))
389
+ pcpu_temperature = reallocz(pcpu_temperature, sizeof(long) * number_of_cpus);
390
+ for (i = 0; i < number_of_cpus; i++) {
391
+ mib[2] = i;
392
+ sprintf(char_mib, "dev.cpu.%d.temperature", i);
393
+ if (unlikely(GETSYSCTL_SIMPLE(char_mib, mib, pcpu_temperature[i]))) {
394
+ error("DISABLED: cpu.temperature chart");
395
+ error("DISABLED: dev.cpu.temperature module");
396
+ return 1;
397
+ }
398
+ }
399
+
400
+ // --------------------------------------------------------------------
401
+
402
+ static RRDSET *st;
403
+ static RRDDIM **rd_pcpu_temperature;
404
+
405
+ if(unlikely(number_of_cpus != old_number_of_cpus)) {
406
+ rd_pcpu_temperature = reallocz(rd_pcpu_temperature, sizeof(RRDDIM) * number_of_cpus);
407
+ if (unlikely(number_of_cpus > old_number_of_cpus))
408
+ memset(&rd_pcpu_temperature[old_number_of_cpus], 0, sizeof(RRDDIM) * (number_of_cpus - old_number_of_cpus));
409
+ }
410
+
411
+ for (i = 0; i < number_of_cpus; i++) {
412
+ if (unlikely(!st)) {
413
+ st = rrdset_create_localhost("cpu",
414
+ "temperature",
415
+ NULL,
416
+ "temperature",
417
+ "cpu.temperatute",
418
+ "Core temperature",
419
+ "degree",
420
+ 1050,
421
+ update_every,
422
+ RRDSET_TYPE_STACKED
423
+ );
424
+
425
+
426
+ sprintf(char_rd, "cpu%d.temp", i);
427
+ rd_pcpu_temperature[i] = rrddim_add(st, char_rd, NULL, 1, 1, RRD_ALGORITHM_PCENT_OVER_DIFF_TOTAL);
428
+ } else rrdset_next(st);
429
+
430
+ rrddim_set_by_pointer(st, rd_pcpu_temperature[i], pcpu_temperature[i]);
431
+ rrdset_done(st);
432
+ }
433
+
434
+ old_number_of_cpus = number_of_cpus;
435
+
436
+ return 0;
437
+}
438
+
439
// --------------------------------------------------------------------------------------------------------------------
440
// hw.intrcnt
441
src/plugin_freebsd.c
+1
@@ -36,6 +36,7 @@ static struct freebsd_module {
36
37
// CPU metrics
38
{ .name = "kern.cp_times", .dim = "cp_times", .enabled = 1, .func = do_kern_cp_times },
39
+ { .name = "dev.cpu.temperature", .dim = "cpu_temperature", .enabled = 1, .func = do_dev_cpu_temperature },
40
41
// disk metrics
42
{ .name = "kern.devstat", .dim = "kern_devstat", .enabled = 1, .func = do_kern_devstat },
src/plugin_freebsd.h
+1
@@ -17,6 +17,7 @@ extern int do_vm_loadavg(int update_every, usec_t dt);
17
extern int do_vm_vmtotal(int update_every, usec_t dt);
18
extern int do_kern_cp_time(int update_every, usec_t dt);
19
extern int do_kern_cp_times(int update_every, usec_t dt);
20
+extern int do_dev_cpu_temperature(int update_every, usec_t dt);
21
extern int do_hw_intcnt(int update_every, usec_t dt);
22
extern int do_vm_stats_sys_v_intr(int update_every, usec_t dt);
23
extern int do_vm_stats_sys_v_soft(int update_every, usec_t dt);