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:
- sudo apt install postgresql-client
Em seguida, você baixará o check_postgres
para o seu diretório home. Primeiro, navegue até ele:
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:
- 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:
- 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:
- 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:
- 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:
- cd /usr/local/nagios/libexec
Em seguida, crie os links simbólicos com:
- 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):
- 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:
- ./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:
- 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:
- 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:
- 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:
- 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:
- 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:
- 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:
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.
Click em Add Nagios Integration. Quando a página carregar, role para baixo e tome nota do token, porque você precisará dele mais adiante.
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:
- 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:
- sudo curl https://raw.githubusercontent.com/tinyspeck/services-examples/master/nagios.pl -o slack.pl
Torne-o executável executando o seguinte comando:
Agora, você precisará editá-lo para conectar-se ao seu workspace usando o token que você obteve do Slack. Abra-o para edição:
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:
- ./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.
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:
- 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:
- 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:
- 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:
- 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:
- 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.
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.
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.