Domine o CloudWatch: Painéis poderosos com Logs Insights da AWS

Na AWS, cada serviço mantém um registro detalhado de suas operações em arquivos de log, que são organizados em grupos no CloudWatch. Esses grupos, para fácil identificação, costumam receber nomes que refletem o serviço ao qual pertencem. Informações essenciais do sistema ou dados de status são registradas nesses arquivos por padrão.

Entretanto, existe a possibilidade de enriquecer esses registros com informações personalizadas. Logs bem estruturados podem se transformar em painéis do CloudWatch altamente eficazes.

Adicionando métricas e dados estruturados, é possível obter detalhes extras sobre o processamento das tarefas. Assim, os painéis podem conter informações que vão além dos dados padrão do sistema, permitindo a inclusão de conteúdo personalizado, agregado em widgets ou métricas criadas sob medida.

Análise de Arquivos de Log

Fonte: aws.amazon.com

O AWS CloudWatch Log Insights oferece a capacidade de pesquisar e examinar dados de log de seus recursos AWS em tempo real. Imagine essa ferramenta como uma interface de banco de dados, onde você define consultas e o sistema as executa, exibindo os resultados no painel, seja em tempo real ou dentro de um período específico que você define.

Essa análise é feita utilizando uma linguagem de consulta própria, o CloudWatch Logs Insights, que se baseia em um subconjunto da linguagem SQL. Com ela, você pode realizar buscas e aplicar filtros nos dados de log, seja por eventos específicos, textos personalizados ou palavras-chave. Além disso, é possível filtrar os dados por campos e, o mais importante, agregar informações de um ou mais arquivos de log para gerar métricas e visualizações resumidas.

Quando você executa uma consulta, o CloudWatch Log Insights varre os dados de log no grupo especificado, retornando os trechos de texto que correspondem aos seus critérios de busca.

Exemplo de Consultas em Arquivos de Log

Vamos analisar algumas consultas básicas para entender melhor como isso funciona.

Por padrão, cada serviço registra certos erros cruciais. Mesmo que você não tenha definido logs personalizados para esses eventos, é possível, com uma consulta simples, contar o número de erros nos logs do seu aplicativo durante a última hora:

fields @timestamp, @message
| filter @message like /ERROR/
| stats count() by bin(1h)

Ou, para monitorar o tempo médio de resposta da sua API no último dia:

fields @timestamp, @message
| filter @message like /API response time/
| stats avg(response_time) by bin(1d)

Como a utilização da CPU é uma métrica registrada por padrão no CloudWatch, você também pode coletar esse tipo de informação:

fields @timestamp, @message
| filter @message like /CPUUtilization/
| stats avg(value) by bin(1h)

Essas consultas podem ser customizadas para se adequar às suas necessidades específicas e podem ser usadas para criar métricas e visualizações personalizadas nos painéis do CloudWatch. Para isso, basta adicionar o widget ao painel e inserir o código da consulta para definir o que deve ser exibido.

Veja alguns dos widgets que podem ser utilizados nos painéis do CloudWatch e que podem ser preenchidos com dados do Log Insights:

  • Widgets de texto – exibem informações textuais, como o resultado de uma consulta do CloudWatch Insights.
  • Widgets de consulta de log – exibem os resultados de consultas de log do CloudWatch Insights, como o número de erros nos logs do seu aplicativo.

Como Criar Logs Úteis para Painéis

Fonte: aws.amazon.com

Para tirar o máximo proveito das consultas do CloudWatch Insights nos painéis do CloudWatch, é fundamental adotar boas práticas ao criar logs para cada serviço que você utiliza. Aqui estão algumas dicas:

#1. Utilize Log Estruturado

Adote um formato de log que utilize um esquema predefinido para registrar dados de forma estruturada. Isso simplifica a busca e a filtragem de dados de log através de consultas do CloudWatch Insights.

