Skip to content

Commit 178831b

Browse files
committed
address issues from PR comments
1 parent c685203 commit 178831b

File tree

2 files changed

+175
-105
lines changed

2 files changed

+175
-105
lines changed

tests/performance-tests/include/performance_tests/reporting/JsonReportingMetrics.h renamed to tests/performance-tests/include/performance-tests/reporting/JsonReportingMetrics.h

Lines changed: 72 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,31 @@
1010
#include <aws/core/monitoring/CoreMetrics.h>
1111
#include <aws/core/monitoring/MonitoringFactory.h>
1212
#include <aws/core/monitoring/MonitoringInterface.h>
13+
#include <aws/core/utils/DateTime.h>
14+
#include <aws/core/utils/json/JsonSerializer.h>
1315
#include <aws/core/utils/memory/AWSMemory.h>
16+
#include <aws/core/utils/memory/stl/AWSMap.h>
1417
#include <aws/core/utils/memory/stl/AWSSet.h>
1518
#include <aws/core/utils/memory/stl/AWSString.h>
1619
#include <aws/core/utils/memory/stl/AWSVector.h>
1720

1821
#include <cstdint>
1922
#include <memory>
20-
#include <utility>
23+
#include <variant>
2124

2225
namespace PerformanceTest {
2326
namespace Reporting {
27+
2428
/**
2529
* Container for a single performance metric record that stores measurement data and associated metadata.
2630
*/
2731
struct PerformanceMetricRecord {
2832
Aws::String name;
2933
Aws::String description;
3034
Aws::String unit;
31-
int64_t date;
32-
Aws::Vector<int64_t> measurements;
33-
Aws::Vector<std::pair<Aws::String, Aws::String>> dimensions;
35+
Aws::Utils::DateTime date;
36+
Aws::Vector<std::variant<int64_t, double>> measurements;
37+
Aws::Map<Aws::String, Aws::String> dimensions;
3438
};
3539

3640
/**
@@ -39,6 +43,18 @@ struct PerformanceMetricRecord {
3943
*/
4044
class JsonReportingMetrics : public Aws::Monitoring::MonitoringInterface {
4145
public:
46+
/**
47+
* Constructor that initializes the metrics collector with configuration parameters.
48+
* @param monitoredOperations Set of operations to monitor (empty means monitor all)
49+
* @param productId Product identifier (e.g., "cpp1")
50+
* @param sdkVersion SDK version string
51+
* @param commitId Git commit identifier
52+
* @param outputFilename Path to output file (e.g., "s3-perf-results.json")
53+
*/
54+
JsonReportingMetrics(const Aws::Set<Aws::String>& monitoredOperations = Aws::Set<Aws::String>(), const Aws::String& productId = "unknown",
55+
const Aws::String& sdkVersion = "unknown", const Aws::String& commitId = "unknown",
56+
const Aws::String& outputFilename = "performance-test-results.json");
57+
4258
~JsonReportingMetrics() override;
4359

4460
/**
@@ -58,7 +74,7 @@ class JsonReportingMetrics : public Aws::Monitoring::MonitoringInterface {
5874
* @param request HTTP request object
5975
* @param outcome HTTP response outcome
6076
* @param metrics Core metrics collection containing latency data
61-
* @param context Request context (unused)
77+
* @param context Request context
6278
*/
6379
void OnRequestSucceeded(const Aws::String& serviceName, const Aws::String& requestName,
6480
const std::shared_ptr<const Aws::Http::HttpRequest>& request, const Aws::Client::HttpResponseOutcome& outcome,
@@ -71,7 +87,7 @@ class JsonReportingMetrics : public Aws::Monitoring::MonitoringInterface {
7187
* @param request HTTP request object
7288
* @param outcome HTTP response outcome
7389
* @param metrics Core metrics collection containing latency data
74-
* @param context Request context (unused)
90+
* @param context Request context
7591
*/
7692
void OnRequestFailed(const Aws::String& serviceName, const Aws::String& requestName,
7793
const std::shared_ptr<const Aws::Http::HttpRequest>& request, const Aws::Client::HttpResponseOutcome& outcome,
@@ -82,7 +98,7 @@ class JsonReportingMetrics : public Aws::Monitoring::MonitoringInterface {
8298
* @param serviceName Name of the AWS service
8399
* @param requestName Name of the operation
84100
* @param request HTTP request object
85-
* @param context Request context (unused)
101+
* @param context Request context
86102
*/
87103
void OnRequestRetry(const Aws::String& serviceName, const Aws::String& requestName,
88104
const std::shared_ptr<const Aws::Http::HttpRequest>& request, void* context) const override;
@@ -92,60 +108,53 @@ class JsonReportingMetrics : public Aws::Monitoring::MonitoringInterface {
92108
* @param serviceName Name of the AWS service
93109
* @param requestName Name of the operation
94110
* @param request HTTP request object
95-
* @param context Request context (unused)
111+
* @param context Request context
96112
*/
97113
void OnFinish(const Aws::String& serviceName, const Aws::String& requestName,
98114
const std::shared_ptr<const Aws::Http::HttpRequest>& request, void* context) const override;
99115

116+
private:
100117
/**
101-
* Sets test dimensions that will be included with all performance records.
102-
* @param dimensions Vector of key-value pairs representing test dimensions (e.g., size, bucket type)
103-
*/
104-
static void SetTestContext(const Aws::Vector<std::pair<Aws::String, Aws::String>>& dimensions);
105-
106-
/**
107-
* Registers specific operations to monitor. If empty, all operations are monitored.
108-
* @param operations Vector of operation names to track (e.g., "PutObject", "GetItem")
109-
*/
110-
static void RegisterOperationsToMonitor(const Aws::Vector<Aws::String>& operations);
111-
112-
/**
113-
* Sets product information to include in the JSON output.
114-
* @param productId Product identifier (e.g., "cpp1")
115-
* @param sdkVersion SDK version string
116-
* @param commitId Git commit identifier
117-
*/
118-
static void SetProductInfo(const Aws::String& productId, const Aws::String& sdkVersion, const Aws::String& commitId);
119-
120-
/**
121-
* Sets the output filename for the JSON performance report.
122-
* @param filename Path to output file (e.g., "s3-perf-results.json")
118+
* Helper method to process request metrics and store in context.
119+
* @param serviceName Name of the AWS service
120+
* @param requestName Name of the operation
121+
* @param request HTTP request object
122+
* @param metricsFromCore Core metrics collection containing latency data
123+
* @param context Request context
123124
*/
124-
static void SetOutputFilename(const Aws::String& filename);
125+
void StoreLatencyInContext(const Aws::String& serviceName, const Aws::String& requestName,
126+
const std::shared_ptr<const Aws::Http::HttpRequest>& request,
127+
const Aws::Monitoring::CoreMetricsCollection& metricsFromCore, void* context) const;
125128

126-
private:
127129
/**
128-
* Adds a performance record for a completed AWS service operation.
129-
* @param serviceName Name of the AWS service (e.g., "S3", "DynamoDB")
130-
* @param requestName Name of the operation (e.g., "PutObject", "GetItem")
131-
* @param metricsFromCore Core metrics collection containing latency data
130+
* Adds a performance record with a specified duration.
131+
* @param serviceName Name of the AWS service
132+
* @param requestName Name of the operation
133+
* @param request HTTP request object
134+
* @param durationMs Duration of the request in milliseconds
132135
*/
133136
void AddPerformanceRecord(const Aws::String& serviceName, const Aws::String& requestName,
134-
const Aws::Monitoring::CoreMetricsCollection& metricsFromCore) const;
137+
const std::shared_ptr<const Aws::Http::HttpRequest>& request, const std::variant<int64_t, double>& durationMs) const;
135138

136139
/**
137140
* Outputs aggregated performance metrics to JSON file.
138141
* Groups records by name and dimensions, then writes to configured output file.
139142
*/
140143
void DumpJson() const;
141144

145+
/**
146+
* Writes JSON to the output file.
147+
* @param root The JSON root object to write
148+
*/
149+
void WriteJsonToFile(const Aws::Utils::Json::JsonValue& root) const;
150+
142151
mutable Aws::Vector<PerformanceMetricRecord> m_performanceRecords;
143-
static Aws::Vector<std::pair<Aws::String, Aws::String>> TestDimensions;
144-
static Aws::Set<Aws::String> MonitoredOperations;
145-
static Aws::String ProductId;
146-
static Aws::String SdkVersion;
147-
static Aws::String CommitId;
148-
static Aws::String OutputFilename;
152+
Aws::Set<Aws::String> m_monitoredOperations;
153+
Aws::String m_productId;
154+
Aws::String m_sdkVersion;
155+
Aws::String m_commitId;
156+
Aws::String m_outputFilename;
157+
mutable bool m_hasInvalidLatency;
149158
};
150159

151160
/**
@@ -154,12 +163,32 @@ class JsonReportingMetrics : public Aws::Monitoring::MonitoringInterface {
154163
*/
155164
class JsonReportingMetricsFactory : public Aws::Monitoring::MonitoringFactory {
156165
public:
166+
/**
167+
* Constructor that initializes the factory with configuration parameters.
168+
* @param monitoredOperations Set of operations to monitor (empty means monitor all)
169+
* @param productId Product identifier (e.g., "cpp1")
170+
* @param sdkVersion SDK version string
171+
* @param commitId Git commit identifier
172+
* @param outputFilename Path to output file (e.g., "s3-perf-results.json")
173+
*/
174+
JsonReportingMetricsFactory(const Aws::Set<Aws::String>& monitoredOperations = Aws::Set<Aws::String>(),
175+
const Aws::String& productId = "unknown", const Aws::String& sdkVersion = "unknown",
176+
const Aws::String& commitId = "unknown", const Aws::String& outputFilename = "performance-test-results.json");
177+
157178
~JsonReportingMetricsFactory() override = default;
179+
158180
/**
159181
* Creates a new JsonReportingMetrics instance for performance monitoring.
160182
* @return Unique pointer to monitoring interface implementation
161183
*/
162184
Aws::UniquePtr<Aws::Monitoring::MonitoringInterface> CreateMonitoringInstance() const override;
185+
186+
private:
187+
Aws::Set<Aws::String> m_monitoredOperations;
188+
Aws::String m_productId;
189+
Aws::String m_sdkVersion;
190+
Aws::String m_commitId;
191+
Aws::String m_outputFilename;
163192
};
164193
} // namespace Reporting
165194
} // namespace PerformanceTest

0 commit comments

Comments
 (0)