From: Sebastien GODARD Date: Sat, 25 May 2019 14:04:58 +0000 (+0200) Subject: sadf: PCP: Add support for A_PWR_FAN activity X-Git-Tag: v12.1.5~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c5bfb2aaf4843b544fe94866ea1e18821adc4d24;p=sysstat sadf: PCP: Add support for A_PWR_FAN activity Add metrics displayed by "sar -m FAN" (fan statistics) to PCP archive. Signed-off-by: Sebastien GODARD --- diff --git a/activity.c b/activity.c index c300895..46f01fe 100644 --- a/activity.c +++ b/activity.c @@ -1484,6 +1484,7 @@ struct activity pwr_fan_act = { .f_json_print = json_print_pwr_fan_stats, .f_svg_print = svg_print_pwr_fan_stats, .f_raw_print = raw_print_pwr_fan_stats, + .f_pcp_print = pcp_print_pwr_fan_stats, .f_count_new = NULL, .item_list = NULL, .desc = "Fans speed", diff --git a/pcp_def_metrics.c b/pcp_def_metrics.c index 262722c..47f83d5 100644 --- a/pcp_def_metrics.c +++ b/pcp_def_metrics.c @@ -1487,6 +1487,45 @@ void pcp_def_huge_metrics() #endif /* HAVE_PCP */ } +/* + *************************************************************************** + * Define PCP metrics for fan statistics. + * + * IN: + * @a Activity structure with statistics. + *************************************************************************** + */ +void pcp_def_pwr_fan_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_FAN); + + for (inst = 0; inst < a->item_list_sz; inst++) { + sprintf(buf, "fan%d", inst + 1); + pmiAddInstance(indom, buf, inst); + } + } + + pmiAddMetric("power.fan.rpm", + PM_IN_NULL, PM_TYPE_U64, indom, PM_SEM_INSTANT, + pmiUnits(0, 0, 0, 0, 0, 0)); + + pmiAddMetric("power.fan.drpm", + PM_IN_NULL, PM_TYPE_U64, indom, PM_SEM_INSTANT, + pmiUnits(0, 0, 0, 0, 0, 0)); + + pmiAddMetric("power.fan.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. @@ -1508,7 +1547,7 @@ void pcp_def_pwr_usb_metrics(struct activity *a) for (inst = 0; inst < a->item_list_sz; inst++) { sprintf(buf, "usb%d", inst); - pmiAddInstance(indom,buf, inst); + pmiAddInstance(indom, buf, inst); } } diff --git a/pcp_def_metrics.h b/pcp_def_metrics.h index 383c320..e7d9e59 100644 --- a/pcp_def_metrics.h +++ b/pcp_def_metrics.h @@ -41,6 +41,7 @@ void pcp_def_net_icmp6_metrics(void); 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_usb_metrics(struct activity *); void pcp_def_filesystem_metrics(struct activity *); void pcp_def_fchost_metrics(struct activity *); @@ -55,6 +56,7 @@ void pcp_def_fchost_metrics(struct activity *); #define PM_INDOM_FCHOST 6 #define PM_INDOM_USB 7 #define PM_INDOM_DISK 8 +#define PM_INDOM_FAN 9 #endif /* _PCP_DEF_METRICS_H */ diff --git a/pcp_stats.c b/pcp_stats.c index f30bd7c..6c05876 100644 --- a/pcp_stats.c +++ b/pcp_stats.c @@ -1820,6 +1820,45 @@ __print_funct_t pcp_print_pwr_cpufreq_stats(struct activity *a, int curr, unsign #endif /* HAVE_PCP */ } +/* + *************************************************************************** + * Display fan 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_fan_stats(struct activity *a, int curr, unsigned long long itv, + struct record_header *record_hdr) +{ +#ifdef HAVE_PCP + int i; + struct stats_pwr_fan *spc; + char buf[64], instance[32]; + + for (i = 0; i < a->nr[curr]; i++) { + + spc = (struct stats_pwr_fan *) ((char *) a->buf[curr] + i * a->msize); + sprintf(instance, "fan%d", i + 1); + + snprintf(buf, sizeof(buf), "%llu", + (unsigned long long) spc->rpm); + pmiPutValue("power.fan.rpm", instance, buf); + + snprintf(buf, sizeof(buf), "%llu", + (unsigned long long) (spc->rpm - spc->rpm_min)); + pmiPutValue("power.fan.drpm", instance, buf); + + snprintf(buf, sizeof(buf), "%s", + spc->device); + pmiPutValue("power.fan.device", instance, buf); + } +#endif /* HAVE_PCP */ +} + /* *************************************************************************** * Display huge pages statistics in PCP format. diff --git a/pcp_stats.h b/pcp_stats.h index 970664d..be9a034 100644 --- a/pcp_stats.h +++ b/pcp_stats.h @@ -73,6 +73,8 @@ __print_funct_t pcp_print_net_udp6_stats (struct activity *, int, unsigned long long, struct record_header *); __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_huge_stats (struct activity *, int, unsigned long long, struct record_header *); __print_funct_t pcp_print_pwr_usb_stats diff --git a/sadf_misc.c b/sadf_misc.c index 8c33965..8689637 100644 --- a/sadf_misc.c +++ b/sadf_misc.c @@ -769,6 +769,10 @@ __printf_funct_t print_pcp_statistics(int *tab, int action, struct activity *act pcp_def_huge_metrics(); break; + case A_PWR_FAN: + pcp_def_pwr_fan_metrics(act[p]); + break; + case A_PWR_USB: pcp_def_pwr_usb_metrics(act[p]); break;