Ausführliche Anleitung zu Autodiscovery auf Amazon-ECS-Clustern - Amazon CloudWatch

Ausführliche Anleitung zu Autodiscovery auf Amazon-ECS-Clustern

Prometheus bietet Dutzende dynamischer Service-Discovery-Mechanismen, wie in <scrape_config> beschrieben. Es gibt jedoch keine integrierte Service-Erkennung für Amazon ECS. Der CloudWatch-Agent fügt diesen Mechanismus hinzu.

Wenn die Amazon-ECS-Prometheus-Serviceerkennung aktiviert ist, führt der CloudWatch-Agent regelmäßig die folgenden API-Aufrufe an Amazon-ECS- und Amazon-EC2-Frontends durch, um die Metadaten der ausgeführten ECS-Aufgaben im ECS-Ziel-Cluster abzurufen.

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

Die Metadaten werden vom CloudWatch-Agenten verwendet, um die Prometheus-Ziele innerhalb des ECS-Clusters zu scannen. Der CloudWatch-Agent unterstützt drei Service-Ermittlungsmodi:

  • Container-Docker-Label-basierte Service-Erkennung

  • ECS-Aufgabendefinition, ARN basierte Service-Discovery mit regulären Ausdrücken

  • ECS-Servicename, reguläre Ausdrucks-basierte Service-Erkennung

Alle Modi können gemeinsam verwendet werden. Der CloudWatch-Agent dedupliziert die erkannten Ziele basierend auf: {private_ip}:{port}/{metrics_path}.

Alle erkannten Ziele werden in eine Ergebnisdatei geschrieben, die durch das sd_result_file-Konfigurationsfeld im CloudWatch-Agent-Container angegeben wird. Das Folgende ist eine Beispielergebnisdatei:

- 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

Sie können diese Ergebnisdatei direkt in die dateibasierte Service-Erkennung von Prometheus integrieren. Weitere Informationen zur dateibasierten Serviceerkennung von Prometheus finden Sie unter <file_sd_config>

Angenommen, die Ergebnisdatei wird in /tmp/cwagent_ecs_auto_sd.yaml geschrieben. Die folgende Prometheus-Scrape-Konfiguration verbraucht sie.

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" ]

Der CloudWatch-Agent fügt außerdem die folgenden zusätzlichen Bezeichnungen für die erkannten Ziele hinzu.

  • container_name

  • TaskDefinitionFamily

  • TaskRevision

  • TaskGroup

  • StartedBy

  • LaunchType

  • job

  • __metrics_path__

  • Docker-Bezeichnungen

Wenn der Cluster den Starttyp EC2 hat, werden die folgenden drei Bezeichnungen hinzugefügt.

  • InstanceType

  • VpcId

  • SubnetId

Anmerkung

Docker-Bezeichnungen, die nicht dem regulären Ausdruck [a-zA-Z_][a-zA-Z0-9_]* entsprechen, werden herausgefiltert. Dies stimmt mit den Prometheus-Konventionen überein, die unter label_name in der Konfigurationsdatei in der Prometheus-Dokumentation aufgeführt sind.

Beispiele für die ECS-Serviceerkennung

Dieser Abschnitt enthält Beispiele, die die Ermittlung von ECS-Services veranschaulichen.

Beispiel 1

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

In diesem Beispiel wird die Docker-Bezeichnungs-basierte Service-Discovery aktiviert. Der CloudWatch-Agent fragt einmal pro Minute die Metadaten der ECS-Aufgaben ab und schreibt die erkannten Ziele in die /tmp/cwagent_ecs_auto_sd.yaml-Datei im CloudWatch-Agentencontainer.

Der Standardwert von sd_port_label im docker_label-Abschnitt ist ECS_PROMETHEUS_EXPORTER_PORT. Wenn ein laufender Container in den ECS-Aufgaben die Docker-Bezeichnung ECS_PROMETHEUS_EXPORTER_PORT hat, verwendet der CloudWatch-Agent seinen Wert als container port, um alle exponierten Ports des Containers zu scannen. Bei Übereinstimmung werden der zugeordnete Host-Port plus die private IP des Containers verwendet, um das Prometheus-Exporterziel im folgenden Format zu erstellen: private_ip:host_port.

