快速监控 Oracle 数据库

Oracle 数据库在行业内应用广泛,通常存放的非常重要的数据,监控是必不可少的,本文使用 Cprobe 采集 Oracle 监控数据,极致简单,分享给大家。

安装配置 Oracle

简单起见,我使用 Docker 启动 Oracle,命令如下:

docker run -d --name oracle -p 1022:22 -p 18080:8080 -p 1521:1521 wnameless/oracle-xe-11g-r2

如上命令启动之后,Oracle 的监听端口是 1521,用户名/密码是 system/oracle,数据库 SID 是 xe,要监控 Oracle,首先得有账号连上去执行 SQL,所以这些连接信息得记住喽,待会要用。

如果是对既有的 Oracle 做监控,需要创建账号并分派权限,比如:

-- Create the monitoring user "cprobe"
CREATE USER cprobe IDENTIFIED BY <YOUR-PASSWORD>;

-- Grant the "cprobe" user the required permissions
GRANT CONNECT TO cprobe;
GRANT SELECT ON SYS.GV_$RESOURCE_LIMIT to cprobe;
GRANT SELECT ON SYS.V_$SESSION to cprobe;
GRANT SELECT ON SYS.V_$WAITCLASSMETRIC to cprobe;
GRANT SELECT ON SYS.GV_$PROCESS to cprobe;
GRANT SELECT ON SYS.GV_$SYSSTAT to cprobe;
GRANT SELECT ON SYS.V_$DATAFILE to cprobe;
GRANT SELECT ON SYS.V_$ASM_DISKGROUP_STAT to cprobe;
GRANT SELECT ON SYS.V_$SYSTEM_WAIT_CLASS to cprobe;
GRANT SELECT ON SYS.DBA_TABLESPACE_USAGE_METRICS to cprobe;
GRANT SELECT ON SYS.DBA_TABLESPACES to cprobe;
GRANT SELECT ON SYS.GLOBAL_NAME to cprobe;

安装 Cprobe

Cprobe 是一个探针采集器,支持常见数据库、中间件的采集,比如 MySQL、Redis、MongoDB、Oracle、Kafka、ElasticSearch 等,最新版本是 v0.7.1,我们从 github releases 页面下载:

https://github.com/cprobe/cprobe/releases/tag/v0.7.1

我是 arm 的 linux,所以下载的是 cprobe-v0.7.1-linux-arm64.tar.gz,如果你是 x86 的,应该下载 amd64 那个包。如果你从 github 下载有困难,我这里提供一个国内的下载地址:

https://download.flashcat.cloud/cprobe-v0.7.1-linux-arm64.tar.gz
https://download.flashcat.cloud/cprobe-v0.7.1-linux-amd64.tar.gz

解压缩进入对应目录,执行 install 和 start 命令即可:

./cprobe -install
./cprobe -start
./cprobe -status

安装完成。

配置 Cprobe 采集

首先配置要采集的 Oracle 的地址,进入刚才 cprobe 解压出的目录,编辑 conf.d/oracledb/main.yaml,修改如下:

global:
  scrape_interval: 15s
  external_labels:
    cplugin: 'oracle'

scrape_configs:
- job_name: 'oracle'
  static_configs:
  - targets:
    - 10.99.1.107:1521/xe # ip:port/service
  scrape_rule_files:
  - 'link.toml'
  - 'comm.toml'

上面的 IP 是我的 Oracle 的 IP,你要根据你的环境做调整。这个 main.yaml 又引用了 link.toml 和 comm.toml,在 link.toml 中配置认证信息,比如:

[global]
username = "system"
password = "oracle"
options = {}

comm.toml 的内容不用动。监控 Oracle 的原理就是连上去执行一堆 SQL,comm.toml 中提前帮你准备好了一堆 SQL,其实还有 cust.toml 有更多 SQL,看你需求,如果 cust.toml 中的监控项你也需要,那就把 cust.toml 也配置到 main.yaml 中,如下:

global:
  scrape_interval: 15s
  external_labels:
    cplugin: 'oracle'

scrape_configs:
- job_name: 'oracle'
  static_configs:
  - targets:
    - 10.99.1.107:1521/xe # ip:port/service
  scrape_rule_files:
  - 'link.toml'
  - 'comm.toml'
  - 'cust.toml'

