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の発行方法は以下を参照してください。
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