注意
本文档适用于 Ceph 的开发版本。
Prometheus 模块
Manager prometheus 模块实现了一个 Prometheus 导出器,用于从 Manager 中的收集点公开 Ceph 性能计数器。Manager 接收来自所有 MgrClient 进程(包括 mons 和 OSD)的 MMgrReport 消息,其中包含性能计数器模式数据和计数器数据,并维护最新样本的循环缓冲区。此模块侦听 HTTP 端点,并在抓取时检索每个计数器的最新样本。HTTP 路径和查询参数将被忽略。所有报告实体所有现存的计数器都以 Prometheus 暴露格式返回。(请参阅 Prometheus 文档。)
启用 Prometheus 输出
运行以下命令启用 prometheus 模块
ceph mgr module enable prometheus
配置
注意
必须重新启动 prometheus Manager 模块才能应用配置更改。
- server_addr
模块侦听 HTTP 请求的 IPv4 或 IPv6 地址
- 类型:
str- 默认值:
::
- server_port
模块侦听 HTTP 请求的端口
- 类型:
int- 默认值:
9283
- scrape_interval
- 类型:
float- 默认值:
15.0
- cache
- 类型:
bool- 默认值:
true
- stale_cache_strategy
- 类型:
str- 默认值:
log
- rbd_stats_pools
- 类型:
str- 默认值:
<空字符串>
- rbd_stats_pools_refresh_interval
- 类型:
int- 默认值:
300
- standby_behaviour
- 类型:
str- 默认值:
default
- standby_error_status_code
- 类型:
int- 默认值:
500- 允许范围:
[400, 599]
- exclude_perf_counters
从单个 Prometheus 导出器收集性能计数器会降低 ceph-mgr 性能,尤其是在大型集群中。相反,默认情况下使用 Ceph-exporter 守护程序来收集性能计数器。仅当未部署 ceph-exporters 时才应禁用此功能。
- 类型:
bool- 默认值:
true
- healthcheck_history_max_entries
要保留的健康检查历史记录条目的最大数量
- 类型:
int- 默认值:
1000
默认情况下,模块将接受主机上所有 IPv4 和 IPv6 地址上端口 9283 的 HTTP 请求。端口和侦听地址可通过 ceph config set 配置,键分别为 mgr/prometheus/server_addr 和 mgr/prometheus/server_port。此端口已在 Prometheus 的 注册表 中注册。
ceph config set mgr mgr/prometheus/server_addr 0.0.0.0
ceph config set mgr mgr/prometheus/server_port 9283
警告
此模块的 mgr/prometheus/scrape_interval 应与 Prometheus 的抓取间隔匹配才能正常工作。
模块中的抓取间隔用于缓存目的并确定缓存何时过期。
不建议使用低于 10 秒的抓取间隔。建议使用 15 秒作为抓取间隔,尽管在某些情况下增加抓取间隔可能很有用。
要在 Prometheus 模块中设置不同的抓取间隔,请将 scrape_interval 设置为所需值
ceph config set mgr mgr/prometheus/scrape_interval 20
在大型集群(>1000 个 OSD)上,获取指标的时间可能会变得很长。如果没有缓存,Prometheus manager 模块可能会使 manager 过载,尤其是在与多个 Prometheus 实例结合使用时,并导致 Ceph Manager 实例无响应或崩溃。因此,默认情况下会启用缓存。这意味着缓存有可能变得陈旧。当从 Ceph 获取指标的时间超过配置的 mgr/prometheus/scrape_interval 时,缓存被认为是陈旧的。
如果是这种情况,将记录一条警告,模块将返回 503 HTTP 状态码(服务不可用),或者它将返回缓存的内容,即使它可能已过期。
可以配置此行为。默认情况下,它将返回 503 HTTP 状态码(服务不可用)。您可以使用 ceph config set 命令设置其他选项。
要配置模块以返回可能过时的数据,请将缓存策略设置为 return
ceph config set mgr mgr/prometheus/stale_cache_strategy return
要配置模块以返回“服务不可用”,请将其设置为 fail
ceph config set mgr mgr/prometheus/stale_cache_strategy fail
如果您确信不需要缓存,可以禁用它
ceph config set mgr mgr/prometheus/cache false
如果您在反向代理或负载均衡器后面使用 prometheus 模块,您可以通过切换到 error 模式来简化活动实例的发现
ceph config set mgr mgr/prometheus/standby_behaviour error
如果设置了此选项,当从 standby 实例请求 / 时,prometheus 模块将响应 HTTP 错误。默认错误代码为 500,但您可以使用以下命令配置 HTTP 响应代码
ceph config set mgr mgr/prometheus/standby_error_status_code 503
有效错误代码介于 400-599 之间。
要切换回默认行为,只需将配置键设置为 default
ceph config set mgr mgr/prometheus/standby_behaviour default
Ceph 健康检查
Manager prometheus 模块跟踪并维护 Ceph 健康检查的历史记录,将其作为离散指标公开给 Prometheus 服务器。这允许为特定的健康检查事件配置 Alertmanager 规则。
指标采用以下形式
# HELP ceph_health_detail healthcheck status by type (0=inactive, 1=active)
# TYPE ceph_health_detail gauge
ceph_health_detail{name="OSDMAP_FLAGS",severity="HEALTH_WARN"} 0.0
ceph_health_detail{name="OSD_DOWN",severity="HEALTH_WARN"} 1.0
ceph_health_detail{name="PG_DEGRADED",severity="HEALTH_WARN"} 1.0
该模块还维护健康检查状态的内存中历史记录。默认情况下,历史记录最多保留 1000 个条目。此限制可通过以下运行时选项配置
mgr/prometheus/healthcheck_history_max_entries- 要在内存中跟踪的唯一健康检查条目的最大数量(默认值:1000)。
此设置有助于避免大型或长期运行的集群中内存无限增长。
可以通过运行以下命令检索和清除健康检查历史记录
ceph healthcheck history ls [--format {plain|json|json-pretty}]
ceph healthcheck history clear
ceph healthcheck ls 命令提供自上次发出 clear 命令以来集群遇到的健康检查概述
ceph healthcheck history ls
Healthcheck Name First Seen (UTC) Last seen (UTC) Count Active
OSDMAP_FLAGS 2021/09/16 03:17:47 2021/09/16 22:07:40 2 No
OSD_DOWN 2021/09/17 00:11:59 2021/09/17 00:11:59 1 Yes
PG_DEGRADED 2021/09/17 00:11:59 2021/09/17 00:11:59 1 Yes
3 health check(s) listed
RBD IO 统计信息
prometheus 模块可以通过启用动态 OSD 性能计数器来选择性地收集 RBD 每映像 IO 统计信息。将为 mgr/prometheus/rbd_stats_pools 配置参数指定的池中的所有映像收集统计信息。该参数是以逗号或空格分隔的 pool[/namespace] 条目列表。如果未指定 RBD 命名空间,则将收集池中所有命名空间的统计信息。
要启用收集名为 pool1、pool2 和 poolN 的 RBD 池的统计信息
ceph config set mgr mgr/prometheus/rbd_stats_pools "pool1,pool2,poolN"
可以使用通配符指示所有池或命名空间
ceph config set mgr mgr/prometheus/rbd_stats_pools "*"
该模块通过扫描指定的池和命名空间来维护所有可用映像的列表。刷新周期可通过 mgr/prometheus/rbd_stats_pools_refresh_interval 参数配置,默认为 300 秒(5 分钟)。如果模块检测到来自以前未知的 RBD 映像的统计信息,它将强制提前刷新。
要将同步间隔设置为 10 分钟,请运行以下命令
ceph config set mgr mgr/prometheus/rbd_stats_pools_refresh_interval 600
Ceph 守护程序性能计数器指标
引入 ceph-exporter 守护程序后,prometheus 模块将不再默认将 Ceph 守护程序性能计数器导出为 Prometheus 指标。但是,可以通过将模块选项 exclude_perf_counters 设置为 false 来重新启用导出这些指标
ceph config set mgr mgr/prometheus/exclude_perf_counters false
统计信息名称和标签
这些 Prometheus 统计信息名称是 Ceph 本地名称,非法字符 .、- 和 :: 已转换为 _,并加上前缀 ceph_。
所有守护程序统计信息都带有一个 ceph_daemon 标签,其值标识它们来自的守护程序的类型和 ID,例如 osd.123。给定指标可能由多种类型的守护程序报告,因此例如在查询 OSD RocksDB 统计信息时,您可以使用 ceph_daemon=~'osd.*' 形式的模式来约束查询,以便排除 Monitor RocksDB 指标。
集群统计信息(即 Ceph 集群全局的统计信息)具有与其报告的实体相对应的标签。例如,与池相关的指标具有 pool_id 标签。
代表 Ceph 统计信息直方图的长期运行平均值由成对的 <name>_sum 和 <name>_count 指标表示。这类似于直方图在 Prometheus 中的表示方式,并且它们被 类似地 处理。
池和 OSD 元数据系列
导出系列是为了便于显示和查询某些元数据字段。
池具有以下形式的 ceph_pool_metadata 指标
ceph_pool_metadata{pool_id="2",name="cephfs_metadata_a"} 1.0
OSD 具有以下形式的 ceph_osd_metadata 指标
ceph_osd_metadata{cluster_addr="172.21.9.34:6802/19096",device_class="ssd",ceph_daemon="osd.0",public_addr="172.21.9.34:6801/19096",weight="1.0"} 1.0
将驱动器统计信息与 node_exporter 相关联
Ceph 集群 Prometheus 指标与来自 Prometheus node_exporter 的通用主机指标结合使用。
为了将 Ceph OSD 统计信息与 node_exporter 的驱动器统计信息相关联,Ceph 创建了以下形式的系列
ceph_disk_occupation_human{ceph_daemon="osd.0", device="sdd", exported_instance="myhost"}
要按 OSD ID 查询驱动器指标,请在 Prometheus 查询中使用 and 运算符或 * 运算符。所有元数据指标(如 ceph_disk_occupation_human)的值都为 1,以便它们以中性方式与 PromQL * 运算符结合。使用 * 允许使用 group_left 和 group_right 分组修饰符,以便结果具有查询一侧的附加标签。
有关构建 PromQL 查询和通过 Prometheus 表达式浏览器进行交互式探索的更多信息,请参阅 prometheus 文档。
例如,我们可以运行如下查询
rate(node_disk_written_bytes_total[30s]) and
on (device,instance) ceph_disk_occupation_human{ceph_daemon="osd.0"}
开箱即用,上述查询不会返回任何指标,因为这两个指标的 instance 标签不匹配。ceph_disk_occupation_human 的 instance 标签将是当前活动的 Manager。
以下部分概述了解决此问题的两种方法。
注意
如果您需要按 ceph_daemon 标签而不是 device 和 instance 标签分组,则使用 ceph_disk_occupation_human 可能无法可靠地工作。建议您改用 ceph_disk_occupation。
区别在于 ceph_disk_occupation_human 在多个 OSD 共享一个设备的情况下,可能会将多个 OSD 分组到单个 ceph_daemon 标签的值中。
使用 label_replace
label_replace 函数(请参阅 label_replace 文档)可以在查询中向指标添加标签或更改指标的标签。
要将 OSD 与其驱动器的写入速率相关联,可以使用以下形式的查询
label_replace(
rate(node_disk_written_bytes_total[30s]),
"exported_instance",
"$1",
"instance",
"(.*):.*"
) and on (device, exported_instance) ceph_disk_occupation_human{ceph_daemon="osd.0"}
配置 Prometheus 服务器
honor_labels
要使 Ceph 输出与任何主机相关的正确标记数据,请在将 Manager 端点添加到 Prometheus 配置时使用 honor_labels 设置。
这会指示 Ceph 导出正确的 instance 标签,而无需 Prometheus 在摄取时覆盖它们。如果没有此设置,Prometheus 会应用一个 instance 标签,其中包含从中抓取每个指标的端点的主机名和端口。由于 Ceph 集群有多个 Manager 守护程序,这会导致 instance 标签在活动 Manager 守护程序更改时发生更改。
如果这是不希望的,可以在 Prometheus 目标配置中设置自定义 instance 标签。您可能希望将其设置为第一个 Manager 的主机名,或任意值(例如 ceph_cluster)。
node_exporter 主机名标签
设置您的 instance 标签以匹配 Ceph OSD 元数据中 instance 字段中显示的内容。这通常是节点的短主机名。
仅当您想将 Ceph 统计信息与主机统计信息相关联时才需要这样做,但您可能会发现这样做有助于将来关联历史数据。
示例配置
此示例显示了一个部署,其中 Manager 和 node_exporter 放置在名为 senta04 的服务器上。请注意,这需要为每个 node_exporter 目标添加适当且唯一的 instance 标签。
这只是一个示例:还有其他方法可以配置 Prometheus 抓取目标和标签重写规则。
prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node'
file_sd_configs:
- files:
- node_targets.yml
- job_name: 'ceph'
honor_labels: true
file_sd_configs:
- files:
- ceph_targets.yml
ceph_targets.yml
[
{
"targets": [ "senta04.mydomain.com:9283" ],
"labels": {}
}
]
node_targets.yml
[
{
"targets": [ "senta04.mydomain.com:9100" ],
"labels": {
"instance": "senta04"
}
}
]
注意事项
导出计数器和仪表。直方图和长期运行平均值目前未导出。Ceph 的二维直方图可以简化为两个单独的一维直方图,并且长期运行平均值可以导出为 Prometheus Summary 类型的指标。
时间戳(与许多导出器一样)由 Prometheus 在摄取时设置为 Prometheus 服务器的抓取时间。Prometheus 期望它正在同步轮询实际的计数器进程。可以随统计报告一起提供时间戳,但 Prometheus 团队强烈建议不要这样做。这意味着时间戳会延迟不可预测的时间。目前尚不清楚这是否会有问题,但值得了解。