Skip to content

Oracle Prometheus + Grafana集成监控

概述

Prometheus + Grafana是目前流行的开源监控解决方案组合,适用于大规模分布式系统的监控。将其与Oracle数据库集成,可以实现对Oracle数据库的全面监控,包括性能指标、资源使用情况、可用性状态等。

Prometheus负责数据采集和存储,通过Exporter从Oracle数据库获取监控指标;Grafana负责数据可视化和告警,提供直观的仪表盘和灵活的告警配置。

集成架构设计

架构组件

  1. Oracle数据库:监控目标,提供动态性能视图和系统视图供Exporter查询
  2. Oracle Exporter:从Oracle数据库采集监控指标,暴露给Prometheus
  3. Prometheus Server:负责数据采集、存储和查询
  4. Grafana Server:提供数据可视化和告警配置
  5. Alertmanager:处理告警通知,支持多种通知方式

架构图

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Oracle 19c/21c │────▶│ Oracle Exporter │────▶│ Prometheus     │
└─────────────────┘     └─────────────────┘     │ Server         │
                                                └─────────────────┘


┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Alertmanager   │◀────│   Grafana       │◀────│ Prometheus     │
│                 │────▶│   Server        │     │ Server         │
└─────────────────┘     └─────────────────┘     └─────────────────┘

数据流向

  1. Oracle Exporter通过JDBC连接Oracle数据库,定期查询动态性能视图
  2. Exporter将查询结果转换为Prometheus格式的指标,暴露在HTTP端口
  3. Prometheus定期从Exporter拉取指标数据,存储到时间序列数据库
  4. Grafana连接Prometheus数据源,通过SQL查询获取指标数据
  5. Grafana将数据可视化展示,并根据配置的告警规则生成告警
  6. 告警发送到Alertmanager,由Alertmanager根据路由规则发送通知

部署步骤

1. 安装Oracle Exporter

1.1 选择合适的Exporter

目前主流的Oracle Exporter有两种:

  • Prometheus Oracle Exporter(官方维护,功能全面)
  • Oracle DB Exporter(第三方维护,轻量级)

根据生产环境需求选择合适的Exporter。

1.2 安装Exporter

以Prometheus Oracle Exporter为例:

bash
# 下载Exporter
wget https://github.com/iamseth/oracle_exporter/releases/download/v0.4.0/oracle_exporter.0.4.0.linux-amd64.tar.gz

# 解压
mkdir -p /opt/oracle_exporter
tar -zxvf oracle_exporter.0.4.0.linux-amd64.tar.gz -C /opt/oracle_exporter

# 创建配置文件
cat > /opt/oracle_exporter/oracle_exporter.yml << EOF
exporters:
  oracle:
    data_source_name: "username/password@//hostname:1521/SID"
    collection_interval: 60s
    collection_timeout: 30s
EOF

# 创建systemd服务
cat > /etc/systemd/system/oracle_exporter.service << EOF
[Unit]
Description=Prometheus Oracle Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/oracle_exporter/oracle_exporter --config.file=/opt/oracle_exporter/oracle_exporter.yml

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl start oracle_exporter
systemctl enable oracle_exporter

2. 配置Prometheus

2.1 编辑Prometheus配置文件

yaml
# /etc/prometheus/prometheus.yml
scrape_configs:
  - job_name: 'oracle'
    static_configs:
      - targets: ['oracle_exporter_ip:9161']
    scrape_interval: 60s
    scrape_timeout: 30s
    metrics_path: /metrics

2.2 重启Prometheus服务

bash
systemctl restart prometheus

3. 安装和配置Grafana

3.1 安装Grafana

bash
# CentOS/RHEL
yum install -y https://dl.grafana.com/oss/release/grafana-9.0.0-1.x86_64.rpm
systemctl start grafana-server
systemctl enable grafana-server

# Ubuntu/Debian
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
apt-get update
apt-get install -y grafana
systemctl start grafana-server
systemctl enable grafana-server

