// Tutorial //

Como Monitorar seu Banco de Dados PostgreSQL Gerenciado Usando o Nagios Core no Ubuntu 18.04

Published on September 23, 2019
Default avatar
By Savic
Developer and author at DigitalOcean.
Português
Como Monitorar seu Banco de Dados PostgreSQL Gerenciado Usando o Nagios Core no Ubuntu 18.04

O autor escolheu o Free and Open Source Fund para receber uma doação como parte do programa Write for DOnations.

Introdução

O monitoramento do banco de dados é essencial para entender como o banco de dados se comporta ao longo do tempo. Ele pode ajudá-lo a descobrir problemas de utilização ocultos e gargalos que ocorrem no seu banco de dados. A implementação de sistemas de monitoramento de banco de dados pode rapidamente se tornar uma vantagem a longo prazo, o que influenciará positivamente seu processo de gerenciamento de infraestrutura. Você poderá reagir rapidamente às alterações de status do seu banco de dados e será notificado rapidamente quando os serviços monitorados retornarem ao funcionamento normal.

O Nagios Core é um sistema de monitoramento popular que você pode usar para monitorar seu banco de dados gerenciado. Os benefícios de usar o Nagios para esta tarefa são sua versatilidade — é fácil de configurar e utiliza um grande repositório de plugins disponíveis, e o mais importante, alerta integrado.

Neste tutorial, você configurará o monitoramento do banco de dados PostgreSQL no Nagios Core utilizando o plugin check_postgres e configurar alertas baseados no Slack. No final, você terá um sistema de monitoramento funcionando em seu banco de dados PostgreSQL gerenciado e será notificado imediatamente sobre alterações de status de várias funcionalidades.

Pré-requisitos

Passo 1 — Instalando check_postgres

Nesta seção, você fará o download da versão mais recente do plug-in check_postgres no Github e disponibilizará para o Nagios Core. Você também instalará o cliente PostgreSQL (psql), para que check_postgres consiga se conectar ao seu banco de dados gerenciado.

Comece instalando o cliente PostgreSQL, executando o seguinte comando:

  1. sudo apt install postgresql-client

Em seguida, você baixará o check_postgres para o seu diretório home. Primeiro, navegue até ele:

  1. cd ~

Vá para a página Github releases e copie o link da versão mais recente do plug-in. No momento da redação deste artigo, a versão mais recente do check_postgres era a 2.24.0; lembre-se de que isso será atualizado e, sempre que possível, a boa prática é usar a versão mais recente.

Agora faça o download usando curl:

  1. curl -LO https://github.com/bucardo/check_postgres/releases/download/2.24.0/check_postgres-2.24.0.tar.gz

Extraia-o usando o seguinte comando:

  1. tar xvf check_postgres-*.tar.gz

Isso criará um diretório com o mesmo nome que o arquivo que você baixou. Essa pasta contém o executável check_postgres, que você precisará copiar para o diretório em que o Nagios armazena seus plugins (geralmente /usr/local/nagios/libexec/). Copie-o executando o seguinte comando:

  1. sudo cp check_postgres-*/check_postgres.pl /usr/local/nagios/libexec/

Em seguida, você precisará atribuir ao usuário nagios a propriedade sobre ele, para que ele possa ser executado a partir do Nagios:

  1. sudo chown nagios:nagios /usr/local/nagios/libexec/check_postgres.pl

O check_postgres está agora disponível para o Nagios e pode ser usado a partir dele. No entanto, ele fornece muitos comandos relativos a diferentes aspectos do PostgreSQL e, para uma melhor manutenção do serviço, é melhor dividi-los para que possam ser chamados separadamente. Você conseguirá isso criando um link simbólico para cada comando check_postgres no diretório do plugin.

Navegue para o diretório onde o Nagios armazena plugins executando o seguinte comando:

  1. cd /usr/local/nagios/libexec

Em seguida, crie os links simbólicos com:

  1. sudo perl check_postgres.pl --symlinks

