/* Statistic collection. * * Author: Steffen Vogel * SPDX-FileCopyrightText: 2014-2023 Institute for Automation of Complex Power Systems, RWTH Aachen University * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace villas { namespace node { // Forward declarations struct Sample; class Node; } // namespace node class Stats { public: using Ptr = std::shared_ptr; enum class Format { HUMAN, JSON, MATLAB }; enum class Metric { SMPS_SKIPPED, // Counter for skipped samples due to hooks. SMPS_REORDERED, // Counter for reordered samples. // Timings GAP_SAMPLE, // Histogram for inter sample timestamps (as sent by remote). GAP_RECEIVED, // Histogram for inter sample arrival time (as seen by this instance). OWD, // Histogram for one-way-delay (OWD) of received samples. AGE, // Processing time of packets within VILLASnode. SIGNAL_COUNT, // Number of signals per sample. // RTP metrics RTP_LOSS_FRACTION, // Fraction lost since last RTP SR/RR. RTP_PKTS_LOST, // Cumul. no. pkts lost. RTP_JITTER // Interarrival jitter. }; enum class Type { LAST, HIGHEST, LOWEST, MEAN, VAR, STDDEV, TOTAL }; protected: std::unordered_map histograms; struct MetricDescription { const char *name; const char *unit; const char *desc; }; struct TypeDescription { const char *name; enum node::SignalType signal_type; }; static std::shared_ptr table; static void setupTable(); Logger logger; public: Stats(int buckets, int warmup); static enum Format lookupFormat(const std::string &str); static enum Metric lookupMetric(const std::string &str); static enum Type lookupType(const std::string &str); void update(enum Metric id, double val); void reset(); json_t *toJson() const; static void printHeader(enum Format fmt); void printPeriodic(FILE *f, enum Format fmt, node::Node *n) const; void print(FILE *f, enum Format fmt, int verbose) const; union node::SignalData getValue(enum Metric sm, enum Type st) const; const Hist &getHistogram(enum Metric sm) const; static std::unordered_map metrics; static std::unordered_map types; static std::vector columns; }; } // namespace villas