Skip to content

Commit 745d880

Browse files
SylvainJugelaurit
andauthored
use semconv attributes for jvm metrics + cleanup (#11257)
Co-authored-by: Lauri Tulmin <ltulmin@splunk.com>
1 parent dfc79eb commit 745d880

File tree

6 files changed

+40
-62
lines changed

6 files changed

+40
-62
lines changed

instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/GarbageCollector.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@
55

66
package io.opentelemetry.instrumentation.runtimemetrics.java8;
77

8-
import static io.opentelemetry.api.common.AttributeKey.stringKey;
98
import static java.util.Arrays.asList;
109
import static java.util.Collections.unmodifiableList;
1110

1211
import com.sun.management.GarbageCollectionNotificationInfo;
1312
import io.opentelemetry.api.OpenTelemetry;
14-
import io.opentelemetry.api.common.AttributeKey;
1513
import io.opentelemetry.api.common.Attributes;
1614
import io.opentelemetry.api.metrics.DoubleHistogram;
1715
import io.opentelemetry.api.metrics.Meter;
1816
import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.JmxRuntimeMetricsUtil;
17+
import io.opentelemetry.semconv.JvmAttributes;
1918
import java.lang.management.GarbageCollectorMXBean;
2019
import java.lang.management.ManagementFactory;
2120
import java.util.ArrayList;
@@ -54,9 +53,6 @@ public final class GarbageCollector {
5453

5554
private static final double MILLIS_PER_S = TimeUnit.SECONDS.toMillis(1);
5655

57-
// TODO: use the opentelemetry-semconv classes once we have metrics attributes there
58-
private static final AttributeKey<String> JVM_GC_NAME = stringKey("jvm.gc.name");
59-
private static final AttributeKey<String> JVM_GC_ACTION = stringKey("jvm.gc.action");
6056
static final List<Double> GC_DURATION_BUCKETS = unmodifiableList(asList(0.01, 0.1, 1., 10.));
6157

6258
private static final NotificationFilter GC_FILTER =
@@ -131,7 +127,9 @@ public void handleNotification(Notification notification, Object unused) {
131127
String gcAction = notificationInfo.getGcAction();
132128
double duration = notificationInfo.getGcInfo().getDuration() / MILLIS_PER_S;
133129

134-
gcDuration.record(duration, Attributes.of(JVM_GC_NAME, gcName, JVM_GC_ACTION, gcAction));
130+
gcDuration.record(
131+
duration,
132+
Attributes.of(JvmAttributes.JVM_GC_NAME, gcName, JvmAttributes.JVM_GC_ACTION, gcAction));
135133
}
136134
}
137135

instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/MemoryPools.java

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55

66
package io.opentelemetry.instrumentation.runtimemetrics.java8;
77

8-
import static io.opentelemetry.api.common.AttributeKey.stringKey;
9-
108
import io.opentelemetry.api.OpenTelemetry;
119
import io.opentelemetry.api.common.AttributeKey;
1210
import io.opentelemetry.api.common.Attributes;
1311
import io.opentelemetry.api.metrics.Meter;
1412
import io.opentelemetry.api.metrics.ObservableLongMeasurement;
1513
import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.JmxRuntimeMetricsUtil;
14+
import io.opentelemetry.semconv.JvmAttributes;
1615
import java.lang.management.ManagementFactory;
1716
import java.lang.management.MemoryPoolMXBean;
1817
import java.lang.management.MemoryType;
@@ -47,14 +46,6 @@
4746
*/
4847
public final class MemoryPools {
4948

50-
// TODO: use the opentelemetry-semconv classes once we have metrics attributes there
51-
private static final AttributeKey<String> JVM_MEMORY_POOL_NAME =
52-
stringKey("jvm.memory.pool.name");
53-
private static final AttributeKey<String> JVM_MEMORY_TYPE = stringKey("jvm.memory.type");
54-
55-
private static final String HEAP = "heap";
56-
private static final String NON_HEAP = "non_heap";
57-
5849
/** Register observers for java runtime memory metrics. */
5950
public static List<AutoCloseable> registerObservers(OpenTelemetry openTelemetry) {
6051
return registerObservers(openTelemetry, ManagementFactory.getMemoryPoolMXBeans());
@@ -73,8 +64,8 @@ static List<AutoCloseable> registerObservers(
7364
.setUnit("By")
7465
.buildWithCallback(
7566
callback(
76-
JVM_MEMORY_POOL_NAME,
77-
JVM_MEMORY_TYPE,
67+
JvmAttributes.JVM_MEMORY_POOL_NAME,
68+
JvmAttributes.JVM_MEMORY_TYPE,
7869
poolBeans,
7970
MemoryPoolMXBean::getUsage,
8071
MemoryUsage::getUsed)));
@@ -85,8 +76,8 @@ static List<AutoCloseable> registerObservers(
8576
.setUnit("By")
8677
.buildWithCallback(
8778
callback(
88-
JVM_MEMORY_POOL_NAME,
89-
JVM_MEMORY_TYPE,
79+
JvmAttributes.JVM_MEMORY_POOL_NAME,
80+
JvmAttributes.JVM_MEMORY_TYPE,
9081
poolBeans,
9182
MemoryPoolMXBean::getUsage,
9283
MemoryUsage::getCommitted)));
@@ -97,8 +88,8 @@ static List<AutoCloseable> registerObservers(
9788
.setUnit("By")
9889
.buildWithCallback(
9990
callback(
100-
JVM_MEMORY_POOL_NAME,
101-
JVM_MEMORY_TYPE,
91+
JvmAttributes.JVM_MEMORY_POOL_NAME,
92+
JvmAttributes.JVM_MEMORY_TYPE,
10293
poolBeans,
10394
MemoryPoolMXBean::getUsage,
10495
MemoryUsage::getMax)));
@@ -110,8 +101,8 @@ static List<AutoCloseable> registerObservers(
110101
.setUnit("By")
111102
.buildWithCallback(
112103
callback(
113-
JVM_MEMORY_POOL_NAME,
114-
JVM_MEMORY_TYPE,
104+
JvmAttributes.JVM_MEMORY_POOL_NAME,
105+
JvmAttributes.JVM_MEMORY_TYPE,
115106
poolBeans,
116107
MemoryPoolMXBean::getCollectionUsage,
117108
MemoryUsage::getUsed)));
@@ -155,9 +146,9 @@ static Consumer<ObservableLongMeasurement> callback(
155146
private static String memoryType(MemoryType memoryType) {
156147
switch (memoryType) {
157148
case HEAP:
158-
return HEAP;
149+
return JvmAttributes.JvmMemoryTypeValues.HEAP;
159150
case NON_HEAP:
160-
return NON_HEAP;
151+
return JvmAttributes.JvmMemoryTypeValues.NON_HEAP;
161152
}
162153
return "unknown";
163154
}

instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/Threads.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,14 @@
55

66
package io.opentelemetry.instrumentation.runtimemetrics.java8;
77

8-
import static io.opentelemetry.api.common.AttributeKey.booleanKey;
9-
import static io.opentelemetry.api.common.AttributeKey.stringKey;
108
import static java.util.Objects.requireNonNull;
119

1210
import io.opentelemetry.api.OpenTelemetry;
13-
import io.opentelemetry.api.common.AttributeKey;
1411
import io.opentelemetry.api.common.Attributes;
1512
import io.opentelemetry.api.metrics.Meter;
1613
import io.opentelemetry.api.metrics.ObservableLongMeasurement;
1714
import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.JmxRuntimeMetricsUtil;
15+
import io.opentelemetry.semconv.JvmAttributes;
1816
import java.lang.invoke.MethodHandle;
1917
import java.lang.invoke.MethodHandles;
2018
import java.lang.invoke.MethodType;
@@ -55,10 +53,6 @@ public final class Threads {
5553
// Visible for testing
5654
static final Threads INSTANCE = new Threads();
5755

58-
// TODO: use the opentelemetry-semconv classes once we have metrics attributes there
59-
static final AttributeKey<Boolean> JVM_THREAD_DAEMON = booleanKey("jvm.thread.daemon");
60-
static final AttributeKey<String> JVM_THREAD_STATE = stringKey("jvm.thread.state");
61-
6256
/** Register observers for java runtime class metrics. */
6357
public static List<AutoCloseable> registerObservers(OpenTelemetry openTelemetry) {
6458
return INSTANCE.registerObservers(openTelemetry, ManagementFactory.getThreadMXBean());
@@ -102,10 +96,11 @@ private static Consumer<ObservableLongMeasurement> java8Callback(ThreadMXBean th
10296
return measurement -> {
10397
int daemonThreadCount = threadBean.getDaemonThreadCount();
10498
measurement.record(
105-
daemonThreadCount, Attributes.builder().put(JVM_THREAD_DAEMON, true).build());
99+
daemonThreadCount,
100+
Attributes.builder().put(JvmAttributes.JVM_THREAD_DAEMON, true).build());
106101
measurement.record(
107102
threadBean.getThreadCount() - daemonThreadCount,
108-
Attributes.builder().put(JVM_THREAD_DAEMON, false).build());
103+
Attributes.builder().put(JvmAttributes.JVM_THREAD_DAEMON, false).build());
109104
};
110105
}
111106

@@ -133,7 +128,8 @@ private static Attributes threadAttributes(ThreadInfo threadInfo) {
133128
throw new IllegalStateException("Unexpected error happened during ThreadInfo#isDaemon()", e);
134129
}
135130
String threadState = threadInfo.getThreadState().name().toLowerCase(Locale.ROOT);
136-
return Attributes.of(JVM_THREAD_DAEMON, isDaemon, JVM_THREAD_STATE, threadState);
131+
return Attributes.of(
132+
JvmAttributes.JVM_THREAD_DAEMON, isDaemon, JvmAttributes.JVM_THREAD_STATE, threadState);
137133
}
138134

139135
private Threads() {}

instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/main/java/io/opentelemetry/instrumentation/runtimemetrics/java8/internal/ExperimentalMemoryPools.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55

66
package io.opentelemetry.instrumentation.runtimemetrics.java8.internal;
77

8-
import static io.opentelemetry.api.common.AttributeKey.stringKey;
98
import static java.util.Collections.singletonList;
109

1110
import io.opentelemetry.api.OpenTelemetry;
12-
import io.opentelemetry.api.common.AttributeKey;
1311
import io.opentelemetry.api.common.Attributes;
1412
import io.opentelemetry.api.metrics.Meter;
1513
import io.opentelemetry.api.metrics.ObservableLongMeasurement;
14+
import io.opentelemetry.semconv.JvmAttributes;
1615
import java.lang.management.ManagementFactory;
1716
import java.lang.management.MemoryPoolMXBean;
1817
import java.lang.management.MemoryType;
@@ -29,14 +28,6 @@
2928
*/
3029
public final class ExperimentalMemoryPools {
3130

32-
// TODO: use the opentelemetry-semconv classes once we have metrics attributes there
33-
private static final AttributeKey<String> JVM_MEMORY_POOL_NAME =
34-
stringKey("jvm.memory.pool.name");
35-
private static final AttributeKey<String> JVM_MEMORY_TYPE = stringKey("jvm.memory.type");
36-
37-
private static final String HEAP = "heap";
38-
private static final String NON_HEAP = "non_heap";
39-
4031
/** Register observers for java runtime experimental memory metrics. */
4132
public static List<AutoCloseable> registerObservers(OpenTelemetry openTelemetry) {
4233
return registerObservers(openTelemetry, ManagementFactory.getMemoryPoolMXBeans());
@@ -60,8 +51,8 @@ private static Consumer<ObservableLongMeasurement> callback(List<MemoryPoolMXBea
6051
for (MemoryPoolMXBean pool : poolBeans) {
6152
attributeSets.add(
6253
Attributes.builder()
63-
.put(JVM_MEMORY_POOL_NAME, pool.getName())
64-
.put(JVM_MEMORY_TYPE, memoryType(pool.getType()))
54+
.put(JvmAttributes.JVM_MEMORY_POOL_NAME, pool.getName())
55+
.put(JvmAttributes.JVM_MEMORY_TYPE, memoryType(pool.getType()))
6556
.build());
6657
}
6758

@@ -84,9 +75,9 @@ private static Consumer<ObservableLongMeasurement> callback(List<MemoryPoolMXBea
8475
private static String memoryType(MemoryType memoryType) {
8576
switch (memoryType) {
8677
case HEAP:
87-
return HEAP;
78+
return JvmAttributes.JvmMemoryTypeValues.HEAP;
8879
case NON_HEAP:
89-
return NON_HEAP;
80+
return JvmAttributes.JvmMemoryTypeValues.NON_HEAP;
9081
}
9182
return "unknown";
9283
}

instrumentation/runtime-telemetry/runtime-telemetry-java8/library/src/test/java/io/opentelemetry/instrumentation/runtimemetrics/java8/ThreadsStableSemconvTest.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
package io.opentelemetry.instrumentation.runtimemetrics.java8;
77

88
import static io.opentelemetry.instrumentation.runtimemetrics.java8.ScopeUtil.EXPECTED_SCOPE;
9-
import static io.opentelemetry.instrumentation.runtimemetrics.java8.Threads.JVM_THREAD_DAEMON;
10-
import static io.opentelemetry.instrumentation.runtimemetrics.java8.Threads.JVM_THREAD_STATE;
119
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
1210
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
1311
import static org.mockito.Mockito.mock;
@@ -16,6 +14,7 @@
1614
import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension;
1715
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
1816
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
17+
import io.opentelemetry.semconv.JvmAttributes;
1918
import java.lang.management.ThreadInfo;
2019
import java.lang.management.ThreadMXBean;
2120
import org.junit.jupiter.api.Test;
@@ -67,12 +66,14 @@ void registerObservers_Java8() {
6766
point
6867
.hasValue(2)
6968
.hasAttributesSatisfying(
70-
equalTo(JVM_THREAD_DAEMON, true)),
69+
equalTo(JvmAttributes.JVM_THREAD_DAEMON, true)),
7170
point ->
7271
point
7372
.hasValue(5)
7473
.hasAttributesSatisfying(
75-
equalTo(JVM_THREAD_DAEMON, false))))));
74+
equalTo(
75+
JvmAttributes.JVM_THREAD_DAEMON,
76+
false))))));
7677
}
7778

