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& 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 71 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 93 private: 94 OperationType operationTypeProperty = {}; 95 std::string idProperty = "MetricId"; 96 std::string metadataProperty = "MetricMetadata"; 97 CollectionTimeScope collectionTimeScopeProperty = {}; 98 CollectionDuration collectionDurationProperty = 99 CollectionDuration(Milliseconds(0u)); 100 std::vector<std::pair<Milliseconds, double>> readingsProperty = {}; 101 std::pair<Milliseconds, double> expectedReadingProperty = {}; 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 << " }, expected: " << reading << "(" << timestamp.count() << "ms) }"; 119 return os; 120 } 121