MongoDB 监控(四)MongoDB Exporter 的初步使用

MongoDB 监控系列第四篇:创建 MongoDB Exporter 监控用户,按 README 配置 clusterMonitor 和 local read 权限,下载 Percona mongodb_exporter,启动 /metrics 端点,并用 --collect-all 验证 MongoDB 指标采集。

作者 快猫实习生

MongoDB 监控

这是 MongoDB 监控系列文章的第四篇,前面几篇文章的链接如下:

这篇开始咱们做个实操。根据前面的文章,要监控 MongoDB,需要创建一个账号并分配权限,咱也不知道咋搞,先问问,掌握个大概。

核心要点摘要

  • 本文延续前一篇 README 阅读结果,实际创建 MongoDB Exporter 使用的监控用户。
  • AIGC 给出的示例权限是 clusterMonitor + readAnyDatabase,本文实际采用 MongoDB Exporter README 中提到的 clusterMonitor + localread
  • 本地环境下载的是 mongodb_exporter-0.42.1.darwin-arm64.tar.gz,适配 MacBook M1。
  • 启动 Exporter 后,通过 curl -s localhost:9216/metrics 验证 /metrics 端点,并用 grep mongodb 查看 MongoDB 相关指标。
  • 默认只看到 mongodb_up 等少量指标时,可以使用 --collect-all 观察更多 collector 采集结果。

创建 MongoDB Exporter 用户

下面是我的 prompt:

我想使用 MongoDB Exporter 监控 MongoDB,需要创建一个用户并分配相关权限,这样 MongoDB Exporter 才能连接到 MongoDB 实例并获取监控数据。请问如何在 MongoDB 中创建用户并分配权限?

在 MongoDB 中创建用户并分配权限的步骤如下。您可以通过 MongoDB Shell 来执行这些操作。

1. 连接到 MongoDB

首先,使用 MongoDB Shell 连接到您的 MongoDB 实例。可以使用以下命令:

mongo --host <mongodb-host> --port <mongodb-port> -u <admin-username> -p <admin-password> --authenticationDatabase admin

确保将 <mongodb-host><mongodb-port><admin-username><admin-password> 替换为实际的值。

2. 选择数据库

在创建用户之前,您需要选择要为其创建用户的数据库。通常,为监控用途的用户可以在 admin 数据库中创建,但您也可以选择特定的数据库。

use admin

3. 创建用户

使用 db.createUser() 命令来创建用户并分配权限。以下是创建一个名为 monitoringUser 的用户的示例,该用户将被授予用于监控的权限:

db.createUser({
  user: "monitoringUser",
  pwd: "yourPassword",  // 替换为您选择的密码
  roles: [
    { role: "clusterMonitor", db: "admin" },  // 监控集群的权限
    { role: "readAnyDatabase", db: "admin" }  // 读取任意数据库的权限
  ]
})

4. 验证用户创建

可以使用以下命令查看已创建的用户:

db.getUsers()

这将列出当前数据库中的所有用户。确保您看到刚刚创建的 monitoringUser

5. 连接 MongoDB Exporter

在 MongoDB Exporter 的连接字符串中,使用刚创建的用户进行身份验证。例如:

docker run -d \
  --name mongodb-exporter \
  -e MONGODB_URI="mongodb://monitoringUser:yourPassword@<mongodb-host>:<mongodb-port>" \
  -p 9216:9216 \
  bitnami/mongodb-exporter

确保将 <mongodb-host><mongodb-port> 替换为实际的 MongoDB 实例信息。

上面的信息已经比较全面了,结合前面的系列文章,我做了如下实操:

test> use admin
switched to db admin

admin> db.createUser({
...   user: "exporteruser",
...   pwd: "MhxzKhl",
...   roles: [
...     { role: "clusterMonitor", db: "admin" },
...     { role: "read", db: "local" }
...   ]
... })
{ ok: 1 }

admin> db.getUsers()
{
  users: [
    {
      _id: 'admin.exporteruser',
      userId: UUID('5696bfbf-737c-4d99-8604-804a19c1f6a5'),
      user: 'exporteruser',
      db: 'admin',
      roles: [
        { role: 'read', db: 'local' },
        { role: 'clusterMonitor', db: 'admin' }
      ],
      mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
    }
  ],
  ok: 1
}

看起来创建用户的整个流程跑通了,接下来就是验证 MongoDB Exporter 是否能够连接到 MongoDB 实例并获取监控数据了。注意上面的 roles 部分,并没有按照 aigc 给的回复配置,而是根据 MongoDB Exporter README 中的说明来配置的。你也可以直接翻看前面的文章。

