Monitore o Oracle com o Grafana e o Prometheus

É possível coletar métricas da Oracle em Google Cloud com o Grafana e o Prometheus.

Veja um exemplo de diagrama de arquitetura:

Implementação do Grafana e do Prometheus

Configurar uma máquina virtual

Primeiro, crie uma máquina virtual (VM) para hospedar o Grafana e o Prometheus:

  1. Faça login no console do Cloud.
  2. Inicie a instância de VM na nuvem privada virtual (VPC)/sub-rede que você usa para acessar os bancos de dados Oracle. Se você tiver vários bancos de dados em várias VPCs, talvez seja necessário adicionar a rota estática às VPCs.

Solicitação de inicialização de VM

Instalar o Prometheus

Para instalar o Prometheus na VM configurada:

  1. Faça o download do software Prometheus:

    wget https://github.com/prometheus/prometheus/releases/download/v2.19.2/prometheus-2.19.2.linux-amd64.tar.gz
    
  2. Descompacte o arquivo transferido:

    tar xvf prometheus-2.19.2.linux-amd64.tar.gz
    
  3. Crie o serviço Prometheus na 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. Crie o arquivo de serviço do Prometheus:

    cd /lib/systemd/system
    sudo touch prometheus.service
    
  5. Adicione o conteúdo a este arquivo prometheus.service com um editor de texto de sua escolha.

    [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. Ative e inicie o serviço prometheus:

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    

Instalar o Grafana

O Grafana é usado para configurar o painel e o alarme.

  1. Crie o repositório yum para facilitar a instalação do Grafana:

    touch /etc/yum.repos.d/grafana.repo
    
  2. Adicione estas linhas 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. Instale o Grafana por yum install e ative o serviço:

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

Instalar o exportador de cliente do Prometheus nos servidores de banco de dados

Você precisará de um exportador de cliente para transferir dados do Oracle para o Prometheus. Há duas opções:

Exportador do banco de dados Oracle

  1. Faça o download dos binários e extraia-os:

    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. Crie o script de shell como este no conteúdo abaixo. Você precisará garantir que tnsping resolva o TNSname do DB abaixo como dbrman. Modifique tnsnames.ora se tnsping não 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. Execute o script como segundo plano e monitore nohup.out para ver se algum erro foi gerado:

    nohup ./start_mon.sh &
    
  4. Verifique se as métricas estão sendo coletadas:

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

Prometheus Oracle Exporter

  1. O exportador Oracle requer etapas adicionais, e você precisará criá-lo. Primeiro, instale o Go 1.14 ou posterior. Se você já tiver uma versão mais antiga do Go instalada, remova-a para evitar erros.

    Adicione o caminho binário do Go para o Oracle e o usuário raiz.

    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. Instale os pacotes necessários para o build do Go. Você pode fazer o download do cliente instantâneo Oracle rpm 12.2, porque esse pacote usa um cliente instantâneo 1.2. Além disso,não pule o SDK da 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. Siga as etapas abaixo para instalar o Oracle OCI8.

    pkg-config --cflags --libs oci8
    

    Primeiro, você encontrará esse erro ao instalar o pacote OCI8. Esse problema foi descrito neste link do 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. Para instalar o OCI8, existem alguns pacotes que você precisa instalar antes de compilar o exportador. Portanto, siga estas etapas para corrigir o problema.

  5. Copie oci8.pc do github para este diretório chamado /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. Tente instalar o OCI8 novamente depois de exportar as variáveis de 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. Crie o 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. Depois da criação, é possível modificar o arquivo ~/prometheus_oracle_exporter/oracle.conf para incluir o banco de dados que você quer monitorar:

    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. O Prometheus exportador do Prometheus usa um formato antigo de carimbo de data/hora do Oracle. Altere o carimbo de data/hora do banco de dados para o formato antigo, se você estiver executando a versão 12.2 do RDBMS e posteriores. Caso contrário, o recurso de monitoramento de erros alert.log não funcionará devido ao problema de carimbo de data/hora.

    alter system set UNIFORM_LOG_TIMESTAMP_FORMAT=FALSE scope=both;
    
  10. Inicie o exportador. Crie o script de shell da seguinte maneira:

    vi star_mon_free_db.sh
    

    Adicione estas linhas:

    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
    

    No ambiente RAC, use o nome TNS como uma instância específica, como no exemplo abaixo. Assim, é possível conectar cada instância para coletar as métricas específicas da instância.

    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. Inicie o daemon:

    nohup ./star_mon_free_db.sh &
    

Adicionar o destino no servidor Prometheus

  1. Na VM em que você instalou o serviço Prometheus, modifique o arquivo /etc/prometheus/prometheus.yml para conter as seguintes informações de endpoint. Use espaços em vez de guias no arquivo yml. O nome do job oracle_short é o primeiro nó do RAC e oracle_short2 é o 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. Reinicie o serviço prometheus para selecionar a nova alteração:

    systemctl status prometheus
    

Criar um painel no Grafana usando o Prometheus como uma origem de dados

  1. O ID do usuário e a senha padrão do Grafana são admin. Primeiro, desative o login anônimo e permita a inscrição definindo a opção "false".

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

    Reinicie o Grafana:

    systemctl restart grafana-server
    
  2. Altere a senha de administrador.

  3. Crie o DataSource com as etapas a seguir.

    Vá para **Configuração > Fontes de dados > Adicionar fonte de dados > Escolher Prometheus

    Adicione o URL** como o endpoint do servidor do Prometheus. Neste exemplo, --web.listen-address=0.0.0.0:9090 é o listener de serviço, de modo que o URL do endpoint é http://localhost:9090.

  4. O Prometheus Explorer Explorer tem alguns painéis de exemplo para monitoramento do Oracle. Elas serão importadas e usadas. É possível criar seus próprios painéis e exibir as métricas disponíveis ou criar as novas métricas personalizadas e exibi-las no novo painel.

    Clique em Painel > Gerenciar > Importar > Upload.json file e selecione o arquivo json que você salvou em freenetdigital.

  5. Clique em Carregar e importar.

  6. Verifique se o painel exibe as métricas. Clique em Painéis > Geral e, depois, no painel importado.

Resumo

Criamos uma solução de monitoramento de amostra com softwares de código aberto para capturar as métricas e exibi-las em um painel de sua propriedade.

Proteja essas métricas implementando as seguintes melhorias:

  • mTls entre cada endpoint.
  • Criptografe a senha do Oracle.
  • Protegendo os endpoints do Grafana com SSL do balanceador de carga do GCP e lista de permissão de IPs.