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>
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_name
em Arquivo de configuração
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 desd_metrics_path
define__metrics_path__
como/metrics
. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus deprivate_ip:host_port/metrics
, e as métricas extraídas serão enviadas ao fluxo de logsjava-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 comversion
de:23
são filtradas para a verificação da porta do contêiner. Para contêineres com um nome deenvoy
que expõem a porta do contêiner em9901
, 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 desd_metrics_path
define__metrics_path__
como/stats/prometheus
. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus deprivate_ip:host_port/stats/prometheus
e enviará as métricas extraídas ao fluxo de logsenvoy-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 desd_metrics_path
define__metrics_path__
como/metrics
. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus deprivate_ip:host_port/metrics
, e as métricas extraídas serão enviadas ao fluxo de logsnginx-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 dehaproxy
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 desd_metrics_path
define__metrics_path__
como/stats/metrics
. Assim, o atendente do CloudWatch extrairá as métricas do Prometheus deprivate_ip:host_port/stats/metrics
, e as métricas extraídas serão enviadas ao fluxo de logshaproxy-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ótuloMY_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 porsd_metrics_ports
. É usado o caminho padrão das métricas/metrics
. É usado o nome do trabalho definido na configuração do Prometheus.