Skip to content

Commit 9366a0e

Browse files
authored
[Improve] Admin GetStats: Fill in missing fields (#1309)
* admin append topic stats * lint
1 parent c369e75 commit 9366a0e

File tree

2 files changed

+119
-22
lines changed

2 files changed

+119
-22
lines changed

pulsaradmin/pkg/admin/topic_test.go

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,21 @@ func TestPartitionState(t *testing.T) {
123123

124124
assert.Nil(t, err)
125125
defer client.Close()
126+
subName := "my-sub"
126127
consumer, err := client.Subscribe(pulsar.ConsumerOptions{
127128
Topic: topic,
128-
SubscriptionName: "my-sub",
129+
SubscriptionName: subName,
129130
Type: pulsar.Exclusive,
130131
})
131132
assert.Nil(t, err)
132133
defer consumer.Close()
133134

134135
// create producer
136+
producerName := "test-producer"
135137
producer, err := client.CreateProducer(pulsar.ProducerOptions{
136138
Topic: topic,
137139
DisableBatching: false,
140+
Name: producerName,
138141
})
139142
assert.Nil(t, err)
140143
defer producer.Close()
@@ -173,6 +176,53 @@ func TestPartitionState(t *testing.T) {
173176
assert.Equal(t, len(subscriptionStats.Consumers), 0)
174177
}
175178

179+
partition, err := topicName.GetPartition(0)
180+
assert.Nil(t, err)
181+
topicState, err := admin.Topics().GetStats(*partition)
182+
assert.Nil(t, err)
183+
assert.Equal(t, len(topicState.Publishers), 1)
184+
publisher := topicState.Publishers[0]
185+
assert.Equal(t, publisher.AccessModel, utils.ProduceModeShared)
186+
assert.Equal(t, publisher.IsSupportsPartialProducer, false)
187+
assert.Equal(t, publisher.ProducerName, producerName)
188+
assert.Contains(t, publisher.Address, "127.0.0.1")
189+
assert.Contains(t, publisher.ClientVersion, "Pulsar Go version")
190+
191+
sub := topicState.Subscriptions[subName]
192+
assert.Equal(t, sub.BytesOutCounter, int64(0))
193+
assert.Equal(t, sub.MsgOutCounter, int64(0))
194+
assert.Equal(t, sub.MessageAckRate, float64(0))
195+
assert.Equal(t, sub.ChunkedMessageRate, float64(0))
196+
assert.Equal(t, sub.BacklogSize, int64(0))
197+
assert.Equal(t, sub.EarliestMsgPublishTimeInBacklog, int64(0))
198+
assert.Equal(t, sub.LastExpireTimestamp, int64(0))
199+
assert.Equal(t, sub.TotalMsgExpired, int64(0))
200+
assert.Equal(t, sub.LastMarkDeleteAdvancedTimestamp, int64(0))
201+
assert.Equal(t, sub.IsDurable, true)
202+
assert.Equal(t, sub.AllowOutOfOrderDelivery, false)
203+
assert.Equal(t, sub.ConsumersAfterMarkDeletePosition, map[string]string{})
204+
assert.Equal(t, sub.NonContiguousDeletedMessagesRanges, 0)
205+
assert.Equal(t, sub.NonContiguousDeletedMessagesRangesSrzSize, 0)
206+
assert.Equal(t, sub.DelayedMessageIndexSizeInBytes, int64(0))
207+
assert.Equal(t, sub.SubscriptionProperties, map[string]string{})
208+
assert.Equal(t, sub.FilterProcessedMsgCount, int64(0))
209+
assert.Equal(t, sub.FilterAcceptedMsgCount, int64(0))
210+
assert.Equal(t, sub.FilterRejectedMsgCount, int64(0))
211+
assert.Equal(t, sub.FilterRescheduledMsgCount, int64(0))
212+
213+
assert.Equal(t, len(sub.Consumers), 1)
214+
consumerState := sub.Consumers[0]
215+
assert.Equal(t, consumerState.BytesOutCounter, int64(0))
216+
assert.Equal(t, consumerState.MsgOutCounter, int64(0))
217+
assert.Equal(t, consumerState.MessageAckRate, float64(0))
218+
assert.Equal(t, consumerState.ChunkedMessageRate, float64(0))
219+
assert.Equal(t, consumerState.AvgMessagesPerEntry, int(0))
220+
assert.Contains(t, consumerState.Address, "127.0.0.1")
221+
assert.Contains(t, consumerState.ClientVersion, "Pulsar Go version")
222+
assert.Equal(t, consumerState.LastAckedTimestamp, int64(0))
223+
assert.Equal(t, consumerState.LastConsumedTimestamp, int64(0))
224+
assert.True(t, consumerState.LastConsumedFlowTimestamp > 0)
225+
176226
}
177227
func TestNonPartitionState(t *testing.T) {
178228
randomName := newTopicName()

pulsaradmin/pkg/utils/data.go

Lines changed: 68 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -244,31 +244,67 @@ type TopicStats struct {
244244
DeDuplicationStatus string `json:"deduplicationStatus"`
245245
}
246246

247+
type ProducerAccessMode string
248+
249+
const (
250+
ProduceModeShared ProducerAccessMode = "Shared"
251+
ProduceModeExclusive = "Exclusive"
252+
ProduceModeExclusiveWithFencing = "ExclusiveWithFencing"
253+
ProduceModeWaitForExclusive = "WaitForExclusive"
254+
)
255+
247256
type PublisherStats struct {
248-
ProducerID int64 `json:"producerId"`
249-
MsgRateIn float64 `json:"msgRateIn"`
250-
MsgThroughputIn float64 `json:"msgThroughputIn"`
251-
AverageMsgSize float64 `json:"averageMsgSize"`
252-
Metadata map[string]string `json:"metadata"`
257+
AccessModel ProducerAccessMode `json:"accessMode"`
258+
ProducerID int64 `json:"producerId"`
259+
MsgRateIn float64 `json:"msgRateIn"`
260+
MsgThroughputIn float64 `json:"msgThroughputIn"`
261+
AverageMsgSize float64 `json:"averageMsgSize"`
262+
ChunkedMessageRate float64 `json:"chunkedMessageRate"`
263+
IsSupportsPartialProducer bool `json:"supportsPartialProducer"`
264+
ProducerName string `json:"producerName"`
265+
Address string `json:"address"`
266+
ConnectedSince string `json:"connectedSince"`
267+
ClientVersion string `json:"clientVersion"`
268+
Metadata map[string]string `json:"metadata"`
253269
}
254270

255271
type SubscriptionStats struct {
256-
BlockedSubscriptionOnUnackedMsgs bool `json:"blockedSubscriptionOnUnackedMsgs"`
257-
IsReplicated bool `json:"isReplicated"`
258-
LastConsumedFlowTimestamp int64 `json:"lastConsumedFlowTimestamp"`
259-
LastConsumedTimestamp int64 `json:"lastConsumedTimestamp"`
260-
LastAckedTimestamp int64 `json:"lastAckedTimestamp"`
261-
MsgRateOut float64 `json:"msgRateOut"`
262-
MsgThroughputOut float64 `json:"msgThroughputOut"`
263-
MsgRateRedeliver float64 `json:"msgRateRedeliver"`
264-
MsgRateExpired float64 `json:"msgRateExpired"`
265-
MsgBacklog int64 `json:"msgBacklog"`
266-
MsgBacklogNoDelayed int64 `json:"msgBacklogNoDelayed"`
267-
MsgDelayed int64 `json:"msgDelayed"`
268-
UnAckedMessages int64 `json:"unackedMessages"`
269-
SubType string `json:"type"`
270-
ActiveConsumerName string `json:"activeConsumerName"`
271-
Consumers []ConsumerStats `json:"consumers"`
272+
BlockedSubscriptionOnUnackedMsgs bool `json:"blockedSubscriptionOnUnackedMsgs"`
273+
IsReplicated bool `json:"isReplicated"`
274+
LastConsumedFlowTimestamp int64 `json:"lastConsumedFlowTimestamp"`
275+
LastConsumedTimestamp int64 `json:"lastConsumedTimestamp"`
276+
LastAckedTimestamp int64 `json:"lastAckedTimestamp"`
277+
MsgRateOut float64 `json:"msgRateOut"`
278+
MsgThroughputOut float64 `json:"msgThroughputOut"`
279+
MsgRateRedeliver float64 `json:"msgRateRedeliver"`
280+
MsgRateExpired float64 `json:"msgRateExpired"`
281+
MsgBacklog int64 `json:"msgBacklog"`
282+
MsgBacklogNoDelayed int64 `json:"msgBacklogNoDelayed"`
283+
MsgDelayed int64 `json:"msgDelayed"`
284+
UnAckedMessages int64 `json:"unackedMessages"`
285+
SubType string `json:"type"`
286+
ActiveConsumerName string `json:"activeConsumerName"`
287+
BytesOutCounter int64 `json:"bytesOutCounter"`
288+
MsgOutCounter int64 `json:"msgOutCounter"`
289+
MessageAckRate float64 `json:"messageAckRate"`
290+
ChunkedMessageRate float64 `json:"chunkedMessageRate"`
291+
BacklogSize int64 `json:"backlogSize"`
292+
EarliestMsgPublishTimeInBacklog int64 `json:"earliestMsgPublishTimeInBacklog"`
293+
TotalMsgExpired int64 `json:"totalMsgExpired"`
294+
LastExpireTimestamp int64 `json:"lastExpireTimestamp"`
295+
LastMarkDeleteAdvancedTimestamp int64 `json:"lastMarkDeleteAdvancedTimestamp"`
296+
Consumers []ConsumerStats `json:"consumers"`
297+
IsDurable bool `json:"isDurable"`
298+
AllowOutOfOrderDelivery bool `json:"allowOutOfOrderDelivery"`
299+
ConsumersAfterMarkDeletePosition map[string]string `json:"consumersAfterMarkDeletePosition"`
300+
NonContiguousDeletedMessagesRanges int `json:"nonContiguousDeletedMessagesRanges"`
301+
NonContiguousDeletedMessagesRangesSrzSize int `json:"nonContiguousDeletedMessagesRangesSerializedSize"`
302+
DelayedMessageIndexSizeInBytes int64 `json:"delayedMessageIndexSizeInBytes"`
303+
SubscriptionProperties map[string]string `json:"subscriptionProperties"`
304+
FilterProcessedMsgCount int64 `json:"filterProcessedMsgCount"`
305+
FilterAcceptedMsgCount int64 `json:"filterAcceptedMsgCount"`
306+
FilterRejectedMsgCount int64 `json:"filterRejectedMsgCount"`
307+
FilterRescheduledMsgCount int64 `json:"filterRescheduledMsgCount"`
272308
}
273309

274310
type ConsumerStats struct {
@@ -279,6 +315,17 @@ type ConsumerStats struct {
279315
MsgThroughputOut float64 `json:"msgThroughputOut"`
280316
MsgRateRedeliver float64 `json:"msgRateRedeliver"`
281317
ConsumerName string `json:"consumerName"`
318+
BytesOutCounter int64 `json:"bytesOutCounter"`
319+
MsgOutCounter int64 `json:"msgOutCounter"`
320+
MessageAckRate float64 `json:"messageAckRate"`
321+
ChunkedMessageRate float64 `json:"chunkedMessageRate"`
322+
AvgMessagesPerEntry int `json:"avgMessagesPerEntry"`
323+
Address string `json:"address"`
324+
ConnectedSince string `json:"connectedSince"`
325+
ClientVersion string `json:"clientVersion"`
326+
LastAckedTimestamp int64 `json:"lastAckedTimestamp"`
327+
LastConsumedTimestamp int64 `json:"lastConsumedTimestamp"`
328+
LastConsumedFlowTimestamp int64 `json:"lastConsumedFlowTimestamp"`
282329
Metadata map[string]string `json:"metadata"`
283330
}
284331

0 commit comments

Comments
 (0)