PrometheusとcAdvisorで、作った環境をモニタする～EHW2018「開発環境整備⑦」

# 概要

このエントリは、「Enterprise "hello, world" 2018 Advent Calendar 2018」の12/14向けのものです。このAdvent Calendarでは、複数個のエントリにまたがる話の流れも鑑みつつ、なるべく1エントリで１つのトピックをカバーできるようにする予定です。

このエントリで記載するトピックは、PrometheusとcAdvisorで、作った環境をモニタすることです。
このエントリ後、これまで作ってきた環境と合わせて、こんな世界になります。

|![EHW2018DevEnv(1)(4).png](https://qiita-image-store.s3.amazonaws.com/0/65002/e1a6ca92-0533-2a50-6ec7-e8d138b391aa.png)|
|:---:|

# 前提

## おことわり

- このEnterpfise "hello, world"シリーズは、ネタのためのエントリです。実環境でそのまま利用ことを目的とはしていません。
- 動かしやすさを優先してセキュリティを意図的に低くする設定など入れてありますのでご注意ください。

## 想定読者

「Enterprise "hello, world" 2018」的なネタとしては、下記のような状況を想定しています。

> いくつかコンテナを使って開発側環境を立ち上げてきた。そうだ、モニタしなければ。作りっぱなしはいけません。

# Prometheus

## Prometheusとは

[Prometheus](https://prometheus.io/)は、メトリクスをいい感じに一か所に収集し、クエリするためのツールです。
複数のデータ提供側の"exporter"から、一定間隔で値を集め、ユーザが指定した形で測定データを見ることができます。

## あわせて、cAdvisor

Prometheusは、複数の"exporter"から値を収集しますが、その一つとして、docker containerホストから値を収集する仕組みの["cAdvisor"](https://github.com/google/cadvisor)があります。こちらを使用して、このAdvent Calendarのシリーズで作ってきたdockerコンテナの測定値も集めます。

## docker-compose

今回のエントリでは、2つのコンテナを同時に扱います。

- ネットワークについて、新たに"intnet"を新設しました。基盤側だけが使うネットワークとして利用するイメージです。
- cAdvisorは、コンテナのホスト側の状態もいろいろ公開する雰囲気であることから、ネットワークを分けようと考えました。そのため、intnetという名称のdockerの内部ネットワークを作成しています。
- 後述しますが、prometheus自体も、認証がかけられる機能はなさそうです。後で公開側からは直接には見えないようにしようと考えており、その意味でも内部ネットワークを使おうと考えています。

```
ersion: '3.7'

networks:
  extnet:
    name: my-external-net
  intnet:
    name: my-internal-net

(中略)

  cadvisor:
    image: google/cadvisor:latest
    restart: always
    networks:
      - intnet
    ports:
      - 8080
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    tty: true
    stdin_open: true

  prometheus:
    image: prom/prometheus
    command:
      - --config.file=/etc/prometheus/prometheus.yml
    restart: always
    networks:
      - extnet
      - intnet
    ports:
      - 9090:9090
    volumes:
      - '${CONF_DIR}/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml'
    links:
      - cadvisor
```

## prometheusの設定

prometheusは、自身の動作と、dockerコンテナ動作確認ができるよう指定します。

```
global:
  scrape_interval:     15s

  external_labels:
    monitor: 'ehw2018-monitor'

scrape_configs:
 - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'docker'
    scrape_interval: 5s
    static_configs:
      - targets:
        - cadvisor:8080

```


## 起動

Advent Calendar的には、すでに他のサービスが動いている状況なので、今回分だけupします。

```
$ sudo docker-compose up cadvisor prometheus
```

## 見た目とか

prometheusは、"exporter"から収集した値を"console"・"graph"の形で確認することができます。下図に、クエリを"container_cpu_system_seconds_total"として1分間隔で収集してグラフ化している様子を示します。（変動がないのは、執筆時に、特に何もしていなかったためです）

![prometheus_image.png](https://qiita-image-store.s3.amazonaws.com/0/65002/c6b331ab-de0e-c8bb-8b95-2e71a9a486a9.png)

## 注意

Prometheusは、[本家サイトのsecurityの記載にある通り](https://prometheus.io/docs/operating/security/)、単体では、特に認証は準備していません。このため、本シリーズにおいては、何かしらのミドルウェア経由で使うか、認証をするだけのリバースプロキシの後ろ側に置くかなどの対応をとる予定です。

# まとめ

このエントリでは、「Enterprise "hello, world" 2018 Advent Calendar 2018」(EHW2018)の14日目として、PrometheusとcAdvisorで、作った環境をモニタすることをトピックとして取り上げました。

EHW2018のネタとしては、このあと、今回作ったモニタリングの仕組みに認証をかけてから、そろそろアプリに着手したいと考えています。