Der Standardwert von sd_metrics_path_label im docker_label-Abschnitt ist ECS_PROMETHEUS_METRICS_PATH. Wenn der Container diese Docker-Bezeichnung hat, wird sein Wert als __metrics_path__ verwendet. Wenn der Container diese Bezeichnung nicht hat, wird der Standardwert /metrics verwendet.

Der Standardwert von sd_job_name_label im docker_label-Abschnitt ist job. Wenn der Container über diese Docker-Bezeichnung verfügt, wird sein Wert als eine der Beschriftungen für das Ziel angehängt, um den in der Prometheus-Konfiguration angegebenen Standardauftragsnamen zu ersetzen. Der Wert dieser Docker-Bezeichnung wird als Protokoll-Streamname in der Protokollgruppe CloudWatch Logs verwendet.

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

In diesem Beispiel wird die Docker-Bezeichnungs-basierte Service-Discovery aktiviert. Der CloudWatch-Agent fragt alle 15 Sekunden die Metadaten der ECS-Aufgaben ab und schreibt die erkannten Ziele in die /tmp/cwagent_ecs_auto_sd.yaml-Datei im CloudWatch-Agent-Container. Die Container mit einer Docker-Bezeichnung von ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A werden gescannt. Der Wert der Docker-Bezeichnung ECS_PROMETHEUS_JOB_NAME wird als Auftragsname verwendet.

Beispiel 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" } ] }

In diesem Beispiel wird die auf regulären Ausdrücken basierende Serviceerkennung des ECS-Aufgabendefinitions-ARN aktiviert. Der CloudWatch-Agent fragt alle fünf Minuten die Metadaten der ECS-Aufgaben ab und schreibt die erkannten Ziele in die /tmp/cwagent_ecs_auto_sd.yaml-Datei im CloudWatch-Agent-Container.

Es werden zwei reguläre ARN Expresionsabschnitte für Aufgabendefinition definiert:

  • Für den ersten Abschnitt werden die ECS-Aufgaben mit javajmx in ihrem ECS-Aufgabendefinitions-ARN für den Container-Port-Scan gefiltert. Wenn die Container innerhalb dieser ECS-Aufgaben den Container-Port auf 9404 oder 9406 verfügbar machen, werden der zugeordnete Host-Port zusammen mit der privaten IP-Adresse des Containers zum Erstellen der Prometheus-Exportziele verwendet. Der Wert von sd_metrics_path setzt __metrics_path__ auf /metrics. Damit der CloudWatch-Agent die Prometheus-Metriken von private_ip:host_port/metrics abkratzt, werden die gescrapten Metriken an den java-prometheus-Protokollstream in CloudWatch Logs in der Protokollgruppe /aws/ecs/containerinsights/cluster_name/prometheus gesendet.

  • Für den zweiten Abschnitt werden die ECS-Aufgaben mit appmesh in ihrem ECS-Aufgabendefinitions-ARN und mit :23 von version für den Container-Port-Scan gefiltert. Für Container mit dem Namen envoy legen Sie den Container-Port auf 9901 offen. Der zugeordnete Host-Port wird zusammen mit der privaten IP des Containers verwendet, um die Prometheus-Exporterziele zu erstellen. Der Wert innerhalb dieser ECS-Aufgaben stellt den Container-Port auf 9404 oder 9406 zur Verfügung, der zugeordnete Host-Port zusammen mit der privaten IP des Containers werden verwendet, um die Prometheus-Exportziele zu erstellen. Der Wert von sd_metrics_path setzt __metrics_path__ auf /stats/prometheus. Der CloudWatch-Agent wird also die Prometheus-Metriken von private_ip:host_port/stats/prometheus scrapen und die gescrapten Metriken an den envoy-prometheus-Protokollstream in CloudWatch Logs in der Protokollgruppe /aws/ecs/containerinsights/cluster_name/prometheus senden.

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

