-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Expand file tree
/
Copy pathJavaagentDistributionAccessCustomizerProvider.java
More file actions
77 lines (69 loc) · 3.04 KB
/
Copy pathJavaagentDistributionAccessCustomizerProvider.java
File metadata and controls
77 lines (69 loc) · 3.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.tooling.config;
import static java.util.logging.Level.WARNING;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
import com.google.auto.service.AutoService;
import io.opentelemetry.api.incubator.config.ConfigProvider;
import io.opentelemetry.javaagent.extension.instrumentation.internal.AgentDistributionConfig;
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.DistributionModel;
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.DistributionPropertyModel;
import java.io.IOException;
import java.util.logging.Logger;
import javax.annotation.Nullable;
/**
* Allows access to the Javaagent distribution node, which cannot be accessed using the {@link
* ConfigProvider} API.
*/
@AutoService(DeclarativeConfigurationCustomizerProvider.class)
public final class JavaagentDistributionAccessCustomizerProvider
implements DeclarativeConfigurationCustomizerProvider {
private static final Logger logger =
Logger.getLogger(JavaagentDistributionAccessCustomizerProvider.class.getName());
private static final ObjectMapper mapper =
new ObjectMapper()
.addHandler(
new DeserializationProblemHandler() {
@Override
public boolean handleUnknownProperty(
DeserializationContext ctxt,
JsonParser p,
JsonDeserializer<?> deserializer,
Object beanOrClass,
String propertyName)
throws IOException {
logger.warning("Unknown distribution.javaagent property: " + propertyName);
p.skipChildren();
return true;
}
});
@Override
public void customize(DeclarativeConfigurationCustomizer customizer) {
customizer.addModelCustomizer(
model -> {
AgentDistributionConfig.set(parseConfig(model.getDistribution()));
return model;
});
}
private static AgentDistributionConfig parseConfig(@Nullable DistributionModel distribution) {
if (distribution != null) {
DistributionPropertyModel javaagent = distribution.getAdditionalProperties().get("javaagent");
if (javaagent != null) {
try {
return mapper.convertValue(javaagent, AgentDistributionConfig.class);
} catch (IllegalArgumentException e) {
logger.log(WARNING, "Failed to parse distribution.javaagent configuration", e);
}
}
}
return AgentDistributionConfig.create();
}
}