Solucionar problemas de métricas do Prometheus no Amazon ECS - Amazon CloudWatch

Solucionar problemas de métricas do Prometheus no Amazon ECS

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

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 AWS 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 AWS CloudFormation em relação à pilha existente. Defina outros parâmetros do changeset para os mesmos valores de sua pilha do AWS 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 AWS 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 AWS 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.