Prometheus + Grafana を Mac 上で docker-compose で起動

Prometheus、流行ってますね。
pull 型で、metrics の収集を HTTP 経由で行えるので、テスト用の監視サーバーをローカルの作業マシンに立ち上げて動作確認をしたりするのが楽なのも良い点だと思います。

Prometheus 本体も exporter も docker image が提供されており、docker での環境構築が楽なのも今風の OSS だなという感じがします。

ここでは、docker-compose を用いてローカルの Mac で起動を試みてみようと思います。

# How to install Prometheus and Grafana on local Mac
## docker
<https://docs.docker.com/docker-for-mac/install/>
上記から Mac 用の dmg をダウンロードしてインストールしてください

## docker-compose
```
$ sudo pip install docker-compose
```

## configuration files
### prometheus.yml
prometheus の設定ファイルです。
以下では、prometheus 自身の監視のみを有効にしています(job_name: 'prometheus')。

```prometheus.yml
global:
  scrape_interval:     15s 
  evaluation_interval: 15s 
  external_labels:
      monitor: 'codelab-monitor'

rule_files:
#   - "/var/app/prometheus/alert.rules"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: 
        - 'localhost:9090'
```

### grafana.env
grafana に渡す環境変数をまとめた設定ファイルです。
docker 経由で grafana を起動する際は、環境変数を渡すことで既存の設定を上書く、という手法を取っています。このファイルを docker-compose 経由で渡します。
実際のところこの記事ではこちらのファイルは使わないのでこのファイルはなくても起動しますが、設定ファイルの雛形として用意をしておきます。

```grafana.env
# [server]
# GF_SERVER_DOMAIN=localhost
# GF_SERVER_HTTP_PORT=3000
# GF_SERVER_PROTOCOL=http
```

### docker-compose.yml
prometheus と grafana を docker-compose 経由で起動するための設定ファイルです。
prometheus.yml と grafana.env は任意の場所に置き換えて構いません。

```docker-compose.yml
version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - /var/app/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    env_file:
      - /var/app/prometheus/grafana.env

```

## start 
```shell
$ docker-compose -f docker-compose.yml up

Creating network "prometheus_default" with the default driver
Creating grafana
Creating prometheus
Attaching to prometheus, grafana
grafana       | t=2017-05-29T04:57:48+0000 lvl=info msg="Starting Grafana" logger=main version=4.3.0-beta1 commit=3a89272 compiled=2017-05-12T09:45:26+0000
grafana       | t=2017-05-29T04:57:48+0000 lvl=info msg="Config loaded from" logger=settings file=/usr/share/grafana/conf/defaults.ini
......
```

起動後、以下の URL に接続するとそれぞれ  Web UI を確認することができます。

- Prometheus : http://localhost:9090/
- Grafana : http://localhost:3000/

grafana の画面から任意の email address を入れて sign up をすると、アカウントの発行を行うことができます。

# add Prometheus dashboard into Grafana
ここでは Prometheus と Grafana の連携例として、 Promehteus があらかじめ用意している Dashboard を Grafana に追加します。

## 1. organization の追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/e9e1578c-49c9-28bb-2e98-71011a5eec76.png)
Grafana の画面左上にあるメニューボタンより "New Organization" を追加します。

## 2. Data Sources の追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/c336d1d9-2057-f863-f835-2efb839c40b0.png)

画面左上にあるメニューボタンより "Data Sources" をクリックし、Data Sources 画面から "+Add data source" ボタンをクリックして Prometheus の設定を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/3d6bb502-c3fd-56ae-267b-4841083d420b.png)

- Name : (任意)
- Type: Prometheus
- Url : http://localhost:9090
- Access: direct

## 3. Dashboard の追加
Prometheus Data Source の "Dashboards" タブをクリックすると、以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/6306f2bf-b09b-1b1a-40b3-f28901b86c5b.png)

こちらの "import" ボタンをクリックすると、以下のような Prometheus の dashboard が Grafana に追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/87399aae-f2ee-0cd9-84b3-26745cf19139.png)

# add node-exporter
ローカル Mac のシステムメトリクスを監視するために、メトリクス収集用の exporter である node-exporter の設定を行います。

<https://github.com/prometheus/node_exporter>

## docker-compose.yml
node-exporter も doker image が提供されているため、先の docker-compose.yml の設定を以下のように変更します。

```docker-compose.yml
version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - /var/app/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    env_file:
      - /var/app/prometheus/grafana.env
  node-exporter:
    image: quay.io/prometheus/node-exporter
    container_name: node-exporter
    ports:
      - 9100:9100
    volumes:
      - /proc:/host/proc
      - /sys:/host/sys
      - /:/rootfs
```

node-exporter は今回は http://localhost:9100/ で起動させます。

## prometheus.yml
```prometheus.yml
global:
  scrape_interval:     15s 
  evaluation_interval: 15s 
  external_labels:
      monitor: 'codelab-monitor'

rule_files:
#   - "/var/app/prometheus/alert.rules"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: 
        - 'localhost:9090'
  - job_name: 'node-exporter'
    static_configs:
      - targets:
        - '(host or ip address):9100'
```
node-exporter の設定を targets に追加します。
ここで `localhost:9100` と記述したくなるところですが、Prometheus は docker container 内で起動しているため、`localhost` アドレスは名前解決時に自分自身の container を指してしまいます。
なので、自分の Mac に割り当てられている localhost 以外の ip address や hostname を指定して上げる必要があります。

## start 
```shell
$ docker-compose -f docker-compose.yml up
```
起動後、以下の URL を開くと、追加した exporter が targets の中に含まれていることが確認できます。

http://localhost:9090/targets

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/f877dc53-7477-9460-016d-a08ad6c75655.png)

表示が `UP` になっていれば、正しく Prometheus - exporter 間が疎通できています。

## graph
exporter 追加後、Prometheus や Grafana の画面で追加した exporter の metrics が取得できるようになり、グラフなどでの可視化が可能になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/44364/60279454-8541-2c7e-afc4-80a8f3fb6bb6.png)

このような形で、必要な metrics を収集する exporter を随時追加し、Prometheus に連携することで、Prometheus や Grafana の設定は行っていきます。