追加の Prometheus ソースのスクレイピングと、それらのメトリクスのインポート - Amazon CloudWatch

追加の Prometheus ソースのスクレイピングと、それらのメトリクスのインポート

Prometheus モニターリングを使用した CloudWatch エージェントは、Prometheus メトリクスをスクレイプするために 2 つの設定が必要です。1 つは標準の Prometheus 設定用で、Prometheus ドキュメントの「<scrape_config>」に記載されています。もう 1 つは CloudWatch エージェント設定用です。

Amazon EKS クラスターの場合、設定は prometheus-eks.yaml (EC2 起動タイプの場合) または prometheus-eks-fargate.yaml (Fargate 起動タイプの場合) で 2 つの設定マップとして定義されます。

  • name: prometheus-config セクションには、Prometheus のスクレイピング設定が含まれています。

  • name: prometheus-cwagentconfig セクションには、CloudWatch エージェントの設定が含まれています。このセクションを使用して、CloudWatch で Prometheus メトリクスを収集する方法を設定できます。例えば、どのメトリクスを CloudWatch にインポートするかを指定し、ディメンションを定義します。

Amazon EC2 インスタンスで実行されている Kubernetes クラスターの場合、設定は prometheus-k8s.yaml YAML ファイルで 2 つの設定マップとして定義されます。

  • name: prometheus-config セクションには、Prometheus のスクレイピング設定が含まれています。

  • name: prometheus-cwagentconfig セクションには、CloudWatch エージェントの設定が含まれています。

追加の Prometheus メトリクスソースをスクレイプし、それらのメトリクスを CloudWatch にインポートするには、Prometheus スクレイプ設定と CloudWatch エージェント設定の両方を変更し、更新された設定でエージェントを再デプロイします。

VPC セキュリティグループの要件

Prometheus ワークロードのセキュリティグループの受信ルールでは、Prometheus のメトリクスをプライベート IP でスクレイピングするために、CloudWatch エージェントへの Prometheus ポートを開く必要があります。

CloudWatch エージェントのセキュリティグループの出力ルールでは、CloudWatch エージェントがプライベート IP によって Prometheus ワークロードのポートに接続できるようにする必要があります。

Prometheus スクレイプ設定

この CloudWatch エージェントは、Prometheus のドキュメントの「<scrape_config>」に記載されているように、標準の Prometheus スクレイプ設定をサポートしています。このセクションを編集して、このファイルに既に含まれている設定を更新したり、Prometheus スクレイピングターゲットを追加したりできます。デフォルトでは、サンプル設定ファイルに次のグローバル設定行が含まれています。

global: scrape_interval: 1m scrape_timeout: 10s
  • scrape_interval – ターゲットをスクレイプする頻度を定義します。

  • scrape_timeout – スクレイプリクエストがタイムアウトするまでの待機時間を定義します。

また、ジョブレベルでこれらの設定に対して異なる値を定義し、グローバル設定をオーバーライドすることもできます。

Prometheus スクレイピングジョブ

CloudWatch エージェント YAML ファイルには、既にいくつかのデフォルトのスクレイピングジョブが設定されています。例えば、prometheus-eks.yaml では、デフォルトのスクレイピングジョブは、job_name セクションの scrape_configs 行で設定されています。このファイルで、次のデフォルト kubernetes-pod-jmx セクションは、JMX Exporter メトリクスをスクレイピングします。

- 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

これらのデフォルトターゲットはそれぞれスクレイピングされ、メトリクスは埋め込みメトリクス形式を使用してログイベントで CloudWatch に送信されます。詳細については、「ログ内へのメトリクスの埋め込み」を参照してください。

Amazon EKS および Kubernetes クラスターからのログイベントは、CloudWatch Logs の [/aws/containerinsights/cluster_name/prometheus] ロググループに保存されます。Amazon ECS クラスターからのログイベントは、[/aws/ecs/containerinsights/cluster_name/prometheus] ロググループに保存されます。

