Amazon EC2 インスタンスでの Prometheus メトリクスコレクションのセットアップと設定 - Amazon CloudWatch

Amazon EC2 インスタンスでの Prometheus メトリクスコレクションのセットアップと設定

次のセクションでは、EC2 インスタンスに Prometheus モニターリングを使用して CloudWatch エージェントをインストールする方法と、追加のターゲットをスクレイプするようにエージェントを設定する方法について説明します。また、Prometheus モニターリングでのテストに使用するサンプルワークロードを設定するためのオチュートリアルも提供します。

Linux と Windows の両方のインスタンスがサポートされています。

CloudWatch エージェントがサポートするオペレーティングシステムについては、「CloudWatch エージェントを使用してメトリクス、ログ、トレースを収集する」を参照してください。

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

VPC を使用している場合は、次の要件が適用されます。

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

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

ステップ 1: CloudWatch エージェントをインストールする

最初のステップは、EC2 インスタンスに CloudWatch エージェントをインストールすることです。手順については、「CloudWatch エージェントをインストールする」を参照してください。

ステップ 2: Prometheus ソースとインポートメトリクスをスクレイプする

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

Prometheus スクレイプ設定

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

PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: MY_JOB sample_limit: 10000 file_sd_configs: - files: ["C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_sd_1.yaml", "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_sd_2.yaml"]

global セクションでは、すべての設定コンテキストで有効なパラメータを指定します。また、これらは他の設定セクションのデフォルトとしても機能します。これには以下のパラメータが含まれています。

  • scrape_interval – ターゲットをスクレイプする頻度を定義します。

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

scrape_configs セクションでは、ターゲットとパラメータのセットを指定し、それらをスクレイプする方法を定義します。これには以下のパラメータが含まれています。

  • job_name – デフォルトでスクレイプされたメトリクスに割り当てられたジョブ名。

  • sample_limit – スクレイプごとに受け入れられるスクレイプされたサンプルの数の制限。

  • file_sd_configs – ファイルサービスの検出設定のリスト。これは、ゼロ個以上の静的設定のリストを含むファイルのセットを読み取ります。file_sd_configs セクションには、ターゲットグループの抽出元となるファイルのパターンを定義する files パラメータが含まれています。

CloudWatch エージェントは、次のサービス検出設定タイプをサポートします。

static_config ターゲットのリストと、それらに共通のラベルセットを指定できます。これは、スクレイプ設定で静的ターゲットを指定するための標準的な方法です。

以下に、ローカルホストから Prometheus メトリクスをスクレーピングするための静的設定の例を示します。エージェントが実行されているサーバーに対して Prometheus ポートが開いている場合は、メトリクスを他のサーバーからスクレイプすることもできます。

PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_sd_1.yaml - targets: - 127.0.0.1:9404 labels: key1: value1 key2: value2

この例には、以下のキー要素が含まれています。

  • targets – 静的設定によってスクレイプされたターゲット。

  • labels – ターゲットからスクレイプされたすべてのメトリクスに割り当てられたラベル。

ec2_sd_config Amazon EC2 インスタンスからスクレイプターゲットを取得できます。EC2 インスタンスのリストから Prometheus メトリクスをスクレイプするサンプル ec2_sd_config を次に示します。これらのインスタンスの Prometheus ポートは、CloudWatch エージェントが実行されているサーバーに対して開く必要があります。CloudWatch エージェントが実行される EC2 インスタンスの IAM ロールには、ec2:DescribeInstance アクセス許可を含める必要があります。例えば、管理ポリシー AmazonEC2ReadOnlyAccess を CloudWatch エージェントを実行するインスタンスにアタッチできます。

PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: MY_JOB sample_limit: 10000 ec2_sd_configs: - region: us-east-1 port: 9404 filters: - name: instance-id values: - i-98765432109876543 - i-12345678901234567

この例には、以下のキー要素が含まれています。

  • region — ターゲット EC2 インスタンスがある AWS リージョン。これを空白のままにすると、インスタンスメタデータのリージョンが使用されます。

  • port – メトリクスをスクレイプするポート。

  • filters – インスタンスリストのフィルタリングに使用するオプションのフィルター。この例では、EC2 インスタンス ID に基づいてフィルタリングします。フィルタリングできるその他の条件については、「DescribeInstances」を参照してください。

