Apollo 应用与源码分析:Monitor监控-软件监控-channel时间延迟监控
创始人
2024-02-27 20:13:55
0

目录

代码

分析

主要结构

判断逻辑

备注


代码

class ChannelMonitor : public RecurrentRunner {public:explicit ChannelMonitor(const std::shared_ptr& latency_monitor);void RunOnce(const double current_time) override;private:static void UpdateStatus(const apollo::dreamview::ChannelMonitorConfig& config,ComponentStatus* status, const bool update_freq, const double freq);std::shared_ptr latency_monitor_;
};void ChannelMonitor::RunOnce(const double current_time) {auto manager = MonitorManager::Instance();const auto& mode = manager->GetHMIMode();auto* components = manager->GetStatus()->mutable_components();for (const auto& iter : mode.monitored_components()) {const std::string& name = iter.first;const auto& config = iter.second;if (config.has_channel()) {double freq;const auto update_freq =latency_monitor_->GetFrequency(config.channel().name(), &freq);UpdateStatus(config.channel(),components->at(name).mutable_channel_status(), update_freq,freq);}}
}

分析

主要结构

runOnce 中不变的套路:

  1. 先从HMI mode 中获取所有配置的监控项目;
  2. 遍历监控项目,使用latency_monitor_->GetFrequency 获取channel的频率;
  3. 使用UpdateStatus 更新状态,生成报警

判断逻辑

void ChannelMonitor::UpdateStatus(const apollo::dreamview::ChannelMonitorConfig& config,ComponentStatus* status, const bool update_freq, const double freq) {status->clear_status();const auto reader_message_pair = GetReaderAndLatestMessage(config.name());const auto reader = reader_message_pair.first;const auto message = reader_message_pair.second;if (reader == nullptr) {SummaryMonitor::EscalateStatus(ComponentStatus::UNKNOWN,absl::StrCat(config.name(), " is not registered in ChannelMonitor."),status);return;}if (message == nullptr || message->ByteSize() == 0) {SummaryMonitor::EscalateStatus(ComponentStatus::FATAL,absl::StrCat("the message ", config.name(), " reseived is empty."),status);return;}// Check channel delayconst double delay = reader->GetDelaySec();if (delay < 0 || delay > config.delay_fatal()) {SummaryMonitor::EscalateStatus(ComponentStatus::FATAL,absl::StrCat(config.name(), " delayed for ", delay, " seconds."),status);}// Check channel fieldsconst std::string field_sepr = ".";if (message != nullptr) {for (const auto& field : config.mandatory_fields()) {if (!ValidateFields(*message, absl::StrSplit(field, field_sepr), 0)) {SummaryMonitor::EscalateStatus(ComponentStatus::ERROR,absl::StrCat(config.name(), " missing field ", field), status);}}}// Check channel frequencyif (update_freq) {if (freq > config.max_frequency_allowed()) {SummaryMonitor::EscalateStatus(ComponentStatus::WARN,absl::StrCat(config.name(), " has frequency ", freq," > max allowed ", config.max_frequency_allowed()),status);}if (freq < config.min_frequency_allowed()) {SummaryMonitor::EscalateStatus(ComponentStatus::WARN,absl::StrCat(config.name(), " has frequency ", freq," < min allowed ", config.max_frequency_allowed()),status);}}SummaryMonitor::EscalateStatus(ComponentStatus::OK, "", status);
}
  1. 通过channel 创建reader,获取最后一条msg;
  2. 如果reader 创建失败就把状态设置为unknow;
  3. 如果最后一帧消息是空,就把状态设置为FATAL;
  4. double delay = reader->GetDelaySec(); 获取延迟;如果延迟<0或者大于阈值就FATAL报警;
  5. 检查必要字段是否缺失,如果缺失就ERROR;
  6. 检查发送频率是否正常,如果不在阈值区间就报WARN;

备注

template 
double Reader::GetDelaySec() const {if (latest_recv_time_sec_ < 0) {return -1.0;}if (second_to_lastest_recv_time_sec_ < 0) {return Time::Now().ToSecond() - latest_recv_time_sec_;}return std::max((Time::Now().ToSecond() - latest_recv_time_sec_),(latest_recv_time_sec_ - second_to_lastest_recv_time_sec_));
}

Reader 获取时间延迟的方法就是通过订阅接收到数据的然后做上一帧时间的差值

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...