]> granicus.if.org Git - sysstat/commitdiff
sadf: PCP: Add support for A_PWR_TEMP activity
authorSebastien GODARD <sysstat@users.noreply.github.com>
Sat, 25 May 2019 14:19:51 +0000 (16:19 +0200)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Sat, 25 May 2019 14:19:51 +0000 (16:19 +0200)
Add metrics displayed by "sar -m TEMP" (temperature statistics) to PCP
archive.

Signed-off-by: Sebastien GODARD <sysstat@users.noreply.github.com>
activity.c
pcp_def_metrics.c
pcp_def_metrics.h
pcp_stats.c
pcp_stats.h
sadf_misc.c

index 46f01fe4a393e7129c20f2ff03b6c7e1cd7cd302..43853e611f694874a2381af05ea0e26d6fa245f0 100644 (file)
@@ -1530,6 +1530,7 @@ struct activity pwr_temp_act = {
        .f_json_print   = json_print_pwr_temp_stats,
        .f_svg_print    = svg_print_pwr_temp_stats,
        .f_raw_print    = raw_print_pwr_temp_stats,
+       .f_pcp_print    = pcp_print_pwr_temp_stats,
        .f_count_new    = NULL,
        .item_list      = NULL,
        .desc           = "Devices temperature",
index 47f83d5c045ac2e739d71bb47a20c94f65348c4f..e1152c4e8cd3443de25ca40fa0fde483adb04dc1 100644 (file)
@@ -1526,6 +1526,45 @@ void pcp_def_pwr_fan_metrics(struct activity *a)
 #endif /* HAVE_PCP */
 }
 
+/*
+ ***************************************************************************
+ * Define PCP metrics for temperature statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ ***************************************************************************
+ */
+void pcp_def_pwr_temp_metrics(struct activity *a)
+{
+#ifdef HAVE_PCP
+       int inst = 0;
+       static pmInDom indom = PM_INDOM_NULL;
+       char buf[16];
+
+       if (indom == PM_INDOM_NULL) {
+               /* Create domain */
+               indom = pmInDom_build(0, PM_INDOM_TEMP);
+
+               for (inst = 0; inst < a->item_list_sz; inst++) {
+                       sprintf(buf, "temp%d", inst + 1);
+                       pmiAddInstance(indom, buf, inst);
+               }
+       }
+
+       pmiAddMetric("power.temp.degC",
+                    PM_IN_NULL, PM_TYPE_FLOAT, indom, PM_SEM_INSTANT,
+                    pmiUnits(0, 0, 0, 0, 0, 0));
+
+       pmiAddMetric("power.temp.temp_pct",
+                    PM_IN_NULL, PM_TYPE_FLOAT, indom, PM_SEM_INSTANT,
+                    pmiUnits(0, 0, 0, 0, 0, 0));
+
+       pmiAddMetric("power.temp.device",
+                    PM_IN_NULL, PM_TYPE_STRING, indom, PM_SEM_DISCRETE,
+                    pmiUnits(0, 0, 0, 0, 0, 0));
+#endif /* HAVE_PCP */
+}
+
 /*
  ***************************************************************************
  * Define PCP metrics for USB devices statistics.
index e7d9e5927d8854e8a727a59326a5eb15fe42ef56..b51ddc5e05e37f70916c12d429d50a1562ae98c3 100644 (file)
@@ -42,6 +42,7 @@ void pcp_def_net_eicmp6_metrics(void);
 void pcp_def_net_udp6_metrics(void);
 void pcp_def_huge_metrics(void);
 void pcp_def_pwr_fan_metrics(struct activity *);
+void pcp_def_pwr_temp_metrics(struct activity *);
 void pcp_def_pwr_usb_metrics(struct activity *);
 void pcp_def_filesystem_metrics(struct activity *);
 void pcp_def_fchost_metrics(struct activity *);
@@ -57,6 +58,6 @@ void pcp_def_fchost_metrics(struct activity *);
 #define PM_INDOM_USB           7
 #define PM_INDOM_DISK          8
 #define PM_INDOM_FAN           9
-
+#define PM_INDOM_TEMP          10
 
 #endif /* _PCP_DEF_METRICS_H */
index 6c05876ed9cc0ab4ce717f80a9cbc574281512aa..843246ea4ade30176dd7cf0664dfa54441f0704f 100644 (file)
@@ -1859,6 +1859,47 @@ __print_funct_t pcp_print_pwr_fan_stats(struct activity *a, int curr, unsigned l
 #endif /* HAVE_PCP */
 }
 
+/*
+ ***************************************************************************
+ * Display temperature statistics in PCP format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ * @itv                Interval of time in 1/100th of a second.
+ * @record_hdr Record header for current sample.
+ ***************************************************************************
+ */
+__print_funct_t pcp_print_pwr_temp_stats(struct activity *a, int curr, unsigned long long itv,
+                                        struct record_header *record_hdr)
+{
+#ifdef HAVE_PCP
+       int i;
+       struct stats_pwr_temp *spc;
+       char buf[64], instance[32];
+
+       for (i = 0; i < a->nr[curr]; i++) {
+
+               spc = (struct stats_pwr_temp *) ((char *) a->buf[curr] + i * a->msize);
+               sprintf(instance, "temp%d", i + 1);
+
+               snprintf(buf, sizeof(buf), "%f",
+                        spc->temp);
+               pmiPutValue("power.temp.degC", instance, buf);
+
+               snprintf(buf, sizeof(buf), "%f",
+                        (spc->temp_max - spc->temp_min) ?
+                        (spc->temp - spc->temp_min) / (spc->temp_max - spc->temp_min) * 100 :
+                        0.0);
+               pmiPutValue("power.temp.temp_pct", instance, buf);
+
+               snprintf(buf, sizeof(buf), "%s",
+                       spc->device);
+               pmiPutValue("power.temp.device", instance, buf);
+       }
+#endif /* HAVE_PCP */
+}
+
 /*
  ***************************************************************************
  * Display huge pages statistics in PCP format.
index be9a034072f7b386a6a18f3ae027a3cc031d80f8..5a37df566e664285e97d229e8d65bc298fb6f29b 100644 (file)
@@ -75,6 +75,8 @@ __print_funct_t pcp_print_pwr_cpufreq_stats
        (struct activity *, int, unsigned long long, struct record_header *);
 __print_funct_t pcp_print_pwr_fan_stats
        (struct activity *, int, unsigned long long, struct record_header *);
+__print_funct_t pcp_print_pwr_temp_stats
+       (struct activity *, int, unsigned long long, struct record_header *);
 __print_funct_t pcp_print_huge_stats
        (struct activity *, int, unsigned long long, struct record_header *);
 __print_funct_t pcp_print_pwr_usb_stats
index 868963700a55268e6eaee33215ea0980e7d4d589..e4728435e82c6be4d3a8ca9d7b1fd0a66e271d9e 100644 (file)
@@ -773,6 +773,10 @@ __printf_funct_t print_pcp_statistics(int *tab, int action, struct activity *act
                                        pcp_def_pwr_fan_metrics(act[p]);
                                        break;
 
+                               case A_PWR_TEMP:
+                                       pcp_def_pwr_temp_metrics(act[p]);
+                                       break;
+
                                case A_PWR_USB:
                                        pcp_def_pwr_usb_metrics(act[p]);
                                        break;