Grafana と Prometheus による Oracle のモニタリング
Google Cloud Grafana と Prometheus を使用して Oracle の指標を収集できます。
以下に、サンプルのアーキテクチャ図を示します。
仮想マシンを設定する
まず、Grafana と Prometheus の両方をホストする仮想マシン(VM)を作成します。
- Cloud Console にログインします。
- Oracle Database へのアクセスに使用する Virtual Private Cloud(VPC)またはサブネットで VM インスタンスを起動します。複数の VPC にわたって複数のデータベースが存在する場合は、VPC に静的ルートを追加することが必要になることがあります。
Prometheus をインストールする
設定した VM に Prometheus をインストールするには:
Prometheus ソフトウェアをダウンロードします。
wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
ダウンロードしたファイルを展開します。
tar xvf prometheus-2.19.2.linux-amd64.tar.gz
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/*
Prometheus サービス ファイルを作成します。
cd /lib/systemd/system sudo touch prometheus.service
任意のテキスト エディタで、これらのファイルの内容を
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
prometheus
サービスを有効にして開始します。sudo systemctl enable prometheus sudo systemctl start prometheus
Grafana をインストールする
Grafana はダッシュボードとアラームの設定に使用されます。
Grafana を簡単にインストールできるように yum リポジトリを作成します。
touch /etc/yum.repos.d/grafana.repo
/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
yum install
で Grafana をインストールし、サービスを有効にします。yum install grafana sudo systemctl start grafana-server sudo systemctl status grafana-server
Prometheus クライアント エクスポータをデータベース サーバーにインストールする
Oracle から Prometheus にデータを取得するには、クライアント エクスポータが必要です。次の 2 つの選択肢があります。
Oracle DB エクスポータ
バイナリをダウンロードして展開します。
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
次のようにシェル スクリプトを作成します。以下に示すように、
tnsping
で DB 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
スクリプトをバックグラウンドとして実行し、
nohup.out
をモニタリングしてエラーが発生しているかどうかを確認します。nohup ./start_mon.sh &
収集された指標を確認します。
curl -s http://YOUR RDBMS IP ADDRESS:9161/metrics | grep oracle
Prometheus Oracle エクスポータ
この 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
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
以下の手順で 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
OCI8 をインストールするには、エクスポータをビルドする前にインストールする必要があるパッケージがいくつか存在します。次の手順で問題を解決してください。
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 ```
環境変数をエクスポートした後に、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
エクスポータをビルドします。
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
ビルドが正常に完了したら、モニタリングするデータベースが含まれるように、
~/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
Prometheus Oracle エクスポータは古い Oracle タイムスタンプ形式を使用します。12.2 以降のバージョンの RDBMS を実行している場合は、データベースのタイムスタンプを古い形式に変更してください。変更を行わない場合は、タイムスタンプの問題が原因で
alert.log
エラー モニタリング機能は動作しません。alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
エクスポータを起動します。次のようにシェル スクリプトを作成します。
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) ) )
デーモンを起動します。
nohup ./star_mon_free_db.sh &
Prometheus サーバーにターゲットを追加する
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}"
prometheus
サービスを再起動して新しい変更を適用します。systemctl status prometheus
Prometheus をデータソースとして使用して Grafana にダッシュボードを作成する
デフォルトの 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
管理者パスワードをご自分のパスワードに変更します。
次の手順で DataSource を作成します。
**[Configuration] > [Data Sources] > [Add Data Source] > [Choose Prometheus] の順に移動します。
Prometheus サーバー エンドポイントとして URL** を追加します。この例の
--web.listen-address=0.0.0.0:9090
はサービス リスナーであるため、エンドポイント URL はhttp://localhost:9090
です。Prometheus Oracle Explorer には、Oracle モニタリング用のサンプル ダッシュボードがあります。これらをインポートして使用します。独自のダッシュボードを作成して、使用可能な指標を表示できます。また、新しいカスタム指標を作成して、新しいダッシュボードに表示することもできます。
[Dashboard] > [Manage] > [Import] > [Upload.json file] をクリックし、freenetdigital からダウンロードした json ファイルを選択します。
[Load and Import] をクリックします。
ダッシュボードに指標が表示されるかどうかを確認します。[Dashboards] > [General] をクリックし、インポートしたダッシュボードをクリックします。
概要
オープンソース ソフトウェアを使用して指標をキャプチャし、所有するダッシュボードで表示するサンプル モニタリング ソリューションを作成しました。
これらの指標は、次の拡張機能を実装することで保護できます。
- 各エンドポイント間の mTLS。
- Oracle パスワードの暗号化。
- GCP ロードバランサの SSL と許可リストに登録された IP を使用した Grafana エンドポイントの保護。