MongoDB 监控(三)MongoDB Exporter 的安装说明和 README

快猫实习生 2024-11-14 10:26:38

MongoDB 监控

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

笔者对 MongoDB 也是一个新人,通过一个系列文章来一边研究一边分享。前面我们已经了解了 MongoDB 的基础知识,安装了 MongoDB,并且了解了监控 MongoDB 的一些典型命令,实际我也不知道这些命令是否够用齐全,没关系,我们继续探索,这次我们来看看 MongoDB Exporter。

使用 MongoDB Exporter 监控 MongoDB 是一种有效的方式,可以将 MongoDB 的指标暴露给 Prometheus,从而实现监控和可视化。以下是使用 MongoDB Exporter 的步骤:

问题:如何使用 MongoDB Exporter 监控 MongoDB?

下面是 aigc 给的答案,我们姑且这么一看,了解个大概,然后咱们自己实践验证。主要是想通过这种方式分享笔者的探索学习过程。

通过 Docker 安装

如果您使用 Docker,可以通过以下命令拉取 MongoDB Exporter 镜像:

docker pull bitnami/mongodb-exporter

然后运行 MongoDB Exporter:

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

本地安装

如果您希望在本地机器上安装 MongoDB Exporter,请访问 MongoDB Exporter GitHub 页面 下载并安装。

2. 配置 MongoDB Exporter

在运行 MongoDB Exporter 时,您需要提供 MongoDB 实例的连接字符串,格式如下:

mongodb://<username>:<password>@<mongodb-host>:<mongodb-port>

确保使用具有足够权限的用户来连接 MongoDB。

3. 启动 Exporter

如果您使用的是本地安装,可以通过命令行启动 Exporter。示例命令如下:

./mongodb_exporter --mongodb.uri="mongodb://<username>:<password>@<mongodb-host>:<mongodb-port>"

4. 验证 Exporter

启动后,您可以通过访问以下地址来验证 MongoDB Exporter 是否正在运行:

http://<exporter-host>:9216/metrics

这将显示 MongoDB 的各种监控指标。

5. 配置 Prometheus

在 Prometheus 配置文件 prometheus.yml 中,添加 MongoDB Exporter 的目标。示例配置如下:

scrape_configs:
  - job_name: 'mongodb'
    static_configs:
      - targets: ['<exporter-host>:9216']

6. 启动 Prometheus

确保 Prometheus 启动并能够访问 MongoDB Exporter。您可以使用以下命令启动 Prometheus:

prometheus --config.file=prometheus.yml

7. 可视化指标

您可以使用 Grafana 等可视化工具来展示 Prometheus 收集到的 MongoDB 指标:

  1. 安装并启动 Grafana。
  2. 在 Grafana 中添加 Prometheus 作为数据源。
  3. 创建新的仪表板,并添加可视化面板,使用 MongoDB Exporter 收集的指标进行数据展示。

8. 监控指标

MongoDB Exporter 提供多种指标,包括但不限于:

  • 连接数:当前连接到 MongoDB 的客户端数量。
  • 操作统计:读写操作的数量和延迟。
  • 内存使用:内存使用情况和缓存命中率。
  • 副本集状态:主节点和从节点的状态。

总结

通过 MongoDB Exporter,您可以轻松地将 MongoDB 的性能指标暴露给 Prometheus,从而进行全面的监控和可视化。确保您正确配置 Exporter 和 Prometheus,以便有效收集和展示 MongoDB 的关键指标。

看起来 MongoDB Exporter 就是作为一个 client 连到 MongoDB,然后获取到了一些指标。咱们来测试一下,我这里不使用容器方式,直接在 Macbook 本地编译安装。后面还计划浏览一下 MongoDB Exporter 的代码呢。

从 github 随时搜索一下 mongodb_exporter,发现其地址如下:

https://github.com/percona/mongodb_exporter

这个 repo 的 group 是 percona,percona 这家公司非常有名,他们有个 MySQL 的发行版就是 Percona Server,所以这个 MongoDB Exporter 应该也是比较靠谱的。接下来是枯燥的部分了,阅读这个 MongoDB Exporter 的 README。据笔者观察,80% 的从业者都不会认真阅读所使用项目的文档,所以,他们注定是菜鸡一枚。这个过程比较枯燥,但这恰恰是你和别人的薪资拉开差距的关键。

ok,现在开始。

MongoDB Exporter README 阅读

README 中说,这是新的 MongoDB 导出器实现,可处理 MongoDB 监控命令公开的所有指标。这个新的实现循环遍历诊断命令中公开的所有字段,并尝试从中获取数据。

目前,这些指标源已实现:

  • $collStats
  • $indexStats
  • getDiagnosticData
  • replSetGetStatus
  • replSetGetConfig
  • serverStatus

