Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
701e1f3
update opentelemetry-api to 1.47.0
cecile75 Oct 15, 2025
aaeee11
add otel metrics configuration
cecile75 Oct 26, 2025
3821b62
merge with master
cecile75 Oct 26, 2025
97a1450
solve P2 spotbugsMain
cecile75 Oct 27, 2025
2e5d917
remove enum from jacocoTest coverage
cecile75 Oct 27, 2025
0f27db4
fix :jacocoTestCoverageVerification for :utils:config-utils
cecile75 Oct 27, 2025
c0500b2
add otel metrics configuration keys to Centralized Configuration
cecile75 Oct 27, 2025
b00f6c0
initialized at build time OtelConfig and OtelConfig
cecile75 Oct 27, 2025
998d75a
easy improvements following feedback
cecile75 Oct 29, 2025
10e9e68
use previous existing function for Map
cecile75 Oct 29, 2025
4e04c77
Merge branch 'master' into cecile/otelmetricstask1
cecile75 Oct 29, 2025
7bb9e0c
Update dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java
cecile75 Oct 30, 2025
781cbba
Update dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java
cecile75 Oct 30, 2025
7c05b8a
Update dd-trace-api/src/main/java/datadog/trace/api/ConfigDefaults.java
cecile75 Oct 30, 2025
7924ced
remove duplicate env vars
cecile75 Oct 30, 2025
dd223a3
Fix spotlessss after commits from github
cecile75 Oct 30, 2025
666e13a
Refactor generic otel config
cecile75 Nov 3, 2025
c5b3923
Clean
cecile75 Nov 3, 2025
2788bdd
Re adapt class name for graalVM
cecile75 Nov 3, 2025
8ef1286
renaming leftover
cecile75 Nov 3, 2025
28394a2
Fix runtime metrics
cecile75 Nov 3, 2025
d4bc02d
Include OtelMetricsConfig$Temporality along with the other new OTel m…
mcculls Nov 4, 2025
aee4d9d
Cleanup OTel constants
mcculls Nov 4, 2025
9d1b892
Put defaults in consistent location
mcculls Nov 4, 2025
c38b0f2
Update comment
mcculls Nov 4, 2025
83d93b9
Replace concat call with +
mcculls Nov 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,9 @@ public static void onEnter(@Advice.Argument(value = 0, readOnly = false) String[
+ "datadog.trace.api.ConfigDefaults:build_time,"
+ "datadog.trace.api.ConfigOrigin:build_time,"
+ "datadog.trace.api.ConfigSetting:build_time,"
+ "datadog.trace.api.config.OtelMetricsConfig$Exporter:build_time,"
+ "datadog.trace.api.config.OtelMetricsConfig$Protocol:build_time,"
+ "datadog.trace.api.config.OtelMetricsConfig$Temporality:build_time,"
+ "datadog.trace.api.EventTracker:build_time,"
+ "datadog.trace.api.InstrumenterConfig:build_time,"
+ "datadog.trace.api.Functions:build_time,"
Expand Down
3 changes: 3 additions & 0 deletions dd-trace-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ val excludedClassesCoverage by extra(
"datadog.trace.payloadtags.PayloadTagsData",
"datadog.trace.payloadtags.PayloadTagsData.PathAndValue",
"datadog.trace.api.llmobs.LLMObsTags",
"datadog.trace.api.config.OtelMetricsConfig.Protocol",
"datadog.trace.api.config.OtelMetricsConfig.Temporality",
"datadog.trace.api.config.OtelMetricsConfig.Exporter",
)
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import static datadog.trace.api.TracePropagationStyle.TRACECONTEXT;
import static java.util.Arrays.asList;

import datadog.trace.api.config.OtelMetricsConfig.Exporter;
import datadog.trace.api.config.OtelMetricsConfig.Protocol;
import java.util.Arrays;
import java.util.BitSet;
import java.util.HashSet;
Expand Down Expand Up @@ -101,6 +103,18 @@ public final class ConfigDefaults {
static final boolean DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_ENABLED = false;
static final int DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT = 10;

public static final boolean DEFAULT_METRICS_OTEL_ENABLED = false;
static final Exporter DEFAULT_OTEL_METRICS_EXPORTER = Exporter.OTLP;
// Default recommended by Datadog; it differs from Otel’s default of 60000 (60s)
static final Integer DEFAULT_OTEL_METRIC_EXPORT_INTERVAL = 10000;
// Default recommended by Datadog; it differs from Otel’s default of 30000 (30s)
static final Integer DEFAULT_OTEL_METRIC_EXPORT_TIMEOUT = 7500;
static final String DEFAULT_OTEL_METRIC_ENDPOINT_SUFFIX = "v1/metrics";
static final String DEFAULT_OTEL_METRIC_ENDPOINT_HTTP_PORT = "4318";
static final String DEFAULT_OTEL_METRIC_ENDPOINT_GRPC_PORT = "4317";
static final Protocol DEFAULT_OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = Protocol.GRPC;
static final int DEFAULT_OTEL_EXPORTER_OTLP_METRICS_TIMEOUT = 10000;

static final int DEFAULT_DOGSTATSD_START_DELAY = 15; // seconds

static final boolean DEFAULT_HEALTH_METRICS_ENABLED = true;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package datadog.trace.api.config;

public final class OtelMetricsConfig {

public static final String METRICS_OTEL_ENABLED = "metrics.otel.enabled";

public static final String OTEL_METRICS_EXPORTER = "otel.metrics.exporter";
public static final String OTEL_METRIC_EXPORT_INTERVAL = "otel.metric.export.interval";
public static final String OTEL_METRIC_EXPORT_TIMEOUT = "otel.metric.export.timeout";

public static final String OTEL_EXPORTER_OTLP_ENDPOINT = "otel.exporter.otlp.endpoint";
public static final String OTEL_EXPORTER_OTLP_HEADERS = "otel.exporter.otlp.headers";
public static final String OTEL_EXPORTER_OTLP_PROTOCOL = "otel.exporter.otlp.protocol";
public static final String OTEL_EXPORTER_OTLP_TIMEOUT = "otel.exporter.otlp.timeout";
public static final String OTEL_EXPORTER_OTLP_METRICS_ENDPOINT =
"otel.exporter.otlp.metrics.endpoint";
public static final String OTEL_EXPORTER_OTLP_METRICS_HEADERS =
"otel.exporter.otlp.metrics.headers";
public static final String OTEL_EXPORTER_OTLP_METRICS_PROTOCOL =
"otel.exporter.otlp.metrics.protocol";
public static final String OTEL_EXPORTER_OTLP_METRICS_TIMEOUT =
"otel.exporter.otlp.metrics.timeout";
public static final String OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE =
"otel.exporter.otlp.metrics.temporality.preference";

public enum Temporality {
CUMULATIVE,
DELTA,
LOWMEMORY
}

public enum Exporter {
OTLP,
NONE
}

public enum Protocol {
GRPC,
HTTP_PROTOBUF,
HTTP_JSON
}

private OtelMetricsConfig() {}
}
181 changes: 181 additions & 0 deletions internal-api/src/main/java/datadog/trace/api/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,15 @@
import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT;
import static datadog.trace.api.ConfigDefaults.DEFAULT_LLM_OBS_AGENTLESS_ENABLED;
import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_INJECTION_ENABLED;
import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_ENABLED;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_EXPORTER_OTLP_METRICS_PROTOCOL;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_EXPORTER_OTLP_METRICS_TIMEOUT;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_METRICS_EXPORTER;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_METRIC_ENDPOINT_GRPC_PORT;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_METRIC_ENDPOINT_HTTP_PORT;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_METRIC_ENDPOINT_SUFFIX;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_METRIC_EXPORT_INTERVAL;
import static datadog.trace.api.ConfigDefaults.DEFAULT_OTEL_METRIC_EXPORT_TIMEOUT;
import static datadog.trace.api.ConfigDefaults.DEFAULT_PARTIAL_FLUSH_MIN_SPANS;
import static datadog.trace.api.ConfigDefaults.DEFAULT_PERF_METRICS_ENABLED;
import static datadog.trace.api.ConfigDefaults.DEFAULT_PRIORITY_SAMPLING_ENABLED;
Expand Down Expand Up @@ -437,6 +446,19 @@
import static datadog.trace.api.config.JmxFetchConfig.JMX_TAGS;
import static datadog.trace.api.config.LlmObsConfig.LLMOBS_AGENTLESS_ENABLED;
import static datadog.trace.api.config.LlmObsConfig.LLMOBS_ML_APP;
import static datadog.trace.api.config.OtelMetricsConfig.METRICS_OTEL_ENABLED;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_ENDPOINT;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_HEADERS;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_METRICS_HEADERS;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_METRICS_TIMEOUT;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_PROTOCOL;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_EXPORTER_OTLP_TIMEOUT;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_METRICS_EXPORTER;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_METRIC_EXPORT_INTERVAL;
import static datadog.trace.api.config.OtelMetricsConfig.OTEL_METRIC_EXPORT_TIMEOUT;
import static datadog.trace.api.config.ProfilingConfig.PROFILING_AGENTLESS;
import static datadog.trace.api.config.ProfilingConfig.PROFILING_AGENTLESS_DEFAULT;
import static datadog.trace.api.config.ProfilingConfig.PROFILING_API_KEY_FILE_OLD;
Expand Down Expand Up @@ -665,6 +687,7 @@
import datadog.environment.SystemProperties;
import datadog.trace.api.civisibility.CiVisibilityWellKnownTags;
import datadog.trace.api.config.GeneralConfig;
import datadog.trace.api.config.OtelMetricsConfig;
import datadog.trace.api.config.ProfilingConfig;
import datadog.trace.api.config.TracerConfig;
import datadog.trace.api.iast.IastContext;
Expand Down Expand Up @@ -889,6 +912,16 @@ public static String getHostName() {
private final boolean jmxFetchMultipleRuntimeServicesEnabled;
private final int jmxFetchMultipleRuntimeServicesLimit;

private final boolean metricsOtelEnabled;
private final OtelMetricsConfig.Exporter otelMetricsExporter;
private final Integer otelMetricExportInterval;
private final Integer otelMetricExportTimeout;
private final String otelExporterOtlpMetricsEndpoint;
private final Map<String, String> otelExporterOtlpMetricsHeaders;
private final OtelMetricsConfig.Protocol otelExporterOtlpMetricsProtocol;
private final Integer otelExporterOtlpMetricsTimeout;
private final OtelMetricsConfig.Temporality otelExporterOtlpMetricsTemporalityPreference;

// These values are default-ed to those of jmx fetch values as needed
private final boolean healthMetricsEnabled;
private final String healthMetricsStatsdHost;
Expand Down Expand Up @@ -1832,6 +1865,100 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins
statsDClientSocketBuffer = configProvider.getInteger(STATSD_CLIENT_SOCKET_BUFFER);
statsDClientSocketTimeout = configProvider.getInteger(STATSD_CLIENT_SOCKET_TIMEOUT);

metricsOtelEnabled =
configProvider.getBoolean(METRICS_OTEL_ENABLED, DEFAULT_METRICS_OTEL_ENABLED);

otelMetricsExporter =
configProvider.getEnum(
OTEL_METRICS_EXPORTER,
OtelMetricsConfig.Exporter.class,
DEFAULT_OTEL_METRICS_EXPORTER,
false);

Integer tmpOtelMetricExportTimeout = configProvider.getInteger(OTEL_METRIC_EXPORT_TIMEOUT);
otelMetricExportTimeout =
(tmpOtelMetricExportTimeout == null || tmpOtelMetricExportTimeout < 0)
? DEFAULT_OTEL_METRIC_EXPORT_TIMEOUT
: tmpOtelMetricExportTimeout;

Integer tmpOtelMetricExportInterval = configProvider.getInteger(OTEL_METRIC_EXPORT_INTERVAL);
otelMetricExportInterval =
(tmpOtelMetricExportInterval == null || tmpOtelMetricExportInterval < 0)
? DEFAULT_OTEL_METRIC_EXPORT_INTERVAL
: tmpOtelMetricExportInterval;

Map<String, String> tmpOtelExporterOtlpMetricsHeaders =
configProvider.getMergedMap(OTEL_EXPORTER_OTLP_METRICS_HEADERS, '=');
if (tmpOtelExporterOtlpMetricsHeaders.isEmpty()) {
tmpOtelExporterOtlpMetricsHeaders =
configProvider.getMergedMap(OTEL_EXPORTER_OTLP_HEADERS, '=');
}
otelExporterOtlpMetricsHeaders = tmpOtelExporterOtlpMetricsHeaders;

OtelMetricsConfig.Protocol tmpOtelExporterOtlpMetricsProtocol =
configProvider.getEnum(
OTEL_EXPORTER_OTLP_METRICS_PROTOCOL,
OtelMetricsConfig.Protocol.class,
null,
false,
"/",
"_");
if (tmpOtelExporterOtlpMetricsProtocol == null) {
tmpOtelExporterOtlpMetricsProtocol =
configProvider.getEnum(
OTEL_EXPORTER_OTLP_PROTOCOL,
OtelMetricsConfig.Protocol.class,
DEFAULT_OTEL_EXPORTER_OTLP_METRICS_PROTOCOL,
false,
"/",
"_");
}
otelExporterOtlpMetricsProtocol = tmpOtelExporterOtlpMetricsProtocol;
// TODO: log warning and switch protocol to default if we don't support the selected protocol?

String tmpOtelExporterOtlpMetricsEndpoint =
configProvider.getString(OTEL_EXPORTER_OTLP_METRICS_ENDPOINT);
if (tmpOtelExporterOtlpMetricsEndpoint == null) {
boolean isHttp = !otelExporterOtlpMetricsProtocol.equals(OtelMetricsConfig.Protocol.GRPC);
String tmpOtelExporterOtlpEndpoint = configProvider.getString(OTEL_EXPORTER_OTLP_ENDPOINT);
if (null == tmpOtelExporterOtlpEndpoint) {
String endpointHost = agentHost.isEmpty() ? DEFAULT_AGENT_HOST : agentHost;
tmpOtelExporterOtlpMetricsEndpoint =
isHttp
? "http://"
+ endpointHost
+ ":"
+ DEFAULT_OTEL_METRIC_ENDPOINT_HTTP_PORT
+ "/"
+ DEFAULT_OTEL_METRIC_ENDPOINT_SUFFIX
: "http://" + endpointHost + ":" + DEFAULT_OTEL_METRIC_ENDPOINT_GRPC_PORT;
} else {
tmpOtelExporterOtlpMetricsEndpoint =
isHttp
? tmpOtelExporterOtlpEndpoint + DEFAULT_OTEL_METRIC_ENDPOINT_SUFFIX
: tmpOtelExporterOtlpEndpoint;
}
}
otelExporterOtlpMetricsEndpoint = tmpOtelExporterOtlpMetricsEndpoint;

Integer tmpOtelExporterOtlpMetricsTimeout =
configProvider.getInteger(OTEL_EXPORTER_OTLP_METRICS_TIMEOUT);
if (null == tmpOtelExporterOtlpMetricsTimeout) {
tmpOtelExporterOtlpMetricsTimeout = configProvider.getInteger(OTEL_EXPORTER_OTLP_TIMEOUT);
}
otelExporterOtlpMetricsTimeout =
(tmpOtelExporterOtlpMetricsTimeout == null || tmpOtelExporterOtlpMetricsTimeout < 0)
? new Integer(DEFAULT_OTEL_EXPORTER_OTLP_METRICS_TIMEOUT)
: tmpOtelExporterOtlpMetricsTimeout;

otelExporterOtlpMetricsTemporalityPreference =
configProvider.getEnum(
OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE,
OtelMetricsConfig.Temporality.class,
OtelMetricsConfig.Temporality.DELTA,
false);

// Runtime metrics are disabled if Otel metrics are enabled and the metrics exporter is none
runtimeMetricsEnabled = configProvider.getBoolean(RUNTIME_METRICS_ENABLED, true);

jmxFetchEnabled =
Expand Down Expand Up @@ -4970,6 +5097,42 @@ public boolean isJmxFetchIntegrationEnabled(
return configProvider.isEnabled(integrationNames, "jmxfetch.", ".enabled", defaultEnabled);
}

public boolean isMetricsOtelEnabled() {
return metricsOtelEnabled;
}

public OtelMetricsConfig.Exporter getOtelMetricsExporter() {
return otelMetricsExporter;
}

public Integer getOtelMetricExportInterval() {
return otelMetricExportInterval;
}

public Integer getOtelMetricExportTimeout() {
return otelMetricExportTimeout;
}

public String getOtelExporterOtlpMetricsEndpoint() {
return otelExporterOtlpMetricsEndpoint;
}

public Map<String, String> getOtelExporterOtlpMetricsHeaders() {
return otelExporterOtlpMetricsHeaders;
}

public OtelMetricsConfig.Protocol getOtelExporterOtlpMetricsProtocol() {
return otelExporterOtlpMetricsProtocol;
}

public Integer getOtelExporterOtlpMetricsTimeout() {
return otelExporterOtlpMetricsTimeout;
}

public OtelMetricsConfig.Temporality getOtelExporterOtlpMetricsTemporalityPreference() {
return otelExporterOtlpMetricsTemporalityPreference;
}

public boolean isRuleEnabled(final String name) {
return isRuleEnabled(name, true);
}
Expand Down Expand Up @@ -5958,6 +6121,24 @@ public String toString() {
+ aiGuardEnabled
+ ", aiGuardEndpoint="
+ aiGuardEndpoint
+ ", metricsOtelEnabled="
+ metricsOtelEnabled
+ ", otelMetricsExporter="
+ otelMetricsExporter
+ ", otelMetricExportInterval="
+ otelMetricExportInterval
+ ", otelMetricExportTimeout="
+ otelMetricExportTimeout
+ ", otelExporterOtlpMetricsEndpoint="
+ otelExporterOtlpMetricsEndpoint
+ ", otelExporterOtlpMetricsHeaders="
+ otelExporterOtlpMetricsHeaders
+ ", otelExporterOtlpMetricsProtocol="
+ otelExporterOtlpMetricsProtocol
+ ", otelExporterOtlpMetricsTimeout="
+ otelExporterOtlpMetricsTimeout
+ ", otelExporterOtlpMetricsTemporalityPreference="
+ otelExporterOtlpMetricsTemporalityPreference
+ ", serviceDiscoveryEnabled="
+ serviceDiscoveryEnabled
+ '}';
Expand Down
Loading