Tabla de contenido
entrada de código
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);
}
}
}
analizar
Hay una clase de gestión en el módulo de detección de supervivencia: node_manager
node_manager_ =
cyber::service_discovery::TopologyManager::Instance()->node_manager();
Las relaciones de elementos simples en la red (nodos, canales, servicios, escritores, lectores, clientes y servidores) están representadas por topología. Puede imaginar un gráfico dirigido: los nodos son contenedores de servidores/clientes/escritores/lectores, son los vértices del gráfico, los canales son los bordes que fluyen de los escritores a los lectores, los servicios son flujos desde los servidores hasta el borde del cliente. Para generar este gráfico, usamos TopologyManager, que tiene tres subadministradores: NodeManager: puede encontrar nodos en esta topología ChannelManager: puede encontrar canales, sus escritores y lectores en esta topología: ServiceManager: puede encontrarlos en esta topología Servicios se encuentran en , y sus servidores y clientes TopologyManager se comunican mediante el participante de fast-rtps. Puede transmitir unirse o dejar mensajes para estos elementos. Además, puede registrar su propio 'ChangeFunc' para monitorear los cambios de topología.
Se puede decir que este node_manger contiene todos los módulos de nodo de apollo.
La lógica de verificación real es relativamente simple:
- Obtener todos los nodos para ser monitoreados;
- Juicio de estado en 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);
}
El juicio de estado aquí es juzgar si el node_manger contiene el nodo marcado