3.2 配置Grafana数据源

  1. 登录Grafana控制台(默认端口3000,用户名/密码:admin/admin)
  2. 导航到"Configuration" > "Data Sources"
  3. 点击"Add data source",选择"Prometheus"
  4. 配置Prometheus数据源:
    • Name: Oracle Prometheus
    • URL: http://prometheus_ip:9090
    • Access: Server
    • 其他保持默认
  5. 点击"Save & Test"验证配置

3.3 导入Oracle监控仪表盘

  1. 导航到"Create" > "Import"
  2. 输入仪表盘ID(推荐使用13925或9614),或上传JSON文件
  3. 选择之前配置的Prometheus数据源
  4. 点击"Import"完成导入

4. 配置Alertmanager

4.1 安装Alertmanager

bash
# 下载Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz

# 解压
mkdir -p /opt/alertmanager
tar -zxvf alertmanager-0.24.0.linux-amd64.tar.gz -C /opt/alertmanager

# 创建配置文件
cat > /opt/alertmanager/alertmanager.yml << EOF
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'email-notifications'

receivers:
- name: 'email-notifications'
  email_configs:
  - to: 'dba@example.com'
    from: 'alertmanager@example.com'
    smarthost: 'smtp.example.com:25'
    auth_username: 'alertmanager'
    auth_password: 'password'
    require_tls: false

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'cluster', 'service']
EOF

# 创建systemd服务
cat > /etc/systemd/system/alertmanager.service << EOF
[Unit]
Description=Prometheus Alertmanager
After=network.target

