diff --git a/src/messaging/ReliableMessageAnalyticsDelegate.h b/src/messaging/ReliableMessageAnalyticsDelegate.h index 4eeea4f23b7e5f..db15c18071db2c 100644 --- a/src/messaging/ReliableMessageAnalyticsDelegate.h +++ b/src/messaging/ReliableMessageAnalyticsDelegate.h @@ -22,6 +22,8 @@ #pragma once +#include + #include #include @@ -65,6 +67,9 @@ class ReliableMessageAnalyticsDelegate // The outgoing message counter associated with the event. If there is no outgoing message counter // this value will be 0. uint32_t messageCounter = 0; + // If the eventType is kRetransmission, this value will be populated with the number of the + // retransmission attempt + std::optional retransmissionCount; }; virtual void OnTransmitEvent(const TransmitEvent & event) = 0; diff --git a/src/messaging/ReliableMessageMgr.cpp b/src/messaging/ReliableMessageMgr.cpp index 9a2bb31777c7e6..69470c234fa31e 100644 --- a/src/messaging/ReliableMessageMgr.cpp +++ b/src/messaging/ReliableMessageMgr.cpp @@ -126,6 +126,12 @@ void ReliableMessageMgr::NotifyMessageSendAnalytics(const RetransTableEntry & en ReliableMessageAnalyticsDelegate::SessionType::kEstablishedCase, .eventType = eventType, .messageCounter = messageCounter }; + + if (eventType == ReliableMessageAnalyticsDelegate::EventType::kRetransmission) + { + event.retransmissionCount = entry.sendCount; + } + mAnalyticsDelegate->OnTransmitEvent(event); } #endif // CHIP_CONFIG_MRP_ANALYTICS_ENABLED diff --git a/src/messaging/tests/TestReliableMessageProtocol.cpp b/src/messaging/tests/TestReliableMessageProtocol.cpp index f30e763c50cd1b..376dbf15a2e5d0 100644 --- a/src/messaging/tests/TestReliableMessageProtocol.cpp +++ b/src/messaging/tests/TestReliableMessageProtocol.cpp @@ -2144,6 +2144,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven EXPECT_EQ(firstTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(firstTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(firstTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kInitialSend); + EXPECT_EQ(firstTransmitEvent.retransmissionCount, std::nullopt); // We have no way of validating the first messageCounter since this is a randomly generated value, but it should // remain constant for all subsequent transmit events in this test. const uint32_t messageCounter = firstTransmitEvent.messageCounter; @@ -2153,6 +2154,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven EXPECT_EQ(secondTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(secondTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(secondTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); + EXPECT_EQ(secondTransmitEvent.retransmissionCount, 1); EXPECT_EQ(messageCounter, secondTransmitEvent.messageCounter); testAnalyticsDelegate.mTransmitEvents.pop(); @@ -2160,20 +2162,23 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven EXPECT_EQ(thirdTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(thirdTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(thirdTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); + EXPECT_EQ(thirdTransmitEvent.retransmissionCount, 2); EXPECT_EQ(messageCounter, thirdTransmitEvent.messageCounter); testAnalyticsDelegate.mTransmitEvents.pop(); - auto forthTransmitEvent = testAnalyticsDelegate.mTransmitEvents.front(); - EXPECT_EQ(forthTransmitEvent.nodeId, expectedNodeId); - EXPECT_EQ(forthTransmitEvent.fabricIndex, expectedFabricIndex); - EXPECT_EQ(forthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); - EXPECT_EQ(messageCounter, forthTransmitEvent.messageCounter); + auto fourthTransmitEvent = testAnalyticsDelegate.mTransmitEvents.front(); + EXPECT_EQ(fourthTransmitEvent.nodeId, expectedNodeId); + EXPECT_EQ(fourthTransmitEvent.fabricIndex, expectedFabricIndex); + EXPECT_EQ(fourthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); + EXPECT_EQ(fourthTransmitEvent.retransmissionCount, 3); + EXPECT_EQ(messageCounter, fourthTransmitEvent.messageCounter); testAnalyticsDelegate.mTransmitEvents.pop(); auto fifthTransmitEvent = testAnalyticsDelegate.mTransmitEvents.front(); EXPECT_EQ(fifthTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(fifthTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(fifthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); + EXPECT_EQ(fifthTransmitEvent.retransmissionCount, 4); EXPECT_EQ(messageCounter, fifthTransmitEvent.messageCounter); testAnalyticsDelegate.mTransmitEvents.pop(); @@ -2181,6 +2186,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitEven EXPECT_EQ(sixthTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(sixthTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(sixthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kAcknowledged); + EXPECT_EQ(sixthTransmitEvent.retransmissionCount, std::nullopt); EXPECT_EQ(messageCounter, sixthTransmitEvent.messageCounter); } @@ -2280,6 +2286,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitFail EXPECT_EQ(firstTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(firstTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(firstTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kInitialSend); + EXPECT_EQ(firstTransmitEvent.retransmissionCount, std::nullopt); // We have no way of validating the first messageCounter since this is a randomly generated value, but it should // remain constant for all subsequent transmit events in this test. const uint32_t messageCounter = firstTransmitEvent.messageCounter; @@ -2289,6 +2296,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitFail EXPECT_EQ(secondTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(secondTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(secondTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); + EXPECT_EQ(secondTransmitEvent.retransmissionCount, 1); EXPECT_EQ(messageCounter, secondTransmitEvent.messageCounter); testAnalyticsDelegate.mTransmitEvents.pop(); @@ -2296,19 +2304,22 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitFail EXPECT_EQ(thirdTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(thirdTransmitEvent.fabricIndex, expectedFabricIndex); EXPECT_EQ(thirdTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); + EXPECT_EQ(thirdTransmitEvent.retransmissionCount, 2); EXPECT_EQ(messageCounter, thirdTransmitEvent.messageCounter); testAnalyticsDelegate.mTransmitEvents.pop(); - auto forthTransmitEvent = testAnalyticsDelegate.mTransmitEvents.front(); - EXPECT_EQ(forthTransmitEvent.nodeId, expectedNodeId); - EXPECT_EQ(forthTransmitEvent.fabricIndex, expectedFabricIndex); - EXPECT_EQ(forthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); - EXPECT_EQ(messageCounter, forthTransmitEvent.messageCounter); + auto fourthTransmitEvent = testAnalyticsDelegate.mTransmitEvents.front(); + EXPECT_EQ(fourthTransmitEvent.nodeId, expectedNodeId); + EXPECT_EQ(fourthTransmitEvent.fabricIndex, expectedFabricIndex); + EXPECT_EQ(fourthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); + EXPECT_EQ(fourthTransmitEvent.retransmissionCount, 3); + EXPECT_EQ(messageCounter, fourthTransmitEvent.messageCounter); testAnalyticsDelegate.mTransmitEvents.pop(); auto fifthTransmitEvent = testAnalyticsDelegate.mTransmitEvents.front(); EXPECT_EQ(fifthTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(fifthTransmitEvent.fabricIndex, expectedFabricIndex); + EXPECT_EQ(fifthTransmitEvent.retransmissionCount, 4); EXPECT_EQ(fifthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kRetransmission); EXPECT_EQ(messageCounter, fifthTransmitEvent.messageCounter); @@ -2316,6 +2327,7 @@ TEST_F(TestReliableMessageProtocol, CheckReliableMessageAnalyticsForTransmitFail auto sixthTransmitEvent = testAnalyticsDelegate.mTransmitEvents.front(); EXPECT_EQ(sixthTransmitEvent.nodeId, expectedNodeId); EXPECT_EQ(sixthTransmitEvent.fabricIndex, expectedFabricIndex); + EXPECT_EQ(sixthTransmitEvent.retransmissionCount, std::nullopt); EXPECT_EQ(sixthTransmitEvent.eventType, ReliableMessageAnalyticsDelegate::EventType::kFailed); EXPECT_EQ(messageCounter, sixthTransmitEvent.messageCounter); }