A saída será semelhante a esta:

Output
Created "check_postgres_archive_ready" Created "check_postgres_autovac_freeze" Created "check_postgres_backends" Created "check_postgres_bloat" Created "check_postgres_checkpoint" Created "check_postgres_cluster_id" Created "check_postgres_commitratio" Created "check_postgres_connection" Created "check_postgres_custom_query" Created "check_postgres_database_size" Created "check_postgres_dbstats" Created "check_postgres_disabled_triggers" Created "check_postgres_disk_space" Created "check_postgres_fsm_pages" Created "check_postgres_fsm_relations" Created "check_postgres_hitratio" Created "check_postgres_hot_standby_delay" Created "check_postgres_index_size" Created "check_postgres_indexes_size" Created "check_postgres_last_analyze" Created "check_postgres_last_autoanalyze" Created "check_postgres_last_autovacuum" Created "check_postgres_last_vacuum" Created "check_postgres_listener" Created "check_postgres_locks" Created "check_postgres_logfile" Created "check_postgres_new_version_bc" Created "check_postgres_new_version_box" Created "check_postgres_new_version_cp" Created "check_postgres_new_version_pg" Created "check_postgres_new_version_tnm" Created "check_postgres_pgagent_jobs" Created "check_postgres_pgb_pool_cl_active" Created "check_postgres_pgb_pool_cl_waiting" Created "check_postgres_pgb_pool_maxwait" Created "check_postgres_pgb_pool_sv_active" Created "check_postgres_pgb_pool_sv_idle" Created "check_postgres_pgb_pool_sv_login" Created "check_postgres_pgb_pool_sv_tested" Created "check_postgres_pgb_pool_sv_used" Created "check_postgres_pgbouncer_backends" Created "check_postgres_pgbouncer_checksum" Created "check_postgres_prepared_txns" Created "check_postgres_query_runtime" Created "check_postgres_query_time" Created "check_postgres_relation_size" Created "check_postgres_replicate_row" Created "check_postgres_replication_slots" Created "check_postgres_same_schema" Created "check_postgres_sequence" Created "check_postgres_settings_checksum" Created "check_postgres_slony_status" Created "check_postgres_table_size" Created "check_postgres_timesync" Created "check_postgres_total_relation_size" Created "check_postgres_txn_idle" Created "check_postgres_txn_time" Created "check_postgres_txn_wraparound" Created "check_postgres_version" Created "check_postgres_wal_files"

O Perl listou todas as funções para as quais criou um link simbólico. Agora elas podem ser executadas na linha de comando, como de costume.

Você baixou e instalou o plug-in check_postgres. Você também criou links simbólicos para todos os comandos do plug-in, para que possam ser usados individualmente no Nagios. No próximo passo, você criará um arquivo de serviço de conexão, que o check_postgres utilizará para se conectar ao seu banco de dados gerenciado.

Passo 2 — Configurando Seu Banco de Dados

Nesta seção, você criará um arquivo de serviço de conexão do PostgreSQL contendo as informações de conexão do seu banco de dados. A seguir, você testará os dados de conexão invocando o check_postgres nele.

O arquivo do serviço de conexão é, por convenção, chamado pg_service.conf e deve estar localizado em /etc/postgresql-common/. Crie este arquivo usando seu editor de textos favorito (por exemplo, o nano):

  1. sudo nano /etc/postgresql-common/pg_service.conf

Adicione as seguintes linhas, substituindo os espaços reservados destacados pelos valores reais mostrados no Painel de Controle do Banco de Dados gerenciado na seção Connection Details:

/etc/postgresql-common/pg_service.conf
[managed-db]
host=host
port=porta
user=nome_de_usuário
password=senha
dbname=defaultdb
sslmode=require

O arquivo do serviço de conexão pode abrigar vários grupos de informações de conexão com o banco de dados. O início de um grupo é sinalizado colocando seu nome entre colchetes. Depois disso vem os parâmetros de conexão (host, port, user, password e assim por diante), separados por novas linhas, que devem receber um valor.

