Monitora Oracle con Grafana e Prometheus

Puoi raccogliere le metriche Oracle su Google Cloud con Grafana e Prometheus.

Ecco un diagramma di architettura di esempio:

Implementazione di Grafana e Prometheus

Configurare una macchina virtuale

Innanzitutto, crea una macchina virtuale (VM) per ospitare sia Grafana che Prometheus:

  1. Accedi alla console Cloud.
  2. Avvia l'istanza VM nel virtual private cloud (VPC)/nella subnet che utilizzi per accedere ai database Oracle. Se hai più database in più VPC, potresti dover aggiungere la route statica alle VPC.

Richiesta di lancio della VM

Installa Prometheus

Per installare Prometheus sulla VM configurata:

  1. Scarica il software Prometheus:

    wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
    
  2. Estrai il file scaricato:

    tar xvf prometheus-2.19.2.linux-amd64.tar.gz
    
  3. Crea il servizio Prometheus sulla VM:

    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. Crea il file del servizio Prometheus:

    cd /lib/systemd/system
    sudo touch prometheus.service
    
  5. Aggiungi questi contenuti al file prometheus.service con un editor di testo di tua scelta.

    [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. Attiva e avvia il servizio prometheus:

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    

Installa Grafana

Grafana viene utilizzato per la configurazione della dashboard e dell'allarme.

  1. Crea il repository yum per un'installazione facile di Grafana:

    touch /etc/yum.repos.d/grafana.repo
    
  2. Aggiungi queste righe a /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. Installa Grafana tramite yum install e attiva il servizio:

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

Installa l'esportatore client Prometheus sui server di database

Per trasferire i dati da Oracle a Prometheus, devi disporre di un esportatore client. Puoi scegliere tra due opzioni:

Oracle DB Exporter

  1. Scarica i file binari ed estraili:

    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. Crea lo script shell come indicato di seguito. Devi assicurarti che tnsping risolva il nome TNS del database di seguito come dbrman. Modifica tnsnames.ora se tnsping non riesce a risolvere dbrman.

    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. Esegui lo script in background e monitora nohup.out per verificare se vengono generati errori:

    nohup ./start_mon.sh &
    
  4. Verifica che le metriche vengano raccolte:

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

Prometheus Oracle Exporter

  1. Questo esportatore Oracle richiede passaggi aggiuntivi e dovrai crearlo. Innanzitutto, installa Go 1.14 o versioni successive. Se hai già installato una versione precedente di Go, rimuovila per evitare errori.

    Assicurati di aggiungere il percorso del file binario Go all'utente Oracle e all'utente 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. Installa i pacchetti richiesti per la compilazione Go. Puoi scaricare il client istantaneo Oracle rpm 12.2 poiché questo pacchetto utilizza il client istantaneo 1.2. Inoltre,non saltare l'SDK Oracle 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. Installa Oracle OCI8 seguendo i passaggi che seguono.

    pkg-config --cflags --libs oci8
    

    Innanzitutto, questo errore si verifica se installi solo il pacchetto OCI8. Questo problema è stato descritto in questo link al portale.

    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. Per installare OCI8, devi installare alcuni pacchetti prima di compilare l'esportatore, quindi segui questi passaggi per risolvere il problema.

  5. Copia oci8.pc da GitHub in questa directory denominata /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. Prova a installare di nuovo OCI8 dopo aver esportato le variabili di ambiente.

    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. Crea l'esportatore:

    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. Una volta completata la compilazione, puoi modificare il file ~/prometheus_oracle_exporter/oracle.conf per includere il database che vuoi monitorare:

    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 utilizza un vecchio formato di timestamp Oracle. Se utilizzi la versione 12.2 o successive del RDBMS, modifica il timestamp del database nel vecchio formato. In caso contrario, la funzionalità di monitoraggio degli errori alert.log non funzionerà a causa del problema con il timestamp.

    alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
    
  10. Avvia l'esportatore. Crea lo script shell come segue:

    vi star_mon_free_db.sh
    

    Aggiungi queste righe:

    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
    

    Nell'ambiente RAC, puoi utilizzare il nome TNS come istanza specifica, come nell'esempio riportato di seguito. In questo modo puoi collegare ogni istanza per raccogliere le metriche specifiche dell'istanza.

    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. Avvia il daemon:

    nohup ./star_mon_free_db.sh &
    

Aggiungi il target sul server Prometheus

  1. Nella VM in cui hai installato il servizio Prometheus, modifica il file /etc/prometheus/prometheus.yml in modo che contenga le seguenti informazioni sull'endpoint. Assicurati di utilizzare spazi anziché tabulazioni nel file yml. Il nome del job oracle_short è il primo nodo del cluster RAC e oracle_short2 è il secondo.

    - 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. Riavvia il servizio prometheus per rilevare la nuova modifica:

    systemctl status prometheus
    

Creare una dashboard in Grafana utilizzando Prometheus come origine dati

  1. L'ID utente e la password di Grafana predefiniti sono admin. Innanzitutto, disattiva l'accesso anonimo e consenti la registrazione impostando l'opzione abilitata su false.

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

    Riavviare Grafana:

    systemctl restart grafana-server
    
  2. Cambia la password amministratore con la tua.

  3. Crea DataSource seguendo questa procedura.

    Vai a **Configurazione > Origini dati > Aggiungi origine dati > Scegli Prometheus

    Aggiungi l'URL** come endpoint del server Prometheus. In questo esempio, --web.listen-address=0.0.0.0:9090 è l'ascoltatore del servizio, quindi l'URL dell'endpoint è http://localhost:9090.

  4. Prometheus Oracle Explorer contiene alcune dashboard di esempio per il monitoraggio di Oracle. Li importeremo e li utilizzeremo. Puoi creare le tue dashboard e visualizzare le metriche disponibili oppure creare le nuove metriche personalizzate e visualizzarle nella nuova dashboard.

    Fai clic su Dashboard > Gestisci > Importa > Carica file JSON, quindi seleziona il file JSON scaricato da freenetdigital.

  5. Fai clic su Carica e importa.

  6. Controlla se la dashboard mostra le metriche. Fai clic su Dashboard > Generale, quindi sulla dashboard che hai importato.

Riepilogo

Abbiamo creato una soluzione di monitoraggio di esempio con software open source per acquisire le metriche e visualizzarle tramite una dashboard di tua proprietà.

Puoi proteggere queste metriche implementando i seguenti miglioramenti:

  • mTls tra ciascun endpoint.
  • Crittografa la password Oracle.
  • Proteggi gli endpoint di Grafana con il bilanciatore del carico SSL di Google Cloud e gli IP inseriti nella lista consentita.