配置项 本文实操值 说明
用户所在库 admin 监控用户在 admin 中创建
用户名 exporteruser 本地测试用监控用户
角色 1 { role: "clusterMonitor", db: "admin" } 用于查看集群和实例状态
角色 2 { role: "read", db: "local" } 按 README 要求读取 local 库

安装 MongoDB Exporter

这里我不自己构建了,直接去 MongoDB Exporter 的 Github releases 页面下载他们打好的包,releases 页面地址如下:

https://github.com/percona/mongodb_exporter/releases

我的环境是 Macbook M1 所以下载下面这个发布包:

mongodb_exporter-0.42.1.darwin-arm64.tar.gz

解压缩:tar zxvf mongodb_exporter-0.42.1.darwin-arm64.tar.gz,然后进入解压后的目录,执行:

./mongodb_exporter --mongodb.uri=mongodb://exporteruser:MhxzKhl@127.0.0.1:27017 --web.listen-address=":9216"

上面的命令运行之后,没有任何输出,比较尴尬,应该是启动成功了,直接测试吧,使用 curl 命令:

curl -s localhost:9216/metrics

会打印出很多指标,因为 MongoDB Exporter 自身这个 Go 进程的指标也暴露出来了,所以你会看到很多 go_* 的指标,这些是 MongoDB Exporter 自身的指标,不是 MongoDB 的指标。这里我 grep 一下,只看 MongoDB 的指标:

$ curl -s localhost:9216/metrics | grep mongodb
collector_scrape_time_ms{collector="general",exporter="mongodb"} 0
# HELP mongodb_up Whether MongoDB is up.
# TYPE mongodb_up gauge
mongodb_up{cluster_role="mongod"} 1

看到 mongodb_up 了,用来表示 MongoDB 是否正常运行的。这里是 1,表示正常。没有更多指标了,按照前文提到的,MongoDB Exporter 类似 Node Exporter,会内置一堆 collector,咱就直接全部启用所有 Collector,看看有哪些指标:

# 增加 --collect-all 参数,重新启动 MongoDB Exporter
./mongodb_exporter --mongodb.uri=mongodb://exporteruser:MhxzKhl@127.0.0.1:27017 --web.listen-address=":9216" --collect-all

稍等片刻,让 Exporter 收集一些数据,然后再次 curl 就可以看到采集了非常多的数据。篇幅所限,就不全部贴出了:

# HELP mongodb_asserts_msg asserts.
# TYPE mongodb_asserts_msg untyped
mongodb_asserts_msg{cl_id="",cl_role=""} 0
# HELP mongodb_asserts_regular asserts.
# TYPE mongodb_asserts_regular untyped
mongodb_asserts_regular{cl_id="",cl_role=""} 0
# HELP mongodb_asserts_rollovers asserts.
# TYPE mongodb_asserts_rollovers untyped
mongodb_asserts_rollovers{cl_id="",cl_role=""} 0
...

上例中的指标有两个标签,cl_id 和 cl_role,都是空字符串,还记得之前文章的说明么?

如果你的 server type 是 standalone,那么 cl_role 将是 (empty string)。

实操结论和注意点

这次实操至少验证了三件事:

  1. MongoDB Exporter 可以使用单独的监控用户连接 MongoDB。
  2. /metrics 端点可以正常暴露 Prometheus 格式指标。
  3. --collect-all 会启用更多采集项,指标数量明显增加。

生产环境里不要把真实用户名和密码直接写在命令行中,因为进程参数可能被 pstop 看见。前一篇 README 里也提到,可以使用 MONGODB_USERMONGODB_PASSWORD 环境变量来传递凭据。

总结

本文介绍了如何在 MongoDB 中创建监控用户、分配权限,以及如何安装和启动 MongoDB Exporter。通过访问 Exporter 的 /metrics 端点,可以确认 MongoDB 指标已经被暴露出来。

下一篇文章我会使用 Prometheus 抓取这些指标,然后找个 Grafana 仪表盘来展示一下。

FAQ

Q1:为什么本文没有使用 AIGC 示例里的 readAnyDatabase

A:因为前一篇阅读的 MongoDB Exporter README 中给出的权限是 clusterMonitorlocalread。本文实操按 README 配置,避免给监控用户过大的权限。

Q2:只看到 mongodb_up 是否表示采集失败?

A:不一定。本文实操中默认输出里可以看到 mongodb_up,说明 Exporter 已经能连接 MongoDB。想观察更多指标,可以尝试 --collect-all

Q3:生产环境可以把密码写在启动命令里吗?

A:不建议。命令行参数可能被系统命令看到。更稳妥的方式是使用环境变量、配置管理或密钥管理工具。

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云