各スクレイピングジョブは、このロググループ内の異なるログストリームに含まれています。例えば、Prometheus スクレイピングジョブ kubernetes-pod-appmesh-envoy が App Mesh に対して定義されています。Amazon EKS および Kubernetes クラスターのすべての App Mesh Prometheus メトリクスは、[/aws/containerinsights/cluster_name>prometheus/kubernetes-pod-appmesh-envoy/] という名前のログストリームに送信されます。

新しいスクレイピングターゲットを追加するには、YAML ファイルの job_name セクションに新しい scrape_configs セクションを追加し、エージェントを再起動します。このプロセスの例については、「新しい Prometheus スクレイピングターゲットを追加するためのチュートリアル: Prometheus API サーバーメトリクス」を参照してください。

Prometheus の CloudWatch エージェント設定

CloudWatch エージェント設定ファイルには、Prometheus スクレイピング設定の prometheusmetrics_collected セクションがあります。これには、次の設定オプションが含まれます。

  • cluster_name – ログイベントのラベルとして追加されるクラスター名を指定します。このフィールドはオプションです。これを省略すると、エージェントは Amazon EKS または Kubernetes クラスター名を検出できます。

  • log_group_name – スクレイプされた Prometheus メトリクスのロググループ名を指定します。このフィールドはオプションです。これを省略すると、CloudWatch では Amazon EKS および Kubernetes クラスターからのログに /aws/containerinsights/cluster_name/prometheus が使用されます。

  • prometheus_config_path – Prometheus スクレイプ設定ファイルパスを指定します。このフィールドの値が env: で始まる場合、Prometheus スクレイプ設定ファイルの内容は、コンテナの環境変数から取得されます。このフィールドは変更しないでください。

  • ecs_service_discovery – Amazon ECS Prometheus サービス検出の設定を指定するセクションです。詳細については、「Amazon ECS クラスターでの自動検出の詳細ガイド」を参照してください。

    ecs_service_discovery セクションには、次のフィールドを含めることができます。

    • sd_frequency は、Prometheus エクスポーターを検出する頻度です。数値と単位サフィックスを指定します。例えば、1m の場合は 1 分に 1 回、30s の場合は 30 秒に 1 回です。有効な単位サフィックスは、nsusmssmh です。

      このフィールドはオプションです。デフォルト値は 60 秒 (1 分) です。

    • sd_target_cluster は、自動検出のターゲット Amazon ECS クラスター名です。このフィールドはオプションです。デフォルトは、CloudWatch エージェントがインストールされている Amazon ECS クラスターの名前です。

    • sd_cluster_region は、ターゲット Amazon ECS クラスターのリージョンです。このフィールドはオプションです。デフォルトは、CloudWatch エージェントがインストールされている Amazon ECS クラスターのリージョンです。

    • sd_result_file は、Prometheus ターゲット結果の YAML ファイルのパスです。Prometheus スクレイプ設定は、このファイルを参照します。

    • docker_label は、docker のラベルベースのサービス検出の設定を指定するために使用できるオプションのセクションです。このセクションを省略すると、docker のラベルベースの検出は使用されません。このセクションには、次のフィールドを含めることができます。

      • sd_port_label は、Prometheus メトリクスのコンテナポートを指定するコンテナの docker ラベル名です。デフォルト値は ECS_PROMETHEUS_EXPORTER_PORT です。コンテナにこの docker ラベルがない場合、CloudWatch エージェントはそれをスキップします。

      • sd_metrics_path_label は、Prometheus メトリクスパスを指定するコンテナの docker ラベル名です。デフォルト値は ECS_PROMETHEUS_METRICS_PATH です。コンテナにこの docker ラベルがない場合は、エージェントはデフォルトパス /metrics を想定します。

      • sd_job_name_label は、Prometheus スクレイプジョブ名を指定するコンテナの docker ラベル名です。デフォルト値は job です。コンテナにこの docker ラベルがない場合、CloudWatch エージェントは Prometheus スクレイプ設定でジョブ名を使用します。

    • task_definition_list は、タスク定義ベースのサービス検出の設定を指定するために使用できるオプションのセクションです。このセクションを省略すると、タスク定義ベースの検出は使用されません。このセクションには、次のフィールドを含めることができます。

      • sd_task_definition_arn_pattern は、検出する Amazon ECS タスク定義を指定するために使用するパターンです。これは正規表現です。

      • sd_metrics_ports に、Prometheus メトリクスの containerPort を示します。containerPort はセミコロンで区切ります。

      • sd_container_name_pattern は、Amazon ECS タスクコンテナ名を指定します。これは正規表現です。

      • sd_metrics_path は、Prometheus のメトリクスパスを指定します。これを省略すると、エージェントはデフォルトのパス /metrics を引き受けます。

      • sd_job_name Prometheus スクレイプジョブ名を指定します。このフィールドを省略すると、CloudWatch エージェントは Prometheus スクレイプ設定のジョブ名を使用します。

  • metric_declaration – 生成されるメトリクス形式が埋め込まれたログの配列を指定するセクションです。CloudWatch エージェントがインポートする各 Prometheus ソースには、デフォルトで metric_declaration セクションがあります。これらの各セクションには、次のフィールドが含まれています。

    • label_matcher は、 source_labels に表示されているラベルの値をチェックする正規表現です。一致するメトリクスは、CloudWatch に送信される埋め込みメトリクス形式に含めることができます。

      source_labels で複数のラベルを指定する場合は、^ の正規表現に $label_matcher 文字を使用しないことをお勧めします。

    • source_labels は、label_matcher 行によってチェックされるラベルの値を指定します。

    • label_separator は、複数の label_matcher が指定されている場合に、source_labels 行で使用するセパレータを指定します。デフォルト: ;。このデフォルトは、次の例の label_matcher 行で使用されています。

    • metric_selectors は、収集され、CloudWatch に送信されるメトリクスを指定する正規表現です。

    • dimensions は、選択した各メトリクスの CloudWatch ディメンションとして使用されるラベルのリストです。

