目录
代码入口
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:你可以在这个拓扑中找到通道,它们的Writer和Reader: ServiceManager:你可以在这个拓扑中找到服务,它们的Servers和Clients TopologyManager使用fast-rtps' Participant进行通信。它可以广播这些元素的加入或离开消息。此外,您可以注册自己的' ChangeFunc '来监视拓扑变化.
可以说这个node_manger中包含了apollo 所有的node 模块。
实际的检查逻辑比较简单:
- 获取所有要被监控的节点;
- 在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 中是不是包含被检查的node