]> granicus.if.org Git - sysstat/commitdiff
sadf: A_PWR_BAT: Generate batteries statistics in PCP format
authorSebastien GODARD <sysstat@users.noreply.github.com>
Thu, 29 Dec 2022 10:27:39 +0000 (11:27 +0100)
committerSebastien GODARD <sysstat@users.noreply.github.com>
Thu, 29 Dec 2022 10:27:39 +0000 (11:27 +0100)
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 8b58168e4f6d91d5b79dd8a52e22e984c1af1786..de7e12d8c1d0cd5df50a878b1b2d11ff00d890f3 100644 (file)
@@ -2031,7 +2031,7 @@ struct activity pwr_bat_act = {
        .f_json_print   = json_print_pwr_bat_stats,
        .f_svg_print    = svg_print_pwr_bat_stats,
        .f_raw_print    = raw_print_pwr_bat_stats,
-       .f_pcp_print    = NULL, // FIXME
+       .f_pcp_print    = pcp_print_pwr_bat_stats,
        .f_count_new    = count_new_bat,
        .item_list      = NULL,
        .desc           = "Batteries capacity",
index bf3e5a213d901d0aa0c4995a7f5605f4b5d62eb3..7b39fe754040a96baf8c7a74d209aae316da6da9 100644 (file)
@@ -1664,6 +1664,42 @@ void pcp_def_pwr_in_metrics(struct activity *a)
 #endif /* HAVE_PCP */
 }
 
+/*
+ * **************************************************************************
+ * Define PCP metrics for battery statistics.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ ***************************************************************************
+ */
+void pcp_def_pwr_bat_metrics(struct activity *a)
+{
+#ifdef HAVE_PCP
+       int inst = 0;
+       static pmInDom indom = PM_INDOM_NULL;
+       struct sa_item *list = a->item_list;
+
+       if (indom == PM_INDOM_NULL) {
+               /* Create domain */
+               indom = pmInDom_build(34, 4);
+
+               /* Create instances */
+               while (list != NULL) {
+                       pmiAddInstance(indom, list->item_name, inst++);
+                       list = list->next;
+               }
+       }
+
+       pmiAddMetric("power.bat.capacity",
+                    pmiID(34, 4, 0), PM_TYPE_U32, indom, PM_SEM_INSTANT,
+                    pmiUnits(0, 0, 0, 0, 0, 0));
+
+       pmiAddMetric("power.bat.status",
+                    pmiID(34, 4, 2), 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 c38b2b1ff3b12ba896337c036b9b55fcd9826850..e60a4c375c9d0599b7174c39205c45d6688b8ca2 100644 (file)
@@ -44,6 +44,7 @@ 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_in_metrics(struct activity *);
+void pcp_def_pwr_bat_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 *);
index 26f0739435aa442e08a3f2750e9515fd93d995a1..4fcabe9dd01deaf0d0d12481716a1a64b6cb21b3 100644 (file)
@@ -31,6 +31,7 @@
 #endif
 
 extern uint64_t flags;
+extern char bat_status[][16];
 
 #ifdef HAVE_PCP
 #include <pcp/pmapi.h>
@@ -1594,6 +1595,42 @@ __print_funct_t pcp_print_pwr_in_stats(struct activity *a, int curr)
 #endif /* HAVE_PCP */
 }
 
+/*
+ * **************************************************************************
+ * Display batteries statistics in PCP format.
+ *
+ * IN:
+ * @a          Activity structure with statistics.
+ * @curr       Index in array for current sample statistics.
+ ***************************************************************************
+ */
+__print_funct_t pcp_print_pwr_bat_stats(struct activity *a, int curr)
+{
+#ifdef HAVE_PCP
+       int i;
+       struct stats_pwr_bat *spbc;
+       char buf[64], bat_name[16];
+
+       for (i = 0; i < a->nr[curr]; i++) {
+
+               spbc = (struct stats_pwr_bat *) ((char *) a->buf[curr] + i * a->msize);
+
+               snprintf(bat_name, sizeof(bat_name), "BAT%d", (int) spbc->bat_id);
+
+               snprintf(buf, sizeof(buf), "%u", (unsigned int) spbc->capacity);
+               pmiPutValue("power.bat.capacity", bat_name, buf);
+
+               /* Battery status code should not be greater than or equal to BAT_STS_NR */
+               if (spbc->status >= BAT_STS_NR) {
+                       spbc->status = 0;
+               }
+
+               snprintf(buf, sizeof(buf), "%s", bat_status[(unsigned int) spbc->status]);
+               pmiPutValue("power.bat.status", bat_name, buf);
+       }
+#endif /* HAVE_PCP */
+}
+
 /*
  ***************************************************************************
  * Display huge pages statistics in PCP format.
index 6fa80cbd8cbb2f8f8d0e20ef74d088897117d3a7..fa7c57b143c94d786fc19e61373df402ebdb8edd 100644 (file)
@@ -79,6 +79,8 @@ __print_funct_t pcp_print_pwr_temp_stats
        (struct activity *, int);
 __print_funct_t pcp_print_pwr_in_stats
        (struct activity *, int);
+__print_funct_t pcp_print_pwr_bat_stats
+       (struct activity *, int);
 __print_funct_t pcp_print_huge_stats
        (struct activity *, int);
 __print_funct_t pcp_print_pwr_usb_stats
index 8e04c5f6954861983459469db8f6e4b4a10ae699..eb273d2f7ef2bdfb8d36696eb30acd448dd9e736 100644 (file)
@@ -777,6 +777,10 @@ __printf_funct_t print_pcp_statistics(int *tab, int action, struct activity *act
                                        pcp_def_pwr_in_metrics(act[p]);
                                        break;
 
+                               case A_PWR_BAT:
+                                       pcp_def_pwr_bat_metrics(act[p]);
+                                       break;
+
                                case A_PWR_USB:
                                        pcp_def_pwr_usb_metrics(act[p]);
                                        break;