From: Sebastien GODARD Date: Thu, 29 Dec 2022 10:27:39 +0000 (+0100) Subject: sadf: A_PWR_BAT: Generate batteries statistics in PCP format X-Git-Tag: v12.7.2~21 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c2129a554a9fe0689c9181aef15bfd59c7dce916;p=sysstat sadf: A_PWR_BAT: Generate batteries statistics in PCP format Signed-off-by: Sebastien GODARD --- diff --git a/activity.c b/activity.c index 8b58168..de7e12d 100644 --- a/activity.c +++ b/activity.c @@ -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", diff --git a/pcp_def_metrics.c b/pcp_def_metrics.c index bf3e5a2..7b39fe7 100644 --- a/pcp_def_metrics.c +++ b/pcp_def_metrics.c @@ -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. diff --git a/pcp_def_metrics.h b/pcp_def_metrics.h index c38b2b1..e60a4c3 100644 --- a/pcp_def_metrics.h +++ b/pcp_def_metrics.h @@ -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 *); diff --git a/pcp_stats.c b/pcp_stats.c index 26f0739..4fcabe9 100644 --- a/pcp_stats.c +++ b/pcp_stats.c @@ -31,6 +31,7 @@ #endif extern uint64_t flags; +extern char bat_status[][16]; #ifdef HAVE_PCP #include @@ -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. diff --git a/pcp_stats.h b/pcp_stats.h index 6fa80cb..fa7c57b 100644 --- a/pcp_stats.h +++ b/pcp_stats.h @@ -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 diff --git a/sadf_misc.c b/sadf_misc.c index 8e04c5f..eb273d2 100644 --- a/sadf_misc.c +++ b/sadf_misc.c @@ -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;