3434import io .netty .util .ReferenceCountUtil ;
3535import io .netty .util .Timeout ;
3636import io .netty .util .concurrent .FastThreadLocal ;
37- import io . opentelemetry . api . common . Attributes ;
37+
3838import java .io .IOException ;
3939import java .net .URI ;
4040import java .net .URISyntaxException ;
9898import org .apache .pulsar .client .api .transaction .TxnID ;
9999import org .apache .pulsar .client .impl .conf .ConsumerConfigurationData ;
100100import org .apache .pulsar .client .impl .crypto .MessageCryptoBc ;
101- import org .apache .pulsar .client .impl .metrics .Counter ;
101+ import org .apache .pulsar .client .impl .metrics .ConsumerMetrics ;
102102import org .apache .pulsar .client .impl .metrics .InstrumentProvider ;
103- import org .apache .pulsar .client .impl .metrics .Unit ;
104- import org .apache .pulsar .client .impl .metrics .UpDownCounter ;
105103import org .apache .pulsar .client .impl .schema .AutoConsumeSchema ;
106104import org .apache .pulsar .client .impl .schema .AutoProduceBytesSchema ;
107105import org .apache .pulsar .client .impl .transaction .TransactionImpl ;
@@ -228,16 +226,7 @@ public class ConsumerImpl<T> extends ConsumerBase<T> implements ConnectionHandle
228226 private final boolean createTopicIfDoesNotExist ;
229227 private final boolean poolMessages ;
230228
231- private final Counter messagesReceivedCounter ;
232- private final Counter bytesReceivedCounter ;
233- private final UpDownCounter messagesPrefetchedGauge ;
234- private final UpDownCounter bytesPrefetchedGauge ;
235- private final Counter consumersOpenedCounter ;
236- private final Counter consumersClosedCounter ;
237- private final Counter consumerAcksCounter ;
238- private final Counter consumerNacksCounter ;
239-
240- private final Counter consumerDlqMessagesCounter ;
229+ private final ConsumerMetrics consumerMetrics ;
241230
242231 private final AtomicReference <ClientCnx > clientCnxUsedForConsumerRegistration = new AtomicReference <>();
243232 private final AtomicInteger previousExceptionCount = new AtomicInteger ();
@@ -421,29 +410,10 @@ protected ConsumerImpl(PulsarClientImpl client, String topic, ConsumerConfigurat
421410 topicNameWithoutPartition = topicName .getPartitionedTopicName ();
422411
423412 InstrumentProvider ip = client .instrumentProvider ();
424- Attributes attrs = Attributes .builder ().put ("pulsar.subscription" , subscription ).build ();
425- consumersOpenedCounter = ip .newCounter ("pulsar.client.consumer.opened" , Unit .Sessions ,
426- "The number of consumer sessions opened" , topic , attrs );
427- consumersClosedCounter = ip .newCounter ("pulsar.client.consumer.closed" , Unit .Sessions ,
428- "The number of consumer sessions closed" , topic , attrs );
429- messagesReceivedCounter = ip .newCounter ("pulsar.client.consumer.message.received.count" , Unit .Messages ,
430- "The number of messages explicitly received by the consumer application" , topic , attrs );
431- bytesReceivedCounter = ip .newCounter ("pulsar.client.consumer.message.received.size" , Unit .Bytes ,
432- "The number of bytes explicitly received by the consumer application" , topic , attrs );
433- messagesPrefetchedGauge = ip .newUpDownCounter ("pulsar.client.consumer.receive_queue.count" , Unit .Messages ,
434- "The number of messages currently sitting in the consumer receive queue" , topic , attrs );
435- bytesPrefetchedGauge = ip .newUpDownCounter ("pulsar.client.consumer.receive_queue.size" , Unit .Bytes ,
436- "The total size in bytes of messages currently sitting in the consumer receive queue" , topic , attrs );
437-
438- consumerAcksCounter = ip .newCounter ("pulsar.client.consumer.message.ack" , Unit .Messages ,
439- "The number of acknowledged messages" , topic , attrs );
440- consumerNacksCounter = ip .newCounter ("pulsar.client.consumer.message.nack" , Unit .Messages ,
441- "The number of negatively acknowledged messages" , topic , attrs );
442- consumerDlqMessagesCounter = ip .newCounter ("pulsar.client.consumer.message.dlq" , Unit .Messages ,
443- "The number of messages sent to DLQ" , topic , attrs );
413+ consumerMetrics = new ConsumerMetrics (ip , topic , subscription );
444414 grabCnx ();
445415
446- consumersOpenedCounter . increment ();
416+ consumerMetrics . recordConsumerOpened ();
447417 }
448418
449419 public ConnectionHandler getConnectionHandler () {
@@ -607,7 +577,7 @@ protected CompletableFuture<Messages<T>> internalBatchReceiveAsync() {
607577 protected CompletableFuture <Void > doAcknowledge (MessageId messageId , AckType ackType ,
608578 Map <String , Long > properties ,
609579 TransactionImpl txn ) {
610- consumerAcksCounter . increment ();
580+ consumerMetrics . recordAck ();
611581
612582 if (getState () != State .Ready && getState () != State .Connecting ) {
613583 stats .incrementNumAcksFailed ();
@@ -630,7 +600,7 @@ protected CompletableFuture<Void> doAcknowledge(MessageId messageId, AckType ack
630600 @ Override
631601 protected CompletableFuture <Void > doAcknowledge (List <MessageId > messageIdList , AckType ackType ,
632602 Map <String , Long > properties , TransactionImpl txn ) {
633- consumerAcksCounter . increment ();
603+ consumerMetrics . recordAck ();
634604
635605 if (getState () != State .Ready && getState () != State .Connecting ) {
636606 stats .incrementNumAcksFailed ();
@@ -721,7 +691,7 @@ protected CompletableFuture<Void> doReconsumeLater(Message<?> message, AckType a
721691 copyMessageKeysIfNeeded (message , typedMessageBuilderNew );
722692 copyMessageEventTime (message , typedMessageBuilderNew );
723693 typedMessageBuilderNew .sendAsync ().thenAccept (msgId -> {
724- consumerDlqMessagesCounter . increment ();
694+ consumerMetrics . recordDlq ();
725695
726696 doAcknowledge (finalMessageId , ackType , Collections .emptyMap (), null ).thenAccept (v -> {
727697 result .complete (null );
@@ -835,7 +805,7 @@ private static void copyMessageEventTime(Message<?> message,
835805
836806 @ Override
837807 public void negativeAcknowledge (MessageId messageId ) {
838- consumerNacksCounter . increment ();
808+ consumerMetrics . recordNack ();
839809 negativeAcksTracker .add (messageId );
840810
841811 // Ensure the message is not redelivered for ack-timeout, since we did receive an "ack"
@@ -844,7 +814,7 @@ public void negativeAcknowledge(MessageId messageId) {
844814
845815 @ Override
846816 public void negativeAcknowledge (Message <?> message ) {
847- consumerNacksCounter . increment ();
817+ consumerMetrics . recordNack ();
848818 negativeAcksTracker .add (message );
849819
850820 // Ensure the message is not redelivered for ack-timeout, since we did receive an "ack"
@@ -1185,7 +1155,7 @@ public synchronized CompletableFuture<Void> closeAsync() {
11851155 return compositeCloseFuture ;
11861156 }
11871157
1188- consumersClosedCounter . increment ();
1158+ consumerMetrics . recordConsumerClosed ();
11891159
11901160 if (!isConnected ()) {
11911161 log .info ("[{}] [{}] Closed Consumer (not connected)" , topic , subscription );
@@ -1369,8 +1339,7 @@ protected <V> MessageImpl<V> newMessage(final MessageIdImpl messageId,
13691339 }
13701340
13711341 private void executeNotifyCallback (final MessageImpl <T > message ) {
1372- messagesPrefetchedGauge .increment ();
1373- bytesPrefetchedGauge .add (message .size ());
1342+ consumerMetrics .recordMessagePrefetched (message .size ());
13741343
13751344 // Enqueue the message so that it can be retrieved when application calls receive()
13761345 // if the conf.getReceiverQueueSize() is 0 then discard message if no one is waiting for it.
@@ -1869,11 +1838,7 @@ protected synchronized void messageProcessed(Message<?> msg) {
18691838 ClientCnx msgCnx = ((MessageImpl <?>) msg ).getCnx ();
18701839 lastDequeuedMessageId = msg .getMessageId ();
18711840
1872- messagesPrefetchedGauge .decrement ();
1873- messagesReceivedCounter .increment ();
1874-
1875- bytesPrefetchedGauge .subtract (msg .size ());
1876- bytesReceivedCounter .add (msg .size ());
1841+ consumerMetrics .recordMessageReceived (msg .size ());
18771842
18781843 if (msgCnx != currentCnx ) {
18791844 // The processed message did belong to the old queue that was cleared after reconnection.
0 commit comments