ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

sql_exporter DSN配置详解:一张表看懂四大数据库连接格式与隐藏坑

sql_exporter DSN配置详解:一张表看懂四大数据库连接格式与隐藏坑 sql_exporter DSN配置详解一张表看懂四大数据库连接格式与隐藏坑【免费下载链接】sql_exporterDatabase agnostic SQL exporter for Prometheus项目地址: https://gitcode.com/gh_mirrors/sqle/sql_exportersql_exporter是一款面向 Prometheus 的数据库无关database agnosticSQL 导出器通过配置文件定义 SQL 查询即可把 MySQL、PostgreSQL、SQL Server、ClickHouse 等任意数据库的状态指标暴露给 Prometheus。而所有连接的总钥匙就是配置里的data_source_name——一个 DSNData Source Name字符串。本文带你一图看懂四种数据库的 DSN 写法差异并提前避开那些让人抓狂的隐藏坑。什么是 DSNsql_exporter 如何认出你的数据库sql_exporter 没有单独的 driver 配置项它直接用 DSN 中://前面的协议前缀来判断该用哪个数据库驱动sqlserver://prom_user:prom_passworddbserver1.example.com:1433 └──────┘ 驱动名由这一部分决定这一逻辑由 sql.go 中的OpenConnection函数实现。理解这一点后下面的对照表就非常好懂了。一张表看懂四大数据库 DSN 格式数据库sql_exporter 中的 DSN 写法驱动实际收到的内容特点MySQLmysql://user:passprotocol(host:port)/dbnameuser:passprotocol(host:port)/dbname前缀mysql://会被剥掉PostgreSQLpostgres://user:passhost:port/dbname原样传递最标准的 URI 风格SQL Serversqlserver://user:passhost:port/instance原样传递路径部分写实例名ClickHouseclickhouse://host:port?usernameuserpasswordpassdatabasedbnametcp://host:port?username...前缀会被替换为tcp:// 对照表原文出处README.md 的 Data Source Names 章节。四种 DSN 的完整格式说明也写在 sql.go 的函数注释中。⚠️ 请注意两个不标准的数据库MySQL 的账号密码格式特殊protocol(host:port)这种写法而ClickHouse 的账号密码根本不在后面而是写在查询参数里。这是绝大多数连接失败问题的根源。data_source_name 写在哪里两种部署模式sql_exporter 支持两种模式DSN 的安放位置不同模式一单目标模式target适合一个 exporter 只盯一个数据库的场景DSN 直接写在target下参考 examples/sql_exporter.ymltarget: data_source_name: sqlserver://prom_user:prom_passworddbserver1.example.com:1433 collectors: [mssql_standard]模式二多任务模式jobs需要同时监控多个实例时DSN 写在每个 job 的static_configs.targets里键是目标名、值是 DSN相关结构定义见 config/config.gojobs: - job_name: mysql_group collectors: [mysql_standard] static_configs: - targets: prod_db_1: mysql://monitor:secret(tcp)(10.0.0.1:3306)/ prod_db_2: mysql://monitor:secret(tcp)(10.0.0.2:3306)/配置解析时config/config.go 会强制校验jobs和target二选一必须且只能定义其中一个。6 个隐藏坑提前避开少走弯路坑 1DSN 缺少://前缀这是最常见的错误。DSN 里找不到://时sql_exporter 会直接报错missing driver in data source name. Expected format driver://dsn见 sql.go。比如把 MySQL 的 DSN 直接写成user:passtcp(host:3306)/很多文档里的原生格式就会中招——一定要自己补上mysql://前缀。坑 2MySQL 的protocol(host:port)语法独此一家MySQL 驱动要求把协议和地址包在括号里例如mysql://u:p(tcp)(127.0.0.1:3306)/。写成常见的mysql://u:p127.0.0.1:3306/是不符合该驱动规范的。坑 3ClickHouse 的账号密码要写在查询参数里clickhouse://后面不要写user:pass正确姿势是clickhouse://host:9000?usernameuserpasswordpassdatabasedbname。并且记住exporter 会自动把它改写成tcp://再交给驱动sql.go。坑 4前缀会被加工日志里的驱动名可能与前缀不同MySQL 的mysql://被剥掉、ClickHouse 的clickhouse://被替换成tcp://这是驱动本身决定的Go 的database/sql不支持按 DSN 自动选驱动详见 README.md。排查问题时别被为什么日志里是 tcp 驱动搞糊涂。坑 5DSN 是 Secret 类型输出时会被打码data_source_name在代码中是Secret类型config/config.go序列化时会显示为secret。这是安全设计不是 bug——但也意味着不要试图从导出配置里反查密码。坑 6多目标模式下的重复与命名约束在同一个static_config中目标名不能重复、DSN 也不能重复config/config.go且每个 target 至少要有一个 collector。另外提醒数据库连不上时/metrics会返回HTTP 500Prometheus 侧表现为up0见 target.go这属于正常降级行为先检查 DSN 和账号权限再怀疑 exporter 本身。快速自查清单部署前逐项核对90% 的 DSN 问题都能解决✅ DSN 是否带有协议://前缀且前缀在mysql/postgres/sqlserver/clickhouse之中✅ MySQL 是否写成user:passprotocol(host:port)/dbname格式✅ ClickHouse 的账号密码是否放在了?usernamepassword查询参数中✅target与jobs是否只定义了其中一个✅ 多目标时目标名与 DSN 是否唯一、collector 引用是否存在✅ 数据库账号是否只授予了 SELECT 权限并能从 exporter 所在主机连通相关资料 想深入阅读推荐按以下顺序浏览项目文件完整注释版配置示例documentation/sql_exporter.yml其中 DSN 示例见 第 33 行最小可用配置examples/sql_exporter.yml开箱即用的标准采集器examples/mssql_standard.collector.ymlDSN 解析与驱动选择源码sql.go配置结构体与校验规则config/config.go 小贴士由于 Go 无法动态加载第三方数据库驱动若要监控其他数据库如 Oracle需要引入对应 Go 驱动后重新编译二进制文件DSN 前缀即新驱动名。【免费下载链接】sql_exporterDatabase agnostic SQL exporter for Prometheus项目地址: https://gitcode.com/gh_mirrors/sqle/sql_exporter创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表