Apollo 应用与源码分析:Monitor监控-软件监控-模块存活监控

目录

代码入口

分析


代码入口

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 模块。

实际的检查逻辑比较简单:

  1. 获取所有要被监控的节点;
  2. 在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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ym影子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值