Salve e feche o arquivo quando terminar.

Agora você testará a validade da configuração conectando-se ao banco de dados via check_postgres executando o seguinte comando:

  1. ./check_postgres.pl --dbservice=managed-db --action=connection

Aqui, você diz ao check_postgres qual grupo de informações de conexão com o banco de dados usar com o parâmetro --dbservice, e também especifica que ele deve apenas tentar se conectar a ele especificando connection como a ação.

Sua saída será semelhante a esta:

Output
POSTGRES_CONNECTION OK: service=managed-db version 11.4 | time=0.10s

Isto significa que o check_postgres conseguiu conectar-se ao banco de dados, de acordo com os parâmetros do pg_service.conf. Se você receber um erro, verifique novamente o que você acabou de inserir nesse arquivo de configuração.

Você criou e preencheu um arquivo de serviço de conexão do PostgreSQL, que funciona como uma string de conexão. Você também testou os dados de conexão executando check_postgres e observando a saída. Na próxima etapa, você configurará o Nagios para monitorar várias partes do seu banco de dados.

Passo 3 — Criando Serviços de Monitoramento no Nagios

Agora você configurará o Nagios para monitorar várias métricas do seu banco de dados, definindo um host e vários serviços, que chamarão o plug-in check_postgres e seus links simbólicos.

O Nagios armazena seus arquivos de configuração personalizados em /usr/local/nagios/etc/objects. Os novos arquivos adicionados lá devem ser ativados manualmente no arquivo de configuração central do Nagios, localizado em /usr/local/nagios/etc/nagios.cfg. Agora você deverá definir comandos, um host e vários serviços, que serão usados para monitorar seu banco de dados gerenciado no Nagios.

Primeiro, crie uma pasta dentro de /usr/local/nagios/etc/objects para armazenar sua configuração relacionada ao PostgreSQL executando o seguinte comando:

  1. sudo mkdir /usr/local/nagios/etc/objects/postgresql

Você armazenará os comandos do Nagios para check_nagios em um arquivo chamado commands.cfg. Crie-o para edição:

  1. sudo nano /usr/local/nagios/etc/objects/postgresql/commands.cfg

Adicione as seguintes linhas:

/usr/local/nagios/etc/objects/postgresql/commands.cfg
define command {
    command_name           check_postgres_connection
    command_line           /usr/local/nagios/libexec/check_postgres_connection --dbservice=$ARG1$
}

define command {
    command_name           check_postgres_database_size
    command_line           /usr/local/nagios/libexec/check_postgres_database_size --dbservice=$ARG1$ --critical='$ARG2$'
}

define command {
    command_name           check_postgres_locks
    command_line           /usr/local/nagios/libexec/check_postgres_locks --dbservice=$ARG1$
}

define command {
    command_name           check_postgres_backends
    command_line           /usr/local/nagios/libexec/check_postgres_backends --dbservice=$ARG1$
}

Salve e feche o arquivo.

Neste arquivo, você define quatro comandos do Nagios que chamam partes diferentes do plugin check_postgres (checando a conectividade, obtendo o número de locks e conexões e o tamanho de todo o banco de dados). Todos eles aceitam um argumento que é passado para o parâmetro --dbservice e especificam a qual dos bancos de dados definidos em pg_service.conf se conectar.

O comando check_postgres_database_size aceita um segundo argumento que é passado para o parâmetro --critical, que especifica o ponto em que o armazenamento do banco de dados está ficando cheio. Os valores aceitos incluem 1 KB para um kilobyte, 1 MB para um megabyte e assim por diante, até exabytes (EB). Um número sem uma unidade de capacidade é tratado como sendo expresso em bytes.

Agora que os comandos necessários estão definidos, você definirá o host (essencialmente o banco de dados) e seus serviços de monitoramento em um arquivo chamado services.cfg. Crie-o usando seu editor favorito:

  1. sudo nano /usr/local/nagios/etc/objects/postgresql/services.cfg