看来这个 MongoDB Exporter 是从 6 个地方或命令获取相关监控数据的,比前面 aigc 给我的答案要更丰富。

MongoDB Exporter 支持的版本

导出器可与 Percona Server for MongoDB 和 MongoDB Community 或 Enterprise Edition 4.4 及更高版本配合使用。旧版本可能也可以工作,但不再进行测试。

关于 MongoDB Exporter 的版本

旧的 0.1xy 版本(前master分支)已移至release-0.1x分支。已实现一个标志 --compatible-mode ,该标志公开具有 0.1x 兼容指标名称的指标,这简化了从旧版本到当前版本的迁移。

看这个解释,是说 MongoDB Exporter 曾经有个 0.1x 版本,官方觉得设计的不太好,已经归档了,不过如果你还想继续使用老版本的指标命名规范,可以通过 --compatible-mode 参数来使用。如果你用的仪表盘是基于老的指标体系命名的,那么这个参数就很有用。

编译构建 MongoDB Exporter

构建过程使用 goreleaser 的 dockerized 版本,因此您无需安装 Go。只需运行 make release 即可在构建目录下生成新的二进制文件。

├── build
│ ├── config.yaml
│ ├── mongodb_exporter_7c73946_checksums.txt
│ ├── mongodb_exporter-7c73946.darwin-amd64.tar.gz
│ ├── mongodb_exporter-7c73946.linux-amd64.tar.gz
│ ├── mongodb_exporter_darwin_amd64
│ │ └── mongodb_exporter <--- MacOS binary
│ └── mongodb_exporter_linux_amd64
│ └── mongodb_exporter <--- Linux binary

生成的二进制文件位于 mongodb_exporter_linux_amd64/mongodb_exporter 或者 mongodb_exporter_darwin_amd64/mongodb_exporter

我这里暂时不自行编译构建了,我直接从 release 页面下载一个二进制文件来使用。

MongoDB Exporter 也提供了镜像:

# with podman
podman run -d -p 9216:9216 percona/mongodb_exporter:0.40 --mongodb.uri=mongodb://127.0.0.1:17001

# with docker
docker run -d -p 9216:9216 percona/mongodb_exporter:0.40 --mongodb.uri=mongodb://127.0.0.1:17001

另外,要使用 MongoDB Exporter 监控 MongoDB,实际 MongoDB Exporter 就是作为一个 client 连到 MongoDB 实例上,这要求 MongoDB Exporter 需要持有一个用户名和密码,这个用户需要具备如下权限才能查询到相关的监控指标:

{
    "role":"clusterMonitor",
    "db":"admin"
},
{
    "role":"read",
    "db":"local"
}

更多关于 MongoDB 角色相关的信息,请参考文档

运行的样例:

mongodb_exporter_linux_amd64/mongodb_exporter --mongodb.uri=mongodb://127.0.0.1:17001

您可以直接在 --mongodb.uri= 中提供 mongodb 用户/密码 --mongodb.uri=mongodb://user:pass@127.0.0.1:17001 ,您还可以使用 --mongodb.user= , --mongodb.password= 提供 mongodb 用户/密码,但是用户和密码信息将通过 ps 或 top 命令泄露,出于安全问题,您可以使用 MONGODB_USERMONGODB_PASSWORD env 为给定 uri 设置用户/密码的变量。

MONGODB_USER=XXX MONGODB_PASSWORD=YYY mongodb_exporter_linux_amd64/mongodb_exporter --mongodb.uri=mongodb://127.0.0.1:17001 --mongodb.collstats-colls=db1.c1,db2.c2
# or
export MONGODB_USER=XXX
export MONGODB_PASSWORD=YYY
mongodb_exporter_linux_amd64/mongodb_exporter --mongodb.uri=mongodb://127.0.0.1:17001 --mongodb.collstats-colls=db1.c1,db2.c2

MongoDB Exporter 多目标监控的支持

Prometheus 生态早期,一般是一个 Exporter 监控一个目标实例,搞起来比较费劲,新版本的 MongoDB Exporter 可以监控多个 MongoDB 实例,只需要用逗号分隔多个 uri 即可:

--mongodb.uri=mongodb://user:pass@127.0.0.1:27017/admin,mongodb://user2:pass2@127.0.0.1:27018/admin

在这种情况下,您可以使用带有目标参数的 /scrape 端点来检索指定目标的指标。查询数据时,您可以在目标参数中仅使用 mongodb://host:port ,无需其他参数,当然也无需主机凭据。

GET /scrape?target=mongodb://127.0.0.1:27018

如果您的 URI 以 mongodb://mongodb+srv:// 模式为前缀,则逗号后未添加前缀的任何主机都将被视为集群的一部分,而不是作为独立主机。因此,集群和独立主机可以像这样组合:

--mongodb.uri=mongodb+srv://user:pass@host1:27017,host2:27017,host3:27017/admin,mongodb://user2:pass2@host4:27018/admin

您可以使用 --split-cluster 选项将所有集群节点拆分为单独的目标。当集群节点被定义为 SRV 记录并且 mongodb_exporter 在指定的 mongodb+srv 域下运行时,此模式非常有用。在这种情况下,将在 mongodb_exporter 启动时查询 SRV 记录,并且可以使用多目标端点的目标参数查询每个集群节点。

有一个整体目标端点 /scrapeall 可以查询一个请求中的所有目标。它可用于存储多个节点指标,而无需单独的目标请求。在这种情况下,每个节点指标将有一个实例标签,其中包含作为主机:端口对的节点名称(如果未指定端口,则仅包含主机)。例如,对于使用以下选项运行的 mongodb_exporter:

--mongodb.uri="mongodb://host1:27015,host2:27016" --split-cluster=true

我们得到这样的指标:

mongodb_up{instance="host1:27015"} 1
mongodb_up{instance="host2:27016"} 1

--mongodb.collstats-colls 接收要使用 collstats 进行监视的数据库和集合的列表。使用示例: --mongodb.collstats-colls=database1.collection1,database2.collection2

mongodb_exporter_linux_amd64/mongodb_exporter --mongodb.uri=mongodb://127.0.0.1:17001 --mongodb.collstats-colls=db1.c1,db2.c2

当通过 --compatible-mode 时,导出器将使用新的命名和标签架构公开所有新指标,同时将以版本 1 兼容的方式公开指标。例如,如果启用了兼容模式,则指标 mongodb_ss_wt_log_log_bytes_written (新格式):

# HELP mongodb_ss_wt_log_log_bytes_written serverStatus.wiredTiger.log.
# TYPE mongodb_ss_wt_log_log_bytes_written untyped
mongodb_ss_wt_log_log_bytes_written 2.6208e+06

也将被暴露为 mongodb_mongod_wiredtiger_log_bytes_total 带有 unwritten 标签。

HELP mongodb_mongod_wiredtiger_log_bytes_total mongodb_mongod_wiredtiger_log_bytes_total
# TYPE mongodb_mongod_wiredtiger_log_bytes_total untyped
mongodb_mongod_wiredtiger_log_bytes_total{type="unwritten"} 2.6208e+06

启用配置文件指标收集

--collector.profile 要收集指标,您需要在MongoDB中启用分析器:使用示例: db.setProfilingLevel(2),对于不同的级别,其描述如下:

  • 0: 探查器已关闭并且不收集任何数据。这是默认的分析器级别。
  • 1: 探查器收集耗时超过 slowms 值或与过滤器匹配的操作的数据。另外,如果启用了过滤器:
    • slowms 和 sampleRate 选项将被忽略。
    • 探查器仅捕获与过滤器匹配的操作。
  • 2: 探查器收集所有操作的数据。

启用分片指标收集

当通过 --collector.shards 启用分片指标收集时,导出器将公开与分片 Mongo 相关的指标。例如,如果启用了分片收集器:

# HELP mongodb_shards_collection_chunks_count sharded collection chunks.
# TYPE mongodb_shards_collection_chunks_count counter
mongodb_shards_collection_chunks_count{collection="system.sessions",database="config",shard="rs1"} 250
mongodb_shards_collection_chunks_count{collection="system.sessions",database="config",shard="rs2"} 250

您可以看到分片名称、集合、数据库和计数。

Cluster role labels

导出器在所有指标中设置一些拓扑标签。标签是:cl_role、cl_id、rs_nm(replicaset name)、rs_state(Replicaset state)。其中 cl_role 的不同情况如下:

  • 如果你的 server type 是 mongos,那么 cl_role 将是 mongos。
  • 如果你的 server type 是 regular instance (primary or secondary),那么 cl_role 将是 shardsvr。
  • 如果你的 server type 是 arbiter,那么 cl_role 将是 shardsvr。
  • 如果你的 server type 是 standalone,那么 cl_role 将是 (empty string)。

从这个文档中也可以看出,原来 MongoDB 也支持集群模式,集群模式下 MongoDB 的不同实例有不同的角色,比如上面提到的 primary、secondary、arbiter、mongos 等。新技能 get 了,不过先不深入了解,先把单机版的监控搞出来。

MongoDB Exporter 的启动参数可以参考这个文档。从这个文档可以看出来,MongoDB Exporter 和 Node Exporter 的机制很像,是把要监控的数据分成了多个 Collector,可以通过参数控制只启用哪些 Collector。

小结

本文介绍了 MongoDB Exporter 的安装说明和 README,具体如何实操咱们下一篇文章再做。

联系我们交流

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat