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

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

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

Amazon ECS クラスターでは、設定は Amazon ECS タスク定義のシークレットによって AWS Systems Manager の Parameter Store と統合されます。

  • このシークレット PROMETHEUS_CONFIG_CONTENT は、Prometheus スクレイプ設定用です。

  • このシークレット CW_CONFIG_CONTENT は、 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 ファイルには、既にいくつかのデフォルトのスクレイピングジョブが設定されています。例えば、cwagent-ecs-prometheus-metric-for-bridge-host.yaml などのAmazon ECS の YAML ファイルでは、デフォルトのスクレイピングジョブが ecs_service_discovery セクションで設定されています。

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

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

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

各スクレイピングジョブは、このロググループ内の異なるログストリームに含まれています。

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

Prometheus の CloudWatch エージェント設定

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

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

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

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

  • ecs_service_discovery – Amazon ECS Prometheus ターゲット自動検出関数の設定を指定するセクションです。Prometheus ターゲットを検出するには、コンテナの docker ラベルに基づく検出と、Amazon ECS タスク定義の ARN 正規表現に基づく検出の 2 つのモードがサポートされています。2 つのモードを一緒に使用すると、CloudWatch エージェントは {private_ip}:{port}/{metrics_path} に基づいて検出されたターゲットの重複排除を行います。

    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 スクレイプ設定のジョブ名を使用します。

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

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

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

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