Files
s390-tools/ziomon/ziorep_printers.hpp
Michael Holzheu b627b8d8e1 Initial s390-tools-2.0.0 import
This commit is based on the s390-tools-1.39.0 version.

Changes on top of s390-tools-1.39.0:

 - Add MIT license to all source files
 - Add LICENSE file
 - Transform REAMDE to README.md (markdown)
 - Add AUTHORS.md file
 - Add CONTRIBUTING.md file
 - Move changelog from README to CHANGELOG.md file

Reviewed-by: Stefan Haberland <sth@linux.vnet.ibm.com>
Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
2017-08-21 10:55:40 +02:00

223 lines
6.8 KiB
C++

/*
* FCP report generators
*
* Utility classes to print framsets
*
* Copyright IBM Corp. 2008, 2017
*
* s390-tools is free software; you can redistribute it and/or modify
* it under the terms of the MIT license. See LICENSE for details.
*/
#ifndef ZIOREP_PRINTERS
#define ZIOREP_PRINTERS
#include "ziorep_frameset.hpp"
#include "ziorep_framer.hpp"
#include "ziorep_cfgreader.hpp"
/**
* Base class for all printer classes
*/
class Printer {
public:
Printer(const ConfigReader *cfg, bool csv_mode);
virtual ~Printer() {};
/**
* Print topline to fp.
* Returns number of characters printed or <0 in case of error */
virtual void print_topline(FILE *fp) = 0;
/**
* Print frameset to fp.
* Returns number of characters printed or <0 in case of error */
virtual int print_frame(FILE *fp, const Frameset &frameset,
const DeviceFilter &dev_filt) = 0;
/// Whether the output should be done in CSV format or not
bool print_csv() const;
protected:
/**
* Print timestamp before the actual frame is printed.
* Returns number of characters printed or <0 in case of error */
void print_timestamp(FILE *fp, const Frameset &frameset);
const ConfigReader *m_cfg;
/**
* Print a given number 'num' in 'num_digs' characters with
* as many decimal places as possible.
* NOTE: max_digits must be 4 or 5!
* E.g. print_abbrev_num(13400, 5) returns '13.4K'.
*/
void print_abbrev_num(FILE *fp, __u64 num, int max_digs) const;
void print_abbrev_num(FILE *fp, __u32 num, int max_digs) const;
/**
* Print floats always using 6 characters */
void print_abbrev_num(FILE *fp, double num) const;
void print_abbrev_num(FILE *fp, double num, int max_digs,
bool more_places = false) const;
const struct adapter_utilization* get_empty_utilization(__u32 host_id);
const struct adapter_utilization* get_invalid_utilization(__u32 host_id);
const struct ioerr_cnt* get_empty_ioerr(struct hctl_ident *identifier);
const struct zfcpdd_dstat* get_empty_zfcpdd_dstat(__u32 device = 0);
const struct blkiomon_stat* get_empty_blkiomon_stat(__u32 device = 0);
/** Print the delimiter appropriate for the output. That's usually
* a space for regular output and ',' for CSV. */
inline void print_delimiter(FILE *fp);
/// Print a character indicating that the respective value is not valid
inline void print_invalid(FILE *fp, int width);
/// set if result should be printed is csv
bool m_csv;
char m_delim;
private:
void print_abbreviated(FILE *fp, double num, int leading_places,
int max_digs) const;
void determine_mag_factor(int leading_places, char *magnitude,
double *factor) const;
void determine_digs(int leading_places, int max_digs,
int *num_full_digs, int *num_places) const;
struct adapter_utilization m_util;
struct adapter_utilization m_util_invalid;
struct ioerr_cnt m_ioerr;
struct zfcpdd_dstat m_dstat;
struct blkiomon_stat m_stat;
/// day of month of last day that was printed
int m_prev_day;
};
class PhysAdapterPrinter : public Printer {
public:
PhysAdapterPrinter(const ConfigReader *cfg, bool csv_mode);
virtual void print_topline(FILE *fp);
virtual int print_frame(FILE *fp, const Frameset &frameset,
const DeviceFilter &dev_filt);
private:
void print_phys_adpt(FILE *fp, __u32 host_id,
int *rc);
void print_utilization(FILE *fp, const struct abbrev_stat *stat,
__u64 count, bool valid);
};
class VirtAdapterPrinter : public Printer {
public:
VirtAdapterPrinter(const ConfigReader *cfg, bool csv_mode);
virtual void print_topline(FILE *fp);
virtual int print_frame(FILE *fp, const Frameset &frameset,
const DeviceFilter &dev_filt);
private:
void print_virt_adpt(FILE *fp, __u32 subchnl, int *rc);
void print_queue_fill(FILE *fp, const struct zfcpdd_dstat *stat,
const struct adapter_utilization *res);
void print_queue_full(FILE *fp, const struct adapter_utilization *res);
void print_failures(FILE *fp, const struct ioerr_cnt *cnt);
void print_throughput(FILE *fp, const struct blkiomon_stat *stat);
void print_num_requests(FILE *fp, const struct blkiomon_stat *stat);
};
class TrafficPrinter : public Printer {
public:
virtual int print_frame(FILE *fp, const Frameset &frameset,
const DeviceFilter &dev_filt);
protected:
TrafficPrinter(const ConfigReader *cfg, Collapser &col,
bool csv_mode);
virtual ~TrafficPrinter();
/**
* Print the actual row, excluding the first column */
virtual void print_data_row(FILE *fp,
const struct blkiomon_stat *blk_stat,
const struct zfcpdd_dstat *zfcp_stat) = 0;
void print_topline_prefix1(FILE *fp);
void print_topline_prefix2(FILE *fp);
void print_topline_whitespace(FILE *fp);
void get_device_list(list<__u64> &lst, const DeviceFilter &dev_filt);
void get_device_list(list<__u32> &lst, const DeviceFilter &dev_filt);
void print_device_wwpn(FILE *fp, __u64 wwpn);
void print_device_chpid(FILE *fp, __u32 chpid);
void print_device_devno(FILE *fp, __u32 devno);
void print_device_mp_mm(FILE *fp, __u32 mp_mm,
const ConfigReader &cfg,
int *rc);
void print_device(FILE *fp, __u32 dev,
const ConfigReader &cfg,
int *rc);
void print_device_all(FILE *fp);
Aggregator m_agg_crit;
/// Multipath devices have variable length
char *m_mp_whitespace;
char *m_mp_topline_pref1;
char *m_mp_topline_pref2;
};
class SummaryTrafficPrinter : public TrafficPrinter {
public:
SummaryTrafficPrinter(const ConfigReader *cfg,
Collapser &col, bool csv_mode);
virtual void print_topline(FILE *fp);
private:
virtual void print_data_row(FILE *fp,
const struct blkiomon_stat *blk_stat,
const struct zfcpdd_dstat *zfcp_stat);
void print_throughput(FILE *fp, const struct blkiomon_stat *stat);
void print_request_stats(FILE *fp, const struct blkiomon_stat *stat);
void print_io_subsystem_latency(FILE *fp, const struct blkiomon_stat *stat);
void print_channel_latency(FILE *fp, const struct zfcpdd_dstat *stat);
void print_fabric_latency(FILE *fp, const struct zfcpdd_dstat *stat);
void print_latency(FILE *fp, const struct minmax *data);
void print_latency(FILE *fp, const struct abbrev_stat *data,
__u64 count);
};
class DetailedTrafficPrinter : public TrafficPrinter {
public:
DetailedTrafficPrinter(const ConfigReader *cfg, Collapser &col,
bool csv_mode);
virtual void print_topline(FILE *fp);
private:
virtual void print_data_row(FILE *fp,
const struct blkiomon_stat *blk_stat,
const struct zfcpdd_dstat *zfcp_stat);
void print_histogram_io_reqs(FILE *fp,
const struct blkiomon_stat *stat);
void print_histogram_io_subs_lat(FILE *fp,
const struct blkiomon_stat *stat);
void print_histogram_channel_lat(FILE *fp,
const struct zfcpdd_dstat *stat);
void print_histogram_fabric_lat(FILE *fp,
const struct zfcpdd_dstat *stat);
};
#endif