🐤

Prometheus で NodeExporter, ContainerExporter を使用して Grafana で可視化する

2024/05/26に公開

はじめに

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 を入れてみたとご理解ください。

https://hub.docker.com/r/prom/container-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

各ファイルの中身

docker-compose.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: ":" 
prometheus.yml
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を控えておきます。
https://grafana.com/grafana/dashboards/1860-node-exporter-full/

左のメニューから[Create]>[Import]を選び、[Import via grafana.com]で先ほど控えたIDを入力し[Load]してください。

Grafana で Node Exporter のダッシュボードを簡単に作れました。

最後に

今回は、Docker 環境で Prometheus、Node Exporter、Container Exporter を動かし、Grafana で可視化するまでの一連の流れを検証しました。
Docker Compose の環境さえあればすぐに実行できますね。

次は Amazon ECS、EKS 環境ではどのように Prometheu を動かしていくのかについて調べていきます。

参考文献

Prometheus 実践ガイド(仲亀拓馬)

Discussion