Guía detallada para la detección automática en clústeres de Amazon ECS - Amazon CloudWatch

Guía detallada para la detección automática en clústeres de Amazon ECS

Prometheus proporciona docenas de mecanismos dinámicos de detección de servicios, como se describe en <scrape_config>. Sin embargo, no existe una detección de servicios integrado para Amazon ECS. El agente CloudWatch agrega este mecanismo.

Cuando se habilita la detección de servicios de Amazon ECS Prometheus, el agente de CloudWatch realiza periódicamente las siguientes llamadas a la API a Amazon ECS y a los frontends de Amazon EC2 para recuperar los metadatos de las tareas ECS en ejecución en el clúster de ECS de destino.

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

El agente de CloudWatch utiliza los metadatos para examinar los destinos de Prometheus dentro del clúster de ECS. El agente de CloudWatch admite tres modos de detección de servicio:

  • Detección de servicio basada en etiquetas docker de contenedor

  • Detección de servicio basada en expresiones regulares ARN de definición de tarea de ECS

  • Detección de servicio basada en expresiones regulares de nombre de servicio de ECS

Todos los modos se pueden utilizar de forma conjunta. El agente de CloudWatch desduplica los destinos detectados en función de: {private_ip}:{port}/{metrics_path}.

Todos los destinos detectados se registran en un archivo de resultados que el campo de configuración sd_result_file especifica dentro del contenedor del agente de CloudWatch. A continuación se muestra un archivo de resultados de ejemplo.

- 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

Puede integrar directamente este archivo de resultados con la detección de servicios basada en archivos de Prometheus. Para obtener más información acerca de la detección de servicios basada en archivos de Prometheus, consulte <file_sd_config>.

Suponga que el archivo de resultados se registra en /tmp/cwagent_ecs_auto_sd.yaml, la siguiente configuración de raspado de Prometheus lo 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" ]

El agente de CloudWatch también agrega las siguientes etiquetas adicionales para los destinos detectados.

  • container_name

  • TaskDefinitionFamily

  • TaskRevision

  • TaskGroup

  • StartedBy

  • LaunchType

  • job

  • __metrics_path__

  • Etiquetas docker

Cuando el clúster tiene el tipo de lanzamiento EC2, se agregan las tres etiquetas siguientes.

  • InstanceType

  • VpcId

  • SubnetId

nota

Las etiquetas docker que no concuerdan con la expresión regular [a-zA-Z_][a-zA-Z0-9_]* se filtran. Coincide con las convenciones de Prometheus enumeradas en label_name en Configuration file (Archivo de configuración) en la documentación de Prometheus.

Ejemplos de configuración de detección de servicios de ECS

En esta sección se incluyen ejemplos que demuestran la detección de servicios de ECS.

Ejemplo 1

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

En este ejemplo se habilita la detección de servicios basada en etiquetas docker El agente de CloudWatch consultará los metadatos de las tareas de ECS una vez por minuto y registrará los destinos detectados en el archivo /tmp/cwagent_ecs_auto_sd.yaml dentro del contenedor del agente de CloudWatch.

El valor predeterminado de sd_port_label en la sección docker_label es ECS_PROMETHEUS_EXPORTER_PORT. Si algún contenedor en ejecución en las tareas de ECS tiene una etiqueta docker ECS_PROMETHEUS_EXPORTER_PORT, el agente CloudWatch utiliza el valor como container port para examinar todos los puertos expuestos del contenedor. Si hay una concordancia, el puerto del host mapeado más la IP privada del contenedor se utilizan para construir el destino del exportador de Prometheus en el siguiente formato: private_ip:host_port.

El valor predeterminado de sd_metrics_path_label en la sección docker_label es ECS_PROMETHEUS_METRICS_PATH. Si el contenedor tiene esta etiqueta docker, el valor se utilizará como la __metrics_path__. Si el contenedor no tiene esta etiqueta, se utiliza el valor predeterminado /metrics.

El valor predeterminado de sd_job_name_label en la sección docker_label es job. Si el contenedor tiene esta etiqueta docker, el valor se agregará como una de las etiquetas para que el destino reemplace el nombre de trabajo predeterminado que se especifica en la configuración de Prometheus. El valor de esta etiqueta docker se utiliza como nombre de flujo de registro en el grupo de registros de CloudWatch Logs.

Ejemplo 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" } }

En este ejemplo se habilita la detección de servicios basada en etiquetas docker. El agente de CloudWatch consultará los metadatos de las tareas de ECS cada 15 segundos y registrará los destinos detectados en el archivo /tmp/cwagent_ecs_auto_sd.yaml dentro del contenedor del agente de CloudWatch. Los contenedores con una etiqueta docker de ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A se examinarán. El valor de la etiqueta docker ECS_PROMETHEUS_JOB_NAME se utiliza como el nombre del trabajo.

Ejemplo 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 ejemplo habilita la detección de servicios basada en expresiones ARN regulares de definición de tareas de ECS. El agente de CloudWatch consultará los metadatos de las tareas de ECS cada cinco minutos y registrará los destinos detectados en el archivo /tmp/cwagent_ecs_auto_sd.yaml dentro del contenedor del agente de CloudWatch.

