

# Solucionar problemas de métricas do Prometheus no Amazon ECS
<a name="ContainerInsights-Prometheus-troubleshooting-ECS"></a>

Esta seção fornece ajuda para solucionar problemas de configuração de métricas do Prometheus em clusters do Amazon ECS. 

## Não visualizo as métricas do Prometheus enviadas ao CloudWatch Logs
<a name="ContainerInsights-Prometheus-troubleshooting-ECS-nometrics"></a>

As métricas do Prometheus devem ser ingeridas como eventos de log no grupo de logs **/aws/ecs/containerinsights/cluster-name/Prometheus**. Se o grupo de logs não estiver criado ou se as métricas do Prometheus não forem enviadas ao grupo de logs, primeiro você precisará conferir se os destinos do Prometheus foram detectados corretamente pelo atendente do CloudWatch. Em seguida, confira o grupo de segurança e as configurações de permissão do atendente do CloudWatch. As etapas a seguir orientam a fazer a depuração.

**Etapa 1: habilitar o modo de depuração do atendente do CloudWatch**

Primeiro, altere o atendente do CloudWatch para o modo de depuração adicionando as seguintes linhas em negrito ao modelo de arquivo do CloudFormation: `cwagent-ecs-prometheus-metric-for-bridge-host.yaml` ou `cwagent-ecs-prometheus-metric-for-awsvpc.yaml`. Salve o arquivo.

```
cwagentconfig.json: |
    {
      "agent": {
        "debug": true
      },
      "logs": {
        "metrics_collected": {
```

Criar um novo changeset do CloudFormation em relação à pilha existente. Defina outros parâmetros do changeset para os mesmos valores de sua pilha do CloudFormation existente. O exemplo a seguir é de um atendente do CloudWatch instalado em um cluster do Amazon ECS usando o tipo de inicialização do EC2 e o modo de rede de ponte.

```
ECS_NETWORK_MODE=bridge
 CREATE_IAM_ROLES=True
ECS_TASK_ROLE_NAME={{your_selected_ecs_task_role_name}}
ECS_EXECUTION_ROLE_NAME={{your_selected_ecs_execution_role_name}}
NEW_CHANGESET_NAME={{your_selected_ecs_execution_role_name}}

aws cloudformation create-change-set --stack-name CWAgent-Prometheus-ECS-${ECS_CLUSTER_NAME}-EC2-${ECS_NETWORK_MODE} \
    --template-body file://cwagent-ecs-prometheus-metric-for-bridge-host.yaml \
    --parameters ParameterKey=ECSClusterName,ParameterValue=$ECS_CLUSTER_NAME \
                 ParameterKey=CreateIAMRoles,ParameterValue=$CREATE_IAM_ROLES \
                 ParameterKey=ECSNetworkMode,ParameterValue=$ECS_NETWORK_MODE \
                 ParameterKey=TaskRoleName,ParameterValue=$ECS_TASK_ROLE_NAME \
                 ParameterKey=ExecutionRoleName,ParameterValue=$ECS_EXECUTION_ROLE_NAME \
    --capabilities CAPABILITY_NAMED_IAM \
    --region $AWS_REGION \
    --change-set-name $NEW_CHANGESET_NAME
```

Acesse o console do CloudFormation para revisar o novo changeset, `$NEW_CHANGESET_NAME`. Deve haver uma alteração aplicada ao recurso **CWAgentConfigSSMParameter**. Execute o changeset e reinicie a tarefa do atendente do CloudWatch inserindo os comandos a seguir.

```
aws ecs update-service --cluster $ECS_CLUSTER_NAME \
--desired-count 0 \
--service {{your_service_name_here}} \
--region $AWS_REGION
```

Aguarde cerca de 10 segundos e insira o comando a seguir.

```
aws ecs update-service --cluster $ECS_CLUSTER_NAME \
--desired-count 1 \
--service {{your_service_name_here}} \
--region $AWS_REGION
```

**Etapa 2: verificar os logs de detecção de serviço do ECS**

Por padrão, a definição de tarefa do ECS do atendente do CloudWatch habilita os logs na seção abaixo. Os logs são enviados ao CloudWatch Logs no grupo de logs **/ecs/ecs-cwagent-prometheus**.

```
LogConfiguration:
  LogDriver: awslogs
    Options:
      awslogs-create-group: 'True'
      awslogs-group: "/ecs/ecs-cwagent-prometheus"
      awslogs-region: !Ref AWS::Region
      awslogs-stream-prefix: !Sub 'ecs-${ECSLaunchType}-awsvpc'
```

