Skip to content

Commit 7e5e8d6

Browse files
authored
Merge branch 'aws-observability:main' into update-bedrock
2 parents 9a6a475 + e144053 commit 7e5e8d6

File tree

10 files changed

+597
-22
lines changed

10 files changed

+597
-22
lines changed

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/AwsApplicationSignalsCustomizerProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import io.opentelemetry.api.common.Attributes;
1919
import io.opentelemetry.api.common.AttributesBuilder;
20-
import io.opentelemetry.api.metrics.MeterProvider;
2120
import io.opentelemetry.contrib.awsxray.AlwaysRecordSampler;
2221
import io.opentelemetry.contrib.awsxray.ResourceHolder;
2322
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter;
@@ -164,14 +163,16 @@ private SdkTracerProviderBuilder customizeTracerProviderBuilder(
164163
MetricReader metricReader =
165164
PeriodicMetricReader.builder(metricsExporter).setInterval(exportInterval).build();
166165

167-
MeterProvider meterProvider =
166+
SdkMeterProvider meterProvider =
168167
SdkMeterProvider.builder()
169168
.setResource(ResourceHolder.getResource())
170169
.registerMetricReader(metricReader)
171170
.build();
171+
172172
// Construct and set application signals metrics processor
173173
SpanProcessor spanMetricsProcessor =
174-
AwsSpanMetricsProcessorBuilder.create(meterProvider, ResourceHolder.getResource())
174+
AwsSpanMetricsProcessorBuilder.create(
175+
meterProvider, ResourceHolder.getResource(), meterProvider::forceFlush)
175176
.build();
176177
tracerProviderBuilder.addSpanProcessor(spanMetricsProcessor);
177178
}

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/AwsSpanMetricsProcessor.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@
2222
import io.opentelemetry.api.metrics.LongHistogram;
2323
import io.opentelemetry.api.trace.StatusCode;
2424
import io.opentelemetry.context.Context;
25+
import io.opentelemetry.sdk.common.CompletableResultCode;
2526
import io.opentelemetry.sdk.resources.Resource;
2627
import io.opentelemetry.sdk.trace.ReadWriteSpan;
2728
import io.opentelemetry.sdk.trace.ReadableSpan;
2829
import io.opentelemetry.sdk.trace.SpanProcessor;
2930
import io.opentelemetry.sdk.trace.data.SpanData;
3031
import java.util.Map;
32+
import java.util.function.Supplier;
3133
import javax.annotation.concurrent.Immutable;
3234

3335
/**
@@ -64,29 +66,38 @@ public final class AwsSpanMetricsProcessor implements SpanProcessor {
6466

6567
private final MetricAttributeGenerator generator;
6668
private final Resource resource;
69+
private final Supplier<CompletableResultCode> forceFlushAction;
6770

6871
/** Use {@link AwsSpanMetricsProcessorBuilder} to construct this processor. */
6972
static AwsSpanMetricsProcessor create(
7073
LongHistogram errorHistogram,
7174
LongHistogram faultHistogram,
7275
DoubleHistogram latencyHistogram,
7376
MetricAttributeGenerator generator,
74-
Resource resource) {
77+
Resource resource,
78+
Supplier<CompletableResultCode> forceFlushAction) {
7579
return new AwsSpanMetricsProcessor(
76-
errorHistogram, faultHistogram, latencyHistogram, generator, resource);
80+
errorHistogram, faultHistogram, latencyHistogram, generator, resource, forceFlushAction);
7781
}
7882

7983
private AwsSpanMetricsProcessor(
8084
LongHistogram errorHistogram,
8185
LongHistogram faultHistogram,
8286
DoubleHistogram latencyHistogram,
8387
MetricAttributeGenerator generator,
84-
Resource resource) {
88+
Resource resource,
89+
Supplier<CompletableResultCode> forceFlushAction) {
8590
this.errorHistogram = errorHistogram;
8691
this.faultHistogram = faultHistogram;
8792
this.latencyHistogram = latencyHistogram;
8893
this.generator = generator;
8994
this.resource = resource;
95+
this.forceFlushAction = forceFlushAction;
96+
}
97+
98+
@Override
99+
public CompletableResultCode forceFlush() {
100+
return forceFlushAction.get();
90101
}
91102

