Skip to content

Commit 2a79c02

Browse files
committed
Rewrite metrics module with interface abstraction and provider pattern to be able to support multiple metrics providers.
1 parent 4444b4b commit 2a79c02

32 files changed

+1138
-1383
lines changed

examples/powertools-examples-core-utilities/cdk/app/src/main/java/helloworld/App.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414

1515
package helloworld;
1616

17-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
18-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetric;
1917
import static software.amazon.lambda.powertools.tracing.TracingUtils.putMetadata;
2018

2119
import com.amazonaws.services.lambda.runtime.Context;
@@ -32,10 +30,12 @@
3230
import org.slf4j.Logger;
3331
import org.slf4j.LoggerFactory;
3432
import org.slf4j.MDC;
35-
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
36-
import software.amazon.cloudwatchlogs.emf.model.Unit;
3733
import software.amazon.lambda.powertools.logging.Logging;
3834
import software.amazon.lambda.powertools.metrics.Metrics;
35+
import software.amazon.lambda.powertools.metrics.MetricsLogger;
36+
import software.amazon.lambda.powertools.metrics.MetricsLoggerFactory;
37+
import software.amazon.lambda.powertools.metrics.model.DimensionSet;
38+
import software.amazon.lambda.powertools.metrics.model.MetricUnit;
3939
import software.amazon.lambda.powertools.tracing.CaptureMode;
4040
import software.amazon.lambda.powertools.tracing.Tracing;
4141
import software.amazon.lambda.powertools.tracing.TracingUtils;
@@ -45,6 +45,8 @@
4545
*/
4646
public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
4747
private static final Logger log = LoggerFactory.getLogger(App.class);
48+
private static final MetricsLogger metricsLogger = MetricsLoggerFactory.getMetricsLogger();
49+
4850
@Logging(logEvent = true, samplingRate = 0.7)
4951
@Tracing(captureMode = CaptureMode.RESPONSE_AND_ERROR)
5052
@Metrics(namespace = "ServerlessAirline", service = "payment", captureColdStart = true)
@@ -54,13 +56,13 @@ public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEv
5456
headers.put("Content-Type", "application/json");
5557
headers.put("X-Custom-Header", "application/json");
5658

57-
metricsLogger().putMetric("CustomMetric1", 1, Unit.COUNT);
59+
metricsLogger.addMetric("CustomMetric1", 1, MetricUnit.COUNT);
5860

59-
withSingleMetric("CustomMetrics2", 1, Unit.COUNT, "Another", (metric) ->
60-
{
61-
metric.setDimensions(DimensionSet.of("AnotherService", "CustomService"));
62-
metric.setDimensions(DimensionSet.of("AnotherService1", "CustomService1"));
63-
});
61+
DimensionSet dimensionSet = DimensionSet.of(
62+
"AnotherService", "CustomService",
63+
"AnotherService1", "CustomService1"
64+
);
65+
metricsLogger.pushSingleMetric("CustomMetric2", 1, MetricUnit.COUNT, "Another", dimensionSet);
6466

6567
MDC.put("test", "willBeLogged");
6668

@@ -103,4 +105,4 @@ private String getPageContents(String address) throws IOException {
103105
return br.lines().collect(Collectors.joining(System.lineSeparator()));
104106
}
105107
}
106-
}
108+
}

examples/powertools-examples-core-utilities/gradle/src/main/java/helloworld/App.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
package helloworld;
1616

1717
import static software.amazon.lambda.powertools.logging.argument.StructuredArguments.entry;
18-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
19-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetric;
2018
import static software.amazon.lambda.powertools.tracing.TracingUtils.putMetadata;
2119

