|
114 | 114 | import static datadog.trace.api.ConfigDefaults.DEFAULT_JMX_FETCH_MULTIPLE_RUNTIME_SERVICES_LIMIT; |
115 | 115 | import static datadog.trace.api.ConfigDefaults.DEFAULT_LLM_OBS_AGENTLESS_ENABLED; |
116 | 116 | import static datadog.trace.api.ConfigDefaults.DEFAULT_LOGS_INJECTION_ENABLED; |
| 117 | +import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_ENABLED; |
| 118 | +import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_INTERVAL; |
| 119 | +import static datadog.trace.api.ConfigDefaults.DEFAULT_METRICS_OTEL_TIMEOUT; |
| 120 | +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_GRPC_PORT; |
| 121 | +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_METRIC_ENDPOINT; |
| 122 | +import static datadog.trace.api.ConfigDefaults.DEFAULT_OTLP_HTTP_PORT; |
117 | 123 | import static datadog.trace.api.ConfigDefaults.DEFAULT_PARTIAL_FLUSH_MIN_SPANS; |
118 | 124 | import static datadog.trace.api.ConfigDefaults.DEFAULT_PERF_METRICS_ENABLED; |
119 | 125 | import static datadog.trace.api.ConfigDefaults.DEFAULT_PRIORITY_SAMPLING_ENABLED; |
|
438 | 444 | import static datadog.trace.api.config.JmxFetchConfig.JMX_TAGS; |
439 | 445 | import static datadog.trace.api.config.LlmObsConfig.LLMOBS_AGENTLESS_ENABLED; |
440 | 446 | import static datadog.trace.api.config.LlmObsConfig.LLMOBS_ML_APP; |
| 447 | +import static datadog.trace.api.config.OtlpConfig.METRICS_OTEL_ENABLED; |
| 448 | +import static datadog.trace.api.config.OtlpConfig.METRICS_OTEL_INTERVAL; |
| 449 | +import static datadog.trace.api.config.OtlpConfig.METRICS_OTEL_TIMEOUT; |
| 450 | +import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_ENDPOINT; |
| 451 | +import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_HEADERS; |
| 452 | +import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_PROTOCOL; |
| 453 | +import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_TEMPORALITY_PREFERENCE; |
| 454 | +import static datadog.trace.api.config.OtlpConfig.OTLP_METRICS_TIMEOUT; |
441 | 455 | import static datadog.trace.api.config.ProfilingConfig.PROFILING_AGENTLESS; |
442 | 456 | import static datadog.trace.api.config.ProfilingConfig.PROFILING_AGENTLESS_DEFAULT; |
443 | 457 | import static datadog.trace.api.config.ProfilingConfig.PROFILING_API_KEY_FILE_OLD; |
|
655 | 669 | import static datadog.trace.api.config.TracerConfig.TRACE_X_DATADOG_TAGS_MAX_LENGTH; |
656 | 670 | import static datadog.trace.api.config.TracerConfig.WRITER_BAGGAGE_INJECT; |
657 | 671 | import static datadog.trace.api.config.TracerConfig.WRITER_TYPE; |
658 | | -import static datadog.trace.api.iast.IastDetectionMode.DEFAULT; |
659 | 672 | import static datadog.trace.api.telemetry.LogCollector.SEND_TELEMETRY; |
660 | 673 | import static datadog.trace.util.CollectionUtils.tryMakeImmutableList; |
661 | 674 | import static datadog.trace.util.CollectionUtils.tryMakeImmutableSet; |
|
666 | 679 | import datadog.environment.SystemProperties; |
667 | 680 | import datadog.trace.api.civisibility.CiVisibilityWellKnownTags; |
668 | 681 | import datadog.trace.api.config.GeneralConfig; |
| 682 | +import datadog.trace.api.config.OtlpConfig; |
669 | 683 | import datadog.trace.api.config.ProfilingConfig; |
670 | 684 | import datadog.trace.api.config.TracerConfig; |
671 | 685 | import datadog.trace.api.iast.IastContext; |
@@ -890,6 +904,15 @@ public static String getHostName() { |
890 | 904 | private final boolean jmxFetchMultipleRuntimeServicesEnabled; |
891 | 905 | private final int jmxFetchMultipleRuntimeServicesLimit; |
892 | 906 |
|
| 907 | + private final boolean metricsOtelEnabled; |
| 908 | + private final int metricsOtelInterval; |
| 909 | + private final int metricsOtelTimeout; |
| 910 | + private final String otlpMetricsEndpoint; |
| 911 | + private final Map<String, String> otlpMetricsHeaders; |
| 912 | + private final OtlpConfig.Protocol otlpMetricsProtocol; |
| 913 | + private final int otlpMetricsTimeout; |
| 914 | + private final OtlpConfig.Temporality otlpMetricsTemporalityPreference; |
| 915 | + |
893 | 916 | // These values are default-ed to those of jmx fetch values as needed |
894 | 917 | private final boolean healthMetricsEnabled; |
895 | 918 | private final String healthMetricsStatsdHost; |
@@ -1454,7 +1477,7 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins |
1454 | 1477 | } |
1455 | 1478 | } |
1456 | 1479 |
|
1457 | | - if (agentHostFromEnvironment == null) { |
| 1480 | + if (agentHostFromEnvironment == null || agentHostFromEnvironment.isEmpty()) { |
1458 | 1481 | agentHost = DEFAULT_AGENT_HOST; |
1459 | 1482 | } else if (agentHostFromEnvironment.charAt(0) == '[') { |
1460 | 1483 | agentHost = agentHostFromEnvironment.substring(1, agentHostFromEnvironment.length() - 1); |
@@ -1833,6 +1856,61 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins |
1833 | 1856 | statsDClientSocketBuffer = configProvider.getInteger(STATSD_CLIENT_SOCKET_BUFFER); |
1834 | 1857 | statsDClientSocketTimeout = configProvider.getInteger(STATSD_CLIENT_SOCKET_TIMEOUT); |
1835 | 1858 |
|
| 1859 | + metricsOtelEnabled = |
| 1860 | + configProvider.getBoolean(METRICS_OTEL_ENABLED, DEFAULT_METRICS_OTEL_ENABLED); |
| 1861 | + |
| 1862 | + int otelInterval = |
| 1863 | + configProvider.getInteger(METRICS_OTEL_INTERVAL, DEFAULT_METRICS_OTEL_INTERVAL); |
| 1864 | + if (otelInterval < 0) { |
| 1865 | + log.warn("Invalid OTel metrics interval: {}. The value must be positive", otelInterval); |
| 1866 | + otelInterval = DEFAULT_METRICS_OTEL_INTERVAL; |
| 1867 | + } |
| 1868 | + metricsOtelInterval = otelInterval; |
| 1869 | + |
| 1870 | + int otelTimeout = configProvider.getInteger(METRICS_OTEL_TIMEOUT, DEFAULT_METRICS_OTEL_TIMEOUT); |
| 1871 | + if (otelTimeout < 0) { |
| 1872 | + log.warn("Invalid OTel metrics timeout: {}. The value must be positive", otelTimeout); |
| 1873 | + otelTimeout = DEFAULT_METRICS_OTEL_TIMEOUT; |
| 1874 | + } |
| 1875 | + metricsOtelTimeout = otelTimeout; |
| 1876 | + |
| 1877 | + // keep OTLP default timeout below the overall export timeout |
| 1878 | + int defaultOtlpTimeout = Math.min(metricsOtelTimeout, DEFAULT_METRICS_OTEL_TIMEOUT); |
| 1879 | + int otlpTimeout = configProvider.getInteger(OTLP_METRICS_TIMEOUT, defaultOtlpTimeout); |
| 1880 | + if (otlpTimeout < 0) { |
| 1881 | + log.warn("Invalid OTLP metrics timeout: {}. The value must be positive", otlpTimeout); |
| 1882 | + otlpTimeout = defaultOtlpTimeout; |
| 1883 | + } |
| 1884 | + otlpMetricsTimeout = otlpTimeout; |
| 1885 | + |
| 1886 | + otlpMetricsHeaders = configProvider.getMergedMap(OTLP_METRICS_HEADERS, '='); |
| 1887 | + otlpMetricsProtocol = |
| 1888 | + configProvider.getEnum( |
| 1889 | + OTLP_METRICS_PROTOCOL, OtlpConfig.Protocol.class, OtlpConfig.Protocol.HTTP_PROTOBUF); |
| 1890 | + |
| 1891 | + String otlpMetricsEndpointFromEnvironment = configProvider.getString(OTLP_METRICS_ENDPOINT); |
| 1892 | + if (otlpMetricsEndpointFromEnvironment == null) { |
| 1893 | + if (otlpMetricsProtocol == OtlpConfig.Protocol.GRPC) { |
| 1894 | + otlpMetricsEndpointFromEnvironment = "http://" + agentHost + ':' + DEFAULT_OTLP_GRPC_PORT; |
| 1895 | + } else { |
| 1896 | + otlpMetricsEndpointFromEnvironment = |
| 1897 | + "http://" |
| 1898 | + + agentHost |
| 1899 | + + ':' |
| 1900 | + + DEFAULT_OTLP_HTTP_PORT |
| 1901 | + + '/' |
| 1902 | + + DEFAULT_OTLP_HTTP_METRIC_ENDPOINT; |
| 1903 | + } |
| 1904 | + } |
| 1905 | + otlpMetricsEndpoint = otlpMetricsEndpointFromEnvironment; |
| 1906 | + |
| 1907 | + otlpMetricsTemporalityPreference = |
| 1908 | + configProvider.getEnum( |
| 1909 | + OTLP_METRICS_TEMPORALITY_PREFERENCE, |
| 1910 | + OtlpConfig.Temporality.class, |
| 1911 | + OtlpConfig.Temporality.DELTA); |
| 1912 | + |
| 1913 | + // Runtime metrics are disabled if Otel metrics are enabled and the metrics exporter is none |
1836 | 1914 | runtimeMetricsEnabled = configProvider.getBoolean(RUNTIME_METRICS_ENABLED, true); |
1837 | 1915 |
|
1838 | 1916 | jmxFetchEnabled = |
@@ -2158,7 +2236,8 @@ PROFILING_DATADOG_PROFILER_ENABLED, isDatadogProfilerSafeInCurrentEnvironment()) |
2158 | 2236 | iastContextMode = |
2159 | 2237 | configProvider.getEnum(IAST_CONTEXT_MODE, IastContext.Mode.class, IastContext.Mode.REQUEST); |
2160 | 2238 | iastDetectionMode = |
2161 | | - configProvider.getEnum(IAST_DETECTION_MODE, IastDetectionMode.class, DEFAULT); |
| 2239 | + configProvider.getEnum( |
| 2240 | + IAST_DETECTION_MODE, IastDetectionMode.class, IastDetectionMode.DEFAULT); |
2162 | 2241 | iastMaxConcurrentRequests = iastDetectionMode.getIastMaxConcurrentRequests(configProvider); |
2163 | 2242 | iastVulnerabilitiesPerRequest = |
2164 | 2243 | iastDetectionMode.getIastVulnerabilitiesPerRequest(configProvider); |
@@ -4972,6 +5051,38 @@ public boolean isJmxFetchIntegrationEnabled( |
4972 | 5051 | return configProvider.isEnabled(integrationNames, "jmxfetch.", ".enabled", defaultEnabled); |
4973 | 5052 | } |
4974 | 5053 |
|
| 5054 | + public boolean isMetricsOtelEnabled() { |
| 5055 | + return metricsOtelEnabled; |
| 5056 | + } |
| 5057 | + |
| 5058 | + public int getMetricsOtelInterval() { |
| 5059 | + return metricsOtelInterval; |
| 5060 | + } |
| 5061 | + |
| 5062 | + public int getMetricsOtelTimeout() { |
| 5063 | + return metricsOtelTimeout; |
| 5064 | + } |
| 5065 | + |
| 5066 | + public String getOtlpMetricsEndpoint() { |
| 5067 | + return otlpMetricsEndpoint; |
| 5068 | + } |
| 5069 | + |
| 5070 | + public Map<String, String> getOtlpMetricsHeaders() { |
| 5071 | + return otlpMetricsHeaders; |
| 5072 | + } |
| 5073 | + |
| 5074 | + public OtlpConfig.Protocol getOtlpMetricsProtocol() { |
| 5075 | + return otlpMetricsProtocol; |
| 5076 | + } |
| 5077 | + |
| 5078 | + public int getOtlpMetricsTimeout() { |
| 5079 | + return otlpMetricsTimeout; |
| 5080 | + } |
| 5081 | + |
| 5082 | + public OtlpConfig.Temporality getOtlpMetricsTemporalityPreference() { |
| 5083 | + return otlpMetricsTemporalityPreference; |
| 5084 | + } |
| 5085 | + |
4975 | 5086 | public boolean isRuleEnabled(final String name) { |
4976 | 5087 | return isRuleEnabled(name, true); |
4977 | 5088 | } |
@@ -5960,6 +6071,22 @@ public String toString() { |
5960 | 6071 | + aiGuardEnabled |
5961 | 6072 | + ", aiGuardEndpoint=" |
5962 | 6073 | + aiGuardEndpoint |
| 6074 | + + ", metricsOtelEnabled=" |
| 6075 | + + metricsOtelEnabled |
| 6076 | + + ", metricsOtelInterval=" |
| 6077 | + + metricsOtelInterval |
| 6078 | + + ", metricsOtelTimeout=" |
| 6079 | + + metricsOtelTimeout |
| 6080 | + + ", otlpMetricsEndpoint=" |
| 6081 | + + otlpMetricsEndpoint |
| 6082 | + + ", otlpMetricsHeaders=" |
| 6083 | + + otlpMetricsHeaders |
| 6084 | + + ", otlpMetricsProtocol=" |
| 6085 | + + otlpMetricsProtocol |
| 6086 | + + ", otlpMetricsTimeout=" |
| 6087 | + + otlpMetricsTimeout |
| 6088 | + + ", otlpMetricsTemporalityPreference=" |
| 6089 | + + otlpMetricsTemporalityPreference |
5963 | 6090 | + ", serviceDiscoveryEnabled=" |
5964 | 6091 | + serviceDiscoveryEnabled |
5965 | 6092 | + '}'; |
|
0 commit comments