[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/alertmanager/alertmanager --config.file=/opt/alertmanager/alertmanager.yml

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
systemctl daemon-reload
systemctl start alertmanager
systemctl enable alertmanager

4.2 配置Prometheus连接Alertmanager

yaml
# /etc/prometheus/prometheus.yml
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['alertmanager_ip:9093']

监控指标配置

核心监控指标

Oracle Exporter可以采集多种类型的指标,包括:

1. 数据库基本信息

指标名称描述Oracle视图19c/21c差异
oracle_up数据库连接状态N/A无明显差异
oracle_version_info数据库版本信息V$VERSION21c返回更新的版本信息
oracle_instance_status实例状态V$INSTANCE无明显差异

2. 性能指标

指标名称描述Oracle视图19c/21c差异
oracle_sessions_active活动会话数V$SESSION21c支持更高并发
oracle_sessions_inactive非活动会话数V$SESSION无明显差异
oracle_sql_execute_timeSQL执行时间V$SQLSTATS21c优化SQL执行计划
oracle_wait_time_seconds_total等待事件总时间V$SESSION_EVENT无明显差异

3. 资源使用指标

指标名称描述Oracle视图19c/21c差异
oracle_sga_bytesSGA大小V$SGA无明显差异
oracle_pga_bytesPGA大小V$PGASTAT21c优化PGA管理
oracle_tablespace_used_bytes表空间使用量DBA_TABLESPACE_USAGE_METRICS无明显差异
oracle_tablespace_free_bytes表空间空闲量DBA_TABLESPACE_USAGE_METRICS无明显差异

4. I/O指标

指标名称描述Oracle视图19c/21c差异
oracle_io_read_bytes_total读取字节数V$FILESTAT21c优化I/O处理
oracle_io_write_bytes_total写入字节数V$FILESTAT21c优化I/O处理
oracle_io_read_time_seconds_total读取时间V$FILESTAT无明显差异
oracle_io_write_time_seconds_total写入时间V$FILESTAT无明显差异

自定义指标配置

可以通过修改Exporter配置文件,添加自定义SQL查询来采集特定指标:

yaml
# /opt/oracle_exporter/oracle_exporter.yml
exporters:
  oracle:
    data_source_name: "username/password@//hostname:1521/SID"
    collection_interval: 60s
    custom_queries:
      - name: custom_table_size
        help: "Size of custom tables"
        sql: "SELECT table_name, bytes FROM user_segments WHERE segment_type = 'TABLE'"
        metrics:
          - name: table_size_bytes
            type: gauge
            labels: [table_name]
            value: bytes

告警配置

1. 在Prometheus中配置告警规则

yaml
# /etc/prometheus/alert_rules.yml
groups:
- name: oracle_alerts
  rules:
  - alert: OracleInstanceDown
    expr: oracle_up == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Oracle Instance Down"
      description: "The Oracle instance {{ $labels.instance }} has been down for more than 5 minutes."

  - alert: HighActiveSessions
    expr: oracle_sessions_active > 100
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High Active Sessions"
      description: "Instance {{ $labels.instance }} has {{ $value }} active sessions, which is above the threshold of 100."

  - alert: TablespaceUsageCritical
    expr: (oracle_tablespace_used_bytes / oracle_tablespace_bytes_total) * 100 > 90
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Tablespace Usage Critical"
      description: "Tablespace {{ $labels.tablespace }} on {{ $labels.instance }} is {{ $value | humanizePercentage }} full."

  - alert: HighWaitTime
    expr: rate(oracle_wait_time_seconds_total[5m]) > 10
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High Wait Time"
      description: "Instance {{ $labels.instance }} has high wait time of {{ $value }} seconds per minute."

2. 在Grafana中配置告警

  1. 登录Grafana控制台
  2. 导航到仪表盘,选择要添加告警的面板
  3. 点击"Edit"按钮,切换到"Alert"标签
  4. 点击"Create Alert Rule",配置告警规则:
    • 名称:告警规则名称
    • 条件:设置告警触发条件
    • 评估期:设置告警评估时间
    • 通知渠道:选择之前配置的通知渠道
  5. 点击"Save"保存告警规则

19c与21c版本差异

特性19c21c
动态性能视图丰富更丰富,新增多个视图
SQL执行计划稳定优化,响应时间更稳定
并发支持更高,支持更多并发会话
I/O处理良好优化,I/O性能提升
监控指标精度秒级支持毫秒级指标
资源管理完善更完善,支持细粒度资源控制

版本差异处理

  1. 动态性能视图差异

    • 21c新增了一些动态性能视图,如V$SQL_MONITOR_HISTORY
    • Exporter需要支持这些新增视图才能采集完整指标
  2. 指标精度差异

    • 21c支持毫秒级指标,监控配置时需要调整阈值
    • Grafana仪表盘需要支持毫秒级显示
  3. 并发指标差异

    • 21c支持更高并发,需要调整会话数告警阈值
    • 资源使用指标需要重新评估正常范围

最佳实践

1. 性能优化

  • Exporter性能

    • 合理设置采集间隔,避免过于频繁的查询影响数据库性能
    • 只采集必要的指标,减少查询开销
    • 使用只读用户连接数据库,限制权限
  • Prometheus性能

    • 合理设置存储保留时间,避免存储过大
    • 配置数据压缩,减少存储占用
    • 使用Prometheus联邦集群,分散负载
  • Grafana性能

    • 优化仪表盘查询,减少数据量
    • 合理设置刷新间隔,避免频繁查询
    • 使用缓存机制,提高查询效率

2. 高可用配置

  • Exporter高可用

    • 部署多个Exporter实例,避免单点故障
    • 使用负载均衡器分发请求
  • Prometheus高可用

    • 部署Prometheus主备集群
    • 使用Thanos或VictoriaMetrics实现高可用
  • Grafana高可用

    • 部署Grafana集群,使用共享数据库
    • 配置负载均衡器分发请求

3. 安全性配置

  • 网络安全

    • 使用HTTPS加密通信
    • 配置防火墙,限制访问IP
    • 使用VPN或专用网络连接
  • 认证授权

    • 配置Grafana用户认证,启用RBAC
    • 为Exporter配置基本认证
    • 限制Prometheus访问IP
  • 数据安全

    • 加密存储敏感数据
    • 定期备份配置文件和数据
    • 配置审计日志,记录访问行为

4. 监控策略

  • 分层监控

    • 基础设施层:监控服务器CPU、内存、磁盘
    • 数据库层:监控Oracle实例、性能、资源使用
    • 应用层:监控应用响应时间、吞吐量
  • 告警策略

    • 设置多级告警,如警告、严重、紧急
    • 配置告警抑制规则,避免告警风暴
    • 建立告警处理流程,明确责任人
  • 定期回顾

    • 定期回顾监控指标,优化监控策略
    • 定期演练告警处理流程
    • 定期更新监控仪表盘,适应业务变化

常见问题(FAQ)

1. Exporter无法连接Oracle数据库

问题:Exporter日志显示"ORA-12541: TNS:no listener"或"ORA-12514: TNS:listener does not currently know of service requested in connect descriptor"

解决方案

  • 检查Oracle监听器是否正常运行:lsnrctl status
  • 检查TNS连接字符串是否正确
  • 检查数据库服务是否注册到监听器:lsnrctl services
  • 检查防火墙是否开放1521端口
  • 检查Exporter服务器是否能ping通数据库服务器

2. Prometheus无法获取指标

问题:Prometheus Targets页面显示Oracle Exporter状态为"DOWN"

解决方案

  • 检查Exporter是否正常运行:systemctl status oracle_exporter
  • 检查Exporter日志是否有错误信息
  • 检查Prometheus配置文件中的target地址和端口是否正确
  • 检查防火墙是否开放Exporter端口(默认9161)
  • 手动访问Exporter的/metrics端点,检查是否能获取指标:curl http://exporter_ip:9161/metrics

3. Grafana仪表盘显示无数据

问题:Grafana仪表盘显示"No data"或"Data source is working"但无数据

解决方案

  • 检查Prometheus数据源配置是否正确
  • 检查Prometheus是否有数据:在Prometheus UI中执行查询
  • 检查Grafana查询语句是否正确
  • 检查时间范围是否设置正确
  • 检查指标名称是否拼写正确

4. 告警不触发

问题:配置了告警规则,但指标超过阈值时告警不触发

解决方案

  • 检查告警规则配置是否正确
  • 检查Prometheus是否加载了告警规则文件
  • 检查指标是否符合告警条件
  • 检查告警评估周期是否设置正确
  • 检查Alertmanager是否正常运行

5. 告警频繁触发

问题:告警频繁触发,导致告警风暴

解决方案

  • 调整告警阈值,使其更合理
  • 增加告警持续时间,避免瞬时峰值触发告警
  • 配置告警抑制规则,减少重复告警
  • 优化监控指标,减少噪声指标
  • 建立告警聚合规则,合并相关告警

6. 19c和21c监控配置差异

问题:同一套监控配置在19c和21c上表现不同

解决方案

  • 针对不同版本创建独立的告警规则
  • 针对不同版本创建独立的Grafana仪表盘
  • 调整指标阈值,适应不同版本的性能特性
  • 使用标签区分不同版本的实例

7. 监控系统性能影响

问题:监控系统对Oracle数据库性能产生影响

解决方案

  • 减少采集频率,避免过于频繁的查询
  • 减少采集的指标数量,只采集必要指标
  • 使用只读用户连接数据库,限制权限
  • 优化Exporter查询,减少数据库负载
  • 考虑使用Oracle Enterprise Manager Cloud Control进行更高效的监控

总结

Prometheus + Grafana集成监控Oracle数据库是一种强大的监控解决方案,具有开源、灵活、可扩展等优点。通过合理的架构设计、部署配置和最佳实践,可以实现对Oracle数据库的全面监控。

在实际生产环境中,需要根据数据库版本(19c/21c)、规模和业务需求,调整监控配置和告警策略。同时,要注意监控系统本身的性能和可用性,避免对被监控系统产生负面影响。

通过持续优化监控配置和告警策略,可以建立一个高效、可靠的数据库监控系统,确保Oracle数据库的稳定运行和良好性能。