Supervisa Oracle con Grafana y Prometheus

Puedes recopilar métricas de Oracle en Google Cloud con Grafana y Prometheus.

A continuación, se muestra un diagrama de arquitectura de muestra:

Implementación de Grafana y Prometheus

Configura una máquina virtual

Primero, cree una máquina virtual (VM) para alojar a Grafana y Prometheus:

  1. Accede a la consola de Cloud.
  2. Inicia la instancia de VM en la nube privada virtual (VPC)/subred que usas para acceder a las bases de datos de Oracle. Si tienes varias bases de datos en varias VPC, es posible que debas agregar la ruta estática en las VPC.

Solicitud de inicio de VM

Instala Prometheus

Para instalar Prometheus en la VM que configuraste, sigue estos pasos:

  1. Descarga el software de Prometheus:

    wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
    
  2. Descomprime el archivo que descargaste:

    tar xvf prometheus-2.19.2.linux-amd64.tar.gz
    
  3. Crea el servicio de Prometheus en 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. Crea el archivo de servicio de Prometheus:

    cd /lib/systemd/system
    sudo touch prometheus.service
    
  5. Agrega estos contenidos de archivo al archivo prometheus.service con el editor de texto que prefieras.

    [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. Habilita e inicia el servicio prometheus:

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    

Instala Grafana

Grafana se usa para configurar el panel y la alarma.

  1. Crea un repositorio de yum para facilitar la instalación de Grafana:

    touch /etc/yum.repos.d/grafana.repo
    
  2. Agrega estas líneas 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. Instala Grafana mediante yum install y habilita el servicio:

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

Instala el exportador de clientes de Prometheus en los servidores de las bases de datos

Necesitarás un exportador de clientes para obtener los datos de Oracle a Prometheus. Puedes elegir entre dos:

Exportador de base de datos de Oracle

  1. Descarga los objetos binarios y extráelos:

    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 la secuencia de comandos de shell como esta en el contenido siguiente. Deberás asegurarte de que tnsping resuelva el TNSname de la base de datos como dbrman. Modifica tnsnames.ora si tnsping no puede resolver 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. Ejecuta la secuencia de comandos como fondo y supervisa nohup.out para ver si se generan errores:

    nohup ./start_mon.sh &
    
  4. Verifica que se estén recopilando las métricas:

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

Exportador de Prometheus para Oracle

  1. Este exportador de Oracle requiere pasos adicionales y debes compilarlo. Primero, instala Go 1.14 o versiones posteriores. Si ya tienes instalada una versión anterior de Go, quítala para evitar errores.

    Asegúrate de agregar la ruta del objeto binario de Go a Oracle y al usuario raíz.

    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. Instala los paquetes necesarios para la compilación de Go. Puedes descargar el cliente instantáneo de Oracle rpm 12.2, ya que este paquete usa el cliente instantáneo 1.2. No omitas el SDK de 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. Instala Oracle OCI8 con los siguientes pasos.

    pkg-config --cflags --libs oci8
    

    Primero, aparecerá este error si instalas el paquete OCI8. Este problema se describió en este vínculo del portal.

    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. Si quieres instalar OCI8, debes instalar algunos paquetes antes de compilar el exportador, así que sigue estos pasos para solucionar el problema.

  5. Copia oci8.pc de github en este directorio llamado /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. Intenta instalar OCI8 nuevamente después de exportar las variables de entorno.

    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. Compila el exportador:

    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 vez que se compila de forma correcta, puedes modificar el archivo ~/prometheus_oracle_exporter/oracle.conf para incluir la base de datos que deseas supervisar:

    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. El exportador de Oracle de Prometheus usa un formato de marca de tiempo de Oracle antiguo. Cambia la marca de tiempo de tu base de datos al formato anterior si ejecutas la versión RDBMS de 12.2 y versiones posteriores. De lo contrario, la característica de supervisión de errores alert.log no funcionará debido al problema de marca de tiempo.

    alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
    
  10. Inicia el exportador. Crea la secuencia de comandos de shell de la siguiente manera:

    vi star_mon_free_db.sh
    

    Agrega estas líneas:

    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
    

    En el entorno de RAC, puedes usar el nombre TNS como una instancia específica, como ejemplo a continuación. Por lo tanto, puedes conectar cada instancia para recopilar las métricas específicas de la instancia.

    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. Inicia el daemon:

    nohup ./star_mon_free_db.sh &
    

Agrega el destino en el servidor de Prometheus

  1. En la VM en la que instalaste el servicio de Prometheus, modifica el archivo /etc/prometheus/prometheus.yml para que contenga la siguiente información del extremo. Asegúrate de usar espacios en lugar de pestañas en el archivo yml. El nombre del trabajo oracle_short es el primer nodo de la RAC y oracle_short2 es el segundo.

    - 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. Reinicia el servicio de prometheus para recoger el nuevo cambio:

    systemctl status prometheus
    

Crea un panel en Grafana con Prometheus como una fuente de datos

  1. El ID de usuario y la contraseña predeterminados de Grafana es admin. Primero, inhabilita el acceso anónimo y permite el registro con la configuración habilitada en falso.

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

    Reinicia Grafana:

    systemctl restart grafana-server
    
  2. Cambia la contraseña de administrador a tu propia cuenta.

  3. Crea la DataSource mediante los siguientes pasos.

    Ve a **Configuration > Data Sources > Add Data Source > Choose Prometheus.

    Agrega la URL** como el extremo del servidor de Prometheus. En este ejemplo, --web.listen-address=0.0.0.0:9090 es el objeto de escucha del servicio, por lo que la URL del extremo es http://localhost:9090.

  4. Oracle Explorer de Prometheus tiene algunos paneles de muestra para la supervisión. Nosotros los importaremos y los usaremos. Puedes crear tus propios paneles y mostrar las métricas disponibles o crear las nuevas y personalizadas en el nuevo panel.

    Haz clic en Dashboard > Manage > Import > Upload.json file y, luego, selecciona el archivo JSON que descargaste de freenetdigital.

  5. Haz clic en Cargar e importar.

  6. Verifica si el panel muestra las métricas. Haz clic en Paneles > General y, luego, en el panel que importaste.

Resumen

Creamos una solución de supervisión de muestra con software de código abierto para limitar las métricas y mostrarlas mediante un panel propio.

Puedes proteger estas métricas si implementas las siguientes mejoras:

  • mTls entre cada extremo.
  • Encripta la contraseña de Oracle
  • Protege los extremos de Grafana con el SSL del balanceador de cargas de GCP y las IP incluidas en la lista de entidades permitidas.