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>
Für Amazon-EKS-Cluster sind die Konfigurationen in prometheus-eks.yaml (für den Starttyp EC2) oder prometheus-eks-fargate.yaml (für den Starttyp Fargate) als zwei Konfigurationszuordnungen definiert:
-
Der
name: prometheus-config-Abschnitt enthält die Einstellungen für Prometheus-Scraping. -
Der
name: prometheus-cwagentconfig-Abschnitt enthält die Konfiguration für den CloudWatch-Agenten. In diesem Abschnitt können Sie konfigurieren, wie die Prometheus-Metriken von CloudWatch erfasst werden. Sie können beispielsweise festlegen, welche Metriken in CloudWatch importiert werden sollen, und deren Dimensionen definieren.
Für Kubernetes-Cluster, die auf Amazon-EC2-Instances ausgeführt werden, sind die Konfigurationen in der prometheus-k8s.yaml YAML-Datei als zwei Konfigurationszuordnungen definiert:
-
Der
name: prometheus-config-Abschnitt enthält die Einstellungen für Prometheus-Scraping. -
Der
name: prometheus-cwagentconfig-Abschnitt enthält die Konfiguration für den CloudWatch-Agenten.
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>
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 prometheus-eks.yaml werden beispielsweise die Standard-Scraping-Aufträge in den job_name-Zeilen im Abschnitt scrape_configs konfiguriert. In dieser Datei kratzt der folgende Standard-kubernetes-pod-jmx-Abschnitt JMX-Exporter-Metriken.
- job_name: 'kubernetes-pod-jmx' sample_limit: 10000 metrics_path: /metrics kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__address__] action: keep regex: '.*:9404$' - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: pod_name - action: replace source_labels: - __meta_kubernetes_pod_container_name target_label: container_name - action: replace source_labels: - __meta_kubernetes_pod_controller_name target_label: pod_controller_name - action: replace source_labels: - __meta_kubernetes_pod_controller_kind target_label: pod_controller_kind - action: replace source_labels: - __meta_kubernetes_pod_phase target_label: pod_phase
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-EKS- und Kubernetes-Clustern werden in der Protokollgruppe /aws/containerinsights/cluster_name/prometheus in CloudWatch Logs gespeichert. 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. Beispielsweise ist der Prometheus-Scraping-Auftrag kubernetes-pod-appmesh-envoy für App Mesh definiert. Alle App-Mesh-Prometheus-Metriken von Amazon-EKS- und Kubernetes-Clustern werden an den Protokollstream namens /aws/containerinsights/cluster_name>prometheus/kubernetes-pod-appmesh-envoy/ gesendet.
Um ein neues Scraping-Ziel hinzuzufügen, fügen Sie dem Abschnitt scrape_configs der YAML-Datei einen neuen job_name-Abschnitt hinzu und starten Sie 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-EKS- oder Kubernetes-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/containerinsights/
cluster_name/prometheus für Protokolle von Amazon-EKS- und Kubernetes-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 Konfiguration für die Amazon-ECS-Prometheus-Serviceerkennung. Weitere Informationen finden Sie unter Ausführliche Anleitung zu Autodiscovery auf Amazon-ECS-Clustern.
Der Abschnitt
ecs_service_discoverykann die folgenden Felder enthalten:-
sd_frequencyist die Häufigkeit, mit der die Prometheus-Exporteure entdeckt werden. Geben Sie eine Zahl und ein Einheitensuffix an. Zum Beispiel1mfür einmal pro Minute oder30sfür einmal pro 30 Sekunden. Gültige Einheitensuffixe sindns,us,ms,s,mundh.Dies ist ein optionales Feld. Der Standardwert ist 60 Sekunden (1 Minute).
-
sd_target_clusterist 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_regionist 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_fileist der Pfad der YAML-Datei für die Prometheus Zielergebnisse. Die Prometheus-Scrape-Konfiguration bezieht sich auf diese Datei. -
docker_labelist 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_labelist der Docker-Bezeichnungsname des Containers, der den Container-Port für Prometheus Metriken angibt. Der Standardwert istECS_PROMETHEUS_EXPORTER_PORT. Wenn der Container nicht über diese Docker-Bezeichnung verfügt, überspringt der CloudWatch-Agent sie. -
sd_metrics_path_labelist der Docker-Bezeichnungsname des Containers, der den Pfad für Prometheus Metriken angibt. Der Standardwert istECS_PROMETHEUS_METRICS_PATH. Wenn der Container nicht über diese Docker-Bezeichnung verfügt, nimmt der Agent den Standardpfad/metricsan. -
sd_job_name_labelist der Docker-Bezeichnungsname des Containers, der den Container-Scraping-Auftrag-Namen für Prometheus angibt. Der Standardwert istjob. Wenn der Container nicht über diese Docker-Bezeichnung verfügt, verwendet der CloudWatch-Agent den Auftragsnamen in der Prometheus-Scrape-Konfiguration.
-
-
task_definition_listist 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_patternist das Muster, das verwendet wird, um die zu erkennenden Amazon-ECS-Aufgabendefinitionen anzugeben. Dies ist ein regulärer Ausdruck. -
sd_metrics_portslistet den containerPort für die Prometheus-Metriken auf. Trennen Sie die ContainerPorts durch Semikolons. -
sd_container_name_patterngibt die Namen des Amazon-ECS-Aufgabencontainers an. Dies ist ein regulärer Ausdruck. -
sd_metrics_pathgibt den Prometheus-Metrikpfad an. Wenn Sie dies weglassen, übernimmt der Agent den Standardpfad/metrics -
sd_job_namegibt 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_matcherist ein regulärer Ausdruck, der den Wert der insource_labelsaufgelisteten Beschriftungen überprüft. Die übereinstimmenden Metriken werden zur Aufnahme in das eingebettete Metrikformat aktiviert, das an CloudWatch gesendet wird.Wenn in
source_labelsmehrere Bezeichnungen angegeben sind, empfehlen wir, keine^- oder$-Zeichen im regulären Ausdruck fürlabel_matcherzu verwenden. -
source_labelsgibt den Wert der Beschriftungen an, die von derlabel_matcher-Zeile überprüft werden. -
label_separatorgibt das Trennzeichen an, das in der Zeilelabel_matcherverwendet werden soll, wenn mehreresource_labelsangegeben werden. Der Standardwert ist;. Sie können diesen Standardwert in der Zeilelabel_matcherim folgenden Beispiel sehen. -
metric_selectorsist ein regulärer Ausdruck, der die Metriken angibt, die erfasst und an CloudWatch gesendet werden sollen. -
dimensionsist 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
Serviceenthält entwedernode-exporteroderkube-dns. -
Der Wert von
Namespaceistkube-system. -
Die Prometheus-Metrik
coredns_dns_request_type_count_totalenthält sowohlService-als auchNamespace-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", ... }
Tutorial zum Hinzufügen eines neuen Prometheus-Scrape-Ziels: Prometheus-API-Server-Metriken
Der Kubernetes API Server stellt Prometheus-Metriken standardmäßig auf Endpunkten zur Verfügung. Das offizielle Beispiel für die Kubernetes API Server-Scraping-Konfiguration ist auf Github
Das folgende Tutorial zeigt, wie Sie die folgenden Schritte ausführen, um mit dem Importieren von Kubernetes API Server-Metriken in CloudWatch zu beginnen:
-
Hinzufügen der Prometheus-Scraping-Konfiguration für Kubernetes API Server zur CloudWatch-Agent-YAML-Datei.
-
Konfigurieren der Metrikdefinitionen des eingebetteten Metrikformats in der CloudWatch-Agent-YAML-Datei.
-
(Optional) Erstellen eines CloudWatch-Dashboards für die Kubernetes-API-Server-Metriken.
Anmerkung
Der Kubernetes API Server stellt Mess-, Zähler-, Histogramm- und Übersichtsmetriken zur Verfügung. In dieser Version unterstützter Prometheus-Metriken importiert CloudWatch nur die Metriken mit Mess- und Zählertypen.
So starten Sie das Sammeln von Prometheus Kubernetes API Server-Metriken in CloudWatch
-
Laden Sie die aktuelle Version der
prometheus-eks.yaml-,prometheus-eks-fargate.yaml- oderprometheus-k8s.yaml-Datei herunter, indem Sie einen der folgenden Befehle eingeben.Geben Sie den folgenden Befehl für einen Amazon-EKS-Cluster mit dem EC2-Starttyp ein:
curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yamlGeben Sie den folgenden Befehl für einen Amazon-EKS-Cluster mit dem Fargate-Starttyp ein:
curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yamlGeben Sie für einen Kubernetes-Cluster, der auf einer Amazon-EC2-Instance ausgeführt wird, den folgenden Befehl ein:
curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml -
Öffnen Sie die Datei mit einem Texteditor, suchen Sie den Abschnitt
prometheus-configund fügen Sie den folgenden Abschnitt in diesem Abschnitt hinzu. Speichern Sie dann die Änderungen:# Scrape config for API servers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints namespaces: names: - default scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: kubernetes;https - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - action: replace source_labels: - __meta_kubernetes_service_name target_label: Service -
Während Sie die YAML-Datei noch im Texteditor geöffnet haben, suchen Sie den Abschnitt
cwagentconfig.json. Fügen Sie den folgenden Unterabschnitt hinzu und speichern Sie die Änderungen. In diesem Abschnitt werden die API-Servermetriken in die Zulassungsliste des CloudWatch-Agenten aufgenommen. Drei Typen von API-Server-Metriken werden der Genehmigungsliste hinzugefügt:-
etcd-Objektanzahl
-
API-Server-Registrierungscontroller-Metriken
-
API-Server-Anforderungsmetriken
{"source_labels": ["job", "resource"], "label_matcher": "^kubernetes-apiservers;(services|daemonsets.apps|deployments.apps|configmaps|endpoints|secrets|serviceaccounts|replicasets.apps)", "dimensions": [["ClusterName","Service","resource"]], "metric_selectors": [ "^etcd_object_counts$" ] }, {"source_labels": ["job", "name"], "label_matcher": "^kubernetes-apiservers;APIServiceRegistrationController$", "dimensions": [["ClusterName","Service","name"]], "metric_selectors": [ "^workqueue_depth$", "^workqueue_adds_total$", "^workqueue_retries_total$" ] }, {"source_labels": ["job","code"], "label_matcher": "^kubernetes-apiservers;2[0-9]{2}$", "dimensions": [["ClusterName","Service","code"]], "metric_selectors": [ "^apiserver_request_total$" ] }, {"source_labels": ["job"], "label_matcher": "^kubernetes-apiservers", "dimensions": [["ClusterName","Service"]], "metric_selectors": [ "^apiserver_request_total$" ] }, -
-
Wenn der CloudWatch-Agent mit Prometheus-Unterstützung bereits in dem Cluster bereitgestellt ist, müssen Sie ihn löschen, indem Sie den folgenden Befehl eingeben:
kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch -
Stellen Sie den CloudWatch-Agenten mit Ihrer aktualisierten Konfiguration bereit, indem Sie einen der folgenden Befehle eingeben. Geben Sie für einen Amazon-EKS-Cluster mit dem Starttyp EC2 Folgendes ein:
kubectl apply -f prometheus-eks.yamlGeben Sie den folgenden Befehl für einen Amazon-EKS-Cluster mit dem Fargate-Starttyp ein. Ersetzen Sie
MyClusterundRegiondurch Werte, die Ihrer Bereitstellung entsprechen.cat prometheus-eks-fargate.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -Geben Sie für einen Kubernetes-Cluster den folgenden Befehl ein. Ersetzen Sie
MyClusterundRegiondurch Werte, die Ihrer Bereitstellung entsprechen.cat prometheus-k8s.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -
Danach sollten Sie einen neuen Protokoll-Stream namens kubernetes-apiservers in der Protokollgruppe /aws/containerinsights/cluster_name/prometheus sehen. Dieser Protokoll-Stream sollte Protokollereignisse mit einer Definition des eingebetteten Metrikformats wie folgt einschließen:
{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"apiserver_request_total" } ], "Dimensions":[ [ "ClusterName", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "ClusterName":"my-cluster-name", "Namespace":"default", "Service":"kubernetes", "Timestamp":"1592267020339", "Version":"0", "apiserver_request_count":0, "apiserver_request_total":0, "code":"0", "component":"apiserver", "contentType":"application/json", "instance":"192.0.2.0:443", "job":"kubernetes-apiservers", "prom_metric_type":"counter", "resource":"pods", "scope":"namespace", "verb":"WATCH", "version":"v1" }
Sie können Ihre Metriken in der CloudWatch-Konsole im Namespace ContainerInsights/Prometheus anzeigen. Optional können Sie auch ein CloudWatch-Dashboard für Ihre Prometheus-Kubernetes-API-Server-Metriken erstellen.
(Optional) Erstellen eines Dashboards für die Kubernetes API-Server-Metriken.
Um Metriken vom Kubernetes-API-Server in Ihrem Dashboard anzuzeigen, müssen Sie zuerst die Schritte in den vorherigen Abschnitten ausgeführt haben, damit mit dem Sammeln dieser Metriken in CloudWatch begonnen wird.
So erstellen Sie ein Dashboard für Kubernetes-API-Server-Metriken
Öffnen Sie die CloudWatch-Konsole unter https://console.aws.amazon.com/cloudwatch/
. -
Stellen Sie sicher, dass Sie die richtige AWS-Region ausgewählt haben.
-
Wählen Sie im Navigationsbereich Dashboards aus.
-
Klicken Sie auf Create Dashboard (Dashboard erstellen). Geben Sie einen Namen für das neue Dashboard ein und wählen Sie Create dashboard (Dashboard erstellen).
-
Wählen Sie unter Add to this dashboard (Zu diesem Dashboard hinzufügen) die Option Cancel (Abbrechen).
-
Wählen Sie Actions (Aktionen), View/edit source (Quelle anzeigen/bearbeiten).
-
Laden Sie die folgende JSON-Datei herunter: Kubernetes API Dashboard-Quelle
. -
Öffnen Sie die heruntergeladene JSON-Datei mit einem Texteditor und nehmen Sie die folgenden Änderungen vor:
-
Ersetzen Sie alle
{{YOUR_CLUSTER_NAME}}-Zeichenfolgen durch den genauen Namen Ihres Clusters. Stellen Sie sicher, dass keine Leerzeichen vor oder nach dem Text hinzugefügt werden. -
Ersetzen Sie alle
{{YOUR_AWS_REGION}}-Zeichenfolgen durch den Namen der Region, in der die Metriken erfasst werden. Zum Beispielus-west-2. Stellen Sie sicher, dass keine Leerzeichen vor oder nach dem Text hinzugefügt werden.
-
-
Kopieren Sie das gesamte JSON-Blob und fügen Sie es in das Textfeld in der CloudWatch-Konsole ein. Ersetzen Sie dabei den Inhalt des Feldes.
-
Wählen Sie Update (Aktualisieren), Save dashboard (Dashboard speichern).