Inclua as seguintes linhas, substituindo db_max_storage_size por um valor referente ao armazenamento disponível do seu banco de dados. É recomendável configurá-lo para 90% do tamanho de armazenamento que você alocou para ele:

/usr/local/nagios/etc/objects/postgresql/services.cfg
define host {
      use                    linux-server
      host_name              postgres
      check_command          check_postgres_connection!managed-db
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Connection
      check_command          check_postgres_connection!managed-db
      notification_options   w,u,c,r,f,s
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Database Size
      check_command          check_postgres_database_size!managed-db!db_max_storage_size
      notification_options   w,u,c,r,f,s
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Locks
      check_command          check_postgres_locks!managed-db
      notification_options   w,u,c,r,f,s
}

define service {
      use                    generic-service
      host_name              postgres
      service_description    PostgreSQL Backends
      check_command          check_postgres_backends!managed-db
      notification_options   w,u,c,r,f,s
}

Você primeiro define um host, para que o Nagios saiba a que entidade os serviços se relacionam. Em seguida, você cria quatro serviços, que chamam os comandos que você acabou de definir. Cada um deles passa managed-db como argumento, detalhando que o managed-db que você definiu no Passo 2 deve ser monitorado.

Em relação às opções de notificação, cada serviço especifica que as notificações devem ser enviadas quando o estado do serviço se tornar WARNING,UNKNOWN, CRITICAL, OK (quando se recuperar de uma parada), quando o serviço iniciar oscilando, ou quando a parada programada iniciar ou terminar. Sem atribuir explicitamente um valor a essa opção, nenhuma notificação seria enviada (para os contatos disponíveis), exceto se acionada manualmente.

Salve e feche o arquivo.

Em seguida, você precisará dizer explicitamente ao Nagios para ler os arquivos de configuração deste novo diretório, editando o arquivo de configuração geral do Nagios. Abra-o para edição executando o seguinte comando:

  1. sudo nano /usr/local/nagios/etc/nagios.cfg

Encontre esta linha destacada no arquivo:

/usr/local/nagios/etc/nagios.cfg
...
# directive as shown below:

cfg_dir=/usr/local/nagios/etc/servers
#cfg_dir=/usr/local/nagios/etc/printers
...

Acima dela, adicione a seguinte linha destacada:

/usr/local/nagios/etc/nagios.cfg
...
cfg_dir=/usr/local/nagios/etc/objects/postgresql
cfg_dir=/usr/local/nagios/etc/servers
...

Salve e feche o arquivo. Esta linha diz ao Nagios para carregar todos os arquivos de configuração a partir do diretório /usr/local/nagios/etc/objects/postgresql, onde seus arquivos de configuração estão localizados.

Antes de reiniciar o Nagios, verifique a validade da configuração executando o seguinte comando:

  1. sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

O final da saída será semelhante a este:

Output
Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check

Isso significa que o Nagios não encontrou erros na configuração. Se ele lhe mostrar um erro, você também verá uma dica sobre o que deu errado, para poder corrigir o erro mais facilmente.

Para fazer com que o Nagios recarregue sua configuração, reinicie seu serviço executando o seguinte comando:

  1. sudo systemctl restart nagios

Agora você pode navegar até o Nagios no seu navegador. Depois de carregado, clique na opção Services no menu à esquerda. Você verá o host do postgres e uma lista de serviços, junto com seus status atuais:

PostgreSQL Monitoring Services - Pending

Em breve, todos eles ficarão verdes e mostrarão o status OK. Você verá a saída do comando na coluna Status Information. Você pode clicar no nome do serviço e ver informações detalhadas sobre seu status e disponibilidade.

Você adicionou comandos check_postgres, um host e vários serviços à sua instalação do Nagios para monitorar seu banco de dados. Você também verificou que os serviços estão funcionando corretamente, examinando-os por meio da interface web do Nagios. Na próxima etapa, você configurará os alertas baseados no Slack.

