AWS Cloudwatch agent (prometheus-beta) でEC2上のexporterからメトリクスを送る

Amazon CloudWatch が Prometheus メトリクスのモニタリングを開始 (ベータ版)

ということで、ベータですがAWS EKSとKubernetes向けに Prometheusメトリクスのモニタリングができるようになりました。

しかし、私はEC2でProemtheusメトリクスを出すExporterを動かしていて、これをモニタリングしたい。

そこで、いろいろ設定を見ながら、EC2上のProemtheusメトリクスをCloudwatchへ送る方法を探した記録です。

まず、セットアップページから githubのページ を見つけます。

そして、prometheus-k8s.yaml をみると、必要な設定ファイルがみつかります。ここから、設定ファイルを作成していきます。

私は fluentdのモニタリングがしたかったので、fluentdのための設定になっています。

一つ目は、cloudwatch agentのための設定

/etc/cwagent.json

    {
      "agent": {
        "region": "ap-northeast-1"
      },
      "logs": {
        "metrics_collected": {
          "prometheus": {
            "cluster_name": "sample",
            "prometheus_config_path": "/etc/prometheusconfig/prometheus.yaml",
            "emf_processor": {
              "metric_declaration_dedup": true,
              "metric_declaration": [
                {
                  "source_labels": ["Service"],
                  "label_matcher": "Fluentd",
                  "dimensions": [["Service","plugin_id"]],
                  "metric_selectors": ["^fluentd_output_"]
                }
              ]
            }
          }
        },
        "force_flush_interval": 5
      }
    }

cluster_name は k8sじゃないので適当です。 prometheus_config_path は読み込むファイルパスです。これは、 docker run するときに prometheus.yamlをマウントする場所なので、どこでもいいです。

emf_processor というところで、どのメトリクスを収集するのか、どの単位で区別するのか、といった設定をします。

source_labels で指定したラベルが label_macherと一致するものを対象として設定されます。ここではServiceラベルが Fluentdであるものを対象としています。今回はprometheus.yaml側で付与したラベルを利用します。

dimensions というところで、メトリクスを区別するタグの組を設定します。ここでは、 Serviceとplugin_idの組で区別するようにしています。複数台で動かす場合は、インスタンス名などを含めるとよいでしょう。

metric _selectorsというところで収集するメトリクスを決めます。 正規表現がつかえます。今回は fluentd_output で始まるメトリクスのみを収集するよう設定しています。

二つ目は、prometheusの設定。

fluentdのprometheus plugin は 24231 ポートでメトリクスを公開するよう設定するサンプルが公式ドキュメントにあります。

/etc/prometheus.yaml

    global:
      scrape_interval: 1m
      scrape_timeout: 10s
    scrape_configs:
      - job_name: fluentd
        static_configs:
          - targets:
            - localhost:24231
            labels:
             - Service: Fluentd

こちらは prometheusのドキュメントを見るのが早いでしょう。

設定ができたら、あとは docker run するだけです

利用すべきイメージはdockerhub で見つけることができます。 prometheus-beta とついているものです

docker run -d --rm  --net host --name cwagent -v /etc/cwagent.json:/etc/cwagentconfig:ro -v /etc/prometheus.yaml;/etc/prometheusconfig/prometheus.yaml:ro  amazon/cloudwatch-agent:latest-prometheus-beta

docker logs cwagent にて、変なエラーが出てないことを確認したら数分待って cloudwatch metricsを見てみましょう。

cloudwatch の設定ファイルを見るとわかるのですが、 logsというセクションが使われています。

実際、cloudwatch logsを見に行くと、ロググループが作成され、メトリクスがログストリームにたまっているのを見ることができます。自動作成されるロググループは、自動では失効しないので、ほっておくとひたすらログがたまり、どんどんお金がかかるようになるので注意しましょう。

また、収集するメトリクスをきちんと絞らないと、大量のメトリクスが収集され、やはりお金がかかるので気を付けましょう。