Skip to content

Commit 9324927

Browse files
committed
GH-2914: Make delivery_tag as a high cardinality observation tag
Fixes: #2914 The `delivery_tag` on consumer side is really per message, so that makes too many metric timers when this property is exposed as a low cardinality tag. * Fix `RabbitListenerObservation` moving the `ListenerLowCardinalityTags.DELIVERY_TAG` into the `ListenerHighCardinalityTags.DELIVERY_TAG` * Leave `ListenerLowCardinalityTags.DELIVERY_TAG` as deprecated to avoid compatibility issues, but exclude it from the `getLowCardinalityKeyNames()` implementation
1 parent db59442 commit 9324927

File tree

2 files changed

+48
-10
lines changed

2 files changed

+48
-10
lines changed

spring-rabbit/src/main/java/org/springframework/amqp/rabbit/support/micrometer/RabbitListenerObservation.java

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.amqp.rabbit.support.micrometer;
1818

19+
import java.util.Arrays;
20+
1921
import io.micrometer.common.KeyValues;
2022
import io.micrometer.common.docs.KeyName;
2123
import io.micrometer.observation.Observation.Context;
@@ -45,7 +47,14 @@ public Class<? extends ObservationConvention<? extends Context>> getDefaultConve
4547

4648
@Override
4749
public KeyName[] getLowCardinalityKeyNames() {
48-
return ListenerLowCardinalityTags.values();
50+
return Arrays.stream(ListenerLowCardinalityTags.values())
51+
.filter((key) -> !ListenerLowCardinalityTags.DELIVERY_TAG.equals(key))
52+
.toArray(KeyName[]::new);
53+
}
54+
55+
@Override
56+
public KeyName[] getHighCardinalityKeyNames() {
57+
return ListenerHighCardinalityTags.values();
4958
}
5059

5160
};
@@ -83,8 +92,33 @@ public String asString() {
8392

8493
/**
8594
* The delivery tag.
95+
* After deprecation this key is not exposed as a low cardinality tag.
8696
*
8797
* @since 3.2
98+
*
99+
* @deprecated in favor of {@link ListenerHighCardinalityTags#DELIVERY_TAG}
100+
*/
101+
@Deprecated(since = "3.2.1", forRemoval = true)
102+
DELIVERY_TAG {
103+
104+
@Override
105+
public String asString() {
106+
return "messaging.rabbitmq.message.delivery_tag";
107+
}
108+
109+
}
110+
111+
}
112+
113+
/**
114+
* High cardinality tags.
115+
*
116+
* @since 3.2.1
117+
*/
118+
public enum ListenerHighCardinalityTags implements KeyName {
119+
120+
/**
121+
* The delivery tag.
88122
*/
89123
DELIVERY_TAG {
90124

@@ -97,6 +131,7 @@ public String asString() {
97131

98132
}
99133

134+
100135
/**
101136
* Default {@link RabbitListenerObservationConvention} for Rabbit listener key values.
102137
*/
@@ -112,12 +147,16 @@ public static class DefaultRabbitListenerObservationConvention implements Rabbit
112147
public KeyValues getLowCardinalityKeyValues(RabbitMessageReceiverContext context) {
113148
final var messageProperties = context.getCarrier().getMessageProperties();
114149
return KeyValues.of(
115-
RabbitListenerObservation.ListenerLowCardinalityTags.LISTENER_ID.asString(), context.getListenerId(),
150+
RabbitListenerObservation.ListenerLowCardinalityTags.LISTENER_ID.asString(),
151+
context.getListenerId(),
116152
RabbitListenerObservation.ListenerLowCardinalityTags.DESTINATION_NAME.asString(),
117-
messageProperties.getConsumerQueue(),
118-
RabbitListenerObservation.ListenerLowCardinalityTags.DELIVERY_TAG.asString(),
119-
String.valueOf(messageProperties.getDeliveryTag())
120-
);
153+
messageProperties.getConsumerQueue());
154+
}
155+
156+
@Override
157+
public KeyValues getHighCardinalityKeyValues(RabbitMessageReceiverContext context) {
158+
return KeyValues.of(RabbitListenerObservation.ListenerHighCardinalityTags.DELIVERY_TAG.asString(),
159+
String.valueOf(context.getCarrier().getMessageProperties().getDeliveryTag()));
121160
}
122161

123162
@Override

spring-rabbit/src/test/java/org/springframework/amqp/rabbit/support/micrometer/ObservationIntegrationTests.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
/**
4848
* @author Artem Bilan
4949
* @author Gary Russell
50+
*
5051
* @since 3.0
5152
*/
5253
@RabbitAvailable(queues = { "int.observation.testQ1", "int.observation.testQ2" })
@@ -120,15 +121,13 @@ public SampleTestRunnerConsumer yourCode() {
120121
.hasTimerWithNameAndTags("spring.rabbit.listener",
121122
KeyValues.of(
122123
KeyValue.of("spring.rabbit.listener.id", "obs1"),
123-
KeyValue.of("messaging.destination.name", "int.observation.testQ1"),
124-
KeyValue.of("messaging.rabbitmq.message.delivery_tag", "1")
124+
KeyValue.of("messaging.destination.name", "int.observation.testQ1")
125125
)
126126
)
127127
.hasTimerWithNameAndTags("spring.rabbit.listener",
128128
KeyValues.of(
129129
KeyValue.of("spring.rabbit.listener.id", "obs2"),
130-
KeyValue.of("messaging.destination.name", "int.observation.testQ2"),
131-
KeyValue.of("messaging.rabbitmq.message.delivery_tag", "1")
130+
KeyValue.of("messaging.destination.name", "int.observation.testQ2")
132131
)
133132
);
134133
};

0 commit comments

Comments
 (0)