Passo 4 — Configurando Alertas para o Slack

Nesta seção, você configurará o Nagios para alertá-lo sobre eventos via Slack, publicando-os nos canais desejados em seu workspace.

Antes de começar, efetue login no workspace desejado no Slack e crie dois canais nos quais você deseja receber mensagens de status do Nagios: um para host e outro para notificações de serviço. Se desejar, você pode criar apenas um canal em que receberá os dois tipos de alertas.

Em seguida, vá para o app Nagios no Diretório de apps do Slack e click em Add Configuration. Você verá uma página para adicionar a Integração Nagios.

Slack - Add Nagios Integration

Click em Add Nagios Integration. Quando a página carregar, role para baixo e tome nota do token, porque você precisará dele mais adiante.

Slack - Integration Token

Agora você instalará e configurará o plugin Slack (escrito em Perl) para o Nagios no seu servidor. Primeiro, instale os pré-requisitos necessários do Perl executando o seguinte comando:

  1. sudo apt install libwww-perl libcrypt-ssleay-perl -y

Em seguida, faça o download do plug-in para o diretório de plugins do Nagios:

  1. sudo curl https://raw.githubusercontent.com/tinyspeck/services-examples/master/nagios.pl -o slack.pl

Torne-o executável executando o seguinte comando:

  1. sudo chmod +x slack.pl

Agora, você precisará editá-lo para conectar-se ao seu workspace usando o token que você obteve do Slack. Abra-o para edição:

  1. sudo nano slack.pl

Localize as seguintes linhas no arquivo:

/usr/local/nagios/libexec/slack.pl
...
my $opt_domain = "foo.slack.com"; # Your team's domain
my $opt_token = "your_token"; # The token from your Nagios services page
...

Substitua foo.slack.com pelo domínio do seu workspace e your_token pelo seu token de integração do app Nagios, salve e feche o arquivo. O script agora poderá enviar solicitações apropriadas ao Slack, que você testará executando o seguinte comando:

  1. ./slack.pl -field slack_channel=#nome_do_seu_canal -field HOSTALIAS="Test Host" -field HOSTSTATE="UP" -field HOSTOUTPUT="Host is UP" -field NOTIFICATIONTYPE="RECOVERY"

Substitua nome_do_seu_canal pelo nome do canal em que você deseja receber alertas de status. O script exibirá informações sobre a solicitação HTTP feita ao Slack e, se tudo for executado corretamente, a última linha da saída será ok. Se você receber um erro, verifique novamente se o canal do Slack especificado existe no workspace.

Agora você pode ir para o workspace do Slack e selecionar o canal que você especificou. Você verá uma mensagem de teste vinda do Nagios.

Slack - Nagios Test Message

Isso confirma que você configurou corretamente o script para o Slack. Agora você passará a configurar o Nagios para alertá-lo via Slack usando este script.

Você precisará criar um contato para o Slack e dois comandos que enviarão mensagens para ele. Você armazenará essa configuração em um arquivo chamado slack.cfg, na mesma pasta que os arquivos de configuração anteriores. Crie-o para edição executando o seguinte comando:

  1. sudo nano /usr/local/nagios/etc/objects/postgresql/slack.cfg

Adicione as seguintes linhas:

/usr/local/nagios/etc/objects/postgresql/slack.cfg
define contact {
      contact_name                             slack
      alias                                    Slack
      service_notification_period              24x7
      host_notification_period                 24x7
      service_notification_options             w,u,c,f,s,r
      host_notification_options                d,u,r,f,s
      service_notification_commands            notify-service-by-slack
      host_notification_commands               notify-host-by-slack
}

define command {
      command_name     notify-service-by-slack
      command_line     /usr/local/nagios/libexec/slack.pl -field slack_channel=#service_alerts_channel
}

define command {
      command_name     notify-host-by-slack
      command_line     /usr/local/nagios/libexec/slack.pl -field slack_channel=#host_alerts_channel
}

