Contents
aws CloudWatch エージェントでPrometheus エクスポーターのメトリクスを取得する
AWS ECSを監視する際にCloudWatch エージェントを使うことが多いと思うが、
CloudWatch エージェントで取得できるメトリクスは限られている。
CloudWatchエージェントで取得できるメトリクスはこちら。
そこで、Prometheusのエクスポーターを使ってCloudWatchにメトリクスを送ることにより、
CloudWatchエージェントでは取得できないメトリクスについて取得・監視することが可能となる。
どんなAWSサービスを使うの?
- ECS-Fargate
- Cloud watch
Prometheus エクスポーターを使うとどんな感じになるの?
前準備:ECS-FargateにCloudWatchエージェントとPrometheusのエクスポータを入れておく
実際の動作:CloudWatchエージェントがPrometheusのエクスポータを叩き、結果をCloudWatchへ送る
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/ContainerInsights-Prometheus-Setup-ECS.html
ここら辺の話。
試しにapache エクスポーターを使って動作を確かめてみる
ソースファイル
Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
FROM ubuntu ENV DEBIAN_FRONTEND noninteractive # curlインストール RUN apt-get update \ && apt-get install -y curl # Apacheインストール RUN apt-get install -y apache2 # CloudWatchエージェントインストール RUN curl -Lo amazon-cloudwatch-agent.deb https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/ubuntu/amd64/1.247346.1b249759/amazon-cloudwatch-agent.deb \ && dpkg -i -E ./amazon-cloudwatch-agent.deb COPY amazon-cloudwatch-agent.json /opt/aws/amazon-cloudwatch-agent/bin/default_linux_config.json ENV RUN_IN_CONTAINER=True # Supervisorインストール RUN apt-get install -y supervisor COPY ./supervisord.conf /etc/ #prometheus関連 COPY ./prometheus.yaml /opt/aws/amazon-cloudwatch-agent/bin/prometheus.yaml RUN curl -Lo apache_exporter-0.7.0.linux-amd64.tar.gz https://github.com/Lusitaniae/apache_exporter/releases/download/v0.7.0/apache_exporter-0.7.0.linux-amd64.tar.gz RUN tar zxvf apache_exporter-0.7.0.linux-amd64.tar.gz RUN mv -i apache_exporter-0.7.0.linux-amd64 /usr/local/apache_exporter-0.7.0 WORKDIR /usr/local/ RUN ln -s apache_exporter-0.7.0 apache_exporter EXPOSE 80 9117 # 起動 CMD /usr/bin/supervisord -c /etc/supervisord.conf |
以下のものをインストールしている
- apache
- CloudWatch agent
- Supervisord
- Prometheus exporter(apache exporter)
「RUN_IN_CONTAINER=True」を記載しないとコンテナでCloudWatchエージェントが動かない
supervisord.conf
1 2 3 4 5 6 7 8 9 10 11 12 |
[supervisord] user = root nodaemon=true [program:apachectl] command=/usr/sbin/apache2ctl -DFOREGROUND [program:amazon-cloudwatch-agent] command=/opt/aws/amazon-cloudwatch-agent/bin/start-amazon-cloudwatch-agent [program:prometheus-apache-exporter] command=/usr/local/apache_exporter-0.7.0/apache_exporter |
Dockerfileでインストールしたものを起動するように使用
amazon-cloudwatch-agent.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
{ "logs": { "metrics_collected": { "prometheus": { "prometheus_config_path": "/opt/aws/amazon-cloudwatch-agent/bin/prometheus.yaml", "ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "task_definition_list": [ { "sd_metrics_ports": "9117", "sd_task_definition_arn_pattern": ".*:task-definition/.*prometheus.*", "sd_metrics_path": "/metrics" } ] }, "emf_processor": { "metric_declaration": [ { "source_labels": ["container_name"], "label_matcher": "^cloudwatch-agent-prometheus$", "dimensions": [["ClusterName"]], "metric_selectors": [ "^apache_accesses_total$" ] } ] } } }, "force_flush_interval": 5 } } |
task_definition_list内の条件に合致するメトリクス取得対象を自動検出して「/tmp/cwagent_ecs_auto_sd.yaml」に吐き出す。
metric_declaration内の条件でCloudWatchにメトリクスを送る
prometheus.yaml
1 2 3 4 5 6 7 8 |
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: cwagent-ecs-file-sd-config sample_limit: 10000 file_sd_configs: - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ] |
「/tmp/cwagent_ecs_auto_sd.yaml」内の情報で15秒間隔でメトリクスを取得するよってこと
Prometheus エクスポーターでCloudWatchにメトリクスを送った結果
複数のコンテナが立ち上がってる場合、「/tmp/cwagent_ecs_auto_sd.yaml」に複数コンテナの情報が書き込まれ、立ち上がってる分だけのコンテナの情報を収集するので、CloudWatchエージェント用のコンテナを立てるのが普通?
ちなみに、、自身のコンテナの情報だけをCloudWatchへ送る方法もある。この場合、CloudWatchエージェント用のコンテナは不要。やり方は↓↓↓↓↓↓↓↓↓↓↓
Prometheus エクスポーターでコンテナローカルのメトリクス 取得ver.
コンテナローカルのメトリクス 取得ver.
コンテナの自動検出機能を使わないと↓こんな感じ↓になる
amazon-cloudwatch-agent.json(コンテナローカルのメトリクス 取得ver.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "logs": { "metrics_collected": { "prometheus": { "prometheus_config_path": "/opt/aws/amazon-cloudwatch-agent/bin/prometheus.yaml", "emf_processor": { "metric_declaration": [ { "source_labels": ["ClusterName"], "label_matcher": "^kinoshit-prometheus2$", "dimensions": [["ClusterName","job"]], "metric_selectors": [ "^apache_accesses_total$" ] } ] } } }, "force_flush_interval": 5 } } |
prometheus.yaml(コンテナローカルのメトリクス 取得ver.)
1 2 3 4 5 6 7 |
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: 'apache' static_configs: - targets: ['localhost:9117'] |