2220
import com.amazonaws.services.lambda.runtime.Context;
@@ -33,10 +31,12 @@
3331
import org.slf4j.Logger;
3432
import org.slf4j.LoggerFactory;
3533
import org.slf4j.MDC;
36-
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
37-
import software.amazon.cloudwatchlogs.emf.model.Unit;
3834
import software.amazon.lambda.powertools.logging.Logging;
3935
import software.amazon.lambda.powertools.metrics.Metrics;
36+
import software.amazon.lambda.powertools.metrics.MetricsLogger;
37+
import software.amazon.lambda.powertools.metrics.MetricsLoggerFactory;
38+
import software.amazon.lambda.powertools.metrics.model.DimensionSet;
39+
import software.amazon.lambda.powertools.metrics.model.MetricUnit;
4040
import software.amazon.lambda.powertools.tracing.CaptureMode;
4141
import software.amazon.lambda.powertools.tracing.Tracing;
4242
import software.amazon.lambda.powertools.tracing.TracingUtils;
@@ -46,6 +46,7 @@
4646
*/
4747
public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
4848
private static final Logger log = LoggerFactory.getLogger(App.class);
49+
private static final MetricsLogger metricsLogger = MetricsLoggerFactory.getMetricsLogger();
4950

5051
@Logging(logEvent = true, samplingRate = 0.7)
5152
@Tracing(captureMode = CaptureMode.RESPONSE_AND_ERROR)
@@ -56,13 +57,13 @@ public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEv
5657
headers.put("Content-Type", "application/json");
5758
headers.put("X-Custom-Header", "application/json");
5859

59-
metricsLogger().putMetric("CustomMetric1", 1, Unit.COUNT);
60+
metricsLogger.addMetric("CustomMetric1", 1, MetricUnit.COUNT);
6061

61-
withSingleMetric("CustomMetrics2", 1, Unit.COUNT, "Another", (metric) ->
62-
{
63-
metric.setDimensions(DimensionSet.of("AnotherService", "CustomService"));
64-
metric.setDimensions(DimensionSet.of("AnotherService1", "CustomService1"));
65-
});
62+
DimensionSet dimensionSet = DimensionSet.of(
63+
"AnotherService", "CustomService",
64+
"AnotherService1", "CustomService1"
65+
);
66+
metricsLogger.pushSingleMetric("CustomMetric2", 1, MetricUnit.COUNT, "Another", dimensionSet);
6667

6768
MDC.put("test", "willBeLogged");
6869

@@ -105,4 +106,4 @@ private String getPageContents(String address) throws IOException {
105106
return br.lines().collect(Collectors.joining(System.lineSeparator()));
106107
}
107108
}
108-
}
109+
}

examples/powertools-examples-core-utilities/kotlin/src/main/kotlin/helloworld/App.kt

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent
2020
import com.amazonaws.xray.entities.Subsegment
2121
import org.slf4j.LoggerFactory
2222
import org.slf4j.MDC
23-
import software.amazon.cloudwatchlogs.emf.logger.MetricsLogger
24-
import software.amazon.cloudwatchlogs.emf.model.DimensionSet
25-
import software.amazon.cloudwatchlogs.emf.model.Unit
2623
import software.amazon.lambda.powertools.logging.Logging
2724
import software.amazon.lambda.powertools.logging.argument.StructuredArguments.entry
2825
import software.amazon.lambda.powertools.metrics.Metrics
29-
import software.amazon.lambda.powertools.metrics.MetricsUtils
26+
import software.amazon.lambda.powertools.metrics.MetricsLogger
27+
import software.amazon.lambda.powertools.metrics.MetricsLoggerFactory
28+
import software.amazon.lambda.powertools.metrics.model.DimensionSet
29+
import software.amazon.lambda.powertools.metrics.model.MetricUnit
3030
import software.amazon.lambda.powertools.tracing.CaptureMode
3131
import software.amazon.lambda.powertools.tracing.Tracing
3232
import software.amazon.lambda.powertools.tracing.TracingUtils
@@ -39,16 +39,23 @@ import java.net.URL
3939
*/
4040