Prometheus の CloudWatch エージェント設定

CloudWatch エージェント設定ファイルには、prometheuslogs の両方の metrics_collected セクションが含まれています。それには次のパラメータが含まれます。

  • cluster_name – ログイベントのラベルとして追加されるクラスター名を指定します。このフィールドはオプションです。

  • log_group_name – スクレイプされた Prometheus メトリクスのロググループ名を指定します。

  • prometheus_config_path – Prometheus スクレイプ設定ファイルパスを指定します。

  • emf_processor – 埋め込みメトリクス形式のプロセッサ設定を指定します。埋め込みメトリックフォーマットの詳細については、「ログ内へのメトリクスの埋め込み」を参照してください。

    emf_processor セクションには、次のパラメータを含めることができます。

    • metric_declaration_dedup – trueに設定すると、埋め込まれたメトリクスフォーマットメトリクスの重複除外機能が有効になります。

    • metric_namespace – 出力される CloudWatch メトリクスのメトリクス名前空間を指定します。

    • metric_unit – メートルの name:metric 単位マップを指定します。サポートされているメトリクス単位については、「MetricDatum」を参照してください。

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

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

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

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

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

以下に、Prometheus の CloudWatch エージェントの設定例を示します。

{ "logs":{ "metrics_collected":{ "prometheus":{ "cluster_name":"prometheus-cluster", "log_group_name":"Prometheus", "prometheus_config_path":"C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus.yaml", "emf_processor":{ "metric_declaration_dedup":true, "metric_namespace":"CWAgent-Prometheus", "metric_unit":{ "jvm_threads_current": "Count", "jvm_gc_collection_seconds_sum": "Milliseconds" }, "metric_declaration":[ { "source_labels":[ "job", "key2" ], "label_matcher":"MY_JOB;^value2", "dimensions":[ [ "key1", "key2" ], [ "key2" ] ], "metric_selectors":[ "^jvm_threads_current$", "^jvm_gc_collection_seconds_sum$" ] } ] } } } } }

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

  • job ラベルの値は MY_JOB です

  • key2 ラベルの値は value2 です

  • Prometheus メトリクス jvm_threads_current および jvm_gc_collection_seconds_sum には、job ラベルおよび key2 ラベルの両方が含まれます。

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

{ "CloudWatchMetrics": [ { "Metrics": [ { "Unit": "Count", "Name": "jvm_threads_current" }, { "Unit": "Milliseconds", "Name": "jvm_gc_collection_seconds_sum" } ], "Dimensions": [ [ "key1", "key2" ], [ "key2" ] ], "Namespace": "CWAgent-Prometheus" } ], "ClusterName": "prometheus-cluster", "InstanceId": "i-0e45bd06f196096c8", "Timestamp": "1607966368109", "Version": "0", "host": "EC2AMAZ-PDDOIUM", "instance": "127.0.0.1:9404", "jvm_threads_current": 2, "jvm_gc_collection_seconds_sum": 0.006000000000000002, "prom_metric_type": "gauge", ... }

例: Prometheus メトリクステスト用に Java/JMX サンプルワークロードを設定する

JMX Exporter は、Prometheus メトリクスとして JMX mBeans をスクレイプおよび公開できる公式の Prometheus エクスポーターです。詳細については、prometheus/jmx_exporter を参照してください。

CloudWatch エージェントは、EC2 インスタンスの JMX Exporter から Java 仮想マシン (JVM)、Hjava、Tomcat (Catalina) から事前定義された Prometheus メトリクスを収集できます。

ステップ 1: CloudWatch エージェントをインストールする

最初のステップは、EC2 インスタンスに CloudWatch エージェントをインストールすることです。手順については、「CloudWatch エージェントをインストールする」を参照してください。

ステップ 2: Java/JMX ワークロードを開始する

次のステップは、Java/JMX ワークロードを開始することです。