92103
@Override

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/AwsSpanMetricsProcessorBuilder.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222
import io.opentelemetry.api.metrics.LongHistogram;
2323
import io.opentelemetry.api.metrics.Meter;
2424
import io.opentelemetry.api.metrics.MeterProvider;
25+
import io.opentelemetry.sdk.common.CompletableResultCode;
2526
import io.opentelemetry.sdk.resources.Resource;
27+
import java.util.function.Supplier;
2628

2729
/** A builder for {@link AwsSpanMetricsProcessor} */
2830
public final class AwsSpanMetricsProcessorBuilder {
@@ -42,18 +44,29 @@ public final class AwsSpanMetricsProcessorBuilder {
4244
private final MeterProvider meterProvider;
4345
private final Resource resource;
4446

47+
// ForceFlush action provided from {@link SdkMeterProvider#forceFlush()} so that when the
48+
// application exits The spanMetricProcessor calls the meterProvder.forceFlush to flush
49+
// any remaining metrics before shutdown
50+
private final Supplier<CompletableResultCode> forceFlushAction;
51+
4552
// Optional builder elements
4653
private MetricAttributeGenerator generator = DEFAULT_GENERATOR;
4754
private String scopeName = DEFAULT_SCOPE_NAME;
4855

4956
public static AwsSpanMetricsProcessorBuilder create(
50-
MeterProvider meterProvider, Resource resource) {
51-
return new AwsSpanMetricsProcessorBuilder(meterProvider, resource);
57+
MeterProvider meterProvider,
58+
Resource resource,
59+
Supplier<CompletableResultCode> forceFlushAction) {
60+
return new AwsSpanMetricsProcessorBuilder(meterProvider, resource, forceFlushAction);
5261
}
5362

54-
private AwsSpanMetricsProcessorBuilder(MeterProvider meterProvider, Resource resource) {
63+
private AwsSpanMetricsProcessorBuilder(
64+
MeterProvider meterProvider,
65+
Resource resource,
66+
Supplier<CompletableResultCode> forceFlushAction) {
5567
this.meterProvider = meterProvider;
5668
this.resource = resource;
69+
this.forceFlushAction = forceFlushAction;
5770
}
5871

5972
/**
@@ -86,6 +99,6 @@ public AwsSpanMetricsProcessor build() {
8699
meter.histogramBuilder(LATENCY).setUnit(LATENCY_UNITS).build();
87100

88101
return AwsSpanMetricsProcessor.create(
89-
errorHistogram, faultHistogram, latencyHistogram, generator, resource);
102+
errorHistogram, faultHistogram, latencyHistogram, generator, resource, forceFlushAction);
90103
}
91104
}

awsagentprovider/src/test/java/software/amazon/opentelemetry/javaagent/providers/AwsSpanMetricsProcessorTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ private enum ExpectedStatusMetric {
7777
private MetricAttributeGenerator generatorMock;
7878
private AwsSpanMetricsProcessor awsSpanMetricsProcessor;
7979

80+
// Mock forceFlush function that returns success when invoked similar
81+
// to the default implementation of forceFlush.
82+
private CompletableResultCode forceFlushAction() {
83+
return CompletableResultCode.ofSuccess();
84+
}
85+
8086
@BeforeEach
8187
public void setUpMocks() {
8288
errorHistogramMock = mock(LongHistogram.class);
@@ -90,7 +96,8 @@ public void setUpMocks() {
9096
faultHistogramMock,
9197
latencyHistogramMock,
9298
generatorMock,
93-
testResource);
99+
testResource,
100+
this::forceFlushAction);
94101
}
95102

96103
@Test

instrumentation/jmx-metrics/src/main/resources/README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,7 @@ OTEL_EXPERIMENTAL_METRICS_VIEW_CONFIG: classpath:/jmx/view.yaml
1010

1111
### rules/*.yaml
1212
The rules are a translation of the JMX Metric Gatherer's [target systems](https://github.com/open-telemetry/opentelemetry-java-contrib/tree/main/jmx-metrics/src/main/resources/target-systems)
13-
based on the [JMX metric rule YAML schema](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/jmx-metrics/javaagent/README.md#basic-syntax).
13+
based on the [JMX metric rule YAML schema](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/instrumentation/jmx-metrics/javaagent/README.md#basic-syntax).
14+
15+
### SystemCpuLoad
16+
The `SystemCpuLoad` metric is deprecated and Java versions 14+ now use `CpuLoad`. However, to avoid emitting double metrics, we stick to using `SystemCpuLoad` as it still works on newer versions.

instrumentation/jmx-metrics/src/main/resources/jmx/rules/jvm.yaml

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ rules:
88
LoadedClassCount:
99
metric: loaded
1010
desc: Number of loaded classes
11-
- bean: java.lang:type=GarbageCollector,*
11+
- bean: java.lang:type=GarbageCollector,name=*
1212
prefix: jvm.gc.collections.
1313
type: counter
1414
metricAttribute:
@@ -27,13 +27,31 @@ rules:
2727
prefix: jvm.memory.
2828
type: gauge
2929
mapping:
30+
HeapMemoryUsage.init:
31+
metric: heap.init
32+
desc: The initial amount of memory that the JVM requests from the operating system for the heap
3033
HeapMemoryUsage.used:
3134
metric: heap.used
3235
desc: The current heap usage
36+
HeapMemoryUsage.committed:
37+
metric: heap.committed
38+
desc: The amount of memory that is guaranteed to be available for the heap
39+
HeapMemoryUsage.max:
40+
metric: heap.max
41+
desc: The maximum amount of memory can be used for the heap
42+
NonHeapMemoryUsage.init:
43+
metric: nonheap.init
44+
desc: The initial amount of memory that the JVM requests from the operating system for non-heap purposes
3345
NonHeapMemoryUsage.used:
3446
metric: nonheap.used
35-
desc: The current non-heap usage
36-
- bean: java.lang:type=MemoryPool,*
47+
desc: The current non-heap memory usage
48+
NonHeapMemoryUsage.committed:
49+
metric: nonheap.committed
50+
desc: The amount of memory that is guaranteed to be available for non-heap purposes
51+
NonHeapMemoryUsage.max:
52+
metric: nonheap.max
53+
desc: The maximum amount of memory can be used for non-heap purposes
54+
- bean: java.lang:type=MemoryPool,name=*
3755
unit: by
3856
prefix: jvm.memory.pool.
3957
type: gauge
@@ -43,26 +61,64 @@ rules:
4361
CollectionUsage.used:
4462
metric: used_after_last_gc
4563
desc: Memory used after the most recent gc event
64+
Usage.init:
65+
metric: init
66+
desc: The initial amount of memory that the JVM requests from the operating system for the memory pool
4667
Usage.used:
4768
metric: used
48-
desc: Current memory pool used
69+
desc: The current memory pool memory usage
70+
Usage.committed:
71+
metric: committed
72+
desc: The amount of memory that is guaranteed to be available for the memory pool
73+
Usage.max:
74+
metric: max
75+
desc: The maximum amount of memory can be used for the memory pool
4976
- bean: java.lang:type=Threading
5077
unit: "1"
51-
prefix: jvm.threads.
5278
type: gauge
5379
mapping:
5480
ThreadCount:
55-
metric: count
81+
metric: jvm.threads.count
5682
desc: Number of threads
57-
- bean: java.lang:type=OperatingSystem,*
58-
prefix: jvm.cpu.
83+
DaemonThreadCount:
84+
metric: jvm.daemon_threads.count
85+
desc: Number of daemon threads
86+
- bean: java.lang:type=OperatingSystem
5987
type: gauge
6088
mapping:
89+
TotalSwapSpaceSize:
90+
metric: jvm.system.swap.space.total
91+
desc: The host swap memory size in bytes
92+
unit: by
93+
FreeSwapSpaceSize:
94+
metric: jvm.system.swap.space.free
95+
desc: The amount of available swap memory in bytes
96+
unit: by
97+
TotalPhysicalMemorySize:
98+
metric: jvm.system.physical.memory.total
99+
desc: The total physical memory size in host
100+
unit: by
101+
FreePhysicalMemorySize:
102+
metric: jvm.system.physical.memory.free
103+
desc: The amount of free physical memory in host
104+
unit: by
105+
AvailableProcessors:
106+
metric: jvm.system.available.processors
107+
desc: The number of available processors
108+
unit: "1"
109+
SystemCpuLoad:
110+
metric: jvm.system.cpu.utilization
111+
desc: The current load of CPU in host
112+
unit: "1"
61113
ProcessCpuTime:
62-
metric: time
114+
metric: jvm.cpu.time
63115
unit: ns
64116
desc: CPU time used
65117
ProcessCpuLoad:
66-
metric: recent_utilization
118+
metric: jvm.cpu.recent_utilization
67119
unit: "1"
68120
desc: Recent CPU utilization for the process
121+
OpenFileDescriptorCount:
122+
metric: jvm.open_file_descriptor.count
123+
desc: The number of opened file descriptors
124+
unit: "1"
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
rules:
3+
- bean: kafka.consumer:type=consumer-fetch-manager-metrics,client-id=*
4+
metricAttribute:
5+
client-id: param(client-id)
6+
mapping:
7+
fetch-rate:
8+
metric: kafka.consumer.fetch-rate
9+
type: gauge
10+
desc: The number of fetch requests for all topics per second
11+
unit: "1"
12+
records-lag-max:
13+
metric: kafka.consumer.records-lag-max
14+
type: gauge
15+
desc: Number of messages the consumer lags behind the producer
16+
unit: "1"
17+
bytes-consumed-rate:
18+
metric: kafka.consumer.total.bytes-consumed-rate
19+
type: gauge
20+
desc: The average number of bytes consumed for all topics per second
21+
unit: by
22+
fetch-size-avg:
23+
metric: kafka.consumer.total.fetch-size-avg
24+
type: gauge
25+
desc: The average number of bytes fetched per request for all topics
26+
unit: by
27+
records-consumed-rate:
28+
metric: kafka.consumer.total.records-consumed-rate
29+
type: gauge
30+
desc: The average number of records consumed for all topics per second
31+
unit: "1"
32+
- bean: kafka.consumer:type=consumer-fetch-manager-metrics,client-id=*,topic=*
33+
metricAttribute:
34+
client-id: param(client-id)
35+
topic: param(topic)
36+
mapping:
37+
bytes-consumed-rate:
38+
metric: kafka.consumer.bytes-consumed-rate
39+
type: gauge
40+
desc: The average number of bytes consumed per second
41+
unit: by
42+
fetch-size-avg:
43+
metric: kafka.consumer.fetch-size-avg
44+
type: gauge
45+
desc: The average number of bytes fetched per request
46+
unit: by
47+
records-consumed-rate:
48+
metric: kafka.consumer.records-consumed-rate
49+
type: gauge
50+
desc: The average number of records consumed per second
51+
unit: "1"
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
rules:
3+
- bean: kafka.producer:type=producer-metrics,client-id=*
4+
metricAttribute:
5+
client-id: param(client-id)
6+
mapping:
7+
io-wait-time-ns-avg:
8+
metric: kafka.producer.io-wait-time-ns-avg
9+
type: gauge
10+
desc: The average length of time the I/O thread spent waiting for a socket ready for reads or writes
11+
unit: ns
12+
outgoing-byte-rate:
13+
metric: kafka.producer.outgoing-byte-rate
14+
type: gauge
15+
desc: The average number of outgoing bytes sent per second to all servers
16+
unit: by
17+
request-latency-avg:
18+
metric: kafka.producer.request-latency-avg
19+
type: gauge
20+
desc: The average request latency
21+
unit: ms
22+
request-rate:
23+
metric: kafka-producer.request-rate
24+
type: gauge
25+
desc: The average number of requests sent per second
26+
unit: "1"
27+
response-rate:
28+
metric: kafka.producer.response-rate
29+
type: gauge
30+
desc: Responses received per second
31+
unit: "1"
32+
- bean: kafka.producer:type=producer-topic-metrics,client-id=*,topic=*
33+
metricAttribute:
34+
client-id: param(client-id)
35+
topic: param(topic)
36+
mapping:
37+
byte-rate:
38+
metric: kafka.producer.byte-rate
39+
type: gauge
40+
desc: The average number of bytes sent per second for a topic
41+
unit: by
42+
compression-rate:
43+
metric: kafka.producer.compression-rate
44+
type: gauge
45+
desc: The average compression rate of record batches for a topic
46+
unit: "1"
47+
record-error-rate:
48+
metric: kafka.producer.record-error-rate
49+
type: gauge
50+
desc: The average per-second number of record sends that resulted in errors for a topic
51+
unit: "1"
52+
record-retry-rate:
53+
metric: kafka.producer.record-retry-rate
54+
type: gauge
55+
desc: The average per-second number of retried record sends for a topic
56+
unit: "1"
57+
record-send-rate:
58+
metric: kafka.producer.record-send-rate
59+
type: gauge
60+
desc: The average number of records sent per second for a topic
61+
unit: "1"

0 commit comments

Comments
 (0)