MinIO Prometheus 监控实战指南:四个指标端点、JWT 认证配置与 Grafana 可视化全解
【免费下载链接】minioMinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.项目地址: https://gitcode.com/GitHub_Trending/mi/minio
本篇围绕 MinIO 官方文档《How to monitor MinIO server with Prometheus》展开,讲清 MinIO 如何以 Prometheus 兼容格式对外暴露指标、如何通过MINIO_PROMETHEUS_AUTH_TYPE控制端点认证方式,以及如何完成从生成scrape_configs、启动 Prometheus 到 Grafana 可视化与 AlertManager 告警的完整落地流程。读完本文,你将能够独立为 MinIO(单机或分布式部署)搭建可运维的监控体系,并理解各指标端点背后的源码实现。
1. MinIO 暴露的 Prometheus 指标端点总览
Prometheus 是一个云原生监控平台,采用多维数据模型:时间序列数据由“指标名 + key/value 标签对”唯一标识,采集通过 HTTP/HTTPS 上的拉取(pull)模型完成。MinIO 服务端默认即以 Prometheus 兼容格式暴露数据,监控方只需将 Prometheus 指向相应端点抓取即可。
MinIO 提供 4 个按不同维度划分的 v2 指标端点,完整清单见 监控总览文档:
| 端点 | 维度 | 特点 |
|---|---|---|
/minio/v2/metrics/cluster | 集群级 | 从任意单个节点即可读取整个集群的指标。这意味着经过负载均衡器暴露的 MinIO 实例,无需知晓各节点地址即可完成全集群指标采集 |
/minio/v2/metrics/bucket | 桶级(bucket centric) | 按桶维度聚合的指标 |
/minio/v2/metrics/node | 节点级(node centric) | 额外包含 Go runtime 指标与进程指标,需逐节点抓取 |
/minio/v2/metrics/resource | 资源级(resource centric) | 面向底层资源(磁盘、网络等)的指标 |
上述路径在源码中集中定义于 cmd/metrics-router.go:
const ( prometheusMetricsPathLegacy = "/prometheus/metrics" prometheusMetricsV2ClusterPath = "/v2/metrics/cluster" prometheusMetricsV2BucketPath = "/v2/metrics/bucket" prometheusMetricsV2NodePath = "/v2/metrics/node" prometheusMetricsV2ResourcePath = "/v2/metrics/resource" // Metrics v3 endpoints metricsV3Path = "/metrics/v3" )两点需要注意:
- 旧的
/minio/prometheus/metrics端点已废弃(deprecated),官方文档明确要求使用上述 v2 端点; - 从源码结构看,路由中还注册了新的
/metrics/v3端点,由newMetricsV3Server处理并支持?list查询参数,属于 v2 之外的另一套指标接口,本文聚焦 v2 端点的 Prometheus 抓取场景。
各端点 Handler 的注册逻辑同样位于 cmd/metrics-router.go:
func registerMetricsRouter(router *mux.Router) { // metrics router metricsRouter := router.NewRoute().PathPrefix(minioReservedBucketPath).Subrouter() authType := prometheusAuthType(strings.ToLower(env.Get(EnvPrometheusAuthType, string(prometheusJWT)))) auth := AuthMiddleware if authType == prometheusPublic { auth = NoAuthMiddleware } metricsRouter.Handle(prometheusMetricsPathLegacy, auth(metricsHandler())) metricsRouter.Handle(prometheusMetricsV2ClusterPath, auth(metricsServerHandler())) metricsRouter.Handle(prometheusMetricsV2BucketPath, auth(metricsBucketHandler())) metricsRouter.Handle(prometheusMetricsV2NodePath, auth(metricsNodeHandler())) metricsRouter.Handle(prometheusMetricsV2ResourcePath, auth(metricsResourceHandler())) // ... }2. 准备 Prometheus
- 下载 Prometheus 对应平台的最新发行版并解压(下载渠道见 Prometheus 官方站点):
tar xvfz prometheus-*.tar.gz cd prometheus-*- Prometheus 服务端是一个名为
prometheus(Windows 下为prometheus.exe)的单二进制文件。运行并传入--help可查看全部可用参数:
./prometheus --help usage: prometheus [<flags>] The Prometheus monitoring server . . .开始前提前需已按 MinIO 官方快速入门文档部署好 MinIO 实例。
3. 配置 MinIO 指标端点的认证模式
MinIO 对 Prometheus 端点支持两种认证模式,由环境变量MINIO_PROMETHEUS_AUTH_TYPE控制,取值jwt(默认)或public。从 cmd/metrics-router.go 可以确认这一实现事实:
// Standard env prometheus auth type const ( EnvPrometheusAuthType = "MINIO_PROMETHEUS_AUTH_TYPE" EnvPrometheusOpenMetrics = "MINIO_PROMETHEUS_OPEN_METRICS" ) type prometheusAuthType string const ( prometheusJWT prometheusAuthType = "jwt" prometheusPublic prometheusAuthType = "public" )即路由注册时读取该环境变量并转小写,默认为jwt;仅当显式设为public时,端点才切换为NoAuthMiddleware(免认证)。源码中还定义了MINIO_PROMETHEUS_OPEN_METRICS环境变量,从命名可推断其用于控制指标输出是否采用 OpenMetrics 格式。
允许免认证抓取(适用于内部可信网络):
export MINIO_PROMETHEUS_AUTH_TYPE="public" minio server ~/test默认 JWT 模式下,Prometheus 抓取请求必须携带凭证。Prometheus 支持 bearer token 认证抓取请求,MinIO 官方推荐用mc直接生成配置(见下节),无需手工管理 token。
4. 编写 Prometheus 抓取配置
4.1 认证模式:用 mc 生成 scrape_configs
如果已将 MinIO 配置为免认证暴露指标,可跳过本节直接使用 4.2 的公开配置。
对别名执行如下命令即可生成对应的scrape_configs片段,METRIC-TYPE的合法取值为cluster、node、bucket、resource,缺省为cluster:
mc admin prometheus generate <alias> [METRIC-TYPE]命令为每个类型生成如下四种配置(bearer_token为 mc 生成的密钥):
集群级(Cluster)
scrape_configs: - job_name: minio-job bearer_token: <secret> metrics_path: /minio/v2/metrics/cluster scheme: http static_configs: - targets: ['localhost:9000']桶级(Bucket centric)
- job_name: minio-job-bucket bearer_token: <secret> metrics_path: /minio/v2/metrics/bucket scheme: http static_configs: - targets: ['localhost:9000']节点级(Node centric,可选)
- job_name: minio-job-node bearer_token: <secret> metrics_path: /minio/v2/metrics/node scheme: http static_configs: - targets: ['localhost:9000']资源级(Resource centric,可选)
- job_name: minio-job-resource bearer_token: <secret> metrics_path: /minio/v2/metrics/resource scheme: http static_configs: - targets: ['localhost:9000']4.2 公开模式:免认证抓取配置
当认证类型设为public时,无需bearer_token。集群级与桶级指标各只需在任一节点抓取一次即可采集全量:
集群级
scrape_configs: - job_name: minio-job metrics_path: /minio/v2/metrics/cluster scheme: http static_configs: - targets: ['localhost:9000']桶级
scrape_configs: - job_name: minio-job-bucket metrics_path: /minio/v2/metrics/bucket scheme: http static_configs: - targets: ['localhost:9000']节点级(可选)——节点指标必须逐服务器实例采集,因此targets需要列出所有节点,这样 Grafana 等可视化系统才能按节点区分展示:
scrape_configs: - job_name: minio-job metrics_path: /minio/v2/metrics/node scheme: http static_configs: - targets: ['server1:9000','server2:9000','server3:9000','server4:9000']资源级(可选)
scrape_configs: - job_name: minio-job metrics_path: /minio/v2/metrics/resource scheme: http static_configs: - targets: ['localhost:9000']4.3 各端点 Handler 的底层实现
理解各端点“抓回来什么”有助于选择监控策略,源码中的 Handler 差异十分直观:
- 节点级:cmd/metrics-v2.go 中
metricsNodeHandler注册了nodeCollector,并额外挂入prometheus.NewProcessCollector(带minioNamespace前缀的进程指标)与prometheus.NewGoCollector(Go runtime 指标),这与文档中“node 端点额外包含 go metrics 或 process metrics”的描述完全一致; - 集群级:
metricsServerHandler(cmd/metrics-v2.go)将clusterCollector注册进独立 registry 后聚合输出,因此任一节点返回的都是集群视角数据; - 桶级/资源级:分别由
metricsBucketHandler(cmd/metrics-v2.go)与 cmd/metrics-resource.go 中的metricsResourceHandler提供。
所有 Handler 最终都通过expfmt.NewEncoder按客户端协商的Content-Type输出 Prometheus 文本格式。
5. 启动 Prometheus 并验证抓取
- 将生成的
scrape_configs片段复制进prometheus.yml并保存; - 启动(或重启)Prometheus:
./prometheus --config.file=prometheus.yml其中prometheus.yml为配置文件名。启动后在 Prometheus 控制台(默认http://localhost:9090)即可看到 MinIO 指标与抓取目标状态。
负载均衡 / 反向代理部署注意:Prometheus 对 MinIO 指标端点的 HTTP 请求会把Host头设置为domain:port。若 MinIO 部署在负载均衡器、反向代理或其他控制平面(HAProxy、nginx、pfsense、opnsense 等)之后,需确保这些网络设备能够将此类请求正确路由到 MinIO 部署,否则抓取会失败。
6. 用 Grafana 可视化 MinIO 指标
Prometheus 配置完成后,推荐使用 Grafana 进行可视化。MinIO 仓库内置了官方 Grafana 面板 JSON 文件,位于 docs/metrics/prometheus/grafana/,可直接导入:
| 面板 | JSON 文件 | 说明 |
|---|---|---|
| 集群总览 | minio-dashboard.json | 官方主监控面板 |
| 节点级 | minio-node.json | 配合 node 端点抓取,按节点展示 |
| 桶级 | minio-bucket.json | 配合 bucket 端点抓取 |
| 复制集群级 | minio-replication-cluster.json | 跨站点复制集群视角 |
| 复制节点级 | minio-replication-node.json | 跨站点复制节点视角 |
官方文档同时提醒:这些面板均为示例基线,实际使用中应在此基础上定制并补充新的图表。主面板效果如文首所示。
7. 配置 Prometheus AlertManager 告警
完整的告警配置流程见仓库内 alerts.md,要点如下:
- 部署 AlertManager:编写路由配置(分组、去重、抑制规则),例如使用 webhook 接收器
http://127.0.0.1:8010/webhook,AlertManager 默认监听9093端口; - 让 Prometheus 对接 AlertManager:在
prometheus.yml中追加:
alerting: alertmanagers: - static_configs: - targets: ['localhost:9093'] rule_files: - rules.yml- 添加 MinIO 告警规则(
rules.yml示例——纠删集失去法定人数):
groups: - name: example rules: - alert: MinIOClusterTolerance expr: minio_cluster_health_erasure_set_status < 1 for: 5m labels: severity: critical annotations: summary: "Instance {{ $labels.server }} has lost quorum on pool {{ $labels.pool }} on set {{ $labels.set }}" description: "MinIO instance {{ $labels.server }} of job {{ $labels.job }} has lost quorum on pool {{ $labels.pool }} on set {{ $labels.set }} for more than 5 minutes."- 验证方式:启动 4 节点分布式 MinIO + Prometheus + AlertManager,停掉若干节点使纠删集容错度降为 -1,用
mc admin prometheus metrics ALIAS | grep minio_cluster_health_erasure_set_status确认指标变化,等待 5 分钟后(规则for: 5m)即可在 webhook 与 Prometheus 控制台看到 firing 的告警:
8. 指标清单与延伸阅读
- 集群级与桶级暴露的完整指标列表(含每项指标定义)见 docs/metrics/prometheus/list.md,该文档按
/minio/v2/metrics/cluster、/minio/v2/metrics/bucket、/minio/v2/metrics/resource端点分段列出; - 除 Prometheus 外,MinIO 还提供免认证的 liveness 探针
/minio/health/live与集群探针/minio/health/cluster,可用于 Kubernetes 等编排场景的健康探测,详见 docs/metrics/healthcheck/README.md; - 在 Kubernetes 环境使用 Prometheus Operator 时,MinIO 官方 Helm Chart 的 ServiceMonitor 模板已默认配置
/minio/v2/metrics/node与/minio/v2/metrics/cluster两条抓取路径,见 helm/minio/templates/servicemonitor.yaml。
小结
- MinIO 默认以 JWT 认证暴露 4 个 Prometheus v2 指标端点(cluster / bucket / node / resource),集群级端点支持从任意单节点拉取全集群数据,是负载均衡部署下的首选;
- 免认证模式只需设置
MINIO_PROMETHEUS_AUTH_TYPE="public";认证模式推荐用mc admin prometheus generate <alias> [METRIC-TYPE]自动生成带bearer_token的scrape_configs; - 节点级指标需在
targets中列出全部服务器实例,才能支撑 Grafana 的按节点可视化; - 仓库内配套的 Grafana 面板 JSON、AlertManager 告警示例与指标清单文档,构成了从采集、可视化到告警的完整监控闭环。
【免费下载链接】minioMinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.项目地址: https://gitcode.com/GitHub_Trending/mi/minio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考