ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

OracleDB Exporter与Grafana结合:用Docker Compose打造深度监控大屏

OracleDB Exporter与Grafana结合:用Docker Compose打造深度监控大屏 做数据库运维的人应该都有过这种经历Oracle 突然告警登上去查 AWR发现会话疯狂堆积但根本不知道是从什么时候开始的。我折腾这套 Grafana OracleDB Exporter 监控栈核心诉求只有一个——用 docker-compose 把采集、存储、展示一次拉起来以后想看任何指标打开浏览器就有而不是翻一堆 OEM 报表拼数据。这套组合专门解决一个问题没有商业监控工具的预算又要深度盯住 Oracle 实例。和传统 Oracle EM 不一样Exporter 走的是 Prometheus 生态指标全部以文本形式暴露Grafana 负责画图docker-compose 负责把这三个组件串起来。写这篇文章的人如果是刚接触 Prometheus 生态的 DBA、偏应用侧的运维或者手里管着几个 Oracle 实例又不想买 license 的团队那这篇应该是能直接照着抄作业的。我会把目录结构、compose 编排、监控账号授权、指标解读、看板面板设计、以及我在真实环境里踩过的那些坑一条条说清楚。1. 为什么选择 OracleDB Exporter Grafana自建监控的取舍逻辑先别急着写配置聊清楚选型这件事。很多团队一上来就纠结用哪个监控工具其实核心问题不是工具不够多而是不知道自己的监控目标是什么。我这次的目标很明确自建 Oracle 实例需要看会话数、表空间增长、SGA/PGA 内存水位、等待事件趋势还要能自定义 SQL 抓一些 AWR 之外的东西同时不想背着 OEM 那种重量级架构。1.1 自建监控到底要解决什么问题Oracle 自带的 EM Express 其实够用功能很全AWR、ADDM 都能看。但实操过的都知道EM 仓库本身要占不少资源页面响应速度也一般而且历史数据保留策略、仓库维护、补丁升级全是额外的活。更关键的是EM 的数据不方便被别的系统消费你想在同一个大屏上同时看 Oracle 和 MySQL、Redis、主机负载几乎做不到。Prometheus 这套东西的好处在于指标即文本。OracleDB Exporter 每隔十几秒问你数据库要一次状态把会话数、表空间字节数、等待事件累计时间这些数值全部变成带标签的指标Prometheus 负责存Grafana 负责画。以后无论接多少个数据库实例只要 Exporter 把数据吐出来大屏上就是一套统一的交互逻辑。对我这种手头有多个数据库要管的人来说这种一套大屏看所有的能力比任何单个工具的高级报表都实用。还有一个容易被忽略的动机告警的灵活性。OEM 的告警规则是写死的那些模板想自定义一个活跃会话数连续 5 分钟超过 200 才告警超过 400 立即告警这种条件得在 EM 里绕半天。Prometheus 的告警规则就是一段 PromQL 表达式改起来像写配置文件一样直接。这是自建方案最值钱的部分。1.2 Exporter、OEM、云监控三者怎么选我整理过一张对比表直接说结论方案部署方式指标深度告警灵活性成本适合场景Oracle OEM独立仓库组件多极深AWR/ADDM 全量中等模板化License 和硬件成本高大型企业专职 DBA 团队云数据库自带监控Agent 自动采集基础指标为主中等平台限制按实例/存储计费已上云且用云数据库实例Exporter Prometheusdocker-compose 一条命令深可自定义 SQL极高PromQL 自由写无额外 License自建库、混合云、已有 Prometheus 生态如果你所在团队已经在跑 Prometheus哪怕只是监控主机 CPU那加一套 Oracle Exporter 也就是多一个 job 的事。我选这条路线还有一个现实原因公司没有专职 DBA我要一个人管开发库、测试库和几个生产实例不可能给每个库都维护一套 OEM更不可能给 Oracle 单独买监控授权。Exporter 这种方式轻到可以直接部署在数据库所在宿主机甚至用 docker-compose 和数据库放在同一台机器上都不违和。另外说下为什么不直接用云监控。云监控的 Agent 确实省事装完就自动采集但指标基本停留在 CPU、内存、IOPS 这种资源层像当前哪些会话在做全表扫描、SGA 里哪个池子涨得异常这种数据库内部视角云监控给不了只能靠 Exporter 的 v$ 视图采集或者自定义 SQL 去补。这也是深度监控大屏和普通云监控之间的本质区别一个大屏能不能帮你定位到 SQL 层面取决于底层指标够不够细。2. docker-compose 编排实战一条命令拉起全套监控选型定了之后接下来就是搭环境。我强烈建议用 docker-compose而不是手动起三个容器。原因很简单这套监控栈的组件就三个但之间的依赖关系、数据卷挂载、端口映射、环境变量手动敲一遍很容易漏。compose 文件写好后换机器、迁移环境、给同事复现都是同一份文件docker compose up -d就完事了。2.1 目录结构与配置文件清单我的目录结构长这样oracle-monitor/ ├── docker-compose.yml ├── prometheus/ │ └── prometheus.yml ├── exporter/ │ └── custom_metrics.sql # 自定义采集 SQL可选 └── grafana/ └── provisioning/ ├── datasources/ │ └── prometheus-datasource.yml └── dashboards/ └── oracle-overview.json # 预置大屏 JSON可选这个结构不复杂但有个关键点所有配置文件都留在 compose 文件旁边不打进容器镜像。好处是以后想改抓取频率、改告警阈值、加一个自定义 SQL直接改本地文件再重启容器就行不用重新构建镜像也不用进容器里折腾。我第一次做的时候把 prometheus.yml 打进了一个自定义镜像后来想调一个 scrape_interval 都得重新 build纯属给自己找麻烦后来全部改成卷挂载了。2.2 docker-compose.yml 关键段解读核心文件长这样版本细节可以按自己的习惯调整version: 3.8 services: prometheus: image: prom/prometheus:v2.53.0 container_name: prometheus volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus ports: - 9090:9090 restart: unless-stopped oracledb-exporter: image: iamseth/oracledb_exporter:latest container_name: oracledb-exporter environment: DATA_SOURCE_NAME: monitor/monitor_pass//192.168.1.100:1521/ORCLPDB1 TZ: Asia/Shanghai ports: - 9161:9161 restart: unless-stopped depends_on: - prometheus grafana: image: grafana/grafana:10.4.0 container_name: grafana environment: GF_SECURITY_ADMIN_PASSWORD: admin TZ: Asia/Shanghai volumes: - grafana_data:/var/lib/grafana - ./grafana/provisioning:/etc/grafana/provisioning ports: - 3000:3000 restart: unless-stopped depends_on: - prometheus volumes: prometheus_data: grafana_data:逐段解释一下不是走马观花而是每个字段都有它的意图prometheus服务用的是 prom/prometheus 官方镜像数据卷prometheus_data单独声明防止容器删掉后监控历史全丢。这个数据卷默认在宿主机 Docker 目录下如果想放到指定磁盘路径也可以改成./data/prometheus:/prometheus这种绑定挂载看你的磁盘规划。oracledb-exporter是整个方案里最关键也最容易出问题的一环。环境变量DATA_SOURCE_NAME是连接 Oracle 的完整串格式是用户名/密码//主机IP:端口/服务名。这里注意如果你的 Prometheus 容器和 Oracle 数据库不在同一台机器主机 IP 必须填数据库服务器的实际局域网地址如果是在同一个 compose 网络里跑了一个 Oracle 容器那这里可以直接填 Oracle 服务的容器名但我的实践场景大多是连外部已有数据库所以填的是局域网 IP。depends_on在这里只保证启动顺序不保证就绪。也就是说compose 只会等 Prometheus 容器启动起来不会等它真正能接受请求。好在 Prometheus 对这种依赖不敏感启动慢点无非是前面几条抓取失败不影响整体。如果想严格点可以加healthcheck后面我会专门说。数据源接入那部分我用的是 Grafana 的 provisioning 机制也就是在启动时自动读取/etc/grafana/provisioning下的配置文件自动创建数据源。对应的prometheus-datasource.yml内容是这样apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true这个文件的好处是让 Grafana 第一次打开就已经配好数据源不用手动去菜单里点来点去。很多人第一次玩 Grafana 都卡在怎么添加数据源这种基础操作上provisioning 直接把这步省了。2.3 容器网络、时区与服务健康检查compose 默认会帮你建一个网络三个服务在同一个网络里通过服务名互相访问。所以 Grafana 里数据源地址写的是http://prometheus:9090而不是http://localhost:9090。这个细节很关键——容器内的localhost指的是容器自己不是宿主机更不是别的容器。如果这里写错Grafana 界面会一直报Bad Gateway或者Data source is unhealthy。时区问题我单独拿出来说是因为真的踩过。Grafana 默认使用 UTC 时间如果你不设置TZ看板上的时间轴会和本地时间差 8 个小时。数据库凌晨 2 点的告警你在本地看可能是上午 10 点排查问题的时候会绕很大圈子。我在 compose 里给三个服务都设置了TZ: Asia/Shanghai这个习惯后来扩展到其他监控项目基本没有再被时间问题坑过。另外推荐给 Prometheus 加一个健康检查让 compose 能够感知到服务真正就绪healthcheck: test: [CMD, wget, --spider, -q, http://localhost:9090/-/healthy] interval: 10s timeout: 3s retries: 33. OracleDB Exporter 采集原理从连接串到指标面板的距离很多人以为 Exporter 就是把数据库连上就行实际上它做的事是定期执行一组 SQL从数据字典和动态性能视图里取数然后转换成 Prometheus 格式的指标。这一节我把原理和指标讲透因为后面配看板的时候你对指标理解得越深面板画得越准。3.1 连接串的写法和监控账号的最小授权Exporter 要用一个数据库账号去连 Oracle这个账号不能直接用 SYS 或 SYSTEM风险太大。我的习惯是单独建一个只读监控账号权限给到刚好够用就行。创建脚本如下CREATE USER monitor IDENTIFIED BY 你的强密码; GRANT CONNECT TO monitor; GRANT SELECT_CATALOG_ROLE TO monitor;SELECT_CATALOG_ROLE会一次性授予对所有数据字典视图和动态性能视图的只读权限对大部分监控场景来说足够。如果你所在的企业对权限管控很严DBA 团队不希望给角色那就走最小化授权路线按 Exporter 实际需要的视图逐个授权GRANT CONNECT TO monitor; GRANT SELECT ON v_$instance TO monitor; GRANT SELECT ON v_$session TO monitor; GRANT SELECT ON v_$sysstat TO monitor; GRANT SELECT ON v_$sgastat TO monitor; GRANT SELECT ON v_$parameter TO monitor; GRANT SELECT ON v_$process TO monitor; GRANT SELECT ON v_$waitstat TO monitor; GRANT SELECT ON v_$latch TO monitor; GRANT SELECT ON v_$librarycache TO monitor; GRANT SELECT ON v_$rowcache TO monitor; GRANT SELECT ON v_$sga TO monitor; GRANT SELECT ON v_$filestat TO monitor; GRANT SELECT ON v_$tablespace TO monitor; GRANT SELECT ON dba_tablespaces TO monitor; GRANT SELECT ON dba_segments TO monitor; GRANT SELECT ON dba_data_files TO monitor;两种方案我在不同环境都验证过。测试环境直接给角色省事生产环境我建议最小化授权。注意v_$前面有个下划线这是 Oracle 里动态性能视图的同义词命名习惯写的时候别漏了漏了视图名Exporter 启动时只会报 ORA-00942排查起来不算难但浪费时间。连接串的格式必须写对这是所有问题里出现频率最高的。正确的格式是用户名/密码//主机IP:端口/服务名比如monitor/Abc123456//192.168.1.100:1521/ORCLPDB1注意 CDB 和 PDB 的区别。如果数据库是 12c 以上并且启用了 CDB服务名可以写 CDB 的服务名也可以写某个 PDB 的服务名。监控 CDB 能看到全局信息监控 PDB 只能看到这个 PDB 自己的数据。我通常一个实例建一个 exporter 连接看 CDB 级别的整体状态PDB 级细节需要的时候再单独拉一个采集 job。3.2 核心指标解读会话、表空间、SGA/PGA 与等待事件部署完成后第一步不是急着配 Grafana而是先确认 Exporter 到底吐出了哪些指标。在服务器上执行curl http://localhost:9161/metrics你会看到大量# HELP、# TYPE开头的文本这就是 Prometheus 要抓的数据。不同 fork 的 Exporter 输出的指标名会有差异比如有的版本叫oracle_session_active有的叫oracle_session_count有的把会话状态拆成 status 标签。所以我养成了一个习惯不管参考哪篇文档先以实际/metrics输出为准再决定看板上写什么 PromQL。以常见版本为例我平时盯得最多的几类指标会话类当前活跃会话数、非活跃会话数、进程数。这类指标对应数据库的连接压力也是很多故障的第一个信号。活跃会话短时间内翻倍通常意味着某个 SQL 出了问题。表空间类表空间当前已用字节、最大可扩展字节。计算使用率时用已用 / 最大可扩展能看出还有多少增长空间只看已用字节没有意义因为自动扩展的表空间总量一直在变。内存类SGA 相关指标、PGA 相关指标。SGA 里哪个池子涨得快往往对应特定类型的工作负载比如 PGA 涨说明排序和 hash join 多Shared Pool 涨说明解析量大或内存泄漏。等待事件类各种等待事件的累计等待时间。数据库卡的根源大多数能归到等待事件上比如 log file sync 对应提交频繁enq: TX - row lock contention 对应锁等待。PromQL 的写法我给你几个可以直接抄的示例。会话趋势面板的核心语句sum(oracle_session_active)如果你想按实例区分假设 Exporter 抓取时带了 instance 标签sum by (instance) (oracle_session_active)表空间使用率是看板上最常用的指标PromQL 这样写100 * (oracle_tablespace_bytes / oracle_tablespace_maxbytes)但如果maxbytes为 0比如某些临时表空间或未开启自动扩展的数据文件这行 PromQL 会得到无穷大面板上直接不显示。我一般会先用clamp_min把分母保护一下100 * (oracle_tablespace_bytes / clamp_min(oracle_tablespace_maxbytes, 1))SGA 构成用 by 分组展示sum by (type) (oracle_sga_bytes)这里type标签具体叫什么取决于 Exporter 的实现。我建议你在 Grafana 的 Explore 页面直接把指标名敲进去看返回的标签有哪些再决定用哪个字段分组。不要凭猜猜的 PromQL 十有八九要返工。3.3 自定义采集项把 AWR 里你最关心的指标拉过来固定指标只是基础Exporter 真正强的是支持自定义 SQL。比如我想抓当前数据库里锁等待最严重的会话或者想看某个业务用户连接数占比这些在默认指标里不一定有但写一条 SQL 就能拿到。不同版本的 Exporter 配置自定义查询的方式略有差异但思路一样提供一个包含 SQL 的配置文件Exporter 会定时执行把结果的每一行转成一个指标。假设我的自定义查询文件挂在/custom_metrics.sql下里面有一段这样的逻辑-- 按会话状态统计当前连接数 SELECT status AS metric_label, COUNT(*) AS metric_value FROM v$session GROUP BY status;自定义查询有两个使用要点。第一SQL 里必须至少有一个字段作为标签、一个数字字段作为指标值否则 Exporter 不知道怎么把行转成指标。第二查询间隔不要设得太短也不要查特别重的视图。我见过有人直接把一条 AWR 层面的复杂 SQL 塞进自定义采集每 5 秒跑一次结果 Exporter 本身把数据库负载拉高了几个百分点这就完全背离了监控的初衷。自定义采集适合低频但关键的信息比如锁状态、Top 等待事件、特定用户的连接数抓取间隔 30 秒甚至 1 分钟都够了。4. Grafana 大屏搭建从数据源到可交互看板组件都跑起来、指标也能看到了接下来是让数据变成一张真正可用的深度监控大屏。Grafana 的魅力在于所有面板的交互逻辑统一你可以从实例总览一层层下钻到具体指标比如先看到某个实例活跃会话异常高再点进表空间面板确认是不是满表空间引起的连锁反应。4.1 数据源接入与变量设计数据源接入用 provisioning 文件搞定这点前面说过。如果你没用 provisioning手动添加也不难登录 Grafana进 Configuration 里的 Data Sources填上 Prometheus 地址和访问模式就行。一旦数据源健康就可以开始建看板。强烈建议在看板里加变量这是 Grafana 能从一个单机监控页升级成多实例总控大屏的关键。比如我建了一个$instance变量Query 类型选 Prometheus查询语句填label_values(oracle_session_active, instance)这样看板顶部会出现一个实例下拉框选中哪个实例所有面板自动切换数据范围。配合$tablespace变量label_values(oracle_tablespace_bytes, tablespace_name)就能在表空间面板里选择具体表空间查看趋势。这个体验和静态面板完全不是一个量级告警时切到对应实例、选对应表空间整个过程几秒钟。4.2 一张深度监控大屏至少要有的面板我搭过的 Oracle 大屏第一版通常是四行。不是越多越好而是每个面板都在回答一个关键问题第一行是实例总览行放在最显眼的位置。核心面板包括当前是否在线用up指标判断、活跃会话总数、活动会话数和后台进程数。图表类型用 Stat 或 Gauge两个数字面板加一个状态灯一眼就能看出实例有没有在正常工作。第二行是表空间行核心面板是几个使用率最高的表空间排行用 Bar gauge 或者 Table 展示。下面可以放一个表空间已用字节的趋势图用 Time series。这样既能看到当前水位也能看到增长速度。表空间问题通常是慢性的不会无故告警但一旦满了就是立刻停机级的故障所以必须以排行方式优先展示。第三行是内存行核心面板是 SGA 各池子占比和 PGA 总大小趋势。用 Time series 分组展示每一根线代表一个池子。这行面板要解决的核心问题是内存是不是涨得异常以及哪个池子在涨。第四行是等待事件行核心面板是主要等待事件累计时间的变化率。用rate()函数转换后能看到每小时新增的等待时间。这一行对有经验的 DBA 来说价值最大很多性能瓶颈在会话面板看起来正常但一翻等待事件就原形毕露了。面板的刷新时间建议和 Prometheus 的抓取间隔保持一致默认 15 秒大屏足够用。不要设成 1 秒Prometheus 本身是拉模型你再怎么刷新底层数据也不会比抓取间隔更细还白白增加 Grafana 的查询压力。4.3 告警规则的阈值设定思路告警规则放在 Prometheus 里比放在 Grafana 里更合适。原因是我可以让告警独立于大屏就算 Grafana 暂时挂了Prometheus 的规则照常计算Alertmanager 照常打电话和发消息。Grafana 自己的告警功能也不差但如果团队本来就在用 Alertmanager没必要在 Grafana 里再配一套。我常用的告警规则文件片段长这样groups: - name: oracle-alerts rules: - alert: OracleInstanceDown expr: up{joboracledb} 0 for: 1m labels: severity: critical annotations: summary: Oracle 实例 {{ $labels.instance }} 已离线 - alert: OracleTablespaceUsageHigh expr: | 100 * (oracle_tablespace_bytes / clamp_min(oracle_tablespace_maxbytes, 1)) 90 for: 10m labels: severity: warning annotations: summary: 实例 {{ $labels.instance }} 表空间 {{ $labels.tablespace_name }} 使用率超过 90% - alert: OracleActiveSessionsHigh expr: sum by (instance) (oracle_session_active) 200 for: 5m labels: severity: warning annotations: summary: 实例 {{ $labels.instance }} 活跃会话数长时间超过 200阈值设置不是拍脑袋我一般统计一周的基线再定。比如生产库活跃会话平时在 30-80 之间波动那就设 150 为 warning、200 为 critical留足灰度空间。如果直接设 30那系统每隔几分钟就会误报一次误报多了团队就疲了反而真出问题的时候没人看信息。表空间 85% warning、92% critical是我多年养成的习惯但也看你表空间是不是自动扩展如果全区手动扩展阈值得更保守。5. 实测踩坑与排查链路连接失败、指标缺失、资源抢占这部分是全文最值钱的干货。理论再完整不如把真实环境里的问题链路看一遍。我把自己部署这套监控时踩过的坑和排查思路完整复盘每个问题都给排查路径而不是只给最终答案。5.1 连接失败的完整排查路径Exporter 起不来十有八九是连接串有问题。最常见的错误分几种ORA-01017 用户名或密码错误ORA-12170 网络不可达ORA-12514 服务名不存在ORA-12541 监听端口不对。排查链路我建议从数据库本身开始一层层往外推在数据库所在主机上用 sqlplus 直接测试连接串确认账号、密码、服务名没问题sqlplus monitor/密码//192.168.1.100:1521/ORCLPDB1这一步能排除所有数据库侧问题。如果 sqlplus 都连不上那就先解决数据库的问题不要去动 Exporter。在 Exporter 容器里测试网络是否可达。注意容器内不一定有 ping 命令但可以用 bash 的 /dev/tcp 技巧docker exec -it oracledb-exporter bash -c cat /dev/null /dev/tcp/192.168.1.100/1521 echo port open如果端口不通考虑防火墙、安全组、Oracle 服务器上的 iptables 规则。这一步经常被人忽略因为数据库明明能在本机连上但容器网络出宿主机的时候被防火墙拦了。检查 Exporter 日志。docker logs 虽然不够结构化但能看到最关键的错误码。比如ORA-12514告诉你服务名解析失败ORA-12170提示网络超时ORA-01017则说明认证失败。如果以上都没问题考虑数据库监听器的服务注册。12c 以后的动态注册如果没配好即使端口通也可能提示服务名不存在。在数据库主机上执行lsnrctl status看目标服务名是否在监听列表里。有一次我折腾了半个多小时最后发现是连接串里//少了一个斜杠Exporter 把连接串当成别的东西解析了。所以再强调一遍连接串格式严格到字符级别用户名/密码//主机:端口/服务名一个字符都不能错。5.2 指标缺失与权限不足的处理另一种典型问题是 Exporter 进程正常、up指标也是 1但看板某个面板永远没数据。我遇到最多的是表空间相关指标查不到日志里反复报ORA-00942: table or view does not exist。这个报错的根源就是权限不足。比如dba_tablespaces、dba_data_files这些数据字典视图普通CONNECT角色根本没有访问权限。解决方案是把对应视图的 SELECT 权限补上或者直接给SELECT_CATALOG_ROLE角色。补完权限后注意一点Exporter 已经建立的会话不会立刻获得新权限必须重启 Exporter 容器让数据库连接重新建立。我见过有人授权后等半天发现指标还是空的最后才想起来连接会话没有刷新。还有一种情况指标有数据但数值看起来很奇怪。比如表空间使用率算出来超过 100%或者显示为一个巨大的负数。这种一般是maxbytes字段为 0或者表空间有多个数据文件而 Exporter 的输出把每个文件都暴露了。处理方式有两种一是 PromQL 里做分母保护二是看板分组时先用sum by把每个表空间的数据文件合并。我两种方案都用PromQL 做兜底Grafana 的查询加sum双保险。5.3 容器资源、日志与中文乱码问题最后说几个容易忽略的运维细节。时区问题我在 compose 那节提过这里再补充一个表现如果你的 Grafana 显示的是 UTC 时间而 Prometheus 抓取到的数据本身是准的看板上的时间轴就会整体偏移 8 小时。排查告警的时候尤其危险因为这条告警是几点发生的直接决定了你去翻哪个时间段的 AWR 和监听日志。统一时区这个动作建议在第一次部署时就做掉不要等项目跑起来再改。Exporter 本身的资源占用也要留意。一个正常配置的 Exporter内存占用在几十 MB 到几百 MB 之间。如果你自定义采集了很重的查询内存会明显上涨甚至把数据库连接池占满。我的建议是给 Exporter 容器加资源限制deploy: resources: limits: memory: 512M另外 Prometheus 的本地存储会持续增长。--storage.tsdb.retention.time默认保留 15 天数据如果你的磁盘不大建议在 compose 里加上启动参数比如保留 7 天command: - --storage.tsdb.retention.time7d日志这块docker logs 默认只保留最近几十 KB 的滚动输出排查历史问题很吃力。我习惯在 compose 里给每个服务加 log 配置logging: driver: json-file options: max-size: 10m max-file: 3最后是中文乱码问题。如果服务器或者数据库字符集不是 AL32UTF8Exporter 从 v$ 视图取出来的某些标签值比如表空间名、等待事件名可能包含乱码看板里显示就会花掉。这个问题的根源在数据库 NLS 参数不一定非得在监控层面解决但如果你只是想让看板显示正常可以在连接串里加上字符集参数或者在 Grafana 的查询里用replace函数把非预期字符替换掉。我个人的处理比较保守尽量在数据库层面确认字符集风格统一乱码的表空间名用正则替换成可读别名。折腾完这套东西我最大的感受是不要一上来就追求大而全。先把实例在线、活跃会话、表空间使用率、等待事件趋势这四类核心指标跑通形成一个最小可用闭环再根据需要加自定义采集和告警。等这套基础打稳了后面扩展多实例接入、集成 Alertmanager 到钉钉或邮件、导出看板 JSON 做模板沉淀都是水到渠成的事。Proxmox 那套监控我后来也接到同一个 Grafana 上了任何一套新组件进来无非就是加一个 exporter、加一个 scrape job、画一组面板三个动作。这套方法论一旦成型管多少个库都不会慌。
返回列表