Aqui você define um contato chamado slack, declara que ele pode ser contatado a qualquer momento e especifica quais comandos usar para notificar eventos relacionados ao serviço e ao host. Esses dois comandos são definidos depois e chamam o script que você acabou de configurar. Você precisará substituir service_alerts_channel e host_alerts_channel pelos nomes dos canais em que deseja receber mensagens de serviço e host, respectivamente. Se preferir, você pode usar os mesmos nomes de canais.

De maneira semelhante à criação do serviço no último passo, é crucial definir as opções de notificação de serviço e host no contato, pois ele determina que tipo de alerta o contato receberá. A omissão dessas opções resultaria no envio de notificações somente quando acionadas manualmente a partir da interface web.

Quando você terminar de editar, salve e feche o arquivo.

Para habilitar o alerta através do contato slack que você acabou de definir, você precisará adicioná-lo ao grupo de contatos admin, definido no arquivo de configuração contacts.cfg, localizado em /usr/local/nagios/etc/objects/. Abra-o para edição executando o seguinte comando:

  1. sudo nano /usr/local/nagios/etc/objects/contacts.cfg

Localize o bloco de configuração parecido com este:

/usr/local/nagios/etc/objects/contacts.cfg
define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin
}

Adicione slack à lista de membros, assim:

/usr/local/nagios/etc/objects/contacts.cfg
define contactgroup {

    contactgroup_name       admins
    alias                   Nagios Administrators
    members                 nagiosadmin,slack
}

Salve e feche o arquivo.

Por padrão, ao executar scripts, o Nagios não disponibiliza informações de host e serviço por meio de variáveis de ambiente, que é o que o script Slack requer para enviar mensagens significativas. Para remediar isso, você precisará definir a configuração enable_environment_macros em nagios.cfg como 1. Abra-o para edição executando o seguinte comando:

  1. sudo nano /usr/local/nagios/etc/nagios.cfg

Encontre a linha semelhante a essa:

/usr/local/nagios/etc/nagios.cfg
enable_environment_macros=0

Altere o valor para 1, assim:

/usr/local/nagios/etc/nagios.cfg
enable_environment_macros=1

Salve e feche o arquivo.

Teste a validade da configuração do Nagios executando o seguinte comando:

  1. sudo /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

O final da saída será semelhante a:

Output
Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check

Prossiga e reinicie o Nagios executando o seguinte comando:

  1. sudo systemctl restart nagios

Para testar a integração do Slack, você vai enviar uma notificação personalizada pela interface web. Recarregue a página de status Services do Nagios no seu navegador. Clique no serviço PostgreSQL Backends e clique em Send custom service notification à direita quando a página carregar.

Nagios - Custom Service Notification

Digite um comentário de sua escolha e clique em Commit e, em seguida, clique em Done. Você receberá imediatamente uma nova mensagem no Slack.

Slack - Status Alert From Nagios

Agora você integrou o Slack ao Nagios, para receber mensagens sobre eventos críticos e alterações de status imediatamente. Você também testou a integração acionando manualmente um evento no Nagios.

Conclusão

Agora você tem o Nagios Core configurado para monitorar seu banco de dados PostgreSQL gerenciado e relatar quaisquer mudanças de status e eventos para o Slack, para estar sempre de olho no que está acontecendo com seu banco de dados. Isso permitirá que você reaja rapidamente em caso de emergência, porque você receberá o feed de status em tempo real.

Se você quiser saber mais sobre os recursos do check_postgres, consulte a documentação, onde você encontrará muito mais comandos que você pode eventualmente usar.

Para obter mais informações sobre o que você pode fazer com seu banco de dados PostgreSQL gerenciado, visite a doumentação de produto.


Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.

Sign up
About the authors
Default avatar
Savic

author

Developer and author at DigitalOcean.

Default avatar
Developer and author at DigitalOcean.

Default avatar
Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?
Leave a comment