View a markdown version of this page

Enviar logs ao Amazon CloudWatch - Amazon CloudWatch

Enviar logs ao Amazon CloudWatch

O OTel Container Insights coleta e envia logs de contêiner ao Amazon CloudWatch Logs usando o pipeline de logs do OpenTelemetry Collector. O complemento de observabilidade Amazon CloudWatch Observability EKS implanta um coletor do OpenTelemetry como DaemonSet que usa o receptor do log de arquivos para rastrear arquivos de log de contêineres, enriquecê-los com metadados do Kubernetes e exportá-los para o CloudWatch Logs por meio do exportador CloudWatch Logs.

Nenhuma configuração adicional é necessária para coleta básica de logs. A coleta de logs é ativada por padrão quando você segue o Início rápido: OTel Container Insights no Amazon EKS.

Pré-requisitos

Antes de configurar a coleta de logs, verifique se os seguintes requisitos estão sendo atendidos.

  • OTel Container Insights instalado e o complemento amazon-cloudwatch-observability ativo em seu cluster

  • Permissões do IAM: logs:CreateLogGroup, logs:CreateLogStream, logs:PutLogEvents, logs:DescribeLogGroups e logs:DescribeLogStreams (incluídas na política gerenciada pela CloudWatchAgentServerPolicy)

  • Acesso ao nó: o coletor requer acesso a /var/log/pods em cada nó

Grupos de logs e fontes

A tabela a seguir descreve o grupo de logs que o OTel Container Insights cria e a fonte da qual ele coleta.

Grupo de logs Origem Conteúdo
/aws/containerinsights/cluster-name/application /var/log/pods/**/*.log Todos os logs stdout e stderr do contêiner
nota

Os logs do host e do plano de dados estarão disponíveis em uma versão futura.

Como funciona o pipeline de logs do OTel

O OpenTelemetry Collector do complemento executa um pipeline de log com os seguintes componentes.

  • Receptores: o receptor filelog retém os arquivos de log do contêiner de /var/log/pods/.

  • Processadores: o processador k8sattributes enriquece os logs com metadados do Kubernetes. O processador batch agrupa os registros de log antes da exportação. O processador resource acrescenta atributos de recursos.

  • Exportadores: o exportador awscloudwatchlogs envia registros de log para o CloudWatch Logs.

Enriquecimento de logs

O pipeline enriquece cada registro de log com os seguintes atributos.

  • Atributos de recursos do Kubernetes: k8s.pod.name, k8s.namespace.name, k8s.container.name, k8s.node.name e k8s.deployment.name

  • Rótulos de pod: todos os rótulos de pod como atributos k8s.pod.label.*

  • Atributos da nuvem: cloud.region, cloud.account.id e cloud.platform

  • Atributos do cluster: k8s.cluster.name

Personalização da coleta de logs

Você pode personalizar a coleta de logs atualizando os valores de configuração do complemento. As seções a seguir descrevem as opções de personalização comuns.

Desativar coleta de logs

Para desativar totalmente a coleta de logs, atualize a configuração do complemento com os logs de contêiner desativados.

Para desativar a coleta de logs
  • Execute o comando a seguir. Substitua cluster-name pelo nome do cluster do Amazon EKS.

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":false}}' \ --resolve-conflicts OVERWRITE

Excluir namespaces da coleta de logs

Para excluir namespaces específicos da coleta de logs, use a opção de configuração excludeNamespaces.

Para excluir namespaces da coleta de logs
  • Execute o comando a seguir. Substitua cluster-name pelo nome do cluster do Amazon EKS. Substitua os valores do namespace pelos namespaces que você deseja excluir.

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"excludeNamespaces":["kube-system","load-testing","monitoring"]}}' \ --resolve-conflicts OVERWRITE

Incluir somente namespaces específicos

Para coletar logs somente de namespaces específicos, use a opção de configuração includeNamespaces.

Para incluir somente namespaces específicos
  • Execute o comando a seguir. Substitua cluster-name pelo nome do cluster do Amazon EKS. Substitua os valores do namespace pelos namespaces que você deseja incluir.

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"includeNamespaces":["production","staging"]}}' \ --resolve-conflicts OVERWRITE

