⚠️ 重要提示:v1.2.0+ 采用全新多数据源架构,与 v1.1.6 及更早版本不兼容。查看版本兼容性说明
Dameng Exporter 是一个专为达梦数据库(DM8)设计的 Prometheus 监控数据采集器,提供全面的数据库性能指标采集和监控能力。
- 🚀 多数据源支持 - 支持同时监控多个达梦数据库实例
- 📊 丰富的监控指标 - 提供 30+ 种数据库性能指标
- 🎨 Grafana 面板 - 内置专业的 Grafana 8.5+ 监控面板模板
- 🔒 安全特性 - 支持配置文件中的密码自动加密、Basic Auth 认证
- ⚡ 高性能 - 支持并发采集、智能缓存机制
- 🔧 灵活配置 - 支持 TOML 配置文件和命令行参数
- 🩺 可控探活 -
enableHealthPing可关闭周期性 Ping,仅在 SQL 报错时触发确认并自动重试 - 📝 自定义指标 - 支持通过 SQL 定义自定义监控指标
- 🐳 容器化部署 - 提供 Docker 镜像,支持 amd64/arm64 架构
💡 获取详细指标文档:关注微信公众号「达梦课代表」,回复「exporter资料」获取完整的指标实现 SQL 及逻辑说明文档。
dameng_exporter/
├── docs/ # 文档和配置模板
│ ├── documents/ # 文档文件
│ │ ├── 参数配置指南.md # 参数详细说明文档
│ │ ├── 自定义指标使用指南.md # 自定义指标使用指南
│ ├── dashboards/ # Grafana 面板模板
│ │ └── *.json # 监控面板文件
│ ├── alertmanager/ # 告警配置模板
│ └── prometheus_告警规则/ # Prometheus 告警规则
├── collector/ # 指标采集器实现
├── config/ # 配置文件目录
├── logs/ # 日志文件目录
├── scripts/ # 脚本工具目录
├── dameng_exporter.toml # 主配置文件
├── custom_queries.metrics # 自定义指标配置
└── README.md # 项目主文档
- 达梦数据库 DM8 或以上版本
- Prometheus 2.0+
- Grafana 8.5+(使用提供的面板模板)
- Go 1.23+(从源码编译时需要)
访问 Releases 页面下载对应平台的版本:
# Linux AMD64
wget https://github.com/gaoyuan98/dameng_exporter/releases/download/v1.2.4/dameng_exporter_v1.2.4_linux_amd64.tar.gz
tar -xzf dameng_exporter_v1.2.4_linux_amd64.tar.gz
# Linux ARM64
wget https://github.com/gaoyuan98/dameng_exporter/releases/download/v1.2.4/dameng_exporter_v1.2.4_linux_arm64.tar.gz
tar -xzf dameng_exporter_v1.2.4_linux_arm64.tar.gz
# Windows AMD64
# 下载 dameng_exporter_v1.2.4_windows_amd64.tar.gz 并解压# 拉取镜像(自动匹配系统架构)
docker pull gaoyuan98/dameng_exporter:latest # 拉取最新版本
# docker pull gaoyuan98/dameng_exporter:v1.2.0 # 拉取指定版本
# 如果遇到拉取失败,尝试以下方法:
# 1. 使用完整路径
docker pull docker.io/gaoyuan98/dameng_exporter:latest
# 2. 使用国内镜像加速(腾讯云为例)
# 先配置镜像加速器:sudo vim /etc/docker/daemon.json
# 添加: {"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]}
# 重启: sudo systemctl restart docker
# 运行容器
docker run -d --name dameng_exporter \
-p 9200:9200 \
gaoyuan98/dameng_exporter:latest \
--dbHost="192.168.1.100:5236" \
--dbUser="SYSDBA" \
--dbPwd="YourPassword"
# 查看所有镜像标签
# Docker Hub: https://hub.docker.com/r/gaoyuan98/dameng_exporter/tags# 克隆项目
git clone https://github.com/gaoyuan98/dameng_exporter.git
cd dameng_exporter
# 编译(自动下载依赖)
go build -o dameng_exporter main.go
# Windows 一键编译
./scripts/build_all_versions.bat在达梦数据库中创建专用监控用户并授权:
-- 创建表空间和用户(可以使用任意用户名,这里以 MONITOR_USER 为例)
CREATE TABLESPACE "MONITOR_TS" DATAFILE 'MONITOR_TS.DBF' SIZE 512 CACHE = NORMAL;
CREATE USER "MONITOR_USER" IDENTIFIED BY "YourPassword123";
ALTER USER "MONITOR_USER" DEFAULT TABLESPACE "MONITOR_TS" DEFAULT INDEX TABLESPACE "MONITOR_TS";
-- 推荐:授予 DBA 权限(简化权限管理)
GRANT DBA TO "MONITOR_USER";
-- 或者:最小权限授予(生产环境推荐)
GRANT "PUBLIC","RESOURCE","SOI","SVI","VTI" TO "MONITOR_USER";
-- 授予必要的系统视图查询权限
GRANT SELECT ON V$SYSSTAT TO MONITOR_USER;
GRANT SELECT ON V$SESSIONS TO MONITOR_USER;
GRANT SELECT ON V$LICENSE TO MONITOR_USER;
GRANT SELECT ON V$DATABASE TO MONITOR_USER;
GRANT SELECT ON V$DM_INI TO MONITOR_USER;
GRANT SELECT ON V$RLOGFILE TO MONITOR_USER;
GRANT SELECT ON V$RLOG TO MONITOR_USER;
GRANT SELECT ON V$TABLESPACE TO MONITOR_USER;
GRANT SELECT ON V$DATAFILE TO MONITOR_USER;
GRANT SELECT ON DBA_DATA_FILES TO MONITOR_USER;
GRANT SELECT ON DBA_FREE_SPACE TO MONITOR_USER;
GRANT SELECT ON V$TRXWAIT TO MONITOR_USER;
GRANT SELECT ON V$CKPT TO MONITOR_USER;
GRANT SELECT ON V$RAPPLY_SYS TO MONITOR_USER;
GRANT SELECT ON V$RAPPLY_STAT TO MONITOR_USER;
GRANT SELECT ON V$PROCESS TO MONITOR_USER;
GRANT SELECT ON V$LOCK TO MONITOR_USER;
GRANT SELECT ON V$THREADS TO MONITOR_USER;
GRANT SELECT ON V$INSTANCE_LOG_HISTORY TO MONITOR_USER;
GRANT SELECT ON V$ARCH_FILE TO MONITOR_USER;
GRANT SELECT ON V$DMWATCHER TO MONITOR_USER;
GRANT SELECT ON V$INSTANCE TO MONITOR_USER;
GRANT SELECT ON V$BUFFERPOOL TO MONITOR_USER;
GRANT SELECT ON V$ARCH_SEND_INFO TO MONITOR_USER;
GRANT SELECT ON V$ARCH_STATUS TO MONITOR_USER;
GRANT SELECT ON V$ARCH_APPLY_INFO TO MONITOR_USER;
GRANT SELECT ON V$PURGE TO MONITOR_USER;
GRANT SELECT ON V$DYNAMIC_TABLES TO MONITOR_USER;
GRANT SELECT ON V$DYNAMIC_TABLE_COLUMNS TO MONITOR_USER;
GRANT SELECT ON V$DB_CACHE TO MONITOR_USER;
GRANT SELECT ON V$ARCH_QUEUE TO MONITOR_USER;📖 配置参数详解:查看 参数配置指南 了解所有参数的详细说明和使用示例。
- 创建配置文件
dameng_exporter.toml:
# 单数据源配置
[[datasource]]
name = "dm_prod"
dbHost = "192.168.1.100:5236"
dbUser = "SYSDBA"
dbPwd = "SYSDBA"
# 多数据源配置示例
[[datasource]]
name = "dm_prod"
dbHost = "192.168.1.100:5236"
dbUser = "SYSDBA"
dbPwd = "SYSDBA123"
labels = "env=prod,region=beijing" # 可选:用于 Grafana 面板过滤
[[datasource]]
name = "dm_test"
dbHost = "192.168.1.101:5236"
dbUser = "TEST_USER"
dbPwd = "TestPassword"
labels = "env=test,region=shanghai" # 可选:用于 Grafana 面板过滤
# 如需更多配置选项,请参考:docs/documents/参数配置指南.md💡 如果希望减少对目标数据库的周期性 Ping,可在全局配置中设置
enableHealthPing = false。Exporter 仅会在 SQL 报错时对对应数据源补一次确认性 Ping,失败后自动降级并交给后台重试,dmdb_up指标仍然准确。
- 启动服务:
# Linux/Unix
nohup ./dameng_exporter --configFile=dameng_exporter.toml > /dev/null 2>&1 &
# Windows
dameng_exporter.exe --configFile=dameng_exporter.toml
# 验证服务
curl http://localhost:9200/metrics./dameng_exporter \
--dbHost="192.168.1.100:5236" \
--dbUser="MONITOR_USER" \
--dbPwd="YourPassword123" \
--listenAddress=":9200" \
--logLevel="info"# 使用配置文件方式
docker run -d --name dameng_exporter \
-p 9200:9200 \
-v $(pwd)/dameng_exporter.toml:/app/dameng_exporter.toml \
-v $(pwd)/custom_metrics.toml:/app/custom_metrics.toml \
gaoyuan98/dameng_exporter:latest
# 使用命令行参数方式
docker run -d --name dameng_exporter \
-p 9200:9200 \
gaoyuan98/dameng_exporter:latest \
--dbHost="192.168.1.100:5236" \
--dbUser="MONITOR_USER" \
--dbPwd="YourPassword123"
编辑 Prometheus 配置文件 prometheus.yml:
scrape_configs:
# 单个 Exporter 实例
- job_name: "dameng_exporter"
static_configs:
- targets: ["192.168.1.100:9200"]
# 多个 Exporter 实例(监控不同环境)
- job_name: "dameng_exporter_multi"
static_configs:
- targets:
- "192.168.1.100:9200" # 生产环境 Exporter
- "192.168.1.101:9200" # 测试环境 Exporter重载 Prometheus 配置:
# 发送 SIGHUP 信号
kill -HUP $(pidof prometheus)
# 或使用 API
curl -X POST http://localhost:9090/-/reload- 登录 Grafana(默认 http://localhost:3000)
- 导航到 Dashboard → Import
- 上传面板文件:
docs/dashboards/达梦DB监控面板_多标签_20250903.json- 支持多维度标签过滤(datasource、env、region、cluster)
- 适用于多数据源、多环境监控场景
- 向后兼容,即使只配置了 datasource 标签也能正常工作
- 选择 Prometheus 数据源
- 点击 Import 完成导入
💡 多标签版本说明:
- datasource:数据源标识(必需)
- env:环境标识(如:prod、test、dev)
- region:地域标识(如:beijing、shanghai)
- cluster:集群标识(如:order_cluster、user_cluster)
- 支持通过 Grafana 变量进行灵活的级联过滤
- 复制告警规则到 Prometheus:
cp docs/prometheus_告警规则/rules/*.yml /etc/prometheus/rules/- 配置 AlertManager:
cp docs/alertmanager/*.yml /etc/alertmanager/- 重启服务生效
自定义指标功能允许用户通过 SQL 查询定义专属的监控指标,无需修改源代码。
- 在
dameng_exporter.toml中为目标数据源启用自定义指标并指定配置文件:[[datasource]] name = "dm_prod" dbHost = "192.168.1.100:5236" dbUser = "SYSDBA" dbPwd = "SYSDBA" registerCustomMetrics = true customMetricsFile = "./custom_queries.metrics" # 支持相对/绝对路径
registerCustomMetrics默认为true,若显式设置为false将跳过自定义指标;customMetricsFile必须指向实际存在的.metrics、.sql.toml或.queries.toml文件。 - 在
custom_queries.metrics中新增一个或多个[[metric]]区块以定义 SQL 查询。 - 保存文件后重新启动 Exporter(或重新部署容器),日志中出现
loaded X custom metric(s)表示加载成功。
# custom_queries.metrics
[[metric]]
context = "tablespace_usage"
labels = ["tablespace_name"]
request = """
SELECT name AS tablespace_name,
TOTAL_SIZE * PAGE / 1024 / 1024 / 1024 AS size_gb
FROM SYS.V$TABLESPACE
"""
metricsdesc = { size_gb = "Tablespace size in GB" }
metricstype = { size_gb = "gauge" }
# ignorezeroresult = true # 可选:为 true 时忽略数值为 0 的样本context用于生成最终的指标前缀dmdbms_<context>_<字段名>。labels定义会作为 Prometheus 标签暴露的列,未配置时默认为空数组。request需要返回数值列(指标)和可选的标签列,字段名会自动转换为小写。metricsdesc与metricstype必须使用内联表形式(单行),并为每个数值列提供描述及类型(gauge或counter)。ignorezeroresult为可选布尔值,设置为true时会过滤掉值为 0 的结果。
- 执行
curl http://<exporter-host>:9200/metrics | grep dmdbms_tablespace_usage检查指标是否输出。 - 若未看到指标,请确认 SQL 可在数据库中直接执行、字段类型正确,并查看日志是否存在解析或执行错误。
- 🔧 通过 SQL 灵活定义指标
- 🏷️ 支持多维度标签
- 📊 支持 Counter 和 Gauge 类型
- 🔄 保存配置并重启后即可生效
📖 详细文档:查看 自定义指标使用指南 了解完整的自定义指标使用指南,包括:
- 详细参数说明
- 性能监控、业务指标、安全审计等实用示例
- 最佳实践和性能优化建议
- 故障排除和调试技巧
保护 metrics 端点免受未授权访问:
./dameng_exporter --encryptBasicAuthPwd="YourPassword123"
# 输出: $2a$12$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx# dameng_exporter.toml
enableBasicAuth = true
basicAuthUsername = "admin"
basicAuthPassword = "$2a$12$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 使用上面生成的加密密码scrape_configs:
- job_name: "dm_secure"
static_configs:
- targets: ["192.168.1.100:9200"]
basic_auth:
username: "admin"
password: "YourPassword123" # 使用原始密码- 达梦数据库+Prometheus监控适配速览
- Prometheus+Grafana基础监控平台搭建
- 部署dameng_exporter数据采集组件
- 监控项告警配置详解(短信/邮件)
- 解决Prometheus未授权访问漏洞问题
- 配置Basic Auth认证
- 配置全局告警面板
- 开启慢SQL监控功能
- SQLLOG分析工具使用
- 📖 源码分析
- 🐳 Docker Hub
微信公众号:达梦课代表
分享DM数据库一线遇到的各类问题和解决方案
关键提示:选择适合您的版本
- 适用场景:监控单个达梦数据库实例
- 配置方式:命令行参数
- Grafana面板:使用
达梦DB监控面板_20250518.json - 特点:配置简单,稳定可靠
- 适用场景:需要同时监控多个数据库实例
- 配置方式:TOML 配置文件(不兼容旧版命令行参数)
- Grafana面板:必须使用
达梦DB监控面板_多标签_*.json - 特点:支持多实例、标签过滤、更灵活的配置
- 配置文件:从 v1.1.6 升级需要完全重新配置,参考配置说明
- Grafana面板:必须更新到多标签版本面板
- 建议:先在测试环境验证,确认无误后再升级生产环境
- 回退方案:如果只需监控单实例,可继续使用 v1.1.6 版本
- 新增enableHealthPing参数,控制健康的数据源是否定期进行探活,(探活间隔受RetryIntervalSeconds参数控制 默认30s一次)
- 完善配置文件加密后的重复写文件逻辑
注:必须使用新的grafana面板样式,重大更新
- feat: 新增指标dmdbms_system_event_waits_total 收集系统中的事件等待指标信息
- feat: 新增后台状态监控协程,定期健康检查与失败重试数据源,支持成功自动恢复与失败降级
- feat: 新增dmdb_up指标,来表示每个数据源是否正常 1正常 0不正常
- feat: 新增指标dmdbms_rlog_file_size_bytes 展示redo文件的相关信息
- feat: 新增计算归档/Redo切换频率的指标
- perf: 死锁数量指标名称由dmdbms_dead_lock_num_info调整为dmdbms_dead_lock_num_total,符合grafana的指标命名规范
- perf: dmdbms_db_status_occurs指标废弃,原是用来判断数据库状态是否为OPEN做出来的一个指标,现告警时可以直接判断,所以该指标废弃
- perf: dmdbms_session_type_Info指标显示所有的会话状态而不是仅显示IDLE、ACTIVE
- perf: 废弃dmdbms_session_percentage指标改为表达式计算
- perf: 优化datasource标签解决找不到ip的问题,优化指标格式
- fix: dmdbms_dead_lock_num_info指标的含义(之前统计的是事务阻塞而非死锁),事务阻塞指标为dmdbms_trx_info并更名为dmdbms_trx_num_info
- 新增集群状态下监控主库发送归档队列堆积指标
- 修复registerCustomMetrics参=true时,sql指标不生效的问题
- 完善自定义指标的使用说明
- 优化内存池状态查询sql,避免出现慢sql
- 🚀 支持多数据源配置
- 🔧 全面重构配置系统,采用 TOML 格式
- ⚡ 新增采集模式选择(blocking/fast)
- 🔒 增强安全特性
- 新增指标
dmdbms_rapply_time_diff- 备库同步延迟监控 - 修复
dmdbms_instance_log_error_info指标数据重复问题
- 新增系统信息指标:CPU 核心数、物理内存大小
- 优化归档相关指标的标签处理
- 改进视图存在性检查逻辑
- 修复低版本兼容性问题
- 新增
dameng_exporter_build_info指标
- 新增回滚段信息指标
- 实现 Basic Auth 认证功能
- 新增日志级别配置参数
- 优化 LSN 差值计算逻辑
完整更新历史请查看 GitHub Releases
欢迎提交 Issue 和 Pull Request!
- 使用问题:提交 Issue
- 功能建议:提交 Feature Request
- 安全问题:请私信联系维护者
# 克隆项目
git clone https://github.com/gaoyuan98/dameng_exporter.git
# 安装依赖
go mod download
# 本地测试
go run main.go --configFile=dameng_exporter.toml
# 运行测试
go test ./...
# 构建
go build -o dameng_exporter main.go本项目采用 MIT 许可证,详见 LICENSE 文件。
如果这个项目对您有帮助,请给个 ⭐ Star 支持一下!
本次改造目标:优先修复多数据源配置语义问题,并提升可扩展性、稳定性与性能。
- 新增
CollectorContext,由多数据源适配器在采集前注入(数据源名、配置、labels)。 - 新增按数据源读取配置的全局访问接口(如
GetQueryTimeoutForDataSource、GetCheckSlowSQLForDataSource等)。 - 将采集器中依赖
config.Global.GetQueryTimeout/GetCheckSlowSQL/...的逻辑切换为按dataSource生效,避免“总是读取首数据源配置”的问题。
- 将
DBPoolManager逻辑拆分为:db/pool_recovery.go:失败登记、后台重试、恢复提升。db/pool_health.go:健康检查、降级、状态查询。
- 对外 API 保持兼容,内部职责边界更清晰,便于二开维护。
RegisterMultiSourceCollectors改为声明式注册表(collector + feature),减少新增采集器时的改动点。- 引入数据源能力汇总,避免重复扫描配置。
- 多数据源采集增加并发上限(按
GOMAXPROCS动态计算),防止高数据源数量下 goroutine 爆发。 - 将高频成功采集日志从
info下调为debug,降低日志 I/O 压力。 - 自定义指标采集改为流式逐行处理,替代整批
[]map缓存,降低内存峰值与临时分配。 - 预计算自定义指标运行时元数据,复用标签切片,减少热路径分配。
- 新增/完善单测:
config/global_test.go:按数据源配置语义。collector/multi_source_adapter_test.go:上下文注入。collector/perf_test.go:并发上限、能力汇总。collector/custom_collector_test.go:自定义指标行级处理。db/pool_manager_state_test.go:健康→失败→恢复状态机。
- 为单测引入
unit构建标签隔离 DM 驱动:db/driver_dm.go(非 unit 引入真实驱动)db/driver_dm_unit.go(unit 下不引入驱动)
go test -tags unit ./...





