1 #pragma once
2 
3 #include "types/collection_duration.hpp"
4 #include "types/collection_time_scope.hpp"
5 #include "types/operation_type.hpp"
6 
7 #include <chrono>
8 #include <cstdint>
9 #include <ostream>
10 #include <string>
11 #include <vector>
12 
13 class 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& collectionTimeScope(CollectionTimeScope val)
39     {
40         collectionTimeScopeProperty = val;
41         return *this;
42     }
43 
44     const CollectionTimeScope& collectionTimeScope() const
45     {
46         return collectionTimeScopeProperty;
47     }
48 
49     MetricParams& collectionDuration(CollectionDuration val)
50     {
51         collectionDurationProperty = val;
52         return *this;
53     }
54 
55     const CollectionDuration& collectionDuration() const
56     {
57         return collectionDurationProperty;
58     }
59 
60     MetricParams& readings(std::vector<std::pair<Milliseconds, double>> value)
61     {
62         readingsProperty = std::move(value);
63         return *this;
64     }
65 
66     const std::vector<std::pair<Milliseconds, double>>& readings() const
67     {
68         return readingsProperty;
69     }
70 
71     MetricParams& expectedReading(Milliseconds delta, double reading)
72     {
73         expectedReadingProperty = std::make_pair(delta, reading);
74         return *this;
75     }
76 
77     const std::pair<Milliseconds, double>& expectedReading() const
78     {
79         return expectedReadingProperty;
80     }
81 
82   private:
83     OperationType operationTypeProperty = {};
84     std::string idProperty = "MetricId";
85     CollectionTimeScope collectionTimeScopeProperty = {};
86     CollectionDuration collectionDurationProperty =
87         CollectionDuration(Milliseconds(0u));
88     std::vector<std::pair<Milliseconds, double>> readingsProperty = {};
89     std::pair<Milliseconds, double> expectedReadingProperty = {};
90 };
91 
92 inline std::ostream& operator<<(std::ostream& os, const MetricParams& mp)
93 {
94     using utils::enumToString;
95 
96     os << "{ op: " << enumToString(mp.operationType())
97        << ", timeScope: " << enumToString(mp.collectionTimeScope())
98        << ", duration: " << mp.collectionDuration().t.count()
99        << ", readings: { ";
100     for (auto [timestamp, reading] : mp.readings())
101     {
102         os << reading << "(" << timestamp.count() << "ms), ";
103     }
104 
105     auto [timestamp, reading] = mp.expectedReading();
106     os << " }, expected: " << reading << "(" << timestamp.count() << "ms) }";
107     return os;
108 }
109