🔥

Prometheus初心者がとりあえずやってみる

2020/12/18に公開

はじめに

こんにちは、
私は特に運用周りなど詳しくない一般的な開発者です。
この度、少しPrometheusさんを少し触る機会があったのでここに駄文でまとめておこうと思います。
よろしくおねがいします。

概要

PrometheusはZabbix等と同様に運用用の監視ソフトウェアです。
仮想マシンなどを監視し、CPU利用率やメモリの利用率などを管理します。
Prometheusはリッチなグラフ表示環境などは無いらしく、Grafanaというグラフ表示ソフトを利用するのが一般的です。
また、コンピュータの情報を収集するExporterというのを、監視対象のパソコンにインストールすることも必要です。

構成は下記のようなイメージです。

Exporter

Exporterは色々な種類があるらしく、私はnode_exporterというやつを使いました。
これは9100ポートに常駐し、そこにアクセスしに来た人にコンピュータの情報を教えてくれる役割をします。
完全待受型で動作することに注意です。

Prometheus

Exporterさんは待ち受けるため、Prometheusさんは呼びに行く必要があります。
なので基本的に呼び出せる場所にPrometheusさんが存在する必要があります。

同一ネットワーク内か、監視対象のパソコンがグローバルなIPでサポートする必要があるということですね…
(めんどくさい…)
監視対象が増えたり減ったりする場合も対象の場所を知る必要があります。

このときに使うのがService Discoveryという機能です。
これは(基本的に)対象パソコンが属する管理システムにアクセスし、パソコンが増えたことや場所を随時知ることが出来ます。

設定方法はここにあります。
https://prometheus.io/docs/prometheus/latest/configuration/configuration/
よく使いそうなのは、AWSやGCP、Azure、kubernetesあたりでしょうか。

設定ファイル

上の説明でも出ましたがPrometheusさんは基本的には設定ファイルで管理されます。
prometheus.ymlというファイルです。
これは名前の通り、yaml形式で提供されていて、下記のイメージで記載します。

global:
  scrape_interval:     15s # By default, scrape targets every 15 seconds.

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

参考:https://prometheus.io/docs/prometheus/latest/getting_started/

この中で、接続するコンピュータの設定が記載されているのがこの部分です。

  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090']

静的な監視対象の追加

この参考設定ではローカルで動いているPrometheusの様子を見るためにlocalhost:9090というPrometheusの標準サポートなエンドポイントを指定しています。
もちろん、下記のようにExporterの場所を指定することも可能です。

  - job_name: 'prometheus'

    # Override the global default and scrape targets from this job every 5 seconds.
    scrape_interval: 5s

    static_configs:
      - targets: ['localhost:9090',192.168.10.100:9100]

この例では192.168.10.100にExporterをインストールしたパソコンが存在するイメージで記載しています。
静的な監視対象であればこのように追加していけば確認できます。

動的な監視対象の追加

さて、問題は動的な監視対象の追加です。
設定ファイルの情報を見てみると下記のような設定がサポートされています

azure_sd_configs:Microsoft Azure VMの設定
ec2_sd_configs:Amazon Web Service EC2の設定
gce_sd_configs:Google Cloud PlatformのGCEの設定 
kubernetes_sd_configs: kubernetesの設定

このあたりがAWSやらなんやらの動的な設定方法になります。
今回はkubernetesに関して見てみましょう。

対象をserviceやnode,pod,endpointsなどから選び、その中から絞ったり、除外したりして、管理するイメージです。(IPTablesに近い感じですね。)

下記の設定でnamespace=defaultのすべてのpodを対象にします。

- job_name: 'kubernetes-pods'
  kubernetes_sd_configs:
  - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_namespace]
    action: keep
    regex: default

色々と組み合わせて対象を絞ったり、監視対象にラベル付けして管理することも出来ます。
この辺の詳しい部分は公式のものか詳しく書かれているのを参考にしてもらえると幸いです。

駄文で申し訳ないです。
時間があれば別記事でDocker内で環境を構築してグラフを見るところまでやってみたいと思います。
ありがとうございました。

Discussion