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 bool expectedIsTimerRequired() const 83 { 84 return expectedIsTimerRequiredProperty; 85 } 86 87 MetricParams& expectedIsTimerRequired(bool value) 88 { 89 expectedIsTimerRequiredProperty = value; 90 return *this; 91 } 92 93 private: 94 OperationType operationTypeProperty = {}; 95 std::string idProperty = "MetricId"; 96 CollectionTimeScope collectionTimeScopeProperty = {}; 97 CollectionDuration collectionDurationProperty = 98 CollectionDuration(Milliseconds(0u)); 99 std::vector<std::pair<Milliseconds, double>> readingsProperty = {}; 100 std::pair<Milliseconds, double> expectedReadingProperty = {}; 101 bool expectedIsTimerRequiredProperty = true; 102 }; 103 104 inline 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 << " }, expectedReading: " << reading << "(" << timestamp.count() 119 << "ms), expectedIsTimerRequired: " << std::boolalpha 120 << mp.expectedIsTimerRequired() << " }"; 121 return os; 122 } 123