まず、次の場所から最新の JMX Exporter の jar ファイルをダウンロードします: prometheus/jmx_exporter

サンプルアプリケーションに jar を使用する

次のセクションのコマンド例では、SampleJavaApplication-1.0-SNAPSHOT.jar を jar ファイルとして使用します。コマンドのこれらの部分をアプリケーションの jar に置き換えます。

JMX Exporter 設定ファイルを準備する

config.yaml ファイルは JMX Exporter 設定ファイルです。詳細については、JMX Exporter ドキュメントの「設定」を参照してください。

Java と Tomcat の設定のサンプルを次に示します。

--- lowercaseOutputName: true lowercaseOutputLabelNames: true rules: - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)' name: java_lang_OperatingSystem_$1 type: GAUGE - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)' name: java_lang_threading_$1 type: GAUGE - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)' name: catalina_globalrequestprocessor_$3_total labels: port: "$2" protocol: "$1" help: Catalina global $3 type: COUNTER - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount)' name: catalina_servlet_$3_total labels: module: "$1" servlet: "$2" help: Catalina servlet $3 total type: COUNTER - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)' name: catalina_threadpool_$3 labels: port: "$2" protocol: "$1" help: Catalina threadpool $3 type: GAUGE - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions)' name: catalina_session_$3_total labels: context: "$2" host: "$1" help: Catalina session $3 total type: COUNTER - pattern: ".*"

Prometheus エクスポーターで Java アプリケーションを起動する

サンプルアプリケーションを起動する これにより、Prometheus メトリクスをポート 9404 に出力します。エントリポイント com.gubupt.sample.app.App は、必ずサンプル Java アプリケーションの正しい情報に置き換えてください。

Linux では、以下のコマンドを入力します。

$ nohup java -javaagent:./jmx_prometheus_javaagent-0.14.0.jar=9404:./config.yaml -cp ./SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App &

Windows では、以下のコマンドを入力します。

PS C:\> java -javaagent:.\jmx_prometheus_javaagent-0.14.0.jar=9404:.\config.yaml -cp .\SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App

Prometheus メトリクスの放出を確認する

Prometheus メトリクスが出力されていることを確認します。

Linux では、以下のコマンドを入力します。

$ curl localhost:9404

Windows では、以下のコマンドを入力します。

PS C:\> curl http://localhost:9404

Linux での出力例:

StatusCode : 200 StatusDescription : OK Content : # HELP jvm_classes_loaded The number of classes that are currently loaded in the JVM # TYPE jvm_classes_loaded gauge jvm_classes_loaded 2526.0 # HELP jvm_classes_loaded_total The total number of class... RawContent : HTTP/1.1 200 OK Content-Length: 71908 Content-Type: text/plain; version=0.0.4; charset=utf-8 Date: Fri, 18 Dec 2020 16:38:10 GMT # HELP jvm_classes_loaded The number of classes that are currentl... Forms : {} Headers : {[Content-Length, 71908], [Content-Type, text/plain; version=0.0.4; charset=utf-8], [Date, Fri, 18 Dec 2020 16:38:10 GMT]} Images : {} InputFields : {} Links : {} ParsedHtml : System.__ComObject RawContentLength : 71908

ステップ 3: Prometheus メトリクスをスクレイプするように CloudWatch エージェントを設定する

次に、CloudWatch エージェント設定ファイルで Prometheus スクレイプ設定をセットアップします。

