Skip to content

Commit 0338ecd

Browse files
author
Pankaj Agrawal
committed
feat: single metric utility method to pick default namespace
1 parent 6569c61 commit 0338ecd

File tree

5 files changed

+82
-3
lines changed

5 files changed

+82
-3
lines changed

powertools-metrics/src/main/java/software/amazon/cloudwatchlogs/emf/model/MetricsLoggerHelper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public static long dimensionsCount() {
1616
return metricsContext().getDimensions().size();
1717
}
1818

19-
private static MetricsContext metricsContext() {
19+
public static MetricsContext metricsContext() {
2020
try {
2121
Field f = metricsLogger().getClass().getDeclaredField("context");
2222
f.setAccessible(true);

powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsUtils.java

+32
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import java.util.function.Consumer;
44

5+
import software.amazon.cloudwatchlogs.emf.config.SystemWrapper;
56
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger;
7+
import software.amazon.cloudwatchlogs.emf.model.MetricsContext;
8+
import software.amazon.cloudwatchlogs.emf.model.MetricsLoggerHelper;
69
import software.amazon.cloudwatchlogs.emf.model.Unit;
710

811
/**
@@ -26,6 +29,29 @@ public static MetricsLogger metricsLogger() {
2629
return metricsLogger;
2730
}
2831

32+
/**
33+
* Add and immediately flush a single metric. It will use the default namespace
34+
* specific either on {@link Metrics} annotation or via POWERTOOLS_METRICS_NAMESPACE env var.
35+
*
36+
* @param name the name of the metric
37+
* @param value the value of the metric
38+
* @param unit the unit type of the metric
39+
* @param logger the MetricsLogger
40+
*/
41+
public static void withSingleMetricOnDefaultNameSpace(final String name,
42+
final double value,
43+
final Unit unit,
44+
final Consumer<MetricsLogger> logger) {
45+
MetricsLogger metricsLogger = new MetricsLogger();
46+
try {
47+
metricsLogger.setNamespace(defaultNameSpace());
48+
metricsLogger.putMetric(name, value, unit);
49+
logger.accept(metricsLogger);
50+
} finally {
51+
metricsLogger.flush();
52+
}
53+
}
54+
2955
/**
3056
* Add and immediately flush a single metric.
3157
*
@@ -49,4 +75,10 @@ public static void withSingleMetric(final String name,
4975
metricsLogger.flush();
5076
}
5177
}
78+
79+
private static String defaultNameSpace() {
80+
MetricsContext context = MetricsLoggerHelper.metricsContext();
81+
return "aws-embedded-metrics".equals(context.getNamespace()) ?
82+
SystemWrapper.getenv("POWERTOOLS_METRICS_NAMESPACE"): context.getNamespace();
83+
}
5284
}

powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/MetricsLoggerTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,33 @@ void singleMetricsCaptureUtility() {
6262
}
6363
}
6464

65+
@Test
66+
void singleMetricsCaptureUtilityWithDefaultNameSpace() {
67+
try (MockedStatic<SystemWrapper> mocked = mockStatic(SystemWrapper.class)) {
68+
mocked.when(() -> SystemWrapper.getenv("AWS_EMF_ENVIRONMENT")).thenReturn("Lambda");
69+
mocked.when(() -> SystemWrapper.getenv("POWERTOOLS_METRICS_NAMESPACE")).thenReturn("GlobalName");
70+
71+
MetricsUtils.withSingleMetricOnDefaultNameSpace("Metric1", 1, Unit.COUNT,
72+
metricsLogger -> metricsLogger.setDimensions(DimensionSet.of("Dimension1", "Value1")));
73+
74+
assertThat(out.toString())
75+
.satisfies(s -> {
76+
Map<String, Object> logAsJson = readAsJson(s);
77+
78+
assertThat(logAsJson)
79+
.containsEntry("Metric1", 1.0)
80+
.containsEntry("Dimension1", "Value1")
81+
.containsKey("_aws");
82+
83+
Map<String, Object> aws = (Map<String, Object>) logAsJson.get("_aws");
84+
85+
assertThat(aws.get("CloudWatchMetrics"))
86+
.asString()
87+
.contains("Namespace=GlobalName");
88+
});
89+
}
90+
}
91+
6592
private Map<String, Object> readAsJson(String s) {
6693
try {
6794
return mapper.readValue(s, Map.class);

powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/handlers/PowertoolsMetricsEnabledHandler.java

+6
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
import com.amazonaws.services.lambda.runtime.Context;
44
import com.amazonaws.services.lambda.runtime.RequestHandler;
55
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger;
6+
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
67
import software.amazon.cloudwatchlogs.emf.model.Unit;
78
import software.amazon.lambda.powertools.metrics.Metrics;
89

910
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
11+
import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetricOnDefaultNameSpace;
1012

1113
public class PowertoolsMetricsEnabledHandler implements RequestHandler<Object, Object> {
1214

@@ -16,6 +18,10 @@ public Object handleRequest(Object input, Context context) {
1618
MetricsLogger metricsLogger = metricsLogger();
1719
metricsLogger.putMetric("Metric1", 1, Unit.BYTES);
1820

21+
22+
withSingleMetricOnDefaultNameSpace("Metric2", 1, Unit.COUNT,
23+
log -> log.setDimensions(DimensionSet.of("Dimension1", "Value1")));
24+
1925
return null;
2026
}
2127
}

powertools-metrics/src/test/java/software/amazon/lambda/powertools/metrics/internal/LambdaMetricsAspectTest.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,23 @@ public void metricsWithoutColdStart() {
7575
mocked.when(() -> SystemWrapper.getenv("AWS_EMF_ENVIRONMENT")).thenReturn("Lambda");
7676
requestHandler.handleRequest("input", context);
7777

78-
assertThat(out.toString())
78+
assertThat(out.toString().split("\n"))
79+
.hasSize(2)
7980
.satisfies(s -> {
80-
Map<String, Object> logAsJson = readAsJson(s);
81+
Map<String, Object> logAsJson = readAsJson(s[0]);
82+
83+
assertThat(logAsJson)
84+
.containsEntry("Metric2", 1.0)
85+
.containsEntry("Dimension1", "Value1")
86+
.containsKey("_aws");
87+
88+
Map<String, Object> aws = (Map<String, Object>) logAsJson.get("_aws");
89+
90+
assertThat(aws.get("CloudWatchMetrics"))
91+
.asString()
92+
.contains("Namespace=ExampleApplication");
93+
94+
logAsJson = readAsJson(s[1]);
8195

8296
assertThat(logAsJson)
8397
.containsEntry("Metric1", 1.0)

0 commit comments

Comments
 (0)