4141
class App : RequestHandler<APIGatewayProxyRequestEvent?, APIGatewayProxyResponseEvent> {
42+
private val log = LoggerFactory.getLogger(this::class.java)
43+
private val metricsLogger: MetricsLogger = MetricsLoggerFactory.getMetricsLogger()
44+
4245
@Logging(logEvent = true, samplingRate = 0.7)
4346
@Tracing(captureMode = CaptureMode.RESPONSE_AND_ERROR)
4447
@Metrics(namespace = "ServerlessAirline", service = "payment", captureColdStart = true)
4548
override fun handleRequest(input: APIGatewayProxyRequestEvent?, context: Context?): APIGatewayProxyResponseEvent {
4649
val headers = mapOf("Content-Type" to "application/json", "X-Custom-Header" to "application/json")
47-
MetricsUtils.metricsLogger().putMetric("CustomMetric1", 1.0, Unit.COUNT)
48-
MetricsUtils.withSingleMetric("CustomMetrics2", 1.0, Unit.COUNT, "Another") { metric: MetricsLogger ->
49-
metric.setDimensions(DimensionSet.of("AnotherService", "CustomService"))
50-
metric.setDimensions(DimensionSet.of("AnotherService1", "CustomService1"))
51-
}
50+
51+
metricsLogger.addMetric("CustomMetric1", 1.0, MetricUnit.COUNT)
52+
53+
val dimensionSet = DimensionSet.of(
54+
"AnotherService", "CustomService",
55+
"AnotherService1", "CustomService1"
56+
)
57+
metricsLogger.pushSingleMetric("CustomMetric2", 1.0, MetricUnit.COUNT, "Another", dimensionSet)
58+
5259
MDC.put("test", "willBeLogged")
5360
val response = APIGatewayProxyResponseEvent().withHeaders(headers)
5461
return try {
@@ -89,6 +96,4 @@ class App : RequestHandler<APIGatewayProxyRequestEvent?, APIGatewayProxyResponse
8996
reader.readText().trim()
9097
}
9198
}
92-
93-
private val log = LoggerFactory.getLogger(this::class.java)
94-
}
99+
}

examples/powertools-examples-core-utilities/sam-graalvm/src/main/java/helloworld/App.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
package helloworld;
1616

1717
import static software.amazon.lambda.powertools.logging.argument.StructuredArguments.entry;
18-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
19-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetric;
2018
import static software.amazon.lambda.powertools.tracing.TracingUtils.putMetadata;
2119

2220
import com.amazonaws.services.lambda.runtime.Context;
@@ -33,11 +31,13 @@
3331
import org.slf4j.Logger;
3432
import org.slf4j.LoggerFactory;
3533
import org.slf4j.MDC;
36-
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
37-
import software.amazon.cloudwatchlogs.emf.model.StorageResolution;
38-
import software.amazon.cloudwatchlogs.emf.model.Unit;
3934
import software.amazon.lambda.powertools.logging.Logging;
4035
import software.amazon.lambda.powertools.metrics.Metrics;
36+
import software.amazon.lambda.powertools.metrics.MetricsLogger;
37+
import software.amazon.lambda.powertools.metrics.MetricsLoggerFactory;
38+
import software.amazon.lambda.powertools.metrics.model.DimensionSet;
39+
import software.amazon.lambda.powertools.metrics.model.MetricResolution;
40+
import software.amazon.lambda.powertools.metrics.model.MetricUnit;
4141
import software.amazon.lambda.powertools.tracing.CaptureMode;
4242
import software.amazon.lambda.powertools.tracing.Tracing;
4343
import software.amazon.lambda.powertools.tracing.TracingUtils;
@@ -47,6 +47,7 @@
4747
*/
4848
public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
4949
private static final Logger log = LoggerFactory.getLogger(App.class);
50+
private static final MetricsLogger metricsLogger = MetricsLoggerFactory.getMetricsLogger();
5051

5152
@Logging(logEvent = true, samplingRate = 0.7)
5253
@Tracing(captureMode = CaptureMode.RESPONSE_AND_ERROR)
@@ -57,15 +58,15 @@ public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEv
5758
headers.put("Content-Type", "application/json");
5859
headers.put("X-Custom-Header", "application/json");
5960

60-
metricsLogger().putMetric("CustomMetric1", 1, Unit.COUNT);
61+
metricsLogger.addMetric("CustomMetric1", 1, MetricUnit.COUNT);
6162

62-
withSingleMetric("CustomMetrics2", 1, Unit.COUNT, "Another", (metric) ->
63-
{
64-
metric.setDimensions(DimensionSet.of("AnotherService", "CustomService"));
65-
metric.setDimensions(DimensionSet.of("AnotherService1", "CustomService1"));
66-
});
63+
DimensionSet dimensionSet = DimensionSet.of(
64+
"AnotherService", "CustomService",
65+
"AnotherService1", "CustomService1"
66+
);
67+
metricsLogger.pushSingleMetric("CustomMetric2", 1, MetricUnit.COUNT, "Another", dimensionSet);
6768

