为什么 ceph mgr 的指标不见了?

January 15, 2018

ceph 从 12.2.0 到升级 12.2.2 后,通过ceph-mgr 的 prometheus 插件收集的一些指标比之前少了,例如 Monitor 里的 osd_bytes 就不见了,调查了下。

先建立测试环境。部署一个单节点的集群,并开启 prometheus mgr plugin。修改 plugin 后重启 mgr 就可以看到测试结果。

首先发现 prometheus 插件收集用了 get_all_perf_counters,而查看其源码发现其接收一个参数 prio_limit, 过滤了一些指标,于是设置该参数为 PRIO_DEBUGONLY,然而 osd_bytes 指标依然未出现。于是跟踪 get_perf_schema,得到 MgrModule::get_perf_schema -> BaseMgrModule.cc::get_perf_schema -> ActivePyModules::get_perf_schema_python -> daemon_state,跟踪 daemon_state,发现是在 Mgr::load_all_metadata 载入的,并没有什么特别,再查看 daemon_state[key].perf_counters, 发现它是在 DaemonServer::handle_report 更新的,跟踪 MMgrReport 得到发送者在 MgrClient::send_report,查看代码发现有以下过滤逻辑:

auto include_counter = [this](
        const PerfCounters::perf_counter_data_any_d &ctr,
        const PerfCounters &perf_counters)
    {
      return perf_counters.get_adjusted_priority(ctr.prio) >= (int)stats_threshold;
    };

通过跟踪 stats_threshold 发现有配置参数 mgr_stats_threshold,而 osd_bytes priority 为 DEBUG_ONLY(=0),而 mgr_stats_threshold 默认为 PRIO_USEFUL,因此未包括,将配置改为 0,问题解决。