Skip to content

Commit a17cd57

Browse files
committed
Add declarative configuration support
Register the distro's resource detector via DeclarativeConfigurationCustomizerProvider (model customizer) and ComponentProvider SPIs so it works in DC mode. Express default instrumentation properties in DC notation as the source of truth, translated to otel.instrumentation.* keys for auto-configuration. ConfigPropertiesBackedConfigProvider bridges them to DC paths automatically. Supersedes #1062. Signed-off-by: Gregor Zeitlinger <gregor.zeitlinger@grafana.com>
1 parent 733f571 commit a17cd57

6 files changed

Lines changed: 141 additions & 32 deletions

custom/build.gradle

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,47 @@
11
plugins {
2-
id "java"
3-
id "org.owasp.dependencycheck" version "12.2.0"
2+
id "java"
3+
id "org.owasp.dependencycheck" version "12.2.0"
44
}
55

66
apply from: "$rootDir/gradle/checkstyle.gradle"
77

88
dependencies {
9-
compileOnly("io.opentelemetry:opentelemetry-sdk")
10-
compileOnly("io.opentelemetry.semconv:opentelemetry-semconv")
11-
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
12-
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
13-
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")
14-
15-
testImplementation("io.opentelemetry.semconv:opentelemetry-semconv")
16-
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
17-
testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common")
18-
testImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
9+
compileOnly("io.opentelemetry:opentelemetry-sdk")
10+
compileOnly("io.opentelemetry.semconv:opentelemetry-semconv")
11+
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure")
12+
compileOnly("io.opentelemetry:opentelemetry-sdk-extension-incubator")
13+
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
14+
compileOnly("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling")
15+
16+
testImplementation("io.opentelemetry.semconv:opentelemetry-semconv")
17+
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi")
18+
testImplementation("io.opentelemetry.javaagent:opentelemetry-testing-common")
19+
testImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-extension-api")
20+
testImplementation("io.opentelemetry:opentelemetry-sdk-extension-incubator")
1921
}
2022

2123
dependencyCheck {
22-
skipConfigurations = ["checkstyle", "annotationProcessor"]
23-
suppressionFile = "buildscripts/dependency-check-suppressions.xml"
24-
failBuildOnCVSS = 7.0f // fail on high or critical CVE
24+
skipConfigurations = ["checkstyle", "annotationProcessor"]
25+
suppressionFile = "buildscripts/dependency-check-suppressions.xml"
26+
failBuildOnCVSS = 7.0f // fail on high or critical CVE
2527
}
2628