68-
metricsLogger().putMetric("CustomMetric3", 1, Unit.COUNT, StorageResolution.HIGH);
69+
metricsLogger.addMetric("CustomMetric3", 1, MetricUnit.COUNT, MetricResolution.HIGH);
6970

7071
MDC.put("test", "willBeLogged");
7172

@@ -108,4 +109,4 @@ private String getPageContents(String address) throws IOException {
108109
return br.lines().collect(Collectors.joining(System.lineSeparator()));
109110
}
110111
}
111-
}
112+
}

examples/powertools-examples-core-utilities/sam/src/main/java/helloworld/App.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,32 @@
1515
package helloworld;
1616

1717
import static software.amazon.lambda.powertools.logging.argument.StructuredArguments.entry;
18-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
19-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetric;
2018
import static software.amazon.lambda.powertools.tracing.TracingUtils.putMetadata;
2119

22-
import com.amazonaws.services.lambda.runtime.Context;
23-
import com.amazonaws.services.lambda.runtime.RequestHandler;
24-
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
25-
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
2620
import java.io.BufferedReader;
2721
import java.io.IOException;
2822
import java.io.InputStreamReader;
2923
import java.net.URL;
3024
import java.util.HashMap;
3125
import java.util.Map;
3226
import java.util.stream.Collectors;
27+
3328
import org.slf4j.Logger;
3429
import org.slf4j.LoggerFactory;
3530
import org.slf4j.MDC;
36-
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
37-
import software.amazon.cloudwatchlogs.emf.model.StorageResolution;
38-
import software.amazon.cloudwatchlogs.emf.model.Unit;
31+
32+
import com.amazonaws.services.lambda.runtime.Context;
33+
import com.amazonaws.services.lambda.runtime.RequestHandler;
34+
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
35+
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
36+
3937
import software.amazon.lambda.powertools.logging.Logging;
4038
import software.amazon.lambda.powertools.metrics.Metrics;
39+
import software.amazon.lambda.powertools.metrics.MetricsLogger;
40+
import software.amazon.lambda.powertools.metrics.MetricsLoggerFactory;
41+
import software.amazon.lambda.powertools.metrics.model.DimensionSet;
42+
import software.amazon.lambda.powertools.metrics.model.MetricResolution;
43+
import software.amazon.lambda.powertools.metrics.model.MetricUnit;
4144
import software.amazon.lambda.powertools.tracing.CaptureMode;
4245
import software.amazon.lambda.powertools.tracing.Tracing;
4346
import software.amazon.lambda.powertools.tracing.TracingUtils;
@@ -47,6 +50,7 @@
4750
*/
4851
public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
4952
private static final Logger log = LoggerFactory.getLogger(App.class);
53+
private static final MetricsLogger metricsLogger = MetricsLoggerFactory.getMetricsLogger();
5054

5155
@Logging(logEvent = true, samplingRate = 0.7)
5256
@Tracing(captureMode = CaptureMode.RESPONSE_AND_ERROR)
@@ -57,15 +61,14 @@ public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEv
5761
headers.put("Content-Type", "application/json");
5862
headers.put("X-Custom-Header", "application/json");
5963

60-
metricsLogger().putMetric("CustomMetric1", 1, Unit.COUNT);
64+
metricsLogger.addMetric("CustomMetric1", 1, MetricUnit.COUNT);
6165

62-
withSingleMetric("CustomMetrics2", 1, Unit.COUNT, "Another", (metric) ->
63-
{
64-
metric.setDimensions(DimensionSet.of("AnotherService", "CustomService"));
65-
metric.setDimensions(DimensionSet.of("AnotherService1", "CustomService1"));
66-
});
66+
DimensionSet dimensionSet = new DimensionSet();
67+
dimensionSet.addDimension("AnotherService", "CustomService");
68+
dimensionSet.addDimension("AnotherService1", "CustomService1");
69+
metricsLogger.pushSingleMetric("CustomMetric2", 1, MetricUnit.COUNT, "Another", dimensionSet);
6770

