Prometheus实战篇:Prometheus监控mongodb
准备环境
docker-compose安装mongodb
docker-compose.yaml
version: '3' services: mongo: image: mongo:4.2.5 container_name: mongo restart: always volumes: - /data/mongo/db: /data/db port: - 27017:27017 command: [--auth] enviroment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: 123456
docker-compose up -d
监控mongoDB
创建监控用户
登录MongoDB创建监控用户,权限为"readAnyDatabase",如果是cluster环境,需要有"clusterMonitor"
登录MongoDB(docker安装的mongo)
docker exec -it mongo mongo admin
创建监控用户
> db.auth('root','123456') 1 >db.createUser({ user: 'exporter',pwd : 'password',roles:[{role: 'readAnyDatabase',db : admin},{role: 'clusterMonitor',db : admin}]}) #测试 使用上面创建的用户信息进行连接 > db.auth('exporter','password') 1 #表示成功 > exit
docker安装exporter
docker直接运行
docker run -d -p 9216:9216 -p 17001:17001 --restart=always --name mongodb-exporter bitnami/mongodb_exporter :latest --collect-all --compatible-mode --mongodb.uri=mongodb://exporter:password@localhost:27017/admin?ssl=false
docker-compose方式
为了方便省事,我mongodb使用管理员账号,生产不建议使用
cat >docker-compose.yml << EOF version: '3.3' services: mongodb_exproter: image: bitnami/mongodb_exporter:latest container_name: mongodb_exproter restart: always environment: MONGODB_URI: "mongodb://exporter:password@localhost:27017/admin?ssl=false" command: - '--collect-all' - '--compatible-mode' port: - "9216:9216" EOF
启动
docker-compose up -d
检查
查看正在运行的容器 docker ps 或者: 查看mongodb_exporter容器的运行日志 docker logs -f mongodb_exporter
参数解释
Environment variable |
值 |
描述 |
collect-all |
localhost:15672 |
rabbitmq管理插件的url(必须以http(2)开头) |
compatible-mode |
guest |
rabbitmq管理插件的用户名 |
metrics地址
安装好Exporter后会暴露一个/metrics结尾的服务
名称 |
地址 |
mongodb_exporter |
Prometheus配置
配置Prometheus去采集(拉取)nginx_exporter的监控样本数据
cd /data/docker-prometheus # 在scrapc_configs(搜刮配置):下面增加如下配置: cat >prometheus/prometheus.yml <<FOF - job_name: 'mongodb_exporter' static_configs: - targets: ['localhost:9216'] labels: instance: test服务器 EOF
重新加载配置
curl -x POST http://localhost:9090/-/reload
检查
常用的mongodb监控指标
mongodb_ss_connections{conn_type="available"} 可用的连接数 mongodb_ss_mem_virtual mongodb_ss_mem_residenl #关于server status mongodb_up 服务器是否在线 mongodb_ss_ok{cl_id="",cl_role="current",rs_state="0"} 服务器是否正常运行,取值为1,0.标签中记录了Cluster,ReplicaSet mongodb_ss_uptime 服务器的运行时长,单位为秒 mongdb_ss_connections{conn_type="current"} 客户端连接数 # 关于主机 mongodb_sys_cpu_num_cpus 主机的CPU核数 # 关于 collection mongodb_collstats_storageStats_count{database="xx",collection="xx"} collection 全部文档的数量 mongodb_collstats_storageStats_size collection全部文档的体积,单位bytes mongodb_collstats_storageStats_storageSize collection全部文档占用的磁盘空间,默认会压缩 delta(mongodb_collstats_latencyStats_reads_ops[1m]) collection读操作的数量(每分钟) delta(mongodb_collstats_latencyStats_reads_latency[1m]) collection读操作的延迟(每分钟),单位为微秒 mongodb_collstats_latencyStats_write_ops mongodb_collstats_latencyStats_write_latency
触发器配置
由于之前的触发器是全部写在了一个yml里面就是alert.yam,这样随着后面配置的触发器越来越多最终会变得难以维护.这里我们让它去读rules目录下所有的yml文件即可
Prometheus配置
rule_files: - "alert.yml" - "rules/*.yml"
配置mongdb触发器
因为是单机所以未配置集群的触发器
cat >prometheus/rules/mongodb.yml <<FOF groups: - name: PerconaMongodbExporter rules: - alert: MongodbDown expr: 'mongodb_up == 0' for: 0m labels: severity: critical annotations: summary: "MongoDB Down,容器:$labels.instance" description: "MongoDB 容器 is down,当前值{{ $value }}" - alert: MongodbNumberCursorsOpen expr: 'mongodb_ss_metrics_cursor_open{csr_type="total"}' > 10 for: 2m labels: severity: warning annotations: summary: "MongoDB 数字游标打开告警 容器:{{$labels.instance }}" description: "MongoDB为客户端打开的游标过多>10k,当前值为:{{ $value }}" - alert: MongdbCursorsTimeouts expr: 'increase(mongodb_ss_metrics_cursor_timedOut[1m]) > 100' for: 2m labels: severity: warning annotations: summary: "MongDB 游标超时,容器:{{$labels.instance }}" description: "太多游标超时,当前值为:{{ $value }}" - alert: MongodbVirtualMemoryUsage expr: '(sum(mongodb_ssmem_virtual BY (instance) / sum(mongodb_ss_mem_resident) BY (instance)) > 3' for: 2m labels: severity: warning annotations: summary: "MongoDB虚拟内存使用告警,容器:{{$labels.instance }}" description: "虚拟内存使用过高,当前值为:{{ $value }}" EOF
一定记住这里需要仔细校对yaml语法,最好是能去在线验证yaml语法的网站上看看.yaml语法还是比较严格的一点缩进错误都不能有
检查配置
docker exec -it prometheus promtool check config /etc/prometheus/prometheus.yml
重新加载配置
curl -x POST http://localhost:9090/-/reload
检查
http://localhost:9090/alerts?search=
或:
dashboard
这里需要从github上去下载对应的dashboard
选择导入刚刚从github上下载的json文件即可
可以发现最终的仪表盘上有这一块连接数是空的
只需要在插件中将polystat的插件下载即可,具体在设置中然后搜索这个插件下载即可.