Isso significa, essencialmente, padronizar seus logs em diferentes serviços dentro da sua arquitetura. Definir essa padronização nas fases de desenvolvimento facilita muito o processo.

Por exemplo, você pode estabelecer que qualquer problema relacionado a uma tabela específica do banco de dados será registrado com uma mensagem que comece com: “[TABLE_NAME] Aviso / Erro: <mensagem>”.

Ou, para separar processos de dados completos de processos de dados incrementais, você pode usar prefixos como “[FULL/DELTA]” para selecionar somente as mensagens relevantes.

Definir que, ao processar dados de um sistema de origem específico, o nome desse sistema será o prefixo de cada entrada de log relacionada também facilita a filtragem das mensagens e a criação de métricas.

#2. Use Formatos de Log Consistentes

Adote formatos de log consistentes em todos os seus recursos da AWS para simplificar a busca e a filtragem de dados de log através de consultas do CloudWatch Insights.

Este ponto está diretamente relacionado ao anterior: quanto mais padronizado for o formato do log, mais fácil será trabalhar com ele. Os desenvolvedores podem confiar nesse formato e usá-lo de forma intuitiva.

Infelizmente, muitos projetos não se preocupam com qualquer tipo de padronização na geração de logs. Além disso, diversos projetos nem sequer criam logs personalizados. Isso é surpreendente, mas muito comum.

É impressionante como algumas pessoas trabalham sem nenhuma abordagem de tratamento de erros. E mesmo quando há algum esforço nesse sentido, como o tratamento de exceções, muitas vezes ele é feito de forma incorreta.

Portanto, um formato de log consistente é um recurso valioso, e muitos não o têm.

#3. Inclua Metadados Relevantes

Adicione metadados aos seus dados de log, como timestamps, IDs de recursos e códigos de erro, para facilitar a busca e a filtragem de dados de log através de consultas do CloudWatch Insights.

#4. Habilite a Rotação de Logs

Ative a rotação de logs para evitar que seus arquivos fiquem muito grandes e para facilitar a busca e a filtragem de dados de log através de consultas do CloudWatch Insights.

Não ter dados de log é um problema, mas ter muitos dados sem estrutura é igualmente complicado. Se você não consegue usar os dados, é como se não os tivesse.

#5. Utilize Agentes do CloudWatch Logs

Se você não quiser criar seu próprio sistema de log personalizado, pelo menos utilize os agentes do CloudWatch Logs. Eles enviam automaticamente dados de log de seus recursos AWS para o CloudWatch Logs, facilitando a busca e a filtragem de dados através de consultas do CloudWatch Insights.

Exemplos de Consultas Mais Complexas

As consultas do CloudWatch Insights podem ser mais complexas do que apenas uma declaração simples de duas linhas.

fields @timestamp, @message
| filter @message like /ERROR/
| filter @message not like /404/
| parse @message /.*[(?<timestamp>[^]]+)].*"(?<method>[^s]+)s+(?<path>[^s]+).*" (?<status>d+) (?<response_time>d+)/
| stats avg(response_time) as avg_response_time, count() as count by bin(1h), method, path, status
| sort count desc
| limit 20