2729
def updateGeneratedFile(file, newContent) {
28-
if (System.getenv("CHECK_GENERATED_FILES") == "true") {
29-
def oldContent = file.text
30-
if (oldContent != newContent) {
31-
throw new GradleException("File ${file} was modified in CI. Please update it locally and commit.")
30+
if (System.getenv("CHECK_GENERATED_FILES") == "true") {
31+
def oldContent = file.text
32+
if (oldContent != newContent) {
33+
throw new GradleException("File ${file} was modified in CI. Please update it locally and commit.")
34+
}
35+
} else {
36+
project.mkdir(file.parent)
37+
file.text = newContent
3238
}
33-
} else {
34-
project.mkdir(file.parent)
35-
file.text = newContent
36-
}
3739
}
3840

3941
tasks.register('manageVersionClass') {
40-
doLast {
41-
updateGeneratedFile(new File("${projectDir}/src/main/java/com/grafana/extensions/resources/internal", "DistributionVersion.java"),
42-
"""/*
42+
doLast {
43+
updateGeneratedFile(new File("${projectDir}/src/main/java/com/grafana/extensions/resources/internal", "DistributionVersion.java"),
44+
"""/*
4345
* Copyright Grafana Labs
4446
* SPDX-License-Identifier: Apache-2.0
4547
*/
@@ -53,7 +55,7 @@ public class DistributionVersion {
5355
public static final String VERSION = "$version";
5456
}
5557
""")
56-
}
58+
}
5759
}
5860

5961
compileJava.dependsOn(manageVersionClass)

custom/src/main/java/com/grafana/extensions/GrafanaAutoConfigCustomizerProvider.java

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,32 @@
1515

1616
public class GrafanaAutoConfigCustomizerProvider implements AutoConfigurationCustomizerProvider {
1717

18+
// Defaults in DC notation (source of truth).
19+
// Keys are DC paths under instrumentation/development.java.
20+
// ConfigPropertiesBackedConfigProvider bridges these to ConfigProperties automatically.
21+
static final Map<String, String> DC_DEFAULTS = new HashMap<>();
22+
23+
static {
24+
DC_DEFAULTS.put("micrometer.base_time_unit", "s");
25+
DC_DEFAULTS.put("log4j_appender.experimental_log_attributes", "true");
26+
DC_DEFAULTS.put("logback_appender.experimental_log_attributes", "true");
27+
}
28+
1829
@Override
1930
public void customize(AutoConfigurationCustomizer autoConfiguration) {
2031
autoConfiguration
21-
.addPropertiesSupplier(GrafanaAutoConfigCustomizerProvider::getDefaultProperties)
32+
.addPropertiesSupplier(GrafanaAutoConfigCustomizerProvider::getDefaultConfigProperties)
2233
.addPropertiesCustomizer(TestedInstrumentationsCustomizer::customizeProperties)
2334
.addMeterProviderCustomizer(MetricsCustomizer::configure)
2435
.addResourceCustomizer(ResourceCustomizer::truncate);
2536
}
2637

27-
private static Map<String, String> getDefaultProperties() {
38+
/** Translate DC defaults to {@code otel.instrumentation.*} keys for auto-configuration. */
39+
private static Map<String, String> getDefaultConfigProperties() {
2840
HashMap<String, String> map = new HashMap<>();
29-
map.put("otel.instrumentation.micrometer.base-time-unit", "s");
30-
map.put("otel.instrumentation.log4j-appender.experimental-log-attributes", "true");
31-
map.put("otel.instrumentation.logback-appender.experimental-log-attributes", "true");
41+
for (Map.Entry<String, String> entry : DC_DEFAULTS.entrySet()) {
42+
map.put("otel.instrumentation." + entry.getKey().replace('_', '-'), entry.getValue());
43+
}
3244
return map;
3345
}
3446
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright Grafana Labs
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.grafana.extensions;
7+
8+
import com.grafana.extensions.resources.internal.DistroComponentProvider;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizer;
10+
import io.opentelemetry.sdk.extension.incubator.fileconfig.DeclarativeConfigurationCustomizerProvider;
11+
12+
public class GrafanaDeclarativeConfigurationCustomizerProvider
13+
implements DeclarativeConfigurationCustomizerProvider {
14+
15+
@Override
16+
public void customize(DeclarativeConfigurationCustomizer customizer) {
17+
customizer.addModelCustomizer(
18+
model -> {
19+
DistroComponentProvider.addDistroResourceProvider(model);
20+
return model;
21+
});
22+
}
23+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Copyright Grafana Labs
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package com.grafana.extensions.resources.internal;
7+
8+
import com.grafana.extensions.resources.DistributionResource;
9+
import io.opentelemetry.api.incubator.config.DeclarativeConfigProperties;
10+
import io.opentelemetry.sdk.autoconfigure.spi.internal.ComponentProvider;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectionModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalResourceDetectorModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OpenTelemetryConfigurationModel;
14+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ResourceModel;
15+
import io.opentelemetry.sdk.resources.Resource;
16+
import java.util.Collections;
17+
import java.util.List;
18+
import java.util.Objects;
19+
import java.util.Set;
20+
import java.util.stream.Collectors;
21+
22+
@SuppressWarnings("rawtypes")
23+
public class DistroComponentProvider implements ComponentProvider {
24+
25+
static final String GRAFANA_JAVAAGENT_DISTRIBUTION = "grafana-javaagent-distribution";
26+
private static final List<String> REQUIRED_DETECTORS =
27+
Collections.singletonList(GRAFANA_JAVAAGENT_DISTRIBUTION);
28+
29+
public static void addDistroResourceProvider(OpenTelemetryConfigurationModel model) {
30+
ResourceModel resource = model.getResource();
31+
if (resource == null) {
32+
resource = new ResourceModel();
33+
model.withResource(resource);
34+
}
35+
ExperimentalResourceDetectionModel detectionModel = resource.getDetectionDevelopment();
36+
if (detectionModel == null) {
37+
detectionModel = new ExperimentalResourceDetectionModel();
38+
resource.withDetectionDevelopment(detectionModel);
39+
}
40+
List<ExperimentalResourceDetectorModel> detectors =
41+
Objects.requireNonNull(detectionModel.getDetectors());
42+
Set<String> names =
43+
detectors.stream()
44+
.flatMap(detector -> detector.getAdditionalProperties().keySet().stream())
45+
.collect(Collectors.toSet());
46+
47+
for (String name : REQUIRED_DETECTORS) {
48+
if (!names.contains(name)) {
49+
ExperimentalResourceDetectorModel detector = new ExperimentalResourceDetectorModel();
50+
detector.getAdditionalProperties().put(name, null);
51+
detectors.add(detector);
52+
}
53+
}
54+
}
55+
56+
@Override
57+
public Class<?> getType() {
58+
return Resource.class;
59+
}
60+
61+
@Override
62+
public String getName() {
63+
return GRAFANA_JAVAAGENT_DISTRIBUTION;
64+
}
65+
66+
@Override
67+
public Object create(DeclarativeConfigProperties config) {
68+
return DistributionResource.get();
69+
}
70+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
com.grafana.extensions.resources.internal.DistroComponentProvider
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
com.grafana.extensions.GrafanaDeclarativeConfigurationCustomizerProvider

0 commit comments

Comments
 (0)