Оглавление
ввод кода
class ModuleMonitor : public RecurrentRunner {
public:
using NodeManagerPtr = std::shared_ptr<cyber::service_discovery::NodeManager>;
ModuleMonitor();
void RunOnce(const double current_time) override;
void UpdateStatus(const apollo::dreamview::ModuleMonitorConfig& config,
const std::string& module_name, ComponentStatus* status);
private:
NodeManagerPtr node_manager_ = nullptr;
};
void ModuleMonitor::RunOnce(const double current_time) {
auto manager = MonitorManager::Instance();
const auto& mode = manager->GetHMIMode();
// Check monitored components.
auto* components = manager->GetStatus()->mutable_components();
for (const auto& iter : mode.monitored_components()) {
const std::string& name = iter.first;
const auto& monitored_component = iter.second;
if (monitored_component.has_module() &&
apollo::common::util::ContainsKey(*components, name)) {
const auto& config = monitored_component.module();
auto* status = components->at(name).mutable_module_status();
UpdateStatus(config, name, status);
}
}
}
анализировать
В модуле обнаружения выживания есть класс управления: node_manager
node_manager_ =
cyber::service_discovery::TopologyManager::Instance()->node_manager();
Отношения простых элементов в сети — узлов, каналов, служб, писателей, читателей, клиентов и серверов — представлены топологией. Вы можете представить ориентированный граф — узлы — это контейнеры серверов/клиентов/писателей/читателей, они являются вершинами графа, каналы — это ребра, которые текут от писателей к читателям, сервисы — это потоки от серверов к ребру клиента. Для создания этого графа мы используем TopologyManager, который имеет три подменеджера — NodeManager: вы можете найти узлы в этой топологии ChannelManager: вы можете найти каналы, их Writers и Readers в этой топологии: ServiceManager: вы можете найти их в этой топологии Services находятся в , а их серверы и клиенты TopologyManager взаимодействуют с помощью участника fast-rtps. Он может транслировать сообщения о присоединении или выходе для этих элементов. Кроме того, вы можете зарегистрировать свой собственный ChangeFunc для отслеживания изменений топологии.
Можно сказать, что этот node_manger содержит все модули узла Apollo.
Фактическая логика проверки относительно проста:
- Получить все узлы для мониторинга;
- Оценка статуса в UpdateStatus
void ModuleMonitor::UpdateStatus(
const apollo::dreamview::ModuleMonitorConfig& config,
const std::string& module_name, ComponentStatus* status) {
status->clear_status();
bool all_nodes_matched = true;
for (const std::string& name : config.node_name()) {
if (!node_manager_->HasNode(name)) {
all_nodes_matched = false;
break;
}
}
if (all_nodes_matched) {
// Working nodes are all matched. The module is running.
SummaryMonitor::EscalateStatus(ComponentStatus::OK, module_name, status);
return;
}
SummaryMonitor::EscalateStatus(ComponentStatus::FATAL, "", status);
}
Оценка состояния здесь заключается в том, чтобы определить, содержит ли node_manger проверенный узел.