Prometheus で NodeExporter, ContainerExporter を使用して Grafana で可視化する
はじめに
Observability について詳しくなりたく、Prometheus, OpenTelemetry, AWS Distro for OpenTelemetry を学んでいきます。
まだ書き始めたばかりなので、随時追記していきます。
ゴール
- Prometheus の NodeExporter を使用し、サーバーのメトリクスを取得します。それを Grafana ダッシュボードで可視化させてみます。
- なお、Grafana の具体的な操作方法についてはほとんど含みません。今回の検証では、Prometheus メトリクスを Grafana で可視化させるまでをゴールにしています。
- せっかくなので他の Exporter も触ってみようということで、Docker で動いているコンテナのメトリクスを取得する、Container Exporter もターゲットに追加してみる
- 使ってみて気づいたのですが、公式のディレクトリがどれなのか見つけられず... Docker Hub では Prometheus による管理となっているようですが、最終更新日が 9 years ago ということでかなり前でした。
- 今回の検証では、あくまでも色々な Exporter をいじる前段としてこちらの Exporter を入れてみたとご理解ください。
環境
Docker Compose を使用した環境で行いたいと思います。AWS の Amazon ECS に最適化された AMI であれば Docker がすでに入っているため、そちらに Docker Compose も入れて検証環境としました。
※ AWS CLI, Goについては今回は必要ありませんが、他の検証でも必要だったためインストールしています。
使用した CloudFormation テンプレートはこちら
CloudFormation テンプレート
Parameters:
SshKey:
Type: AWS::EC2::KeyPair::KeyName
ImageId:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id
InstanceType:
Type: String
Default: t3.small
Resources:
MyEcsInstance:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref ImageId
InstanceType: !Ref InstanceType
KeyName: !Ref SshKey
IamInstanceProfile: !Ref MyDockerInstanceProfile
UserData:
Fn::Base64: !Sub |
#!/bin/bash
sudo yum update -y
sudo yum install git wget unzip -y
sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo curl \
-L https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m) \
-o /usr/local/lib/docker/cli-plugins/docker-compose
sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose
// AWS CLI インストール
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
// go 環境のインストール
wget https://go.dev/dl/go1.22.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.22.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
MyDockerInstanceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AdministratorAccess // Admin権限なので、適切な権限にしてください。
MyDockerInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Roles:
- !Ref MyDockerInstanceRole
ディレクトリ構成
% tree
.
├── docker-compose.yml
├── grafana
│ └── data
└── prometheus
└── prometheus.yml
各ファイルの中身
version: '3'
services:
prometheus:
image: prom/prometheus:v2.33.3
ports:
- '9090:9090'
volumes:
- './prometheus/prometheus.yml:/etc/prometheus/prometheus.yml'
command:
--web.enable-lifecycle
--config.file=/etc/prometheus/prometheus.yml
node-exporter:
image: prom/node-exporter:v1.3.1
hostname: prometheus-book
ports:
- '9100:9100'
container-exporter:
image: prom/container-exporter
ports:
- '9104:9104'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /sys/fs/cgroup:/cgroup
grafana:
image: grafana/grafana:8.3.6
ports:
- 3000:3000
volumes:
- ./grafana/data:/var/lib/grafana
user: ":"
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ["localhost:9090"]
- job_name: 'node'
static_configs:
- targets: ["node-exporter:9100"]
- job_name: 'container'
static_configs:
- targets: ["container-exporter:9104"]
動かす
$ docker-compose up -d
Grafana の UI へアクセス
http://<EC2のパブリックIPまたはパブリックDNS>:3000
ID/PASS はどちらも「admin」
早速メトリクスを可視化してみます。
[Explore]から適当なメトリクスをクエリしてみます。
Grafanaのダッシュボード
Node Exporter のダッシュボードは外部ダッシュボードとしてすでに用意されているため、こちらを使います。
ここにある[Copy ID to clipboard]でIDを控えておきます。
左のメニューから[Create]>[Import]を選び、[Import via grafana.com]で先ほど控えたIDを入力し[Load]してください。
Grafana で Node Exporter のダッシュボードを簡単に作れました。
最後に
今回は、Docker 環境で Prometheus、Node Exporter、Container Exporter を動かし、Grafana で可視化するまでの一連の流れを検証しました。
Docker Compose の環境さえあればすぐに実行できますね。
次は Amazon ECS、EKS 環境ではどのように Prometheu を動かしていくのかについて調べていきます。
Discussion