7879
@Test
@@ -110,14 +111,18 @@ void registerObservers_Java9AndNewer() {
110111
point
111112
.hasValue(1)
112113
.hasAttributesSatisfying(
113-
equalTo(JVM_THREAD_DAEMON, false),
114-
equalTo(JVM_THREAD_STATE, "runnable")),
114+
equalTo(JvmAttributes.JVM_THREAD_DAEMON, false),
115+
equalTo(
116+
JvmAttributes.JVM_THREAD_STATE,
117+
"runnable")),
115118
point ->
116119
point
117120
.hasValue(1)
118121
.hasAttributesSatisfying(
119-
equalTo(JVM_THREAD_DAEMON, true),
120-
equalTo(JVM_THREAD_STATE, "waiting"))))));
122+
equalTo(JvmAttributes.JVM_THREAD_DAEMON, true),
123+
equalTo(
124+
JvmAttributes.JVM_THREAD_STATE,
125+
"waiting"))))));
121126
}
122127

123128
static final class ThreadInfoAnswer implements Answer<Object> {

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,7 @@ private static void installBytebuddyAgent(
200200
}
201201

202202
private static void copyNecessaryConfigToSystemProperties(ConfigProperties config) {
203-
for (String property :
204-
asList(
205-
"otel.instrumentation.experimental.span-suppression-strategy",
206-
"otel.semconv-stability.opt-in")) {
203+
for (String property : asList("otel.instrumentation.experimental.span-suppression-strategy")) {
207204
String value = config.getString(property);
208205
if (value != null) {
209206
System.setProperty(property, value);

0 commit comments

Comments
 (0)