使用 Grafana 和 Prometheus 監控 Oracle

您可以使用 GrafanaPrometheus 收集 Oracle 指標。 Google Cloud

以下是架構圖範例:

導入 Grafana 和 Prometheus

設定虛擬機器

首先,請建立虛擬機器 (VM) 來代管 Grafana 和 Prometheus:

  1. 登入 Cloud 控制台。
  2. 在用於存取 Oracle Database 的虛擬私有雲 (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. 建立 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 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。如果 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 和 root 使用者。

    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 Exporter 使用舊版 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. 啟動 Daemon:

    nohup ./star_mon_free_db.sh &
    

在 Prometheus 伺服器上新增目標

  1. 在安裝 Prometheus 服務的 VM 上,修改 /etc/prometheus/prometheus.yml 檔案,以便納入下列端點資訊。請務必在 yml 檔案中使用空格,而非 Tab 鍵。工作名稱 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. 請按照下列步驟建立 DataSource。

    依序前往「Configuration」>「Data Sources」>「Add Data Source」>「Choose Prometheus」

    將網址** 新增為 Prometheus 伺服器端點。在這個範例中,--web.listen-address=0.0.0.0:9090 是服務事件監聽器,因此端點網址為 http://localhost:9090

  4. Prometheus Oracle Explorer 提供一些 Oracle 監控範例資訊主頁。我們會匯入並使用這些資料。您可以自行建立資訊主頁並顯示可用的指標,或是建立新的自訂指標並顯示至新資訊主頁。

    依序點選「Dashboard」>「Manage」>「Import」>「Upload.json」檔案,然後選取從 freenetdigital 下載的 JSON 檔案。

  5. 按一下「載入並匯入」

  6. 檢查儀表板是否顯示指標。依序點選「Dashboard」>「General」,然後點選您匯入的 Dashboard。

摘要

我們使用開放原始碼軟體建立了監控解決方案範例,擷取指標並透過您擁有的資訊主頁顯示這些指標。

您可以實施下列強化措施,保護這些指標:

  • 各個端點之間的 mTLS。
  • 加密 Oracle 密碼。
  • 使用 GCP 負載平衡器 SSL 和許可清單 IP 保護 Grafana 端點。