Scraping zusätzlicher Prometheus-Quellen und Importieren dieser Metriken - Amazon CloudWatch

Scraping zusätzlicher Prometheus-Quellen und Importieren dieser Metriken

Der CloudWatch-Agent mit Prometheus-Überwachung benötigt zwei Konfigurationen, um die Prometheus-Metriken abzurufen. Er folgt der standardmäßigen Prometheus-Konfiguration, wie in <scrape_config> in der Prometheus-Dokumentation erläutert. Die andere bezieht sich auf die CloudWatch-Agent-Konfiguration.

Für Amazon-ECS-Cluster werden die Konfigurationen durch die Secrets in der Amazon-ECS-Aufgabendefinition in den Parameter Store von AWS Systems Manager integriert:

  • Das Secret PROMETHEUS_CONFIG_CONTENT ist für die Scrape-Konfiguration von Prometheus.

  • Das Secret CW_CONFIG_CONTENT bezieht sich auf die CloudWatch-Agent-Konfiguration.

Um das Erfassen weiterer Prometheus-Metrikquellen durchzuführen und diese Metriken in CloudWatch zu importieren, ändern Sie sowohl die Prometheus-Scrape-Konfiguration als auch die CloudWatch-Agentkonfiguration. Anschließend stellen Sie den Agenten mit der aktualisierten Konfiguration wieder bereit.

Anforderungen an VPC-Sicherheitsgruppen

Die Eingangsregeln der Sicherheitsgruppen für die Prometheus-Workloads müssen die Prometheus-Ports für den CloudWatch-Agent öffnen, um die Prometheus-Metriken nach der privaten IP zu scrapen.

Die Ausstiegsregeln der Sicherheitsgruppe für den CloudWatch-Agent müssen es dem CloudWatch-Agenten ermöglichen, über private IP eine Verbindung zum Prometheus-Workload-Port herzustellen.

Prometheus-Scrape-Konfiguration

Der CloudWatch-Agent unterstützt die standardmäßigen Scrape-Konfigurationen von Prometheus, wie in <scrape_config> in der Prometheus-Dokumentation dokumentiert. Sie können diesen Abschnitt bearbeiten, um die Konfigurationen zu aktualisieren, die sich bereits in dieser Datei befinden, und zusätzliche Prometheus-Scraping-Ziele hinzufügen. Standardmäßig enthält die Beispielkonfigurationsdatei die folgenden globalen Konfigurationszeilen:

global: scrape_interval: 1m scrape_timeout: 10s
  • scrape_interval – Definiert, wie oft das Scraping von zielen durchgeführt werden soll.

  • scrape_timeout – Definiert, wie lange gewartet werden soll, bis für eine Scrape-Anforderung eine Zeitüberschreitung eintritt.

Sie können auch verschiedene Werte für diese Einstellungen auf Auftragsebene definieren, um die globalen Konfigurationen zu überschreiben.

Prometheus-Scraping-Aufträge

Für die CloudWatch-Agent-YAML-Dateien sind bereits einige Standard-Scraping-Aufträge konfiguriert. In den YAML-Dateien für Amazon ECS wie cwagent-ecs-prometheus-metric-for-bridge-host.yaml werden beispielsweise die Standard-Scraping-Aufträge im Abschnitt ecs_service_discovery konfiguriert.

"ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { }, "task_definition_list": [ { "sd_job_name": "ecs-appmesh-colors", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition\/.*-ColorTeller-(white):[0-9]+", "sd_metrics_path": "/stats/prometheus" }, { "sd_job_name": "ecs-appmesh-gateway", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition/.*-ColorGateway:[0-9]+", "sd_metrics_path": "/stats/prometheus" } ] }

Bei jedem dieser Standardziele wird Scraping eingesetzt, und die Metriken werden in Protokollereignissen im eingebetteten Metrikformat an CloudWatch gesendet. Weitere Informationen finden Sie unter Einbetten von Metriken in Protokollen.

Protokollereignisse von Amazon-ECS-Clustern werden in der Protokollgruppe /aws/ecs/containerinsights/cluster_name/prometheus gespeichert.

Jeder Scraping-Auftrag ist in einem anderen Protokoll-Stream in dieser Protokollgruppe enthalten.

Um ein neues Scraping-Ziel hinzuzufügen, fügen Sie im Abschnitt task_definition_list unter dem Abschnitt ecs_service_discovery der YAML-Datei einen neuen Eintrag hinzu und starten den Agenten neu. Ein Beispiel für diesen Prozess finden Sie unter Tutorial zum Hinzufügen eines neuen Prometheus-Scrape-Ziels: Prometheus-API-Server-Metriken.

CloudWatch-Agentenkonfiguration für Prometheus

Die Konfigurationsdatei des CloudWatch-Agenten hat einen prometheus-Abschnitt unter metrics_collected für die Prometheus-Scraping-Konfiguration. Es sind folgende Konfigurationsoptionen enthalten:

  • Clustername – Gibt den Clusternamen an, der als Bezeichnung im Protokollereignis hinzugefügt werden soll. Dies ist ein optionales Feld. Wenn Sie es weglassen, kann der Agent den Amazon-ECS-Clusternamen erkennen.

  • log_group_name – Gibt den Namen der Protokollgruppe für die Prometheus-Scrape-Metriken an. Dies ist ein optionales Feld. Wenn Sie es weglassen, verwendet CloudWatch /aws/ecs/containerinsights/cluster_name/prometheus für Protokolle von Amazon-ECS-Clustern.

  • prometheus_config_path – gibt den Pfad der Prometheus-Scrape-Konfigurationsdatei an. Wenn der Wert dieses Felds mit env: beginnt, wird der Inhalt der Prometheus-Scrape-Konfigurationsdatei aus der Umgebungsvariablen des Containers abgerufen. Ändern Sie dieses Feld nicht.

  • ecs_service_discovery – ist der Abschnitt zum Angeben der Konfigurationen der Ziel-Auto-Discovery-Funktionen von Amazon ECS Prometheus. Zur Ermittlung der Prometheus-Ziele werden zwei Modi unterstützt: Ermittlung basierend auf der Docker-Bezeichnung des Containers oder Ermittlung basierend auf dem regulären ARN-Ausdruck der Amazon-ECS-Aufgabendefinition. Sie können die beiden Modi zusammen verwenden und der CloudWatch-Agent dedupliziert die ermittelten Ziele basierend auf: {private_ip}:{port}/{metrics_path}.

    Der Abschnitt ecs_service_discovery kann die folgenden Felder enthalten:

    • sd_frequency ist die Häufigkeit, mit der die Prometheus-Exporteure entdeckt werden. Geben Sie eine Zahl und ein Einheitensuffix an. Zum Beispiel 1m für einmal pro Minute oder 30s für einmal pro 30 Sekunden. Gültige Einheitensuffixe sind ns, us, ms, s, m und h.

      Dies ist ein optionales Feld. Der Standardwert ist 60 Sekunden (1 Minute).

    • sd_target_cluster ist der Name des Amazon-ECS-Ziel-Clusters für die automatische Erkennung. Dies ist ein optionales Feld. Der Standardwert ist der Name des Amazon-ECS-Clusters, auf dem der CloudWatch-Agent installiert ist.

    • sd_cluster_region ist die Region des Amazon-ECS-Ziel-Clusters. Dies ist ein optionales Feld. Der Standardwert ist die Region des Amazon-ECS-Clusters, auf der der CloudWatch-Agent installiert ist.

    • sd_result_file ist der Pfad der YAML-Datei für die Prometheus Zielergebnisse. Die Prometheus-Scrape-Konfiguration bezieht sich auf diese Datei.

    • docker_label ist ein optionaler Abschnitt, mit dem Sie die Konfiguration für die Docker-Beschriftungs-basierte Service-Discovery angeben können. Wenn Sie diesen Abschnitt auslassen, wird die Docker-Bezeichnungs-basierte Erkennung nicht verwendet. Dieser Abschnitt kann die folgenden Felder enthalten:

      • sd_port_label ist der Docker-Bezeichnungsname des Containers, der den Container-Port für Prometheus Metriken angibt. Der Standardwert ist ECS_PROMETHEUS_EXPORTER_PORT. Wenn der Container nicht über diese Docker-Bezeichnung verfügt, überspringt der CloudWatch-Agent sie.

      • sd_metrics_path_label ist der Docker-Bezeichnungsname des Containers, der den Pfad für Prometheus Metriken angibt. Der Standardwert ist ECS_PROMETHEUS_METRICS_PATH. Wenn der Container nicht über diese Docker-Bezeichnung verfügt, nimmt der Agent den Standardpfad /metrics an.

      • sd_job_name_label ist der Docker-Bezeichnungsname des Containers, der den Container-Scraping-Auftrag-Namen für Prometheus angibt. Der Standardwert ist job. Wenn der Container nicht über diese Docker-Bezeichnung verfügt, verwendet der CloudWatch-Agent den Auftragsnamen in der Prometheus-Scrape-Konfiguration.

    • task_definition_list ist ein optionaler Abschnitt, den Sie verwenden können, um die Konfiguration der aufgabendefinitionsbasierten Serviceerkennung anzugeben. Wenn Sie diesen Abschnitt auslassen, wird die aufgabendefinitionsbasierte Erkennung nicht verwendet. Dieser Abschnitt kann die folgenden Felder enthalten:

      • sd_task_definition_arn_pattern ist das Muster, das verwendet wird, um die zu erkennenden Amazon-ECS-Aufgabendefinitionen anzugeben. Dies ist ein regulärer Ausdruck.

      • sd_metrics_ports listet den containerPort für die Prometheus-Metriken auf. Trennen Sie die ContainerPorts durch Semikolons.

      • sd_container_name_pattern gibt die Namen des Amazon-ECS-Aufgabencontainers an. Dies ist ein regulärer Ausdruck.

      • sd_metrics_path gibt den Prometheus-Metrikpfad an. Wenn Sie dies weglassen, übernimmt der Agent den Standardpfad /metrics

      • sd_job_name gibt den Namen des Prometheus -Scrape-Auftrags an. Wenn Sie dieses Feld weglassen, verwendet der CloudWatch-Agent den Auftragsnamen in der Prometheus-Konfiguration.

    • service_name_list_for_tasks ist ein optionaler Abschnitt, den Sie verwenden können, um die Konfiguration der auf Servicenamen basierenden Erkennung anzugeben. Wenn Sie diesen Abschnitt auslassen, wird die auf Servicenamen basierende Erkennung nicht verwendet. Dieser Abschnitt kann die folgenden Felder enthalten:

      • sd_service_name_pattern ist das Muster, das verwendet werden soll, um den Amazon-ECS-Service anzugeben, in dem Aufgaben erkannt werden sollen. Dies ist ein regulärer Ausdruck.

      • sd_metrics_ports listet den containerPort für die Prometheus-Metriken auf. Trennen Sie mehrere containerPorts durch Semikolons.

      • sd_container_name_pattern gibt die Namen des Amazon-ECS-Aufgabencontainers an. Dies ist ein regulärer Ausdruck.

      • sd_metrics_path gibt den Prometheus-Metrikpfad an. Wenn Sie dies weglassen, übernimmt der Agent den Standardpfad /metrics

      • sd_job_name gibt den Namen des Prometheus -Scrape-Auftrags an. Wenn Sie dieses Feld weglassen, verwendet der CloudWatch-Agent den Auftragsnamen in der Prometheus-Konfiguration.

  • metric_declaration – sind Abschnitte, die das Array von Protokollen mit eingebettetem Metrikformat angeben, das generiert werden soll. Es gibt metric_declaration-Abschnitte für jede Prometheus-Quelle, aus der der CloudWatch-Agent standardmäßig importiert. Diese Abschnitte enthalten jeweils die folgenden Felder:

    • label_matcher ist ein regulärer Ausdruck, der den Wert der in source_labels aufgelisteten Beschriftungen überprüft. Die übereinstimmenden Metriken werden zur Aufnahme in das eingebettete Metrikformat aktiviert, das an CloudWatch gesendet wird.

      Wenn in source_labels mehrere Bezeichnungen angegeben sind, empfehlen wir, keine ^- oder $-Zeichen im regulären Ausdruck für label_matcher zu verwenden.

    • source_labels gibt den Wert der Beschriftungen an, die von der label_matcher-Zeile überprüft werden.

    • label_separator gibt das Trennzeichen an, das in der Zeile label_matcherverwendet werden soll, wenn mehrere source_labels angegeben werden. Der Standardwert ist ;. Sie können diesen Standardwert in der Zeile label_matcher im folgenden Beispiel sehen.

    • metric_selectors ist ein regulärer Ausdruck, der die Metriken angibt, die erfasst und an CloudWatch gesendet werden sollen.

    • dimensions ist die Liste der Beschriftungen, die als CloudWatch-Dimensionen für jede ausgewählte Metrik verwendet werden sollen.

Sehen Sie sich das folgende metric_declaration-Beispiel an.

"metric_declaration": [ { "source_labels":[ "Service", "Namespace"], "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system$", "dimensions":[ ["Service", "Namespace"] ], "metric_selectors":[ "^coredns_dns_request_type_count_total$" ] } ]

In diesem Beispiel wird ein eingebetteter Metrikformatabschnitt konfiguriert, der als Protokollereignis gesendet wird, wenn die folgenden Bedingungen erfüllt sind:

  • Der Wert von Service enthält entweder node-exporter oder kube-dns.

  • Der Wert von Namespace ist kube-system.

  • Die Prometheus-Metrik coredns_dns_request_type_count_total enthält sowohl Service-als auch Namespace-Beschriftungen.

Das Protokollereignis, das gesendet wird, enthält den folgenden hervorgehobenen Abschnitt:

{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"coredns_dns_request_type_count_total" } ], "Dimensions":[ [ "Namespace", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "Namespace":"kube-system", "Service":"kube-dns", "coredns_dns_request_type_count_total":2562, "eks_amazonaws_com_component":"kube-dns", "instance":"192.168.61.254:9153", "job":"kubernetes-service-endpoints", ... }