Essa consulta realiza as seguintes operações:

  • Seleciona eventos de log que contêm a string “ERROR”, mas não “404”.
  • Analisa a mensagem de log para extrair o registro de data e hora, o método HTTP, o caminho, o código de status e o tempo de resposta.
  • Calcula o tempo médio de resposta e a contagem de eventos de log para cada combinação de método HTTP, caminho, código de status e hora.
  • Ordena os resultados por contagem em ordem decrescente.
  • Limita a saída aos 20 principais resultados.
  • Esta consulta identifica os erros mais frequentes em seu aplicativo e rastreia o tempo médio de resposta para cada combinação de método HTTP, caminho e código de status. Os resultados podem ser utilizados para criar métricas e visualizações personalizadas em painéis do CloudWatch, monitorando o desempenho da sua aplicação web e auxiliando na solução de problemas.

    Outro exemplo de consulta, dessa vez das mensagens do serviço Amazon S3:

    fields @timestamp, @message
    | filter @message like /REST.API.REQUEST/
    | parse @message /.*"(?<method>[^s]+)s+(?<path>[^s]+).*" (?<status>d+) (?<response_time>d+)/
    | stats avg(response_time) as avg_response_time, count() as count by bin(1h), method, path, status
    | sort count desc
    | limit 20
    • A consulta seleciona eventos de log que contenham a string “REST.API.REQUEST”.
    • Em seguida, analisa a mensagem de log para extrair o método HTTP, o caminho, o código de status e o tempo de resposta.
    • Calcula o tempo médio de resposta e a contagem de eventos para cada combinação de método HTTP, caminho e código de status, e ordena os resultados por contagem em ordem decrescente.
    • Limita a saída aos 20 principais resultados.

    Você pode usar o resultado dessa consulta para criar um gráfico de linhas em um painel do CloudWatch, mostrando o tempo médio de resposta para cada combinação de método HTTP, caminho e código de status ao longo do tempo.

    Construindo o Painel

    Para exibir as métricas e visualizações nos painéis do CloudWatch a partir das consultas do CloudWatch Insights, navegue até o console do CloudWatch e siga o assistente do painel para criar seu conteúdo.

    Após esse processo, o código de um painel do CloudWatch se parecerá com o exemplo abaixo, com as métricas preenchidas pelos dados da consulta do CloudWatch Insights:

    {
        "widgets": [
            {
                "type": "metric",
                "x": 0,
                "y": 0,
                "width": 12,
                "height": 6,
                "properties": {
                    "metrics": [
                        [
                            "AWS/EC2",
                            "CPUUtilization",
                            "InstanceId",
                            "i-0123456789abcdef0",
                            {
                                "label": "CPU Utilization",
                                "stat": "Average",
                                "period": 300
                            }
                        ]
                    ],
                    "view": "timeSeries",
                    "stacked": false,
                    "region": "us-east-1",
                    "title": "EC2 CPU Utilization"
                }
            },
            {
                "type": "log",
                "x": 0,
                "y": 6,
                "width": 12,
                "height": 6,
                "properties": {
                    "query": "fields @timestamp, @message
    | filter @message like /ERROR/
    | stats count() by bin(1h)
    ",
                    "region": "us-east-1",
                    "title": "Application Errors"
                }
            }
        ]
    }

    Este painel do CloudWatch contém dois widgets:

  • Um widget de métrica que exibe a utilização média da CPU de uma instância do EC2 ao longo do tempo. O CloudWatch Insights Query preenche o widget, selecionando os dados de utilização da CPU para uma instância específica do EC2 e os agregando em intervalos de 5 minutos.
  • Um widget de log que exibe o número de erros do aplicativo ao longo do tempo. Ele seleciona eventos de log que contêm a string “ERROR” e os agrega por hora.
  • O painel é definido em um arquivo no formato JSON, que inclui a própria consulta do insight como uma propriedade.

    Você pode usar esse código e implementá-lo em qualquer conta da AWS que precisar. Se os serviços e as mensagens de log forem consistentes em todas as contas e estágios da AWS, o painel funcionará em todas as contas sem necessidade de alterações no código.

    Considerações Finais

    Construir uma estrutura de logs bem definida sempre foi um bom investimento para a confiabilidade de qualquer sistema. Agora, essa prática pode ter um propósito ainda maior: gerar painéis úteis com métricas e visualizações como um efeito colateral positivo.

    Com um pouco de trabalho extra, feito apenas uma vez, toda a equipe – desenvolvimento, teste e usuários de produção – pode se beneficiar dessa mesma solução.

    Para saber mais, confira as melhores ferramentas de monitoramento da AWS.