68-
metricsLogger().putMetric("CustomMetric3", 1, Unit.COUNT, StorageResolution.HIGH);
71+
metricsLogger.addMetric("CustomMetric3", 1, MetricUnit.COUNT, MetricResolution.HIGH);
6972

7073
MDC.put("test", "willBeLogged");
7174

@@ -77,8 +80,7 @@ public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEv
7780
TracingUtils.putAnnotation("Test", "New");
7881
String output = String.format("{ \"message\": \"hello world\", \"location\": \"%s\" }", pageContents);
7982

80-
TracingUtils.withSubsegment("loggingResponse", subsegment ->
81-
{
83+
TracingUtils.withSubsegment("loggingResponse", subsegment -> {
8284
String sampled = "log something out";
8385
log.info(sampled);
8486
log.info(output);

examples/powertools-examples-core-utilities/serverless/src/main/java/helloworld/App.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
package helloworld;
1616

1717
import static software.amazon.lambda.powertools.logging.argument.StructuredArguments.entry;
18-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.metricsLogger;
19-
import static software.amazon.lambda.powertools.metrics.MetricsUtils.withSingleMetric;
2018
import static software.amazon.lambda.powertools.tracing.TracingUtils.putMetadata;
2119

2220
import com.amazonaws.services.lambda.runtime.Context;
@@ -33,10 +31,12 @@
3331
import org.apache.logging.log4j.LogManager;
3432
import org.apache.logging.log4j.Logger;
3533
import org.slf4j.MDC;
36-
import software.amazon.cloudwatchlogs.emf.model.DimensionSet;
37-
import software.amazon.cloudwatchlogs.emf.model.Unit;
3834
import software.amazon.lambda.powertools.logging.Logging;
3935
import software.amazon.lambda.powertools.metrics.Metrics;
36+
import software.amazon.lambda.powertools.metrics.MetricsLogger;
37+
import software.amazon.lambda.powertools.metrics.MetricsLoggerFactory;
38+
import software.amazon.lambda.powertools.metrics.model.DimensionSet;
39+
import software.amazon.lambda.powertools.metrics.model.MetricUnit;
4040
import software.amazon.lambda.powertools.tracing.CaptureMode;
4141
import software.amazon.lambda.powertools.tracing.Tracing;
4242
import software.amazon.lambda.powertools.tracing.TracingUtils;
@@ -46,6 +46,7 @@
4646
*/
4747
public class App implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
4848
private static final Logger log = LogManager.getLogger(App.class);
49+
private static final MetricsLogger metricsLogger = MetricsLoggerFactory.getMetricsLogger();
4950

5051
@Logging(logEvent = true, samplingRate = 0.7)
5152
@Tracing(captureMode = CaptureMode.RESPONSE_AND_ERROR)
@@ -56,13 +57,13 @@ public APIGatewayProxyResponseEvent handleRequest(final APIGatewayProxyRequestEv
5657
headers.put("Content-Type", "application/json");
5758
headers.put("X-Custom-Header", "application/json");
5859

59-
metricsLogger().putMetric("CustomMetric1", 1, Unit.COUNT);
60+
metricsLogger.addMetric("CustomMetric1", 1, MetricUnit.COUNT);
6061

61-
withSingleMetric("CustomMetrics2", 1, Unit.COUNT, "Another", (metric) ->
62-
{
63-
metric.setDimensions(DimensionSet.of("AnotherService", "CustomService"));
64-
metric.setDimensions(DimensionSet.of("AnotherService1", "CustomService1"));
65-
});
62+
DimensionSet dimensionSet = DimensionSet.of(
63+
"AnotherService", "CustomService",
64+
"AnotherService1", "CustomService1"
65+
);
66+
metricsLogger.pushSingleMetric("CustomMetric2", 1, MetricUnit.COUNT, "Another", dimensionSet);
6667

6768
MDC.put("test", "willBeLogged");
6869

@@ -100,4 +101,4 @@ private String getPageContents(String address) throws IOException {
100101
return br.lines().collect(Collectors.joining(System.lineSeparator()));
101102
}
102103
}
103-
}
104+
}

0 commit comments

Comments
 (0)