次の metric_declaration の例を参照してください。

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

この例では、次の条件が満たされた場合にログイベントとして送信される埋め込みメトリクス形式セクションを設定します。

  • Service の値には node-exporter または kube-dns が含まれます。

  • Namespace の値は kube-system です。

  • Prometheus メトリクス coredns_dns_request_type_count_total には、Service ラベルおよび Namespace ラベルの両方が含まれます。

送信されるログイベントには、次の強調表示されたセクションが含まれます。

{ "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", ... }

新しい Prometheus スクレイピングターゲットを追加するためのチュートリアル: Prometheus API サーバーメトリクス

Kubernetes API サーバーは、デフォルトでエンドポイントで Prometheus メトリクスを公開します。Kubernetes API サーバーのスクレイピング設定に関する公式のサンプルは、GitHub で入手できます。

次のチュートリアルでは、次のステップを実行して Kubernetes API サーバーメトリクスを CloudWatch にインポートする方法を示します。

  • CloudWatch エージェントの YAML ファイルに、Kubernetes API サーバーの Prometheus スクレイピング設定を追加します。

  • CloudWatch エージェントの YAML ファイルに埋め込まれたメトリクス形式のメトリクス定義を設定します。

  • (オプション) Kubernetes API サーバーメトリクスの CloudWatch ダッシュボードを作成します。

注記

Kubernetes API サーバーは、ゲージ、カウンター、ヒストグラム、およびサマリーメトリクスを公開します。このリリースの Prometheus メトリクスサポートでは、CloudWatch はゲージ、カウンター、およびサマリータイプのメトリクスのみをインポートします。

