Guia detalhado para detecção automática em clusters do Amazon ECS - Amazon CloudWatch

Guia detalhado para detecção automática em clusters do Amazon ECS

O Prometheus fornece dezenas de mecanismos dinâmicos de detecção de serviços, conforme descrito em <scrape_config>. Porém, não há detecção de serviço integrada para o Amazon ECS. O atendente do CloudWatch adiciona esse mecanismo.

Quando a detecção de serviço do Amazon ECS Prometheus é habilitada, o atendente do CloudWatch faz periodicamente as seguintes chamadas de API aos frontends do Amazon ECS e do Amazon EC2 para recuperar os metadados das tarefas do ECS em execução no cluster do ECS de destino.

EC2:DescribeInstances ECS:ListTasks ECS:ListServices ECS:DescribeContainerInstances ECS:DescribeServices ECS:DescribeTasks ECS:DescribeTaskDefinition

Os metadados são usados pelo atendente do CloudWatch para verificar os destinos do Prometheus dentro do cluster do ECS. O atendente do CloudWatch é compatível com três modos de detecção de serviço:

  • Detecção de serviço baseada em rótulos do docker

  • Detecção de serviço baseado em expressão regular do ARN da definição de tarefa do ECS

  • Detecção de serviço baseada em expressão regular do nome do serviço do ECS

Todos os modos podem ser usados conjuntamente. O atendente do CloudWatch elimina a duplicação dos destinos detectados com base em: {private_ip}:{port}/{metrics_path}.

Todos os destinos detectados são gravados em um arquivo de resultado especificado pela confiiguração sd_result_file dentro do contêiner do atendente do CloudWatch. Veja a seguir um exemplo de arquivo de resultado:

- targets: - 10.6.1.95:32785 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT: "9406" ECS_PROMETHEUS_JOB_NAME: demo-jar-ec2-bridge-dynamic ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-jar-ec2-bridge-dynamic-port TaskGroup: family:demo-jar-ec2-bridge-dynamic-port TaskRevision: "7" VpcId: vpc-01234567890 container_name: demo-jar-ec2-bridge-dynamic-port job: demo-jar-ec2-bridge-dynamic - targets: - 10.6.3.193:9404 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_B: "9404" ECS_PROMETHEUS_JOB_NAME: demo-tomcat-ec2-bridge-mapped-port ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-tomcat-ec2-bridge-mapped-port TaskGroup: family:demo-jar-tomcat-bridge-mapped-port TaskRevision: "12" VpcId: vpc-01234567890 container_name: demo-tomcat-ec2-bridge-mapped-port job: demo-tomcat-ec2-bridge-mapped-port

É possível integrar diretamente esse arquivo de resultados à detecção de serviços baseada em arquivo do Prometheus. Para obter mais informações sobre a detecção de serviços baseada em arquivos do Prometheus, consulte <file_sd_config>.

Suponha que o arquivo resultante seja gravado em /tmp/cwagent_ecs_auto_sd.yaml. A seguinte configuração de extração do Prometheus o consumirá.

global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: cwagent-ecs-file-sd-config sample_limit: 10000 file_sd_configs: - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ]

O atendente do CloudWatch também acrescenta os seguintes rótulos adicionais aos destinos descobertos.

  • container_name

  • TaskDefinitionFamily

  • TaskRevision

  • TaskGroup

  • StartedBy

  • LaunchType

  • job

  • __metrics_path__

  • Rótulos do Docker

Quando o cluster tiver o tipo de inicialização do EC2, os três rótulos a seguir serão adicionados.

  • InstanceType

  • VpcId

  • SubnetId

nota

Os rótulos do Docker que não correspondem à expressão regular [a-zA-Z_][a-zA-Z0-9_]* são filtrados. Isso corresponde às convenções do Prometheus listadas em label_nameem Arquivo de configuração na documentação do Prometheus.

Exemplos de configuração de detecção de serviços do ECS

Esta seção contém exemplos que demonstram a detecção de serviços do ECS.

Exemplo 1

"ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { } }

Este exemplo habilita a detecção de serviços baseada em rótulos do docker. O atendente do CloudWatch consultará os metadados das tarefas do ECS uma vez por minuto e gravará os destinos detectados no arquivo /tmp/cwagent_ecs_auto_sd.yaml dentro do contêiner do atendente do CloudWatch.

O valor padrão de sd_port_label na seção docker_label é ECS_PROMETHEUS_EXPORTER_PORT. Se qualquer contêiner em execução nas tarefas do ECS tiver um rótulo do docker ECS_PROMETHEUS_EXPORTER_PORT, o atendente do CloudWatch usará seu valor como container port para verificar todas as portas expostas do contêiner. Se houver uma correspondência, a porta do host mapeada mais o IP privado do contêiner serão usados para construir o destino do exportador do Prometheus neste formato: private_ip:host_port.

O valor padrão de sd_metrics_path_label na seção docker_label é ECS_PROMETHEUS_METRICS_PATH. Se o contêiner tiver esse rótulo do docker, seu valor será usado como __metrics_path__. Se o contêiner não tiver esse rótulo, será usado o valor padrão /metrics.

O valor padrão de sd_job_name_label na seção docker_label é job. Se o contêiner tiver esse rótulo do docker, seu valor será anexado como um dos rótulos do destino para substituir o nome do trabalho padrão especificado na configuração do Prometheus. O valor desse rótulo do docker será usado como o nome do fluxo de logs no grupo de logs do CloudWatch Logs.

Exemplo 2

"ecs_service_discovery": { "sd_frequency": "15s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A", "sd_job_name_label": "ECS_PROMETHEUS_JOB_NAME" } }

Este exemplo habilita a detecção de serviços baseada em rótulos do docker. O atendente do CloudWatch consultará os metadados das tarefas do ECS a cada 15 segundos e gravará os destinos detectados no arquivo /tmp/cwagent_ecs_auto_sd.yaml dentro do contêiner do atendente do CloudWatch. Os contêineres com o rótulo do docker ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A serão verificados. O valor do rótulo do docker ECS_PROMETHEUS_JOB_NAME é usado como nome do trabalho.

Exemplo 3

"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "task_definition_list": [ { "sd_job_name": "java-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9404; 9406", "sd_task_definition_arn_pattern": ".*:task-definition/.*javajmx.*:[0-9]+" }, { "sd_job_name": "envoy-prometheus", "sd_metrics_path": "/stats/prometheus", "sd_container_name_pattern": "^envoy$", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition/.*appmesh.*:23" } ] }

Este exemplo habilita a detecção de serviço baseado em expressão regular do ARN da definição de tarefa do ECS. O atendente do CloudWatch consultará os metadados das tarefas do ECS a cada cinco minutos e gravará os destinos detectados no arquivo /tmp/cwagent_ecs_auto_sd.yaml dentro do contêiner do atendente do CloudWatch.

São definidas duas seções de expressão regular do ARN da definição de tarefa:

  • Na primeira seção, as tarefas do ECS com javajmx no ARN da definição de tarefa do ECS são filtradas para a verificação da porta do contêiner. Se os contêineres dentro dessas tarefas do ECS expuserem a porta do contêiner em 9404 ou 9406, a porta do host mapeada juntamente com o IP privado do contêiner serão usados para criar os destinos do exportador do Prometheus. O valor de sd_metrics_path define __metrics_path__ como /metrics. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus de private_ip:host_port/metrics, e as métricas extraídas serão enviadas ao fluxo de logs java-prometheus no CloudWatch Logs no grupo de logs /aws/ecs/containerinsights/cluster_name/prometheus.

  • Na segunda seção, as tarefas do ECS com appmesh no ARN da definição de tarefa do ECS e com version de :23 são filtradas para a verificação da porta do contêiner. Para contêineres com um nome de envoy que expõem a porta do contêiner em 9901, a porta de host mapeada e o IP privado do contêiner são usados para criar os destinos do exportador do Prometheus. Se o valor dentro dessas tarefas do ECS expuser a porta do contêiner em 9404 ou 9406, a porta do host mapeada e o IP privado do contêiner serão usados para criar os destinos do exportador do Prometheus. O valor de sd_metrics_path define __metrics_path__ como /stats/prometheus. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus de private_ip:host_port/stats/prometheus e enviará as métricas extraídas ao fluxo de logs envoy-prometheus no CloudWatch Logs no grupo de logs /aws/ecs/containerinsights/cluster_name/prometheus.

Exemplo 4

"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "service_name_list_for_tasks": [ { "sd_job_name": "nginx-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9113", "sd_service_name_pattern": "^nginx-.*" }, { "sd_job_name": "haproxy-prometheus", "sd_metrics_path": "/stats/metrics", "sd_container_name_pattern": "^haproxy$", "sd_metrics_ports": "8404", "sd_service_name_pattern": ".*haproxy-service.*" } ] }

Este exemplo habilita a detecção de serviço baseado em expressão regular do nome do serviço do ECS. O atendente do CloudWatch consultará os metadados dos serviços do ECS a cada cinco minutos e gravará os destinos detectados no arquivo /tmp/cwagent_ecs_auto_sd.yaml dentro do contêiner do atendente do CloudWatch.

São definidas duas seções de expressão regular de nome de serviço:

  • Na primeira seção, as tarefas do ECS associadas aos serviços do ECS que têm nomes correspondentes à expressão regular ^nginx-.*são filtrados para a verificação da porta do contêiner. Se os contêineres dentro dessas tarefas do ECS expuserem a porta do contêiner em 9113, a porta do host mapeada e o IP privado do contêiner serão usados para criar os destinos do exportador do Prometheus. O valor de sd_metrics_path define __metrics_path__ como /metrics. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus de private_ip:host_port/metrics, e as métricas extraídas serão enviadas ao fluxo de logs nginx-prometheus no CloudWatch Logs no grupo de logs /aws/ecs/containerinsights/cluster_name/prometheus.

  • Na segunda seção, as tarefas do ECS associadas aos serviços do ECS que têm nomes correspondentes à expressão regular .*haproxy-service.*são filtrados para a verificação da porta do contêiner. Para contêineres com um nome de haproxy que expõem a porta do contêiner em 8404, a porta de host mapeada e o IP privado do contêiner são usados para criar os destinos do exportador do Prometheus. O valor de sd_metrics_path define __metrics_path__ como /stats/metrics. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus de private_ip:host_port/stats/metrics, e as métricas extraídas serão enviadas ao fluxo de logs haproxy-prometheus no CloudWatch Logs no grupo de logs /aws/ecs/containerinsights/cluster_name/prometheus.

Exemplo 5

"ecs_service_discovery": { "sd_frequency": "1m30s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "MY_PROMETHEUS_EXPORTER_PORT_LABEL", "sd_metrics_path_label": "MY_PROMETHEUS_METRICS_PATH_LABEL", "sd_job_name_label": "MY_PROMETHEUS_METRICS_NAME_LABEL" } "task_definition_list": [ { "sd_metrics_ports": "9150", "sd_task_definition_arn_pattern": "*memcached.*" } ] }

Este exemplo habilita os dois modos de detecção de serviços do ECS. O atendente do CloudWatch consultará os metadados das tarefas do ECS a cada 90 segundos e gravará os destinos detectados no arquivo /tmp/cwagent_ecs_auto_sd.yaml dentro do contêiner do atendente do CloudWatch.

Para a configuração de detecção de serviços baseada em docker:

  • As tarefas do ECS com rótulo do docker MY_PROMETHEUS_EXPORTER_PORT_LABEL serão filtradas para a verificação de porta do Prometheus. A porta do contêiner do Prometheus de destino é especificada pelo valor do rótulo MY_PROMETHEUS_EXPORTER_PORT_LABEL.

  • Utiliza-se o valor do rótulo do docker MY_PROMETHEUS_EXPORTER_PORT_LABEL para __metrics_path__. Se o contêiner não tiver esse rótulo do docker, será usado o valor padrão /metrics.

  • O valor do rótulo do docker MY_PROMETHEUS_EXPORTER_PORT_LABEL é usado como rótulo do trabalho. Se o contêiner não tiver esse rótulo do docker, será usado o nome do trabalho definido na configuração do Prometheus.

Para configuração da detecção de serviço baseado em expressão regular do ARN da definição de tarefa do ECS:

  • As tarefas do ECS com memcached no ARN da definição de tarefa do ECS são filtradas para verificação da porta do contêiner. A porta de contêiner do Prometheus de destino é 9150, conforme definido por sd_metrics_ports. É usado o caminho padrão das métricas /metrics. É usado o nome do trabalho definido na configuração do Prometheus.