Java/JMX の例の Prometheus スクレイプ設定を行うには
  1. file_sd_config および static_config の設定をセットアップします。

    Linux では、以下のコマンドを入力します。

    $ cat /opt/aws/amazon-cloudwatch-agent/var/prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: jmx sample_limit: 10000 file_sd_configs: - files: [ "/opt/aws/amazon-cloudwatch-agent/var/prometheus_file_sd.yaml" ]

    Windows では、以下のコマンドを入力します。

    PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: jmx sample_limit: 10000 file_sd_configs: - files: [ "C:\\ProgramData\\Amazon\\AmazonCloudWatchAgent\\prometheus_file_sd.yaml" ]
  2. スクレイプターゲットの設定を行います。

    Linux では、以下のコマンドを入力します。

    $ cat /opt/aws/amazon-cloudwatch-agent/var/prometheus_file_sd.yaml - targets: - 127.0.0.1:9404 labels: application: sample_java_app os: linux

    Windows では、以下のコマンドを入力します。

    PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_file_sd.yaml - targets: - 127.0.0.1:9404 labels: application: sample_java_app os: windows
  3. ec2_sc_config によって Prometheus スクレイプ設定を行います。your-ec2-instance-id を正しい EC2 インスタンス ID に置き換えます。

    Linux では、以下のコマンドを入力します。

    $ cat .\prometheus.yaml global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: jmx sample_limit: 10000 ec2_sd_configs: - region: us-east-1 port: 9404 filters: - name: instance-id values: - your-ec2-instance-id

    Windows では、以下のコマンドを入力します。

    PS C:\ProgramData\Amazon\AmazonCloudWatchAgent> cat prometheus_file_sd.yaml - targets: - 127.0.0.1:9404 labels: application: sample_java_app os: windows
  4. CloudWatch エージェント設定を行います。まず、正しいディレクトリに移動します。Linux では、それは /opt/aws/amazon-cloudwatch-agent/var/cwagent-config.json です。Windows では、それは C:\ProgramData\Amazon\AmazonCloudWatchAgent\cwagent-config.json です。

    次に、Java/JHX Prometheus メトリクスが定義されている設定例を示します。必ず path-to-Prometheus-Scrape-Configuration-file へのパスを正しいパスに置き換えてください。

    { "agent": { "region": "us-east-1" }, "logs": { "metrics_collected": { "prometheus": { "cluster_name": "my-cluster", "log_group_name": "prometheus-test", "prometheus_config_path": "path-to-Prometheus-Scrape-Configuration-file", "emf_processor": { "metric_declaration_dedup": true, "metric_namespace": "PrometheusTest", "metric_unit":{ "jvm_threads_current": "Count", "jvm_classes_loaded": "Count", "java_lang_operatingsystem_freephysicalmemorysize": "Bytes", "catalina_manager_activesessions": "Count", "jvm_gc_collection_seconds_sum": "Seconds", "catalina_globalrequestprocessor_bytesreceived": "Bytes", "jvm_memory_bytes_used": "Bytes", "jvm_memory_pool_bytes_used": "Bytes" }, "metric_declaration": [ { "source_labels": ["job"], "label_matcher": "^jmx$", "dimensions": [["instance"]], "metric_selectors": [ "^jvm_threads_current$", "^jvm_classes_loaded$", "^java_lang_operatingsystem_freephysicalmemorysize$", "^catalina_manager_activesessions$", "^jvm_gc_collection_seconds_sum$", "^catalina_globalrequestprocessor_bytesreceived$" ] }, { "source_labels": ["job"], "label_matcher": "^jmx$", "dimensions": [["area"]], "metric_selectors": [ "^jvm_memory_bytes_used$" ] }, { "source_labels": ["job"], "label_matcher": "^jmx$", "dimensions": [["pool"]], "metric_selectors": [ "^jvm_memory_pool_bytes_used$" ] } ] } } }, "force_flush_interval": 5 } }
  5. 次のコマンドのいずれかを入力して、CloudWatch エージェントを再起動します。

    Linux では、以下のコマンドを入力します。

    sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/var/cwagent-config.json

    Windows では、以下のコマンドを入力します。

    & "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:C:\ProgramData\Amazon\AmazonCloudWatchAgent\cwagent-config.json

Prometheus のメトリクスとログの表示

これで、収集されている Java/JMX メトリクスを表示できるようになりました。

サンプル Java/JMX ワークロードのメトリクスを表示するには
  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. クラスターが実行されているリージョンにおいて、左のナビゲーションペインで [Metrics] (メトリクス) を選択します。PrometheusTest 名前空間を検索して、メトリクスを確認します。

  3. CloudWatch Logs イベントを表示するには、ナビゲーションペインで [Log Groups (ロググループ)] を選択します。イベントは、ロググループの prometheus-test にあります。