Oracle mit Grafana und Prometheus überwachen

Sie können Oracle-Messwerte in Google Cloud mit Grafana und Prometheus erfassen.

Hier ein Beispiel für ein Architekturdiagramm:

Implementierung von Grafana und Prometheus

Virtuelle Maschine einrichten

Erstellen Sie zuerst eine virtuelle Maschine (VM) zum Hosten von Grafana und Prometheus:

  1. Melden Sie sich in der Cloud Console an.
  2. Starten Sie die VM-Instanz in der Virtual Private Cloud (VPC) bzw. im Subnetz, das Sie für den Zugriff auf Oracle-Datenbanken verwenden. Wenn Sie mehrere Datenbanken in mehreren VPCs haben, müssen Sie möglicherweise die statische Route in VPCs hinzufügen.

Anfrage für VM-Start

Prometheus installieren

So installieren Sie Prometheus auf der von Ihnen eingerichteten VM:

  1. Laden Sie die Prometheus-Software herunter:

    wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
    
  2. Entpacken Sie die heruntergeladene Datei:

    tar xvf prometheus-2.19.2.linux-amd64.tar.gz
    
  3. Erstellen Sie den Prometheus-Dienst auf der 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. Erstellen Sie die Prometheus-Dienstdatei:

    cd /lib/systemd/system
    sudo touch prometheus.service
    
  5. Fügen Sie diesen Dateiinhalt der Datei prometheus.service mit einem Texteditor Ihrer Wahl hinzu.

    [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. Aktivieren und starten Sie den Dienst prometheus:

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    

Grafana installieren

Grafana wird für das Dashboard und die Einrichtung des Alarms verwendet.

  1. Erstellen Sie ein yum-Repository für eine einfache Grafana-Installation:

    touch /etc/yum.repos.d/grafana.repo
    
  2. Fügen Sie diese Zeilen /etc/yum.repos.d/grafana.repo hinzu:

    [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. Installieren Sie Grafana über yum install und aktivieren Sie den Dienst:

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

Prometheus-Clientexporter auf den Datenbankservern installieren

Sie benötigen einen Client-Exporter, um Daten von Oracle nach Prometheus zu übertragen. Es stehen zwei Optionen zur Auswahl:

Oracle DB Exporter

  1. Laden Sie die Binärdateien herunter und extrahieren Sie sie:

    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. Erstellen Sie das Shell-Skript wie gezeigt unten im Inhalt. Prüfen Sie, ob tnsping den DB-TNS-Namen unten als dbrman auflöst. Ändern Sie tnsnames.ora, wenn tnsping nicht dbrman auflösen kann.

    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. Führen Sie das Skript im Hintergrund aus und beobachten Sie nohup.out, um festzustellen, ob Fehler generiert werden:

    nohup ./start_mon.sh &
    
  4. Prüfen Sie, ob Messwerte erfasst werden:

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

Prometheus Oracle Exporter

  1. Für diesen Oracle-Exporter sind zusätzliche Schritte erforderlich und Sie müssen ihn erstellen. Installieren Sie zuerst Go 1.14 oder höher. Wenn Sie bereits eine ältere Version von Go installiert haben, entfernen Sie diese, um Fehler zu vermeiden.

    Sorgen Sie dafür, dass Sie den Oracle-Binärpfad zum Oracle- und Root-Nutzer hinzufügen.

    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. Installieren Sie die erforderlichen Pakete für den Go-Build. Sie können den Oracle rpm 12.2-Instant-Client herunterladen, da dieses Paket den Instant-Client 1.2 verwendet. Überspringen Sie auch nicht das 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. Installieren Sie Oracle OCI8 mithilfe der folgenden Schritte.

    pkg-config --cflags --libs oci8
    

    Dieser Fehler tritt zuerst auf, wenn Sie nur das OCI8-Paket installieren. Dieses Problem wurde in diesem Portallink beschrieben.

    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. Zum Installieren von OCI8 müssen Sie einige Pakete installieren, bevor Sie den Exporter erstellen. Führen Sie daher die folgenden Schritte aus, um das Problem zu beheben.

  5. Kopieren Sie oci8.pc aus github in dieses Verzeichnis mit dem Namen /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. Installieren Sie OCI8 noch einmal, nachdem Sie die Umgebungsvariablen exportiert haben.

    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. Erstellen Sie den Exporter:

    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. Nach der erfolgreichen Erstellung können Sie die Datei ~/prometheus_oracle_exporter/oracle.conf so ändern, dass sie die Datenbank enthält, die Sie überwachen möchten:

    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 verwendet ein altes Oracle-Zeitstempelformat. Ändern Sie den Zeitstempel der Datenbank in das alte Format, wenn Sie eine RDBMS-Version 12.2 und höher verwenden. Andernfalls funktioniert das Feature alert.log zur Fehlerüberwachung aufgrund des Zeitstempelproblems nicht.

    alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
    
  10. Starten Sie den Exporter. So erstellen Sie das Shell-Skript:

    vi star_mon_free_db.sh
    

    Fügen Sie die folgenden Zeilen hinzu:

    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
    

    In der RAC-Umgebung können Sie den TNS-Namen als instanzspezifisches Beispiel verwenden. Sie können also jede Instanz verbinden, um die instanzspezifischen Messwerte zu erfassen.

    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. Starten Sie den Daemon:

    nohup ./star_mon_free_db.sh &
    

Ziel auf dem Prometheus-Server hinzufügen

  1. Ändern Sie auf der VM, auf der Sie den Prometheus-Dienst installiert haben, die Datei /etc/prometheus/prometheus.yml, sodass sie die folgenden Endpunktinformationen enthält. Achten Sie darauf, in der yml-Datei Leerzeichen anstelle von Tabs zu verwenden. Der Jobname oracle_short ist der erste Knoten des RAC und oracle_short2 der zweite Knoten.

    - 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. Starten Sie den Dienst prometheus neu, um die neue Änderung zu übernehmen:

    systemctl status prometheus
    

In Grafana ein Dashboard mit Prometheus als Datenquelle erstellen

  1. Die Nutzer-ID und das Passwort für Grafana sind standardmäßig admin. Deaktivieren Sie zuerst die anonyme Anmeldung und lassen Sie die Registrierung zu, indem Sie die Einstellung auf "falsch" setzen.

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

    Starten Sie Grafana neu:

    systemctl restart grafana-server
    
  2. Ändern Sie das Administratorpasswort in Ihr eigenes.

  3. Erstellen Sie die Datenquelle mit den folgenden Schritten:

    Gehen Sie zu **Konfiguration > Datenquellen > Datenquelle hinzufügen > Prometheus auswählen.

    Fügen Sie die URL** als Prometheus-Server-Endpunkt hinzu. In diesem Beispiel ist --web.listen-address=0.0.0.0:9090 der Dienst-Listener. Daher ist die Endpunkt-URL http://localhost:9090.

  4. Prometheus Oracle Explorer enthält einige Beispiel-Dashboards für das Oracle-Monitoring. Wir importieren diese und verwenden sie. Sie können eigene Dashboards erstellen und die verfügbaren Messwerte aufrufen oder die neuen benutzerdefinierten Messwerte erstellen und im neuen Dashboard anzeigen.

    Klicken Sie auf Dashboard > Verwalten > Importieren > Upload.json-Datei und wählen Sie dann die JSON-Datei aus, die Sie von freenetvirtual heruntergeladen haben.

  5. Klicken Sie auf Laden und importieren.

  6. Prüfen Sie, ob die Messwerte im Dashboard angezeigt werden. Klicken Sie auf Dashboards > Allgemein und dann auf das importierte Dashboard.

Fazit

Wir haben eine Monitoring-Beispiellösung mit Open-Source-Software erstellt, die Messwerte erfasst und über ein Dashboard von Ihnen anzeigt.

Sie können diese Messwerte mit den folgenden Erweiterungen schützen:

  • mTls zwischen den einzelnen Endpunkten.
  • Oracle-Passwort verschlüsseln
  • Schützen Sie Grafana-Endpunkte mit GCP-Load-Balancer-SSL und zulässigen IP-Adressen.