CuteIP の sobadon です。 先日から、トラフィックや BGP 経路情報をまとめたダッシュボードを Grafana で構築して誰でも閲覧できる形で公開しています。
https://grafana.cute.ad.jp/d/eccd1c3c-e8dc-470f-a088-2344b40a6c43/overview?orgId=1
この Grafana は、予告なく停止されたり公開内容が変更されます。
本記事では、その Grafana と周辺環境に関して解説します。
概要
誰でも閲覧できるように公開している Grafana(以下、公開 Grafana)は、以下の要素から構成されています。
- Grafana
grafana.cute.ad.jp
にてホストされているもの- https://github.com/grafana/grafana
- VictoriaMetrics(Single Server)
- VictoriaMetrics VMAgent
- VictoriaMetrics VMAuth
公開 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_label
に org=private
もしくは org=public
が設定されたものを受け取って、そのラベルを追加して保持します。
メトリクスの参照
公開 Grafana がメトリクスを参照する箇所の概要図は以下の通りです。
Grafana
Grafana には Prometheus 形式で VMAuth を参照するようなデータソースが設定されています。さらにそれぞれのデータソースには公開・非公開を区別する Bearer Token が指定されています。
VMAuth と VMSingle
VMAuth はメトリクスの書き込み時と同様に、受信したクエリの Bearer Token を元に extra_label
を付与して VMSignle に流します。
VMSingle も同様に、extra_label
を元にラベルでフィルタしてクエリを実行し結果を返します。
まとめ
トラフィックや経路情報に関する Grafana をこちらにて公開しています。本記事では、その Grafana と周辺環境について解説しました。
今後は、公開する情報の種類を増やしていく予定です。
Prometheus ではなく VictoriaMetrics を利用しているのは長期間かつストレージ使用量を抑えてメトリクスを保持したいためです。 ↩︎
気楽に設定変更したときに誤って全部公開してしまうようなミスを防ぎたいと考えたためです。そういった単純なミスを防止さえすれば、Grafana は 1 つでその中の org さえ分離していればデータソースの公開範囲は制限できると思います。 ↩︎
https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#multitenancy ↩︎