Configurar a análise de logs de várias linhas

Para combinar entradas de logs de várias linhas (como rastreamentos de pilha) em um único registro de log, configure a análise de várias linhas com um padrão de primeira linha.

Para configurar a análise de log de várias linhas
  • Execute o comando a seguir. Substitua cluster-name pelo nome do cluster do Amazon EKS. Substitua o valor firstLinePattern por um padrão regex que corresponda à primeira linha de cada entrada de log.

    aws eks update-addon \ --cluster-name cluster-name \ --addon-name amazon-cloudwatch-observability \ --configuration-values '{"containerLogs":{"enabled":true,"multilineConfig":{"firstLinePattern":"^\\d{4}-\\d{2}-\\d{2}|^\\[\\d{4}","parseFormat":"auto"}}}' \ --resolve-conflicts OVERWRITE

Definir a retenção de logs

Por padrão, o CloudWatch Logs retém os dados de logs por tempo indeterminado. Para controlar os custos de armazenamento, você pode definir uma política de retenção no grupo de logs.

Para definir a retenção de logs
  • Execute o comando a seguir. Substitua cluster-name pelo nome do cluster do Amazon EKS. Substitua 30 pelo número de dias em que os logs serão retidos.

    aws logs put-retention-policy \ --log-group-name "/aws/containerinsights/cluster-name/application" \ --retention-in-days 30

Verificação

Para verificar se a coleta de logs está funcionando, verifique se os grupos de logs esperados existem e contêm dados.

Para verificar a coleta de logs
  • Execute o comando a seguir. Substitua cluster-name pelo nome do cluster do Amazon EKS.

    aws logs describe-log-groups \ --log-group-name-prefix "/aws/containerinsights/cluster-name" \ --query "logGroups[].{Name:logGroupName,StoredBytes:storedBytes}" \ --output table

    A saída exibe os nomes dos grupos de logs e o número de bytes armazenados. Um valor diferente de zero para StoredBytes confirma que o pipeline está entregando logs.

Solução de problemas

Use as diretrizes a seguir para resolver problemas comuns de coleta de logs.

Grupos de logs não criados após 5 minutos

Sintoma: o grupo de logs /aws/containerinsights/cluster-name/application não aparece no CloudWatch Logs após 5 minutos.

Causa: o coletor não tem as permissões necessárias do IAM para criar grupos e fluxos de logs.

Solução: verifique se o perfil do IAM associado ao coletor tem a política gerenciada pela CloudWatchAgentServerPolicy anexada. Essa política inclui as permissões logs:CreateLogGroup e logs:CreateLogStream.

O grupo de logs da aplicação existe, mas está vazio

Sintoma: o grupo de logs da aplicação existe no CloudWatch Logs, mas não contém fluxos de log nem eventos de logs.

Causa: esse problema ocorre quando os contêineres não estão gravando em stdout ou stderr, ou o receptor do log de arquivos não consegue acessar /var/log/pods/ no nó.

Solução: para resolver esse problema, siga as seguintes etapas:

  1. Verifique se os contêineres da sua aplicação gravam logs em stdout ou stderr.

  2. Verifique se o pod DaemonSet do coletor tem uma montagem de volume para /var/log/pods.

    kubectl get daemonset -n amazon-cloudwatch -o yaml | grep -A 5 "var/log/pods"
  3. Verifique se há erros de acesso ao arquivo nos logs do coletor.

    kubectl logs -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent --tail=50 | grep -i "error\|permission"

Altos custos do CloudWatch Logs

Sintoma: os custos de ingestão ou armazenamento do CloudWatch Logs são maiores do que o esperado.

Causa: namespaces de alto volume (como namespaces de teste de carga ou monitoramento) geram grandes volumes de logs.

Solução: conclua as etapas a seguir para reduzir custos.

  1. Exclua namespaces de alto volume da coleta de logs. Para instruções, consulte Excluir namespaces da coleta de logs.

  2. Defina uma política de retenção no grupo de logs para excluir automaticamente os logs mais antigos. Para instruções, consulte Definir a retenção de logs.