📈

Prometheusを弊社クラウドで動かしてみた

に公開

はじめに

こんにちは。mNi Cloud開発チームです。
今回は弊社が開発しているmNi Cloud上にPrometheus, Grafanaを構築し、監視を行う。といったシナリオになります。

mNi Cloud上にVMを作成

mNi Cloud上ではKVMベースの仮想マシンを作成することができます。

今回はOSとしてUbuntu24.04を使用します。

仮想マシン名,CPU, メモリ, ストレージを指定します。

デフォルトのVPC, サブネット上に仮想マシンを作成します。

以下のCloud-Initを指定し、初期ユーザ設定やDockerのインストールをVM作成時に行えるようにします。

#cloud-config
ssh_pwauth: true
chpasswd:
  list: |
    ubuntu:ubuntu
  expire: false

runcmd:
  # DNS 設定
  - [ resolvectl, dns, enp1s0, 8.8.8.8 ]
  - [ systemctl, restart, systemd-resolved ]

  # Docker リポジトリ登録+インストール処理
  - [ apt-get, update, -y ]
  - [ apt-get, install, -y, ca-certificates, curl ]
  - [ install, -m, "0755", "-d", /etc/apt/keyrings ]
  - [ curl, -fsSL, https://download.docker.com/linux/ubuntu/gpg, -o, /etc/apt/keyrings/docker.asc ]
  - [ chmod, a+r, /etc/apt/keyrings/docker.asc ]
  - |
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
    https://download.docker.com/linux/ubuntu \
    $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" \
    | tee /etc/apt/sources.list.d/docker.list > /dev/null
  - [ apt-get, update, -y ]
  - [ apt-get, install, -y, docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin ]

作成されたら、VMを起動し、SSHでアクセスを行います。

Prometheus + Grafana + AlertManagerを構築

Prometheus + Grafana + AlertManagerを構築します。
今回はネイティブインストールではなく、Docker Composeを使用した方法を採用します。

以下のコマンドでdockerがcloud-initによりインストールされていることを確認します。

ubuntu@vm-prometheus:~/docker-prometheus$ sudo docker version
Client: Docker Engine - Community
 Version:           28.1.1
 API version:       1.49
 Go version:        go1.23.8
 Git commit:        4eba377
 Built:             Fri Apr 18 09:52:14 2025
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          28.1.1
  API version:      1.49 (minimum version 1.24)
  Go version:       go1.23.8
  Git commit:       01f442b
  Built:            Fri Apr 18 09:52:14 2025
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.7.27
  GitCommit:        05044ec0a9a75232cad458027ca83437aae3f4da
 runc:
  Version:          1.2.5
  GitCommit:        v1.2.5-0-g59923ef
 docker-init:
  Version:          0.19.0

以下のコマンドでDocker用のディレクトリを作成します。

ubuntu@vm-prometheus:~$ mkdir docker-prometheus
ubuntu@vm-prometheus:~$ cd docker-prometheus/

今回は以下のようなディレクトリ構成を採用します。

ubuntu@vm-prometheus:~$ tree docker-prometheus/
docker-prometheus/
├── alertmanager
│   └── config.yaml
├── docker-compose.yaml
└── prometheus
    ├── alert.rules
    └── prometheus.yaml

3 directories, 4 files

まず、docker-compose.yamlを作成します

ubuntu@vm-prometheus:~/docker-prometheus$ vi docker-compose.yaml
version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
    command: "--config.file=/etc/prometheus/prometheus.yaml"
    ports:
      - 9090:9090
    restart: always
  exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    ports:
      - 9100:9100
    restart: always
  grafana:
    image: grafana/grafana:main
    container_name: grafana
    ports:
      - 3000:3000
    restart: always
  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    volumes:
      - ./alertmanager:/etc/alertmanager
    command: "--config.file=/etc/alertmanager/config.yaml"
    ports:
      - 9093:9093
    restart: always

ubuntu@vm-prometheus:~/docker-prometheus$

次に以下にprometheusのコンフィグファイルを作成します。

ubuntu@vm-prometheus:~/docker-prometheus$ vi prometheus/prometheus.yaml
global:
  scrape_interval:     15s
  evaluation_interval: 15s
  external_labels:
      monitor: 'codelab-monitor'

rule_files:
  - /etc/prometheus/alert.rules

alerting:
  alertmanagers:
    - scheme: http
      static_configs:
      - targets:
        - alertmanager:9093

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets:
        -  prometheus:9090
        -  node-exporter:9100

次にAlertManagerで通知する用のサンプルルールを作成します。
以下はインスタンスが1分間ダウンしたらアラートを発生させます。

ubuntu@vm-prometheus:~/docker-prometheus$ cat prometheus/alert.rules
groups:
- name: example
  rules:
  - alert: instance_down
    expr: up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

ubuntu@vm-prometheus:~/docker-prometheus$

最後にアラートの通知先の設定を行います。
Slack APIの発行方法は以下を参照してください。
https://api.slack.com/messaging/webhooks

ubuntu@vm-prometheus:~/docker-prometheus$ cat alertmanager/config.yaml
global:
  slack_api_url: '{slack APIのURL}'

route:
  receiver: 'slack'

receivers:
  - name: 'slack'
    slack_configs:
    - channel: '{slackのチャンネル名}'

ubuntu@vm-prometheus:~/docker-prometheus$

ここまでファイルを作成したら、以下のコマンドで、Prometheusを起動します。

ubuntu@vm-prometheus:~/docker-prometheus$ sudo docker compose up -d
WARN[0000] /home/ubuntu/docker-prometheus/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 5/5
 ? Network docker-prometheus_default  Created                              0.1s
 ? Container grafana                  Started                              0.7s
 ? Container prometheus               Started                              0.8s
 ? Container alertmanager             Started                              0.7s
 ? Container node-exporter            Started                              0.8s
ubuntu@vm-prometheus:~/docker-prometheus$
ubuntu@vm-prometheus:~/docker-prometheus$ sudo docker compose ps
WARN[0000] /home/ubuntu/docker-prometheus/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
NAME            IMAGE                       COMMAND                  SERVICE        CREATED         STATUS         PORTS
alertmanager    prom/alertmanager           "/bin/alertmanager -…"   alertmanager   4 seconds ago   Up 3 seconds   0.0.0.0:9093->9093/tcp, [::]:9093->9093/tcp
grafana         grafana/grafana:main        "/run.sh"                grafana        4 seconds ago   Up 3 seconds   0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp
node-exporter   prom/node-exporter:latest   "/bin/node_exporter"     exporter       4 seconds ago   Up 3 seconds   0.0.0.0:9100->9100/tcp, [::]:9100->9100/tcp
prometheus      prom/prometheus             "/bin/prometheus --c…"   prometheus     4 seconds ago   Up 3 seconds   0.0.0.0:9090->9090/tcp, [::]:9090->9090/tcp
ubuntu@vm-prometheus:~/docker-prometheus$

Prometheusへのアクセス

ブラウザから以下のURLにアクセスし、Prometheusが提供しているAPIを確認します。
http://{サーバのIP}:9090/targets

また、以下のURLにアクセスし、Enter Expressionにprometheus_http_requests_totalを入力し、表示モードを「Graph」に設定します。
http://{サーバのIP}:9090/query

Grafanaへのアクセス

次にPrometheusで収集したMetricsをGrafanaにより表示できるようにします。

以下のURLにアクセスし、Grafanaにアクセスします。
初期ユーザ/パスワードはadmin/adminです。
http://{サーバのIP}:3000/login

初期パスワードの変更を行います。スキップすることも可能です。

右上のアイコン→Profileにアクセスします。

Languageを日本語に設定し、「Save」をクリックします。
※2025/04/24現在、GrafanaのDockerイメージでmainタグをしている場合、日本語に設定可能です。現在はPreview機能となります。

Grafanaダッシュボードの作成

左タブの「つながり」→「データソース」にアクセスします。

Prometheusを選択します。

Connectionに「http://prometheus:9090」を指定します。

上部タブの「Dashboard」をクリックし、「Prometheus 2.0 Stats」の「Import」をクリックします。

左タブの「ダッシュボード」をクリックします。
※表示されない場合はブラウザを更新します。

各種情報が表示されます。

AlertManagerの確認

以下のURLにアクセスし、AlertManagerの設定を確認します。
http://{サーバのIP}:9093/#/status

以下のコマンドで疑似的にノードのダウンを再現するために、node-exporterコンテナを停止します。

ubuntu@vm-prometheus:~/docker-prometheus$ sudo docker container stop node-export
er
node-exporter
ubuntu@vm-prometheus:~/docker-prometheus$ sudo docker compose ps
WARN[0000] /home/ubuntu/docker-prometheus/docker-compose.yaml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
NAME           IMAGE                  COMMAND                  SERVICE        CREATED          STATUS          PORTS
alertmanager   prom/alertmanager      "/bin/alertmanager -…"   alertmanager   31 minutes ago   Up 31 minutes   0.0.0.0:9093->9093/tcp, [::]:9093->9093/tcp
grafana        grafana/grafana:main   "/run.sh"                grafana        31 minutes ago   Up 31 minutes   0.0.0.0:3000->3000/tcp, [::]:3000->3000/tcp
prometheus     prom/prometheus        "/bin/prometheus --c…"   prometheus     31 minutes ago   Up 31 minutes   0.0.0.0:9090->9090/tcp, [::]:9090->9090/tcp
ubuntu@vm-prometheus:~/docker-prometheus$

Slackにて通知が来ることを確認します。

おわりに

今回は弊社開発中のmNi Cloud上に仮想マシンを構築し、Prometheus, Grafanaを導入しました。
今後はmNi Cloud上でマネージドサービス「mNi Monitor(仮)」を通じて弊クラウドのメトリクス収集、ログ収集、アラート通知などを提供予定です。
弊クラウド上でマネージドな監視を行いたい。興味がありましたら、ご声掛けお願いします!

Discussion