下面我们测试一下,看看是否真的能够采集到数据:

./cprobe -no-writer -no-httpd -plugins oracledb

正常来讲,会输出很多指标,类似下面这样:

./cprobe -no-writer -no-httpd -plugins oracledb
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/logger/flag.go:12 build version: 0.0.1-2023-12-25-08-39-11
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/logger/flag.go:13 command-line flags
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/logger/flag.go:20   -no-httpd="true"
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/logger/flag.go:20   -no-writer="true"
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/logger/flag.go:20   -plugins="oracledb"
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/runner/runner.go:25       hostname: ulric-flashcat.local
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/runner/runner.go:26       runtime.fd_limits: (soft=61440, hard=unlimited)
2023-12-25T10:27:33.868Z        info    /Users/ulric/works/cprobe/lib/runner/runner.go:27       runtime.vm_limits: (soft=unlimited, hard=unlimited)
>> __name__=oracledb_sessions_value cplugin=oracle instance=10.99.1.107:1521/xe job=oracle status=ACTIVE type=BACKGROUND  1703500053881 22.000000
>> __name__=oracledb_sessions_value cplugin=oracle instance=10.99.1.107:1521/xe job=oracle status=ACTIVE type=USER  1703500053881 1.000000
>> __name__=oracledb_resource_current_utilization cplugin=oracle instance=10.99.1.107:1521/xe job=oracle resource_name=processes  1703500053881 29.000000
>> __name__=oracledb_resource_limit_value cplugin=oracle instance=10.99.1.107:1521/xe job=oracle resource_name=processes  1703500053881 100.000000
...

上面的各个参数的含义:

  • -no-writer 表示不写入 TSDB,只是输出到控制台
  • -no-httpd 表示 Cprobe 不启动 HTTP 服务
  • -plugins oracledb 表示只启动 oracledb 插件,如果你还想启动其他插件,可以用逗号分隔,比如 -plugins oracledb,mysql,redis,如果想启动所有插件,就不加 -plugins 参数即可,默认就是启动所有插件

配置 Cprobe 写入 TSDB

监控数据采集到之后,需要写入 TSDB,Cprobe 在 conf.d 目录下提供 writer.yaml 配置文件,把其中 writers.url 部分改成你自己的时序库的 remote write 地址即可。

  • 如果时序库是 Prometheus,url 通常是:http://IP:9090/api/v1/write
  • 如果时序库是单机版本的 VictoriaMetrics,url 通常是:http://IP:8428/api/v1/write
  • 如果时序库是集群版本的 VictoriaMetrics,url 通常是:http://IP:8480/insert/0/prometheus/api/v1/write
  • 如果想把数据直接推给夜莺,url 通常是:http://IP:17000/prometheus/v1/write

配置完成之后,重启 Cprobe 即可:

./cprobe -restart

writer.yaml 的改动需要重启 Cprobe 才能生效。如果是修改各个插件目录下的配置,改完之后发给 HUP 信号给 Cprobe,Cprobe 会自动 reload 配置,不需要重启。比如:

kill -HUP `pidof cprobe`

仪表盘

笔者整理了 Oracle 的 Grafana 仪表盘,分享给大家,不过 Oracle 的指标都是通过配置文件自定义 SQL 采集的,指标差别可能比较大,这个仪表盘只能是仅供参考了:

https://github.com/cprobe/cprobe/blob/main/conf.d/oracledb/doc/dash/grafana_oracledb_01.json

告警规则暂未整理,关注我,回头整理了再分享给大家。上文提到的方法如果你在实践过程中遇到问题,欢迎留言交流哈。

相关推荐
cyt涛1 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油1 小时前
01_SQLite
数据库·sqlite
liuxin334455661 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。2 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec2 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa2 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke3 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D3 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
FIT2CLOUD飞致云3 小时前
测试管理新增视图与高级搜索功能,测试计划支持一键生成缺陷详情,MeterSphere开源持续测试工具v3.3版本发布
开源·接口测试·metersphere·团队协作·持续测试·测试管理
小宇成长录3 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份