

# Enviar logs ao Amazon CloudWatch
<a name="container-insights-eks-otel-logs"></a>

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](container-insights-eks-otel-quickstart.md).

## Pré-requisitos
<a name="container-insights-eks-otel-logs-prereqs"></a>

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 name="container-insights-eks-otel-logs-groups"></a>

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
<a name="container-insights-eks-otel-logs-pipeline"></a>

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
<a name="container-insights-eks-otel-logs-enrichment"></a>

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
<a name="container-insights-eks-otel-logs-customize"></a>

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
<a name="container-insights-eks-otel-logs-disable"></a>

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
  ```

### Definir a retenção de logs
<a name="container-insights-eks-otel-logs-retention"></a>

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
<a name="container-insights-eks-otel-logs-verify"></a>

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
<a name="container-insights-eks-otel-logs-troubleshoot"></a>

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

### Grupos de logs não criados após 5 minutos
<a name="container-insights-eks-otel-logs-ts-no-loggroup"></a>

**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
<a name="container-insights-eks-otel-logs-ts-empty"></a>

**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.

1. 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"
   ```

1. 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
<a name="container-insights-eks-otel-logs-ts-costs"></a>

**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:** 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](#container-insights-eks-otel-logs-retention).