MongoDB 监控(三)MongoDB Exporter 的安装说明和 README
这是 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 指标:
- 安装并启动 Grafana。
- 在 Grafana 中添加 Prometheus 作为数据源。
- 创建新的仪表板,并添加可视化面板,使用 MongoDB Exporter 收集的指标进行数据展示。
8. 监控指标
MongoDB Exporter 提供多种指标,包括但不限于:
- 连接数:当前连接到 MongoDB 的客户端数量。
- 操作统计:读写操作的数量和延迟。
- 内存使用:内存使用情况和缓存命中率。
- 副本集状态:主节点和从节点的状态。
总结
通过 MongoDB Exporter,您可以轻松地将 MongoDB 的性能指标暴露给 Prometheus,从而进行全面的监控和可视化。确保您正确配置 Exporter 和 Prometheus,以便有效收集和展示 MongoDB 的关键指标。
看起来 MongoDB Exporter 就是作为一个 client 连到 MongoDB,然后获取到了一些指标。咱们来测试一下,我这里不使用容器方式,直接在 Macbook 本地编译安装。后面还计划浏览一下 MongoDB Exporter 的代码呢。
从 github 随时搜索一下 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_USER
和 MONGODB_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,具体如何实操咱们下一篇文章再做。