Se definen dos secciones de expresión regular de ARN de definición de tarea:

  • Para la primera sección, las tareas de ECS con javajmx en la definición de tarea de ECS de ARN se filtran para el análisis del puerto del contenedor. Si los contenedores dentro de estas tareas de ECS exponen el puerto del contenedor en 9404 o 9406, el puerto del host mapeado junto con la IP privada del contenedor se utilizan para crear los destinos del exportador de Prometheus. El valor de sd_metrics_path establece __metrics_path__ a /metrics. Por lo tanto, el agente de CloudWatch raspará las métricas de Prometheus de private_ip:host_port/metrics y las métricas raspadas se enviarán al flujo de registro java-prometheus en CloudWatch Logs en el grupo de registros /aws/ecs/containerinsights/cluster_name/prometheus.

  • Para la segunda sección, las tareas de ECS con appmesh en los ARN de definición de tareas de ECS y con version de :23 se filtran para el análisis del puerto del contenedor. Para contenedores con un nombre de envoy que exponen el puerto del contenedor en 9901, el puerto del host mapeado junto con la IP privada del contenedor se utilizan para crear los destinos del exportador de Prometheus. El valor dentro de estas tareas de ECS expone el puerto contenedor en 9404 o 9406, el puerto del host mapeado junto con la IP privada del contenedor se utilizan para crear los destinos del exportador de Prometheus. El valor de sd_metrics_path establece __metrics_path__ a /stats/prometheus. Por lo tanto, el agente de CloudWatch eliminará las métricas de Prometheus de private_ip:host_port/stats/prometheus y enviará las métricas raspadas al flujo de registros envoy-prometheus en CloudWatch Logs en el grupo de registros /aws/ecs/containerinsights/cluster_name/prometheus.

Ejemplo 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.*" } ] }

En este ejemplo se habilita la detección de servicios basada en expresiones regulares del nombre de servicio de ECS. El agente de CloudWatch consultará los metadatos de los servicios de ECS cada cinco minutos y registrará los destinos detectados en el archivo /tmp/cwagent_ecs_auto_sd.yaml dentro del contenedor del agente de CloudWatch.

Se definen dos secciones de expresiones regulares de nombre de servicio:

  • Para la primera sección, las tareas de ECS asociadas con los servicios de ECS que tienen nombres que concuerdan con la expresión regular ^nginx-.* se filtran para el análisis del puerto del contenedor. Si los contenedores dentro de estas tareas de ECS exponen el puerto del contenedor en 9113, el puerto del host mapeado junto con la IP privada del contenedor se utilizan para crear los destinos del exportador de Prometheus. El valor de sd_metrics_path establece __metrics_path__ a /metrics. Por lo tanto, el agente de CloudWatch raspará las métricas de Prometheus de private_ip:host_port/metrics, y las métricas raspadas se enviarán al flujo de registro nginx-prometheus en CloudWatch Logs en el grupo de registros /aws/ecs/containerinsights/cluster_name/prometheus.

  • Para la segunda sección, las tareas de ECS asociadas con los servicios de ECS que tienen nombres que concuerdan con la expresión regular .*haproxy-service.* se filtran para el análisis del puerto del contenedor. En contenedores con un nombre de haproxy que exponen el puerto del contenedor en 8404, el puerto del host mapeado junto con la IP privada del contenedor se utilizan para crear los destinos del exportador de Prometheus. El valor de sd_metrics_path establece __metrics_path__ a /stats/metrics. Por lo tanto, el agente de CloudWatch raspará las métricas de Prometheus de private_ip:host_port/stats/metrics, y las métricas de raspado se enviarán al flujo de registro haproxy-prometheus en CloudWatch Logs en el grupo de registros /aws/ecs/containerinsights/cluster_name/prometheus.

Ejemplo 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.*" } ] }

En este ejemplo se habilitan los dos modos de detección de servicios de ECS. El agente de CloudWatch consultará los metadatos de las tareas de ECS cada 90 segundos y registrará los destinos detectados en el archivo /tmp/cwagent_ecs_auto_sd.yaml dentro del contenedor del agente de CloudWatch.

Para la configuración de detección de servicios basada en docker:

  • Las tareas de ECS con etiqueta docker MY_PROMETHEUS_EXPORTER_PORT_LABEL se filtrarán para el análisis del puerto de Prometheus. El puerto de destino del contenedor de Prometheus se especifica por el valor de la etiqueta MY_PROMETHEUS_EXPORTER_PORT_LABEL.

  • El valor de la etiqueta docker MY_PROMETHEUS_EXPORTER_PORT_LABEL se utiliza para __metrics_path__. Si el contenedor no tiene esta etiqueta docker, se utiliza el valor predeterminado /metrics.

  • El valor de la etiqueta docker MY_PROMETHEUS_EXPORTER_PORT_LABEL se utiliza como etiqueta de trabajo. Si el contenedor no tiene esta etiqueta docker, se utiliza el nombre del trabajo definido en la configuración de Prometheus.

Para la configuración de la detección de servicio basada en expresiones regulares ARN de definición de tareas de ECS:

  • Las tareas de ECS con memcached en los ARN de definición de tareas de ECS se filtran para el análisis del puerto del contenedor. El puerto del contenedor del destino de Prometheus es 9150 de acuerdo a la definición de sd_metrics_ports. Se utiliza la ruta de métricas predeterminada /metrics. Se utiliza el nombre del trabajo definido en la configuración de Prometheus.