Grafana と Prometheus による Oracle のモニタリング

Google Cloud GrafanaPrometheus を使用して Oracle の指標を収集できます。

以下に、サンプルのアーキテクチャ図を示します。

Grafana と Prometheus の実装

仮想マシンを設定する

まず、Grafana と Prometheus の両方をホストする仮想マシン(VM)を作成します。

  1. Cloud Console にログインします。
  2. Oracle Database へのアクセスに使用する Virtual Private Cloud(VPC)またはサブネットで VM インスタンスを起動します。複数の VPC にわたって複数のデータベースが存在する場合は、VPC に静的ルートを追加することが必要になることがあります。

VM 起動リクエスト

Prometheus をインストールする

設定した VM に 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. VM に 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. Grafana を簡単にインストールできるように yum リポジトリを作成します。

    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 にデータを取得するには、クライアント エクスポータが必要です。次の 2 つの選択肢があります。

Oracle DB エクスポータ

  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. 次のようにシェル スクリプトを作成します。以下に示すように、tnsping で DB TNSname が dbrman として解決されるようにします。tnspingdbrman を解決できない場合は、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 がすでにインストールされている場合は、古いバージョンを削除してエラーを回避します。

    Oracle ユーザーと root ユーザーに Go バイナリパスを追加します。

    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 ビルドに必要なパッケージをインストールします。このパッケージは 1.2 インスタント クライアントを使用しているため、Oracle rpm 12.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. github から /usr/local/share/pkgconf というディレクトリに oci8.pc をコピーします。

    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. エクスポータを起動します。次のようにシェル スクリプトを作成します。

    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 サービスをインストールした VM で、次のエンドポイント情報を含むように /etc/prometheus/prometheus.yml ファイルを変更します。yml ファイルでは、タブではなくスペースを使用してください。ジョブ名 oracle_short は、RAC の最初のノード、oracle_short2 は 2 番目のノードです。

    - 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
    

Prometheus をデータソースとして使用して Grafana にダッシュボードを作成する

  1. デフォルトの Grafana ユーザーの ID とパスワードは admin です。まず、匿名ログインを無効にし、有効になっている項目を 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. 次の手順で DataSource を作成します。

    **[Configuration] > [Data Sources] > [Add Data Source] > [Choose Prometheus] の順に移動します。

    Prometheus サーバー エンドポイントとして URL** を追加します。この例の --web.listen-address=0.0.0.0:9090 はサービス リスナーであるため、エンドポイント URL は http://localhost:9090 です。

  4. Prometheus Oracle Explorer には、Oracle モニタリング用のサンプル ダッシュボードがあります。これらをインポートして使用します。独自のダッシュボードを作成して、使用可能な指標を表示できます。また、新しいカスタム指標を作成して、新しいダッシュボードに表示することもできます。

    [Dashboard] > [Manage] > [Import] > [Upload.json file] をクリックし、freenetdigital からダウンロードした json ファイルを選択します。

  5. [Load and Import] をクリックします。

  6. ダッシュボードに指標が表示されるかどうかを確認します。[Dashboards] > [General] をクリックし、インポートしたダッシュボードをクリックします。

概要

オープンソース ソフトウェアを使用して指標をキャプチャし、所有するダッシュボードで表示するサンプル モニタリング ソリューションを作成しました。

これらの指標は、次の拡張機能を実装することで保護できます。

  • 各エンドポイント間の mTLS。
  • Oracle パスワードの暗号化。
  • GCP ロードバランサの SSL と許可リストに登録された IP を使用した Grafana エンドポイントの保護。