使用 Grafana 和 Prometheus 监控 Oracle

您可以使用 GrafanaPrometheus 在 Google Cloud 上收集 Oracle 指标。

以下是一个架构图示例:

Grafana 和 Prometheus 实现

设置虚拟机

首先,创建一个虚拟机 (VM) 来托管 Grafana 和 Prometheus:

  1. 登录 Cloud 控制台。
  2. 在用于访问 Oracle 数据库的虚拟私有云 (VPC)/子网上启动虚拟机实例。如果您在多个 VPC 中有多个数据库,则可能需要在 VPC 上添加静态路由。

虚拟机启动请求

安装 Prometheus

如需在您设置的虚拟机上安装 Prometheus,请执行以下操作:

  1. 下载 Prometheus 软件:

    wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
    
  2. 解压缩下载的文件:

    tar xvf prometheus-2.19.2.linux-amd64.tar.gz
    
  3. 在虚拟机上创建 Prometheus 服务:

    sudo useradd -rs /bin/false prometheus
    cd prometheus-2.19.2.linux-amd64
    sudo cp prometheus promtool /usr/local/bin
    sudo chown prometheus:prometheus /usr/local/bin/prometheus
    sudo mkdir /etc/prometheus
    sudo cp -R consoles/ console_libraries/ prometheus.yml /etc/prometheus
    sudo mkdir -p data/prometheus
    sudo chown -R prometheus:prometheus data/prometheus /etc/prometheus/*
    
  4. 创建 Prometheus 服务文件:

    cd /lib/systemd/system
    sudo touch prometheus.service
    
  5. 使用您选择的文本编辑器将这些文件内容添加到 prometheus.service 文件中。

    [Unit]
    Description=Prometheus
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    Type=simple
    User=root
    Group=root
    ExecStart=/usr/local/bin/prometheus \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path="/data/prometheus" \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries \
    --web.listen-address=0.0.0.0:9090 \
    --web.enable-admin-api
    
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    
  6. 启用并启动 prometheus 服务:

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    

安装 Grafana

Grafana 用于信息中心和警报设置。

  1. 创建 yum 代码库以便轻松安装 Grafana:

    touch /etc/yum.repos.d/grafana.repo
    
  2. 将以下代码行添加到 /etc/yum.repos.d/grafana.repo

    [grafana]
    name=grafana
    baseurl=https://packages.grafana.com/oss/rpm
    repo_gpgcheck=1
    enabled=1
    gpgcheck=1
    gpgkey=https://packages.grafana.com/gpg.key
    sslverify=1
    sslcacert=/etc/pki/tls/certs/ca-bundle.crt
    
  3. 通过 yum install 安装 Grafana 并启用服务:

    yum install grafana
    sudo systemctl start grafana-server
    sudo systemctl status grafana-server
    

在数据库服务器上安装 Prometheus 客户端导出工具

您需要一个客户端导出工具才能将数据从 Oracle 导出到 Prometheus。有两种导出工具可供您选择:

Oracle 数据库导出工具

  1. 下载二进制文件并将其解压缩:

    wget https://github.com/iamseth/oracledb_exporter/releases/download/0.2.2/oracledb_exporter.0.2.2.linux-amd64.tar.gz
    
    tar -zxf oracledb_exporter.0.2.2.linux-amd64.tar.gz
    cd oracledb_exporter.0.2.2.linux-amd64
    
  2. 在下面的内容中创建 shell 脚本,如下所示。您需要确保 tnsping 将下面的数据库 TNSname 解析为 dbrman。如果 tnsping 无法解析 dbrman,请修改 tnsnames.ora

    export ORACLE_HOSTNAME={your host name}
    export ORACLE_UNQNAME=dbrman
    export ORACLE_BASE=/apps/oracle/oracle_base
    export ORACLE_HOME=/apps/oracle/19.0.0/db_home_standalone
    export ORACLE_SID=dbrman
    export CUSTOM_METRICS=/home/oracle/oracledb_exporter.0.2.2.linux-amd64/custom-metrics.toml
    export PATH=/usr/sbin:$PATH
    export PATH=$ORACLE_HOME/bin:$PATH
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/opt/glibc-2.14/lib
    export DATA_SOURCE_NAME=user/xxxxx@dbrman
    /home/oracle/oracledb_exporter.0.2.2.linux-amd64/oracledb_exporter -default.metrics=/home/oracle/oracledb_exporter.0.2.2.linux-amd64/default-metrics.toml
    -web.listen-address=0.0.0.0:9161
    
  3. 在后台运行脚本,并监控 nohup.out 以查看系统是否产生了任何错误:

    nohup ./start_mon.sh &
    
  4. 检查系统是否正在收集指标:

    curl -s http://YOUR RDBMS IP ADDRESS:9161/metrics | grep oracle
    

Prometheus Oracle 导出工具

  1. 您需要构建此 Oracle 导出工具并需要对其执行一些额外的步骤。首先,安装 Go 1.14 或更高版本。如果您已安装旧版 Go,请移除它以避免出现错误。

    请务必将 Go 二进制路径添加到 Oracle 和根用户。

    wget https://golang.org/dl/go1.14.6.linux-amd64.tar.gz
    sudo tar -C /usr/local -xzf go1.14.6.linux-amd64.tar.gz
    export PATH=$PATH:/usr/local/go/bin
    source ~/.bash_profile
    
    go version
    go version go1.14.6 linux/amd64
    
  2. 安装 Go 版本所需的软件包。您可以下载 Oracle rpm 12.2 即时客户端,因为此软件包使用 1.2 即时客户端。另外,请勿跳过 Oracle SDK oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm

    rpm -i oracle-instantclient12.2-basic-12.2.0.1.0-1.x86_64.rpm
    rpm -i oracle-instantclient12.2-tools-12.2.0.1.0-1.x86_64.rpm
    rpm -i oracle-instantclient12.2-devel-12.2.0.1.0-1.x86_64.rpm
    yum install git
    yum install gcc
    go get github.com/BurntSushi/toml
    go get github.com/prometheus/client_golang/prometheus
    go get github.com/prometheus/common/log
    go get gopkg.in/yaml.v2
    go get github.com/sirupsen/logrus
    go get gopkg.in/alecthomas/kingpin.v2
    
  3. 按照以下步骤安装 Oracle OCI8。

    pkg-config --cflags --libs oci8
    

    首先,如果您只是安装 OCI8 软件包,就会遇到此错误。此门户链接中介绍了此问题。

    Package oci8 was not found in the pkg-config search path.
    Perhaps you should add the directory containing oci8.pc
    to the PKG_CONFIG_PATH environment variable
    No package 'oci8' found
    
  4. 如需安装 OCI8,您需要在构建导出工具之前安装一些软件包,因此请按照以下步骤解决此问题。

  5. 将 oci8.pc 从 github 复制到目录 /usr/local/share/pkgconf

    mkdir /usr/local/share/pkgconfig
    cp {Downloaded unzipped directory}/oci8.pc /usr/local/share/pkgconfig
    
    cat oci8.pc
    
    prefix=/usr
        includedir=${prefix}/include/oracle/12.2/client64 # <<== This is Oracle 12.2 instant client was installed via yum
        libdir=${prefix}/lib/oracle/12.2/client64/lib
    
        Name: oci8
        Description: Oracle Instant Client
        Version: 12.2
        Cflags: -I${includedir}
        Libs: -L${libdir} -lclntsh
     ```
    
  6. 导出环境变量后,尝试重新安装 OCI8。

    export PKG_CONFIG_PATH=/usr/local/share/pkgconfig
    export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib
    go get github.com/mattn/go-oci8
    
  7. 构建导出工具:

    git clone https://github.com/freenetdigital/prometheus_oracle_exporter.git
    cd {cloned directory}
    export GOPATH=/home/oracle/go
    pwd
    
    /home/oracle/prometheus_oracle_exporter
    
    export GOPATH=/home/oracle/go
    go get github.com/freenetdigital/prometheus_oracle_exporter
    cd /home/oracle/go/src/github.com/freenetdigital/prometheus_oracle_exporter/
    ls
    
    alertlog.go  grafana  LICENSE  main.go  misc.go
    oracle.conf.example  README.md
    
    go install
    go build
    
  8. 成功构建后,您便可以修改 ~/prometheus_oracle_exporter/oracle.conf 文件以包含要监控的数据库:

    connections:
       - connection: user/password@dbrman
         database: dbrman
         instance: dbrman
         alertlog:
          - file: /apps/oracle/oracle_base/diag/rdbms/dbrman/dbrman/trace/alert_dbrman.log
          ignoreora:
           - ORA-00001
           - ORA-01033
           - ORA-01041
           - ORA-01089
           - ORA-01555
           - ORA-28
           - ORA-235
           - ORA-609
           - ORA-3136
       queries:
        - sql: "select 1 as column1, 2 as column2 from dual"
          name: sample1
          help: "This is my metric number 1"
          metrics:
           - column1
          labels:
           - column2
        - sql: "select 2 as column1 from dual"
          name: sample2
          help: "This is my metric number 2"
          metrics:
           - column1
    
  9. Prometheus Oracle 导出工具使用旧的 Oracle 时间戳格式。如果您运行的是 12.2 版 RDBMS 及更高版本,请将数据库时间戳更改为旧格式。否则,alert.log 错误监控功能因时间戳问题而无法运作。

    alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
    
  10. 启动导出工具。按如下方式创建 Shell 脚本:

    vi star_mon_free_db.sh
    

    添加以下几行代码:

    export PKG_CONFIG_PATH=/usr/local/share/pkgconfig
    export LD_LIBRARY_PATH=/usr/lib/oracle/12.2/client64/lib
    export TNS_ADMIN=/apps/oracle/19.0.0/db_home_standalone/network/admin
    export NLS_LANG=AMERICAN_AMERICA.UTF8
    /home/oracle/prometheus_oracle_exporter/prometheus_oracle_exporter
    -configfile=/home/oracle/prometheus_oracle_exporter/oracle.conf
    -web.listen-address 0.0.0.0:9500
    -defaultmetrics
    -recovery
    

    在 RAC 环境中,您可以将 TNS 名称用作特定实例,如以下示例所示。因此,您可以连接每个实例以收集实例特定的指标。

    ORCL1 =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = {node 2 IP address} )(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
        (INSTANCE_NAME= orcl1)
      )
    )
    
    ORCL2 =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = {node 1 IP address} )(PORT = 1521))
      (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = orcl)
        (INSTANCE_NAME= orcl2)
      )
    )
    
  11. 启动守护程序:

    nohup ./star_mon_free_db.sh &
    

在 Prometheus 服务器上添加目标

  1. 在安装了 Prometheus 服务的虚拟机上,修改 /etc/prometheus/prometheus.yml 文件以包含以下端点信息。确保在 yml 文件中使用空格而不是制表符。作业名称 oracle_short 是 RAC 的第一个节点,oracle_short2 是第二个节点。

    - job_name: 'oracle_short'
      static_configs:
    - targets: ['{your DB IP}:9500']
      relabel_configs:
      - source_labels: ['__address__']
       target_label: instance
       regex:  '(.*):\d+'
       replacement: "${1}"
    - job_name: 'oracle_short2'
    static_configs:
    - targets:
      - 192.168.1.11:9500
    relabel_configs:
     - source_labels: ['__address__']
       target_label: instance
       regex:  '(.*):\d+'
       replacement: "${1}"
    
  2. 重启 prometheus 服务以让新更改生效:

    systemctl status prometheus
    

在 Grafana 中使用 Prometheus 作为数据源创建信息中心

  1. 默认的 Grafana 用户 ID 和密码是 admin。首先,停用匿名登录,并将 enabled 设置为 false,以允许注册。

    vi /etc/grafana/grafana.ini
    
    enable anonymous access
    ;enabled = false
    disable user signup / registration
    ;allow_sign_up = false
    

    重启 Grafana:

    systemctl restart grafana-server
    
  2. 将管理员密码更改为您自己的密码。

  3. 按照以下步骤创建数据源。

    转到“配置”>“数据源”>“添加数据源”>“选择 Prometheus”

    添加网址**作为您的 Prometheus 服务器端点。在此示例中,--web.listen-address=0.0.0.0:9090 是服务监听器,因此端点网址为 http://localhost:9090

  4. Prometheus Oracle Explorer 提供了一些用于 Oracle 监控的示例信息中心。我们将导入并使用它们。您可以创建自己的信息中心并显示可用的指标,也可以创建新的自定义指标并将其显示在新的信息中心内。

    点击信息中心 > 管理 > 导入 > 上传 .json 文件,然后选择您从 freenetdigital 下载的 JSON 文件。

  5. 点击加载并导入

  6. 检查信息中心是否显示指标。点击信息中心 > 常规,然后点击您导入的信息中心。

摘要

我们使用开源软件创建了一个示例监控解决方案,它可以捕获指标并通过您拥有的信息中心显示这些指标。

您可以通过实施以下增强功能来保护这些指标:

  • 每个端点之间的 mTls。
  • 加密 Oracle 密码。
  • 使用 GCP 负载均衡器 SSL 和列入许可名单的 IP 来保护 Grafana 端点。