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.