Surveiller Oracle avec Grafana et Prometheus

Vous pouvez collecter des métriques Oracle sur Google Cloud avec Grafana et Prometheus.

Voici un exemple de diagramme d'architecture :

Mise en œuvre de Grafana et Prometheus

Configurer une machine virtuelle

Commencez par créer une machine virtuelle (VM) pour héberger à la fois Grafana et Prometheus :

  1. Connectez-vous à la console Cloud.
  2. Lancez l'instance de VM sur le cloud privé virtuel (VPC)/sous-réseau que vous utilisez pour accéder aux bases de données Oracle. Si vous disposez de plusieurs bases de données sur plusieurs VPC, vous devrez peut-être ajouter la route statique sur les VPC.

Requête de lancement de VM

Installer Prometheus

Pour installer Prometheus sur la VM que vous avez configurée, procédez comme suit :

  1. Téléchargez le logiciel Prometheus :

    wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
    
  2. Décompressez le fichier que vous avez téléchargé :

    tar xvf prometheus-2.19.2.linux-amd64.tar.gz
    
  3. Créez le service Prometheus sur la 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. Créez le fichier de service Prometheus :

    cd /lib/systemd/system
    sudo touch prometheus.service
    
  5. Ajoutez le contenu de ce fichier au fichier prometheus.service avec l'éditeur de texte de votre choix.

    [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. Activez et démarrez le service prometheus :

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    

Installer Grafana

Grafana est utilisé pour configurer le tableau de bord et les alarmes.

  1. Créez un dépôt yum pour faciliter l'installation de Grafana :

    touch /etc/yum.repos.d/grafana.repo
    
  2. Ajoutez les lignes suivantes à /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. Installez Grafana via yum install et activez le service :

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

Installer l'exportateur de clients Prometheus sur les serveurs de base de données

Vous aurez besoin d'un exportateur de clients pour transférer les données d'Oracle vers Prometheus. Deux options s'offrent à vous :

Exportateur de base de données Oracle

  1. Téléchargez les binaires et extrayez-les :

    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. Créez le script shell comme dans le contenu ci-dessous. Vous devez vous assurer que tnsping résout le nom TNS de la base de données dans le contenu ci-dessous en tant que dbrman. Modifiez tnsnames.ora si tnsping ne peut pas résoudre 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. Exécutez le script en arrière-plan et surveillez nohup.out pour voir si des erreurs sont générées :

    nohup ./start_mon.sh &
    
  4. Vérifiez que les métriques sont collectées :

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

Exportateur Oracle Prometheus

  1. Cet exportateur Oracle nécessite des étapes supplémentaires et vous devez le compiler. Commencez par installer Go 1.14 ou une version ultérieure. Si une version plus ancienne de Go est déjà installée, supprimez-la pour éviter toute erreur.

    Veillez à ajouter le chemin binaire Go à l'utilisateur racine et Oracle.

    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. Installez les packages requis pour la compilation Go. Vous pouvez télécharger un client instantané Oracle rpm 12.2, car ce package utilise le client instantané 1.2. N'ignorez pas le 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. Installez Oracle OCI8 en procédant comme suit :

    pkg-config --cflags --libs oci8
    

    Cette erreur se produit si vous n'installez que le package OCI8. Ce problème a été décrit dans ce lien vers le portail.

    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. Pour installer OCI8, vous devez installer certains packages avant de compiler l'exportateur. Suivez ces étapes pour résoudre le problème.

  5. Copiez oci8.pc de github dans ce répertoire appelé /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. Réessayez d'installer OCI8 après avoir exporté les variables d'environnement.

    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. Compilez l'exportateur :

    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. Une fois la compilation terminée, vous pouvez modifier le fichier ~/prometheus_oracle_exporter/oracle.conf pour inclure la base de données que vous souhaitez surveiller :

    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. L'exportateur Oracle Prometheus utilise un ancien format d'horodatage Oracle. Veuillez remplacer l'horodatage de votre base de données par l'ancien format si vous exécutez la version 12.2 du SGBDR ou une version ultérieure. Sinon, la fonctionnalité de surveillance des erreurs alert.log ne fonctionnera pas en raison du problème d'horodatage.

    alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
    
  10. Démarrez l'exportateur. Créez le script shell comme suit :

    vi star_mon_free_db.sh
    

    Ajoutez les lignes suivantes :

    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
    

    Dans l'environnement RAC, vous pouvez utiliser le nom TNS en tant qu'instance spécifique, comme dans l'exemple ci-dessous. Vous pouvez donc connecter chaque instance pour collecter les métriques spécifiques à l'instance.

    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. Démarrez le daemon :

    nohup ./star_mon_free_db.sh &
    

Ajouter la cible sur le serveur Prometheus

  1. Sur la VM sur laquelle vous avez installé le service Prometheus, modifiez le fichier /etc/prometheus/prometheus.yml pour contenir les informations de point de terminaison suivantes. Veillez à utiliser des espaces au lieu des tabulations dans le fichier yml. Le nom de tâche oracle_short est le premier nœud du RAC et oracle_short2 est le second.

    - 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. Redémarrez le service prometheus pour appliquer la nouvelle modification :

    systemctl status prometheus
    

Créer un tableau de bord dans Grafana en utilisant Prometheus en tant que source de données

  1. L'ID utilisateur et le mot de passe par défaut de Grafana sont admin. Tout d'abord, désactivez la connexion anonyme et autorisez l'inscription en définissant le paramètre d'activation sur "false".

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

    Redémarrez Grafana :

    systemctl restart grafana-server
    
  2. Remplacez le mot de passe administrateur par le vôtre.

  3. Créez la source de données en procédant comme suit :

    Accédez à **Configuration > Sources de données > Ajouter une source de données > Sélectionner Prometheus.

    Ajoutez une URL** comme point de terminaison du serveur Prometheus. Dans cet exemple, --web.listen-address=0.0.0.0:9090 est l'écouteur de service. L'URL du point de terminaison est donc http://localhost:9090.

  4. L'explorateur Oracle Prometheus dispose de quelques exemples de tableaux de bord pour la surveillance d'Oracle. Nous les importerons et les utiliserons. Vous pouvez créer vos propres tableaux de bord et afficher les métriques disponibles, ou créer des métriques personnalisées et les afficher dans le nouveau tableau de bord.

    Cliquez sur Tableau de bord > Gérer > Importer > Fichier Upload.json, puis sélectionnez le fichier JSON que vous avez téléchargé depuis freenetdigital.

  5. Cliquez sur Charger et importer.

  6. Vérifiez si le tableau de bord affiche les métriques. Cliquez sur Tableaux de bord > Général, puis sur le tableau de bord que vous avez importé.

Résumé

Nous avons créé un exemple de solution de surveillance avec des logiciels Open Source, en capturant les métriques et en les affichant via un tableau de bord que vous possédez.

Vous pouvez protéger ces métriques en mettant en œuvre les améliorations suivantes :

  • Utiliser des mTls entre chaque point de terminaison.
  • Chiffrer le mot de passe Oracle.
  • Protéger les points de terminaison Grafana avec le SSL de l'équilibreur de charge GCP et les adresses IP autorisées.