In diesem Beispiel wird die auf regulären Ausdrücken basierende Serviceerkennung für ECS-Servicenamen aktiviert. Der CloudWatch-Agent fragt alle fünf Minuten die Metadaten der ECS-Services ab und schreibt die erkannten Ziele in die /tmp/cwagent_ecs_auto_sd.yaml-Datei im CloudWatch-Agent-Container.

Es werden zwei reguläre Expresionsabschnitte des Servicenamens definiert:

  • Im ersten Abschnitt werden die ECS-Aufgaben, die ECS-Services zugeordnet sind, deren Namen mit dem regulären Ausdruck ^nginx-.* übereinstimmen, für den Container-Port-Scan gefiltert Wenn die Container innerhalb dieser ECS-Aufgaben den Container-Port auf 9113 verfügbar machen, werden der zugeordnete Host-Port zusammen mit der privaten IP-Adresse des Containers zum Erstellen der Prometheus-Exportziele verwendet. Der Wert von sd_metrics_path setzt __metrics_path__ auf /metrics. Damit der CloudWatch-Agent die Prometheus-Metriken von private_ip:host_port/metrics scrapt, werden die gescrapten Metriken an den nginx-prometheus-Protokollstream in CloudWatch Logs in der Protokollgruppe /aws/ecs/containerinsights/cluster_name/prometheus gesendet.

  • Im zweiten Abschnitt werden die ECS-Aufgaben, die ECS-Services zugeordnet sind, deren Namen mit dem regulären Ausdruck .*haproxy-service.* übereinstimmen, für den Container-Port-Scan gefiltert Für Container mit dem Namen haproxy legen Sie den Container-Port auf 8404 offen. Der zugeordnete Host-Port wird zusammen mit der privaten IP des Containers verwendet, um die Prometheus-Exporterziele zu erstellen. Der Wert von sd_metrics_path setzt __metrics_path__ auf /stats/metrics. Damit der CloudWatch-Agent die Prometheus-Metriken von private_ip:host_port/stats/metrics scrapt, werden die gescrapten Metriken an den haproxy-prometheus-Protokollstream in CloudWatch Logs in der Protokollgruppe /aws/ecs/containerinsights/cluster_name/prometheus gesendet.

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

In diesem Beispiel werden beide ECS-Service-Ermittlungsmodi aktiviert. Der CloudWatch-Agent fragt alle 90 Sekunden die Metadaten der ECS-Aufgaben ab und schreibt die erkannten Ziele in die /tmp/cwagent_ecs_auto_sd.yaml-Datei im CloudWatch-Agent-Container.

Für die Docker-basierte Service-Discovery-Konfiguration:

  • Die ECS-Aufgaben mit Docker-Bezeichnugn MY_PROMETHEUS_EXPORTER_PORT_LABEL werden für den Prometheus-Port-Scan gefiltert. Der Ziel-Prometheus-Container-Port wird durch den Wert der Bezeichnung MY_PROMETHEUS_EXPORTER_PORT_LABEL angegeben.

  • Der Wert der Docker-Bezeichnung MY_PROMETHEUS_EXPORTER_PORT_LABEL wird für __metrics_path__ verwendet. Wenn der Container diese Docker-Bezeichnung nicht hat, wird der Standardwert /metrics verwendet.

  • Der Wert der Docker-Bezeichnung MY_PROMETHEUS_EXPORTER_PORT_LABEL wird als Auftragsbezeichnung verwendet. Wenn der Container nicht über diese Docker-Bezeichnung verfügt, wird der in der Prometheus-Konfiguration definierte Auftragsname verwendet.

Für die ECS-Aufgabendefinition ARN-basierte Serviceerkennungskonfiguration:

  • Die ECS-Aufgaben mit memcached im ARN der ECS-Aufgabendefinition werden für den Container-Port-Scan gefiltert. Der Ziel-Container-Port von Prometheus ist 9150, wie durch sd_metrics_ports definiert. Der Standard-Metrikpfad /metricswird verwendet. Der Auftragsname, der in der Prometheus-Konfiguration definiert ist, wird verwendet.