Skip to content

Commit 3022b24

Browse files
authored
Make telemetry group ordering deterministic (#14384)
1 parent b1bc7ae commit 3022b24

File tree

3 files changed

+71
-5
lines changed

3 files changed

+71
-5
lines changed

docs/instrumentation-list.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4776,12 +4776,10 @@ libraries:
47764776
type: boolean
47774777
default: false
47784778
telemetry:
4779-
- when: otel.instrumentation.kafka.experimental-span-attributes=true
4779+
- when: default
47804780
spans:
47814781
- span_kind: CONSUMER
47824782
attributes:
4783-
- name: kafka.record.queue_time_ms
4784-
type: LONG
47854783
- name: messaging.batch.message_count
47864784
type: LONG
47874785
- name: messaging.client_id
@@ -4802,10 +4800,12 @@ libraries:
48024800
type: STRING
48034801
- name: messaging.system
48044802
type: STRING
4805-
- when: default
4803+
- when: otel.instrumentation.kafka.experimental-span-attributes=true
48064804
spans:
48074805
- span_kind: CONSUMER
48084806
attributes:
4807+
- name: kafka.record.queue_time_ms
4808+
type: LONG
48094809
- name: messaging.batch.message_count
48104810
type: LONG
48114811
- name: messaging.client_id

instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.Map;
2626
import java.util.Set;
2727
import java.util.TreeMap;
28+
import java.util.TreeSet;
2829
import java.util.logging.Logger;
2930
import java.util.stream.Collectors;
3031
import org.yaml.snakeyaml.DumperOptions;
@@ -143,7 +144,7 @@ private static Map<String, Object> baseProperties(InstrumentationModule module)
143144
addConfigurations(module, moduleMap);
144145

145146
// Get telemetry grouping lists
146-
Set<String> telemetryGroups = new java.util.HashSet<>(module.getMetrics().keySet());
147+
Set<String> telemetryGroups = new TreeSet<>(module.getMetrics().keySet());
147148
telemetryGroups.addAll(module.getSpans().keySet());
148149

149150
if (!telemetryGroups.isEmpty()) {

instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.instrumentation.docs.utils;
77

8+
import static java.util.Collections.emptyList;
89
import static org.assertj.core.api.Assertions.assertThat;
910

1011
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -22,6 +23,7 @@
2223
import java.util.ArrayList;
2324
import java.util.HashMap;
2425
import java.util.HashSet;
26+
import java.util.LinkedHashMap;
2527
import java.util.List;
2628
import java.util.Map;
2729
import java.util.Set;
@@ -420,4 +422,67 @@ void testSpanParsing() throws Exception {
420422

421423
assertThat(expectedYaml).isEqualTo(stringWriter.toString());
422424
}
425+
426+
@Test
427+
void testTelemetryGroupsAreSorted() throws Exception {
428+
EmittedMetrics.Metric metric =
429+
new EmittedMetrics.Metric("a.metric", "description", "COUNTER", "1", emptyList());
430+
EmittedSpans.Span span = new EmittedSpans.Span("SERVER", emptyList());
431+
432+
// First ordering
433+
Map<String, List<EmittedMetrics.Metric>> metrics1 = new LinkedHashMap<>();
434+
metrics1.put("z-group", List.of(metric));
435+
metrics1.put("a-group", List.of(metric));
436+
437+
Map<String, List<EmittedSpans.Span>> spans1 = new LinkedHashMap<>();
438+
spans1.put("c-group", List.of(span));
439+
spans1.put("f-group", List.of(span));
440+
spans1.put("b-group", List.of(span));
441+
442+
List<InstrumentationModule> modules1 = new ArrayList<>();
443+
modules1.add(
444+
new InstrumentationModule.Builder()
445+
.srcPath("instrumentation/test/test-1.0")
446+
.instrumentationName("test-1.0")
447+
.namespace("test")
448+
.group("test")
449+
.metrics(metrics1)
450+
.spans(spans1)
451+
.build());
452+
453+
StringWriter stringWriter1 = new StringWriter();
454+
BufferedWriter writer1 = new BufferedWriter(stringWriter1);
455+
YamlHelper.generateInstrumentationYaml(modules1, writer1);
456+
writer1.flush();
457+
String yaml1 = stringWriter1.toString();
458+
459+
// Different ordering
460+
Map<String, List<EmittedMetrics.Metric>> metrics2 = new LinkedHashMap<>();
461+
metrics2.put("a-group", List.of(metric));
462+
metrics2.put("z-group", List.of(metric));
463+
464+
Map<String, List<EmittedSpans.Span>> spans2 = new LinkedHashMap<>();
465+
spans2.put("f-group", List.of(span));
466+
spans2.put("b-group", List.of(span));
467+
spans2.put("c-group", List.of(span));
468+
469+
List<InstrumentationModule> modules2 = new ArrayList<>();
470+
modules2.add(
471+
new InstrumentationModule.Builder()
472+
.srcPath("instrumentation/test/test-1.0")
473+
.instrumentationName("test-1.0")
474+
.namespace("test")
475+
.group("test")
476+
.metrics(metrics2)
477+
.spans(spans2)
478+
.build());
479+
480+
StringWriter stringWriter2 = new StringWriter();
481+
BufferedWriter writer2 = new BufferedWriter(stringWriter2);
482+
YamlHelper.generateInstrumentationYaml(modules2, writer2);
483+
writer2.flush();
484+
String yaml2 = stringWriter2.toString();
485+
486+
assertThat(yaml1).isEqualTo(yaml2);
487+
}
423488
}

0 commit comments

Comments
 (0)