Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
75b857f
Bump OTel to get health metrics
mamazzol Mar 26, 2026
713645b
Add health metrics to OTel SDK
mamazzol Mar 30, 2026
a215113
Small refactor
mamazzol Mar 30, 2026
0fb8b2f
Merge branch 'main' into otel-health
mamazzol Mar 30, 2026
5a1de63
Merge from main
mamazzol Mar 30, 2026
66006de
Merge branch 'main' into otel-health
mamazzol Mar 30, 2026
d35976a
Merge branch 'main' into otel-health
mamazzol Mar 31, 2026
67bc726
Merge branch 'main' into otel-health
mamazzol Mar 31, 2026
d6ecec0
Adding test for health metrics exported
mamazzol Apr 1, 2026
1b83ae1
Add toDuration method to TimeValue
mamazzol Apr 1, 2026
987fa0a
Change RunTask to run ES with OTEL SDK enabled without mock APM server
mamazzol Apr 1, 2026
9d6a989
PR Feedback
mamazzol Apr 1, 2026
843f705
Merge branch 'main' into otel-health
mamazzol Apr 1, 2026
716124b
simplify disable APM Agent logic
mamazzol Apr 1, 2026
0950d19
Remove duplicated flush
mamazzol Apr 1, 2026
18d12d7
Merge branch 'main' into otel-health
prdoyle Apr 1, 2026
13e9b5f
Merge branch 'main' into otel-health
prdoyle Apr 1, 2026
814da9c
Reinstate double flush to ensure flushing of health metrics
mamazzol Apr 2, 2026
65882c3
Merge branch 'main' into otel-health
mamazzol Apr 2, 2026
365d364
Merge branch 'main' into otel-health
mamazzol Apr 2, 2026
538db6a
Merge branch 'main' into otel-health
mamazzol Apr 2, 2026
40f61bb
Merge branch 'main' into otel-health
mamazzol Apr 2, 2026
d5abad8
Merge branch 'main' into otel-health
mamazzol Apr 2, 2026
b44c92b
Merge branch 'main' into otel-health
prdoyle Apr 2, 2026
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 @@ -26,11 +26,14 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.StringJoiner;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import static org.elasticsearch.telemetry.TelemetryProvider.OTEL_METRICS_ENABLED_SYSTEM_PROPERTY;

Expand Down Expand Up @@ -160,6 +163,7 @@ static List<String> apmJvmOptions(Settings settings, @Nullable SecureSettings se
if (agentMetricsEnabled == false) {
propertiesMap.put("metrics_interval", "0s");
propertiesMap.put("disable_metrics", "*");
disableMetricInstrumentation(propertiesMap);
}

// Configures a log file to write to. Don't disable writing to a log file,
Expand Down Expand Up @@ -263,6 +267,22 @@ static Map<String, String> extractApmSettings(Settings settings) throws UserExce
return propertiesMap;
}

/**
* Disables the APM Agent hook that adds an exporter to application {@code SdkMeterProvider} instances.
* When Elasticsearch uses the OTel SDK for metrics, that hook is redundant and can break export;
* traces still use the APM Agent through {@code GlobalOpenTelemetry}.
*/
static void disableMetricInstrumentation(Map<String, String> propertiesMap) {
LinkedHashSet<String> parts = new LinkedHashSet<>();
String existing = propertiesMap.get("disable_instrumentations");
for (String p : Strings.splitStringByCommaToArray(existing)) {
parts.add(p.trim());
}
parts.add("opentelemetry-metrics");
String newValue = parts.stream().filter(Predicate.not(String::isBlank)).collect(Collectors.joining(","));
propertiesMap.put("disable_instrumentations", newValue);
}

private static StringJoiner extractGlobalLabels(String prefix, Map<String, String> propertiesMap, Settings settings) {
// special handling of global labels, the agent expects them in format: key1=value1,key2=value2
final Settings globalLabelsSettings = settings.getByPrefix(prefix + "global_labels.");
Expand Down
Loading
Loading