トラフィックや経路情報に関する Grafana を公開 + 周辺環境解説

CuteIP の sobadon です。 先日から、トラフィックや BGP 経路情報をまとめたダッシュボードを Grafana で構築して誰でも閲覧できる形で公開しています。

https://grafana.cute.ad.jp/d/eccd1c3c-e8dc-470f-a088-2344b40a6c43/overview?orgId=1

この Grafana は、予告なく停止されたり公開内容が変更されます。

本記事では、その Grafana と周辺環境に関して解説します。

公開している Grafana ダッシュボードのスクリーンショット

概要

誰でも閲覧できるように公開している Grafana(以下、公開 Grafana)は、以下の要素から構成されています。

公開 Grafana を構築するにあたって、その公開 Grafana から内部用監視基盤にある非公開にしておきたいメトリクスにアクセスできないように注意しました。

非公開な内部用の監視基盤は VictoriaMetrics1 と VMAgent、VMAuth、内部用 Grafana から構成されています。 このとき、公開用と非公開用それぞれ別個の Grafana で配信して、そこから 1 つの VictoriaMetrics を参照するというやりかたも考えられます。 しかし、公開 Grafana からデータソースとして内部監視用の VictoriaMetrics を直接参照すると、公開 Grafana を介してそのデータソースに任意のクエリを実行できてしまい、結果として非公開にしておきたいメトリクスが閲覧されてしまいます。 他には、org で公開用と非公開用を分離して 1 つの Grafana で配信する方法も考えられます。 この方法に関しては、設定ミスで匿名ユーザーを本来とは異なる org に設定してしまう2という懸念があり、Grafana 自体を分離する形としました。

メトリクスの収集

公開 Grafana で参照されるメトリクスは、VictoriaMetrics Single Server(以下、VMSignle)に書き込まれています。この VMSingle はリソースの都合上、公開・非公開なメトリクスの両方を保持しています。

VMSingle における各メトリクスの公開範囲(擬似的なテナント)の分離は、それを示すラベルを付与することで実現されました。 なお Single Server ではなく Cluster の VictoriaMetrics ではテナント分離に対応しています3 がシンプルに構築するため Single Server を利用しています。 メトリクスを VMSingle に書き込む箇所の概要図は以下の通りです。VMSingle や VMAuth、VMAgent の役割については省略します。

メトリクス収集の概要図

VMAgent

1 つの VMAgent が公開・非公開用の 2 つの remote write と各 remote write に対応する relabel config と bearer token を持っています。

まず、VMAgent は --promscrape.config にて指定された設定ファイルを元に scrape します。

次に、得られたメトリクスは各 remote write の設定(-remoteWrite.urlRelabelConfig)にしたがって処理された上で、リクエストの Authorization ヘッダーに -remoteWrite.bearerTokenFile の Bearer Token が指定されて -remoteWrite.url 宛に remote write されます。具体的なオプションの値は以下の通りです。 このとき、擬似的なテナント分離を実現するため Bearer Token ファイルには異なる値が書かれたファイルを設定しています。 本構成において VMAuth は 1 つで十分なので、-remoteWrite.url は同一になります。

# private
-remoteWrite.url=http://vmauth.example:8247/api/v1/write
-remoteWrite.bearerTokenFile=private_bearer_token.txt
-remoteWrite.urlRelabelConfig=private_relabel_config.yaml

# public
-remoteWrite.url=http://vmauth.example:8247/api/v1/write
-remoteWrite.bearerTokenFile=public_bearer_token.txt
-remoteWrite.urlRelabelConfig=public_relabel_config.yaml

relabel config については、非公開(private)用のは空で、公開(public)用のは以下のような YAML ファイルを指定して必要なメトリクスのみに絞り、必要に応じてラベルの値を変更しています。

# action: keep は AND で結ばれる
# keep 用のラベルを用意して、必要なものにはそのラベルを付与していき、最終的にそれで keep か否かを判断する
# 参考:
# https://www.robustperception.io/or-in-relabelling/
# https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3148

# BGP 経路数
- source_labels: [__name__, proto, name]
  regex: bird_protocol_prefix_import_count;BGP;.+_transit_.+
  target_label: __tmp_keep_me
  replacement: true

# === 対外接続トラフィック量 ===
- action: replace_all
  source_labels: ["device"]
  target_label: device
  regex: ^ethsecret$
  replacement: redacted-external1

# 2. BGP ルーター対外接続に利用している device(redacted 始まり)のメトリクスのみ keep
- source_labels: [__name__, instance, device]
  regex: node_network_(receive|transmit)_(bytes|packets)_total;cute-jp08-site2-node(4|11);redacted.+
  target_label: __tmp_keep_me
  replacement: true

# 最後に keep
- source_labels: [__tmp_keep_me]
  regex: true
  action: keep

VMAuth

VMAuth は、まず VMAgent から remote write を受け取って、Bearer Token に対応した宛先 url_prefix を取得してそこへさらに remote write します。 --auth.config にて指定される VMAuth の設定例は以下の通りです。extra_labelで強制的に追加するラベルを設定してそれで擬似的なテナント分離を実現しています。

users:
  - name: public
    bearer_token: public
    url_prefix: "http://vmsingle.example:8428?extra_label=org=public"

  - name: private
    bearer_token: private
    url_prefix: "http://vmsingle.example:8428?extra_label=org=private"

この例では、信頼された閉じられたネットワークに VMAuth などが存在するとしてシンプルな値を指定しています。この場合だと、VMAuth のレイヤーが存在しなくても良いものの今後のことを考えてそれを挟むようにしています。

VMSingle

VMSignle は、VMAuth から extra_labelorg=private もしくは org=public が設定されたものを受け取って、そのラベルを追加して保持します。

メトリクスの参照

公開 Grafana がメトリクスを参照する箇所の概要図は以下の通りです。

メトリクス参照の概要図

Grafana

Grafana には Prometheus 形式で VMAuth を参照するようなデータソースが設定されています。さらにそれぞれのデータソースには公開・非公開を区別する Bearer Token が指定されています。

VMAuth と VMSingle

VMAuth はメトリクスの書き込み時と同様に、受信したクエリの Bearer Token を元に extra_label を付与して VMSignle に流します。

VMSingle も同様に、extra_label を元にラベルでフィルタしてクエリを実行し結果を返します。

まとめ

トラフィックや経路情報に関する Grafana をこちらにて公開しています。本記事では、その Grafana と周辺環境について解説しました。

今後は、公開する情報の種類を増やしていく予定です。


  1. Prometheus ではなく VictoriaMetrics を利用しているのは長期間かつストレージ使用量を抑えてメトリクスを保持したいためです。 ↩︎

  2. 気楽に設定変更したときに誤って全部公開してしまうようなミスを防ぎたいと考えたためです。そういった単純なミスを防止さえすれば、Grafana は 1 つでその中の org さえ分離していればデータソースの公開範囲は制限できると思います。 ↩︎

  3. https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy ↩︎

Built with Hugo
テーマ StackJimmy によって設計されています。