@buzztaiki です。Qiita に記事を書くのは5年ぶりくらいです。
さて、Grafana で kubernetes-mixin を使って Kubernetes を監視してる人なら見た事があると思いますが、この mixin が提供するダッシュボードには複数の指標を組み合わせて作られたテーブルがあります。↓こんなやつです。
よくよく考えると PromQL では join しても値は一つにしかならないので、どうやって実現しているのか不思議に思う人もいるかもしれません。実は Grafana 側で join させるような事をやっているんですが、世の中を探してもあまり HowTo 的な記事があまり見つかりません。見つからないので、この記事では Grafana で複数の指標からテーブルを作る方法について解説してみます。
この記事の対象になる人
こんな人を対象にしてます。Grafana が分からなかったり PromQL が書けない人は対象外です。
- Grafana で時系列グラフのダッシュボードが作れる
- PromQL が書ける
- 複数の指標を組み合わせたテーブルを作りたい、または仕組みに興味がある
この記事で使っているコンポーネントのバージョン
- kube-prometheus-stack 79.11.0
- Grafana: 12.3.0
- kubernetes-mixin: 1.3.0
この記事で作るダッシュボード
この記事では 「Kubernetes / Compute Resources / Namespace (Workloads)」のダッシュボードを全 namespace 分表示するテーブルがあるダッシュボードを作ってみます。最終的にはこんなものができます。
複数指標からなるテーブルの作り方
それでは作ってみましょう。ダッシュボードを作ったら、まずは変数を定義します。datasource と namespace を選択できるようにしておきます。
Visualization を追加して [Table] を選びます。
まずは Pod 数 のクエリーを追加します。設定は以下のように:
- 名前:
POD_COUNT - Format:
Table - Type:
Instant - クエリー:
count(namespace_workload_pod:kube_pod_owner:relabel{namespace=~"$namespace"}) by (namespace, workload, workload_type)
そうするとこうなります。
次に CPU 使用量のクエリーを追加します:
- 名前:
CPU_USAGE - Format:
Table - Type:
Instant - クエリー:
sum( max by (namespace, pod, container)(rate(container_cpu_usage_seconds_total{namespace=~"$namespace", image!=""} [5m])) * on(namespace, pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=~"$namespace"} ) by (namespace, workload, workload_type)
このままだと以下のようになって、CPU 使用量がテーブルに出てこないですね:
ここで Grafana の機能を使います。[Transform] タブで [Merge series/tables] を選択してください:
Merge series/tables は複数のクエリーから共通のラベルを外部結合してくれるやつです。詳細は 公式ドキュメント を見てください。
Transform を追加すると、Pod 数の横に CPU 使用量が出てきました:
このまま CPU 要求、CPU 要求% も追加します:
- CPU 要求
- 名前:
CPU_REQ - Format:
Table - Type:
Instant - クエリー:
sum( max by (namespace, pod, container)(kube_pod_container_resource_requests{namespace=~"$namespace", resource="cpu"}) * on(namespace, pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=~"$namespace"} ) by (namespace, workload, workload_type)
- 名前:
- CPU 要求%:
- 名前:
CPU_REQ% - Format:
Table - Type:
Instant - クエリー:
sum( max by (namespace, pod, container)(rate(container_cpu_usage_seconds_total{namespace=~"$namespace", image!=""} [5m])) * on(namespace, pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=~"$namespace"} ) by (namespace, workload, workload_type) / sum( max by (namespace, pod, container)(kube_pod_container_resource_requests{namespace=~"$namespace", resource="cpu"}) * on(namespace, pod) group_left(workload, workload_type) namespace_workload_pod:kube_pod_owner:relabel{namespace=~"$namespace"} ) by (namespace, workload, workload_type)
- 名前:
これで複数指標からなるテーブルができました。ここまででこの記事の目的は達成できました。分かってしまえば簡単ですね。
見た目を整える
パネルの field overrides を使ってカラムごとに見た目を整えます。が、伝えたい事は伝えたし、スクショが面倒くさくなっちゃったので、これ をインポートしてからパネルで Show only overrides してください。
オーバーライドしてる属性だけ書いておくとこんな所です:
- 項目名
- 数値のフォーマット
- グラフ表示
-
Cell type: セルをグラフにしたりする
- Gauge: グラフを出す
- Max: グラフの位置を決める
- Thresholds: 赤くする閾値
-
Cell type: セルをグラフにしたりする
- リンク
- Data links: 行の値を使って他のダッシュボードにリンクさせる
おわりに
この記事では Grafana で複数の指標からテーブルを作る方法についてざっと解説してみました。Grafana の視覚化機能は色々できて楽しいんですが、公式に分かりやすい解説があまりないのが困りものですね。色々触って試してみてください。
この記事は Sensyn Robotics Advent Calendar 2025 の記事でした。明日は @andy1dx さんの「DJI Dockでクラウド越しにドローンをリアルタイム制御する方法(MQTT編)」です。