Filtrar os logs pela string `ECS_SD_Stats` para obter as métricas relacionadas à detecção de serviços do ECS, conforme mostrado no exemplo a seguir.

```
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeContainerInstances: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeInstancesRequest: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_DescribeTasks: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: AWSCLI_ListTasks: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: Exporter_DiscoveredTargetCount: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_EC2MetaData: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Get_TaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_ContainerInstance: 1
2020-09-1T01:53:14Z D! ECS_SD_Stats: LRUCache_Size_TaskDefinition: 2
2020-09-1T01:53:14Z D! ECS_SD_Stats: Latency: 43.399783ms
```

O significado de cada métrica para determinado ciclo de detecção de serviços do ECS é o seguinte:
+ **AWSCLI\_DescribeContainerInstances**: o número de chamadas de API `ECS::DescribeContainerInstances` realizadas.
+ **AWSCLI\_DescribeInstancesRequest**: o número de chamadas de API `ECS::DescribeInstancesRequest` realizadas.
+ **AWSCLI\_DescribeTaskDefinition**: o número de chamadas de API `ECS::DescribeTaskDefinition` realizadas.
+ **AWSCLI\_DescribeTasks**: o número de chamadas de API `ECS::DescribeTasks` realizadas.
+ **AWSCLI\_ListTasks**: o número de chamadas de API `ECS::ListTasks` realizadas.
+ **ExporterDiscoveredTargetCount**: o número de destinos do Prometheus que foram detectados e exportados corretamente para o arquivo de resultados de destino dentro do contêiner.
+ **LRUCache\_Get\_EC2MetaData**: o número de vezes em que os metadados de instâncias de contêiner foram recuperados do cache.
+ **LRUCache\_Get\_TaskDefinition**: o número de vezes que os metadados de definição de tarefa do ECS foram recuperados do cache.
+ **LRUCache\_Size\_ContainerInstance**: o número de metadados da instância de contêiner exclusiva armazenados em cache na memória.
+ **LRUCache\_Size\_TaskDefinition**: o número de definições de tarefa de ECS exclusivas armazenadas em cache na memória.
+ **Latency**: quanto tempo demora o ciclo de detecção de serviços.

Confira o valor de `ExporterDiscoveredTargetCount` para ver se os destinos detectados do Prometheus correspondem a suas expectativas. Caso contrário, os possíveis motivos são:
+ A configuração da detecção de serviços do ECS pode não corresponder à configuração de sua aplicação. Para a detecção de serviços baseada em rótulos do docker, seus contêineres de destino talvez não tenham o rótulo do docker necessário configurado no atendente do CloudWatch para detectá-los automaticamente. Para a detecção de serviços baseada em expressão regular do ARN da definição de tarefa do ECS, a configuração regex no atendente do CloudWatch pode não corresponder à definição de tarefa da aplicação. 
+ A função da tarefa do ECS do atendente do CloudWatch pode não ter permissão para recuperar os metadados das tarefas do ECS. Verifique se o atendente do CloudWatch recebeu as seguintes permissões somente para leitura:
  + `ec2:DescribeInstances`
  + `ecs:ListTasks`
  + `ecs:DescribeContainerInstances`
  + `ecs:DescribeTasks`
  + `ecs:DescribeTaskDefinition`

**Etapa 3: verificar a conexão de rede e a política de função de tarefa do ECS**

Se ainda não houver eventos de log enviados ao grupo de logs do CloudWatch Logs de destino, mesmo que o valor de `Exporter_DiscoveredTargetCount` indique que há destinos do Prometheus detectados, isso pode ser causado por uma destas situações:
+ O atendente do CloudWatch talvez não consiga se conectar às portas de destino do Prometheus. Verifique a configuração do grupo de segurança por trás do atendente do CloudWatch. O IP privado deve permitir que o atendente do CloudWatch se conecte às portas do exportador do Prometheus. 
+ A função da tarefa do ECS do atendente do CloudWatch talvez não tenha a política gerenciada **CloudWatchAgentServerPolicy**. A função da tarefa do ECS do atendente do CloudWatch precisa ter essa política para poder enviar as métricas do Prometheus como eventos de log. Se você usou o modelo do CloudFormation para criar as funções do IAM automaticamente, tanto a função da tarefa do ECS como a função de execução do ECS são concedidas com o menor privilégio para executar o monitoramento do Prometheus. 