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& collectionTimeScope(CollectionTimeScope val) 28 { 29 collectionTimeScopeProperty = val; 30 return *this; 31 } 32 33 const CollectionTimeScope& collectionTimeScope() const 34 { 35 return collectionTimeScopeProperty; 36 } 37 38 MetricParams& collectionDuration(CollectionDuration val) 39 { 40 collectionDurationProperty = val; 41 return *this; 42 } 43 44 const CollectionDuration& collectionDuration() const 45 { 46 return collectionDurationProperty; 47 } 48 49 MetricParams& readings(std::vector<std::pair<Milliseconds, double>> value) 50 { 51 readingsProperty = std::move(value); 52 return *this; 53 } 54 55 const std::vector<std::pair<Milliseconds, double>>& readings() const 56 { 57 return readingsProperty; 58 } 59 60 MetricParams& expectedReading(Milliseconds delta, double reading) 61 { 62 expectedReadingProperty = std::make_pair(delta, reading); 63 return *this; 64 } 65 66 const std::pair<Milliseconds, double>& expectedReading() const 67 { 68 return expectedReadingProperty; 69 } 70 71 bool expectedIsTimerRequired() const 72 { 73 return expectedIsTimerRequiredProperty; 74 } 75 76 MetricParams& expectedIsTimerRequired(bool value) 77 { 78 expectedIsTimerRequiredProperty = value; 79 return *this; 80 } 81 82 private: 83 OperationType operationTypeProperty = {}; 84 CollectionTimeScope collectionTimeScopeProperty = {}; 85 CollectionDuration collectionDurationProperty = 86 CollectionDuration(Milliseconds(0u)); 87 std::vector<std::pair<Milliseconds, double>> readingsProperty = {}; 88 std::pair<Milliseconds, double> expectedReadingProperty = {}; 89 bool expectedIsTimerRequiredProperty = true; 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 << " }, expectedReading: " << reading << "(" << timestamp.count() 107 << "ms), expectedIsTimerRequired: " << std::boolalpha 108 << mp.expectedIsTimerRequired() << " }"; 109 return os; 110 } 111