blob: 46540605b9efbc9fa255b50c8d85f1c8e442bf22 [file] [log] [blame]
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +00001#pragma once
2
3#include "types/collection_duration.hpp"
4#include "types/collection_time_scope.hpp"
5#include "types/operation_type.hpp"
6
Krzysztof Grobelny80697712021-03-04 09:49:27 +00007#include <chrono>
8#include <cstdint>
9#include <ostream>
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000010#include <string>
Krzysztof Grobelny80697712021-03-04 09:49:27 +000011#include <vector>
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000012
13class MetricParams final
14{
15 public:
16 MetricParams& operationType(OperationType val)
17 {
18 operationTypeProperty = val;
19 return *this;
20 }
21
22 const OperationType& operationType() const
23 {
24 return operationTypeProperty;
25 }
26
27 MetricParams& id(std::string val)
28 {
29 idProperty = std::move(val);
30 return *this;
31 }
32
33 const std::string& id() const
34 {
35 return idProperty;
36 }
37
38 MetricParams& metadata(std::string val)
39 {
40 metadataProperty = std::move(val);
41 return *this;
42 }
43
44 const std::string& metadata() const
45 {
46 return metadataProperty;
47 }
48
49 MetricParams& collectionTimeScope(CollectionTimeScope val)
50 {
51 collectionTimeScopeProperty = val;
52 return *this;
53 }
54
55 const CollectionTimeScope& collectionTimeScope() const
56 {
57 return collectionTimeScopeProperty;
58 }
59
60 MetricParams& collectionDuration(CollectionDuration val)
61 {
62 collectionDurationProperty = val;
63 return *this;
64 }
65
66 const CollectionDuration& collectionDuration() const
67 {
68 return collectionDurationProperty;
69 }
70
Krzysztof Grobelny80697712021-03-04 09:49:27 +000071 MetricParams& readings(std::vector<std::pair<Milliseconds, double>> value)
72 {
73 readingsProperty = std::move(value);
74 return *this;
75 }
76
77 const std::vector<std::pair<Milliseconds, double>>& readings() const
78 {
79 return readingsProperty;
80 }
81
82 MetricParams& expectedReading(Milliseconds delta, double reading)
83 {
84 expectedReadingProperty = std::make_pair(delta, reading);
85 return *this;
86 }
87
88 const std::pair<Milliseconds, double>& expectedReading() const
89 {
90 return expectedReadingProperty;
91 }
92
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +000093 private:
94 OperationType operationTypeProperty = {};
95 std::string idProperty = "MetricId";
96 std::string metadataProperty = "MetricMetadata";
97 CollectionTimeScope collectionTimeScopeProperty = {};
98 CollectionDuration collectionDurationProperty =
99 CollectionDuration(Milliseconds(0u));
Krzysztof Grobelny80697712021-03-04 09:49:27 +0000100 std::vector<std::pair<Milliseconds, double>> readingsProperty = {};
101 std::pair<Milliseconds, double> expectedReadingProperty = {};
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +0000102};
Krzysztof Grobelny80697712021-03-04 09:49:27 +0000103
104inline std::ostream& operator<<(std::ostream& os, const MetricParams& mp)
105{
106 using utils::enumToString;
107
108 os << "{ op: " << enumToString(mp.operationType())
109 << ", timeScope: " << enumToString(mp.collectionTimeScope())
110 << ", duration: " << mp.collectionDuration().t.count()
111 << ", readings: { ";
112 for (auto [timestamp, reading] : mp.readings())
113 {
114 os << reading << "(" << timestamp.count() << "ms), ";
115 }
116
117 auto [timestamp, reading] = mp.expectedReading();
118 os << " }, expected: " << reading << "(" << timestamp.count() << "ms) }";
119 return os;
120}