diff --git a/include/fastdds_statistics_backend/StatisticsBackend.hpp b/include/fastdds_statistics_backend/StatisticsBackend.hpp index 4c05f6983..2e405529e 100644 --- a/include/fastdds_statistics_backend/StatisticsBackend.hpp +++ b/include/fastdds_statistics_backend/StatisticsBackend.hpp @@ -28,6 +28,7 @@ #include #include #include +#include namespace eprosima { namespace statistics_backend { @@ -78,6 +79,13 @@ class FASTDDS_STATISTICS_BACKEND_DllAPI StatisticsBackend CallbackMask callback_mask = CallbackMask::all(), DataKindMask data_mask = DataKindMask::none()); + static EntityId init_monitor( + DomainId domain, + const fastdds::dds::DomainParticipantQos& participant_qos, + DomainListener* domain_listener = nullptr, + CallbackMask callback_mask = CallbackMask::all(), + DataKindMask data_mask = DataKindMask::none()); + /** * @brief Starts monitoring the network corresponding to a server. * diff --git a/src/cpp/StatisticsBackend.cpp b/src/cpp/StatisticsBackend.cpp index 41dddadb7..41b1149cd 100644 --- a/src/cpp/StatisticsBackend.cpp +++ b/src/cpp/StatisticsBackend.cpp @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -174,6 +173,81 @@ void register_statistics_type_and_topic( } } +int16_t retrieve_entity_id( + const std::string& topic_name) +{ + if (HISTORY_LATENCY_TOPIC == topic_name) + { + return 1; + } + else if (NETWORK_LATENCY_TOPIC == topic_name) + { + return 2; + } + else if (PUBLICATION_THROUGHPUT_TOPIC == topic_name) + { + return 3; + } + else if (SUBSCRIPTION_THROUGHPUT_TOPIC == topic_name) + { + return 4; + } + else if (RTPS_SENT_TOPIC == topic_name) + { + return 5; + } + else if (RTPS_LOST_TOPIC == topic_name) + { + return 6; + } + else if (RESENT_DATAS_TOPIC == topic_name) + { + return 7; + } + else if (HEARTBEAT_COUNT_TOPIC == topic_name) + { + return 8; + } + else if (ACKNACK_COUNT_TOPIC == topic_name) + { + return 9; + } + else if (NACKFRAG_COUNT_TOPIC == topic_name) + { + return 10; + } + else if (GAP_COUNT_TOPIC == topic_name) + { + return 11; + } + else if (DATA_COUNT_TOPIC == topic_name ) + { + return 12; + } + else if (PDP_PACKETS_TOPIC == topic_name) + { + return 13; + } + else if (EDP_PACKETS_TOPIC == topic_name) + { + return 14; + } + else if (DISCOVERY_TOPIC == topic_name) + { + return 15; + } + else if (SAMPLE_DATAS_TOPIC == topic_name) + { + return 16; + } + else if (PHYSICAL_DATA_TOPIC == topic_name) + { + return 17; + } + + return -1; +} + EntityId create_and_register_monitor( const std::string& domain_name, DomainListener* domain_listener, @@ -249,10 +323,15 @@ EntityId create_and_register_monitor( throw Error("Error initializing monitor. Could not create topic " + std::string(topic)); } + DataReaderQos datareader_qos = eprosima::fastdds::statistics::dds::STATISTICS_DATAREADER_QOS; + datareader_qos.endpoint().entity_id = retrieve_entity_id(topic); + datareader_qos.endpoint().user_defined_id = -2; + + /* Create DataReaders */ monitor->readers[topic] = monitor->subscriber->create_datareader( monitor->topics[topic], - eprosima::fastdds::statistics::dds::STATISTICS_DATAREADER_QOS, + datareader_qos, monitor->reader_listener, StatusMask::all()); @@ -328,6 +407,35 @@ EntityId StatisticsBackend::init_monitor( domain_id); } +EntityId StatisticsBackend::init_monitor( + DomainId domain_id, + const DomainParticipantQos& participant_qos, + DomainListener* domain_listener, + CallbackMask callback_mask, + DataKindMask data_mask) +{ + /* Set domain_name */ + std::stringstream domain_name; + domain_name << domain_id; + + /* Set DomainParticipantQoS */ + DomainParticipantQos participant_qos_copy = participant_qos; + /* Previous string conversion is needed for string_255 */ + std::string participant_name = "monitor_domain_" + std::to_string(domain_id); + participant_qos_copy.name(participant_name); + if (participant_qos_copy.transport().use_builtin_transports) + { + /* Avoid using SHM transport by default */ + std::shared_ptr udp_transport = + std::make_shared(); + participant_qos_copy.transport().user_transports.push_back(udp_transport); + participant_qos_copy.transport().use_builtin_transports = false; + } + return create_and_register_monitor( + domain_name.str(), domain_listener, callback_mask, data_mask, participant_qos_copy, + domain_id); +} + void StatisticsBackend::stop_monitor( EntityId monitor_id) {