26
26
27
27
using namespace PerformanceTest ::Reporting;
28
28
29
- Aws::Map<Aws::String, Aws::String> JsonReportingMetrics::TestDimensions;
30
- Aws::Set<Aws::String> JsonReportingMetrics::MonitoredOperations;
31
- Aws::String JsonReportingMetrics::ProductId = " unknown" ;
32
- Aws::String JsonReportingMetrics::SdkVersion = " unknown" ;
33
- Aws::String JsonReportingMetrics::CommitId = " unknown" ;
34
- Aws::String JsonReportingMetrics::OutputFilename = " performance-test-results.json" ;
35
-
36
- void JsonReportingMetrics::SetTestContext (const Aws::Map<Aws::String, Aws::String>& dimensions) { TestDimensions = dimensions; }
37
-
38
- void JsonReportingMetrics::RegisterOperationsToMonitor (const Aws::Vector<Aws::String>& operations) {
39
- MonitoredOperations.clear ();
40
- for (const auto & operation : operations) {
41
- MonitoredOperations.insert (operation);
42
- }
43
- }
44
-
45
- void JsonReportingMetrics::SetProductInfo (const Aws::String& productId, const Aws::String& sdkVersion, const Aws::String& commitId) {
46
- ProductId = productId;
47
- SdkVersion = sdkVersion;
48
- CommitId = commitId;
49
- }
50
-
51
- void JsonReportingMetrics::SetOutputFilename (const Aws::String& filename) { OutputFilename = filename; }
29
+ struct RequestContext {
30
+ Aws::Utils::DateTime requestStartTime;
31
+ };
32
+
33
+ JsonReportingMetrics::JsonReportingMetrics (const Aws::Set<Aws::String>& monitoredOperations, const Aws::String& productId,
34
+ const Aws::String& sdkVersion, const Aws::String& commitId, const Aws::String& outputFilename)
35
+ : m_monitoredOperations(monitoredOperations),
36
+ m_productId(productId),
37
+ m_sdkVersion(sdkVersion),
38
+ m_commitId(commitId),
39
+ m_outputFilename(outputFilename) {}
40
+
41
+ JsonReportingMetricsFactory::JsonReportingMetricsFactory (const Aws::Set<Aws::String>& monitoredOperations, const Aws::String& productId,
42
+ const Aws::String& sdkVersion, const Aws::String& commitId,
43
+ const Aws::String& outputFilename)
44
+ : m_monitoredOperations(monitoredOperations),
45
+ m_productId(productId),
46
+ m_sdkVersion(sdkVersion),
47
+ m_commitId(commitId),
48
+ m_outputFilename(outputFilename) {}
52
49
53
50
JsonReportingMetrics::~JsonReportingMetrics () { DumpJson (); }
54
51
55
52
Aws::UniquePtr<Aws::Monitoring::MonitoringInterface> JsonReportingMetricsFactory::CreateMonitoringInstance () const {
56
- return Aws::MakeUnique<JsonReportingMetrics>(" JsonReportingMetrics" );
53
+ return Aws::MakeUnique<JsonReportingMetrics>(" JsonReportingMetrics" , m_monitoredOperations, m_productId, m_sdkVersion, m_commitId,
54
+ m_outputFilename);
57
55
}
58
56
59
57
void JsonReportingMetrics::AddPerformanceRecord (const Aws::String& serviceName, const Aws::String& requestName,
60
- const Aws::Monitoring::CoreMetricsCollection& metricsFromCore) const {
58
+ const Aws::Monitoring::CoreMetricsCollection&,
59
+ const std::shared_ptr<const Aws::Http::HttpRequest>& request, int64_t durationMs) const {
61
60
// If no operations are registered, monitor all operations. Otherwise, only monitor registered operations
62
- if (!MonitoredOperations .empty () && MonitoredOperations .find (requestName) == MonitoredOperations .end ()) {
61
+ if (!m_monitoredOperations .empty () && m_monitoredOperations .find (requestName) == m_monitoredOperations .end ()) {
63
62
return ;
64
63
}
65
64
66
- int64_t durationMs = 0 ;
67
- Aws::String const latencyKey = Aws::Monitoring::GetHttpClientMetricNameByType (Aws::Monitoring::HttpClientMetricsType::RequestLatency);
68
-
69
- auto iterator = metricsFromCore.httpClientMetrics .find (latencyKey);
70
- if (iterator != metricsFromCore.httpClientMetrics .end ()) {
71
- durationMs = iterator->second ;
72
- }
73
-
74
65
PerformanceMetricRecord record;
75
66
record.name =
76
67
Aws::Utils::StringUtils::ToLower (serviceName.c_str ()) + " ." + Aws::Utils::StringUtils::ToLower (requestName.c_str ()) + " .latency" ;
77
68
record.description = " Time to complete " + requestName + " operation" ;
78
69
record.unit = " Milliseconds" ;
79
70
record.date = Aws::Utils::DateTime::Now ();
80
71
record.measurements .emplace_back (durationMs);
81
- record.dimensions = TestDimensions;
72
+
73
+ if (request) {
74
+ auto headers = request->GetHeaders ();
75
+ for (const auto & header : headers) {
76
+ if (header.first .find (" test-dimension-" ) == 0 ) {
77
+ Aws::String const key = header.first .substr (15 );
78
+ record.dimensions [key] = header.second ;
79
+ }
80
+ }
81
+ }
82
82
83
83
m_performanceRecords.push_back (record);
84
84
}
85
85
86
86
void * JsonReportingMetrics::OnRequestStarted (const Aws::String&, const Aws::String&,
87
87
const std::shared_ptr<const Aws::Http::HttpRequest>&) const {
88
- return nullptr ;
88
+ auto context = Aws::New<RequestContext>(" JsonReportingMetrics" );
89
+ context->requestStartTime = Aws::Utils::DateTime::Now ();
90
+ return context;
89
91
}
90
92
91
93
void JsonReportingMetrics::OnRequestSucceeded (const Aws::String& serviceName, const Aws::String& requestName,
92
- const std::shared_ptr<const Aws::Http::HttpRequest>&, const Aws::Client::HttpResponseOutcome&,
93
- const Aws::Monitoring::CoreMetricsCollection& metricsFromCore, void *) const {
94
- AddPerformanceRecord (serviceName, requestName, metricsFromCore);
94
+ const std::shared_ptr<const Aws::Http::HttpRequest>& request,
95
+ const Aws::Client::HttpResponseOutcome&,
96
+ const Aws::Monitoring::CoreMetricsCollection& metricsFromCore, void * context) const {
97
+ RequestContext* requestContext = static_cast <RequestContext*>(context);
98
+ int64_t durationMs = (Aws::Utils::DateTime::Now () - requestContext->requestStartTime ).count ();
99
+ AddPerformanceRecord (serviceName, requestName, metricsFromCore, request, durationMs);
95
100
}
96
101
97
102
void JsonReportingMetrics::OnRequestFailed (const Aws::String& serviceName, const Aws::String& requestName,
98
- const std::shared_ptr<const Aws::Http::HttpRequest>&, const Aws::Client::HttpResponseOutcome&,
99
- const Aws::Monitoring::CoreMetricsCollection& metricsFromCore, void *) const {
100
- AddPerformanceRecord (serviceName, requestName, metricsFromCore);
103
+ const std::shared_ptr<const Aws::Http::HttpRequest>& request,
104
+ const Aws::Client::HttpResponseOutcome&,
105
+ const Aws::Monitoring::CoreMetricsCollection& metricsFromCore, void * context) const {
106
+ RequestContext* requestContext = static_cast <RequestContext*>(context);
107
+ int64_t durationMs = (Aws::Utils::DateTime::Now () - requestContext->requestStartTime ).count ();
108
+ AddPerformanceRecord (serviceName, requestName, metricsFromCore, request, durationMs);
101
109
}
102
110
103
111
void JsonReportingMetrics::OnRequestRetry (const Aws::String&, const Aws::String&, const std::shared_ptr<const Aws::Http::HttpRequest>&,
104
112
void *) const {}
105
113
106
114
void JsonReportingMetrics::OnFinish (const Aws::String&, const Aws::String&, const std::shared_ptr<const Aws::Http::HttpRequest>&,
107
- void *) const {}
115
+ void * context) const {
116
+ RequestContext* requestContext = static_cast <RequestContext*>(context);
117
+ Aws::Delete (requestContext);
118
+ }
108
119
109
120
void JsonReportingMetrics::DumpJson () const {
110
121
if (m_performanceRecords.empty ()) {
@@ -131,9 +142,9 @@ void JsonReportingMetrics::DumpJson() const {
131
142
132
143
// Create the JSON output
133
144
Aws::Utils::Json::JsonValue root;
134
- root.WithString (" productId" , ProductId );
135
- root.WithString (" sdkVersion" , SdkVersion );
136
- root.WithString (" commitId" , CommitId );
145
+ root.WithString (" productId" , m_productId );
146
+ root.WithString (" sdkVersion" , m_sdkVersion );
147
+ root.WithString (" commitId" , m_commitId );
137
148
138
149
Aws::Utils::Array<Aws::Utils::Json::JsonValue> results (aggregatedRecords.size ());
139
150
size_t index = 0 ;
@@ -175,7 +186,7 @@ void JsonReportingMetrics::DumpJson() const {
175
186
176
187
root.WithArray (" results" , std::move (results));
177
188
178
- std::ofstream outFile (OutputFilename .c_str ());
189
+ std::ofstream outFile (m_outputFilename .c_str ());
179
190
if (outFile.is_open ()) {
180
191
outFile << root.View ().WriteReadable ();
181
192
}
0 commit comments