CloudWatch で Kubernetes API サーバー Prometheus メトリクスの収集を開始するには
  1. 次のコマンドのいずれかを入力して、最新バージョンの prometheus-eks.yamlprometheus-eks-fargate.yaml、または prometheus-k8s.yaml ファイルをダウンロードします。

    EC2 起動タイプの Amazon EKS クラスターの場合は、次のコマンドを入力します。

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml

    Fargate 起動タイプの Amazon EKS クラスターの場合は、次のコマンドを入力します。

    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.yaml

    Amazon EC2 インスタンスで実行されている Kubernetes クラスターの場合は、次のコマンドを入力します。

    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
  2. テキストエディタでファイルを開き、prometheus-config セクションを見つけ、そのセクション内に次のセクションを追加します。次に、変更を保存します。

    # 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
  3. テキストエディタで YAML ファイルを開いている間に、cwagentconfig.json セクションを見つけます。次のサブセクションを追加し、変更を保存します。このセクションでは、API サーバーメトリクスを CloudWatch エージェント許可リストに追加します。次の 3 種類の API サーバーメトリクスを許可リストに追加します。

    • etcd オブジェクト数

    • API サーバー登録コントローラーメトリクス

    • API サーバー要求メトリクス

    {"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$" ] },
  4. Prometheus をサポートする CloudWatch エージェントが既にクラスタにデプロイされている場合は、次のコマンドを入力してエージェントを削除する必要があります。

    kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
  5. 次のいずれかのコマンドを入力して、更新した設定で CloudWatch エージェントをデプロイします。EC2 起動タイプの Amazon EKS クラスターの場合は、次を入力します:

    kubectl apply -f prometheus-eks.yaml

    Fargate 起動タイプの Amazon EKS クラスターの場合は、次のコマンドを入力します。MyCluster および region を、デプロイに合った値に置き換えます。

    cat prometheus-eks-fargate.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -

    Kubernetes クラスターの場合は、次のコマンドを入力します。MyCluster および region を、デプロイに合った値に置き換えます。

    cat prometheus-k8s.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -

これを行うと、[/aws/containerinsights/cluster_name/prometheus] ロググループに [kubernetes-apiservers] という名前の新しいログストリームが表示されます。このログストリームには、次のような埋め込みメトリクス形式の定義を持つログイベントを含める必要があります。

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

CloudWatch コンソールで [ContainerInsights/Prometheus] 名前空間のメトリクスを表示できます。オプションで、Prometheus Kubernetes API サーバーメトリクスの CloudWatch ダッシュボードを作成することもできます。

(オプション) Kubernetes API サーバーメトリクスのダッシュボードの作成

ダッシュボードに Kubernetes API サーバーメトリクスを表示するには、前のセクションのステップをまず完了して、CloudWatch でこれらのメトリクスの収集を開始する必要があります。

Kubernetes API サーバーメトリクスのダッシュボードを作成するには
  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. 正しい AWS リージョンが選択されていることを確認します。

  3. ナビゲーションペインで、ダッシュボードを選択します。

  4. [ダッシュボードの作成] を選択します。新しいダッシュボードの名前を入力し、[ダッシュボードの作成] を選択します。

  5. [このダッシュボードに追加] で、[キャンセル] を選択します。

  6. [アクション]、[ソースの表示/編集] を選択します。

  7. JSON ファイル Kubernetes API ダッシュボードソースをダウンロードします。

  8. ダウンロードした JSON ファイルをテキストエディタで開き、次の変更を加えます。

    • すべての {{YOUR_CLUSTER_NAME}} 文字列をクラスターの正確な名前に置き換えます。テキストの前後に空白を追加しないようにしてください。

    • すべての {{YOUR_AWS_REGION}} 文字列を、メトリクスを収集するリージョンの名前に置き換えます。例: us-west-2 テキストの前後に空白を追加しないようにしてください。

  9. JSON BLOB 全体をコピーし、CloudWatch コンソールのテキストボックスに貼り付けて、ボックスに既に入力されている内容を置き換えます。

  10. [更新]、[ダッシュボードの保存] の順に選択します。