Skip to content

Commit 9107377

Browse files
authored
perf: optimize metric processing (#6669)
- Replace stream-based processing with direct iteration in TimeBucketedMetrics to reduce allocations and GC pressure - Eliminate intermediate list creation in extractAllMetrics by processing metrics recursively in-place - Convert stream().anyMatch() to for-loop in isSupportedCategory for better performance
1 parent 8bd1d2e commit 9107377

4 files changed

Lines changed: 70 additions & 23 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "CloudWatch Metric Publisher",
4+
"contributor": "",
5+
"description": "Optimize metric processing by replacing stream-based operations with direct iteration to reduce allocations and GC pressure."
6+
}

.kiro/settings/lsp.json

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
{
2+
"languages": {
3+
"java": {
4+
"name": "jdtls",
5+
"command": "jdtls",
6+
"args": [],
7+
"file_extensions": [
8+
"java"
9+
],
10+
"project_patterns": [
11+
"pom.xml",
12+
"build.gradle",
13+
"build.gradle.kts",
14+
".project"
15+
],
16+
"exclude_patterns": [
17+
"**/target/**",
18+
"**/build/**",
19+
"**/.gradle/**"
20+
],
21+
"multi_workspace": false,
22+
"initialization_options": {
23+
"settings": {
24+
"java": {
25+
"compile": {
26+
"nullAnalysis": {
27+
"mode": "automatic"
28+
}
29+
},
30+
"configuration": {
31+
"annotationProcessing": {
32+
"enabled": true
33+
}
34+
}
35+
}
36+
}
37+
},
38+
"request_timeout_secs": 60
39+
}
40+
}
41+
}

core/http-auth-aws/src/main/java/software/amazon/awssdk/http/auth/aws/internal/signer/util/SignerUtils.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,8 @@ public static void addHostHeader(SdkHttpRequest.Builder requestBuilder) {
184184

185185
String host = requestBuilder.host();
186186
if (!SdkHttpUtils.isUsingStandardPort(requestBuilder.protocol(), requestBuilder.port())) {
187-
StringBuilder hostHeaderBuilder = new StringBuilder(host);
188-
hostHeaderBuilder.append(":").append(requestBuilder.port());
189-
requestBuilder.putHeader(SignerConstant.HOST, hostHeaderBuilder.toString());
187+
String hostHeaderValue = host + ":" + requestBuilder.port();
188+
requestBuilder.putHeader(SignerConstant.HOST, hostHeaderValue);
190189
} else {
191190
requestBuilder.putHeader(SignerConstant.HOST, host);
192191
}

metric-publishers/cloudwatch-metric-publisher/src/main/java/software/amazon/awssdk/metrics/publishers/cloudwatch/internal/transform/TimeBucketedMetrics.java

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,23 @@ private void addMetricsToBucket(MetricCollection metrics, Instant bucketId) {
128128

129129
private void aggregateMetrics(MetricCollection metrics, Map<MetricAggregatorKey, MetricAggregator> bucket) {
130130
List<Dimension> dimensions = dimensions(metrics);
131-
extractAllMetrics(metrics).forEach(metricRecord -> {
131+
processMetricsRecursively(metrics, dimensions, bucket);
132+
}
133+
134+
private void processMetricsRecursively(MetricCollection metrics,
135+
List<Dimension> dimensions,
136+
Map<MetricAggregatorKey, MetricAggregator> bucket) {
137+
for (MetricRecord<?> metricRecord : metrics) {
132138
MetricAggregatorKey aggregatorKey = new MetricAggregatorKey(metricRecord.metric(), dimensions);
133139
valueFor(metricRecord).ifPresent(metricValue -> {
134140
bucket.computeIfAbsent(aggregatorKey, m -> newAggregator(aggregatorKey))
135141
.addMetricValue(MetricValueNormalizer.normalize(metricValue));
136142
});
137-
});
143+
}
144+
145+
for (MetricCollection child : metrics.children()) {
146+
processMetricsRecursively(child, dimensions, bucket);
147+
}
138148
}
139149

140150
private List<Dimension> dimensions(MetricCollection metricCollection) {
@@ -154,19 +164,6 @@ private List<Dimension> dimensions(MetricCollection metricCollection) {
154164
return result;
155165
}
156166

157-
private List<MetricRecord<?>> extractAllMetrics(MetricCollection metrics) {
158-
List<MetricRecord<?>> result = new ArrayList<>();
159-
extractAllMetrics(metrics, result);
160-
return result;
161-
}
162-
163-
private void extractAllMetrics(MetricCollection metrics, List<MetricRecord<?>> extractedMetrics) {
164-
for (MetricRecord<?> metric : metrics) {
165-
extractedMetrics.add(metric);
166-
}
167-
metrics.children().forEach(child -> extractAllMetrics(child, extractedMetrics));
168-
}
169-
170167
private MetricAggregator newAggregator(MetricAggregatorKey aggregatorKey) {
171168
SdkMetric<?> metric = aggregatorKey.metric();
172169
StandardUnit metricUnit = unitFor(metric);
@@ -214,11 +211,15 @@ private boolean shouldReport(MetricRecord<?> metricRecord) {
214211
}
215212

216213
private boolean isSupportedCategory(MetricRecord<?> metricRecord) {
217-
return metricCategoriesContainsAll ||
218-
metricRecord.metric()
219-
.categories()
220-
.stream()
221-
.anyMatch(metricCategories::contains);
214+
if (metricCategoriesContainsAll) {
215+
return true;
216+
}
217+
for (MetricCategory category : metricRecord.metric().categories()) {
218+
if (metricCategories.contains(category)) {
219+
return true;
220+
}
221+
}
222+
return false;
222223
}
223224

224225
private boolean isSupportedLevel(MetricRecord<?> metricRecord) {

0 commit comments

Comments
 (0)