📘

Grafana のデータソース乱立を解決。BigQuery で DB 可視化を一本化する federated queries 術

に公開

概要

本記事では、Grafana でマネージド Relational Database (以下、マネージド RDB) を効率よく可視化する方法を紹介します。
BigQuery の外部接続機能を利用して Cloud SQL for PostgreSQL のデータに接続し、Grafana で可視化します。
この構成では、BigQuery の federated queries(EXTERNAL_QUERY)を用いるため、クエリ内の接続名を変更するだけで、可視化の対象となるデータベースを簡単に切り替えられるというメリットがあります。

はじめに

データドリブンな意思決定が不可欠となっている現代において、データベースに蓄積された情報をいかに効率的に可視化し、分析につなげるかは重要な課題です。Grafana はその強力な可視化ツールの一つとして広く利用されていますが、マネージド RDB との連携においてはいくつかの課題が存在します。
その課題を解決すべく、今回は Grafana で BigQuery をデータソースとして選択し、BigQuery の機能を利用しマネージド RDB を可視化していきます。

本記事のアーキテクチャと前提

今回のアーキテクチャについて

本記事では、下図のように Grafana が Google Kubernetes Engine (以下 GKE) 上に構築されている環境を前提として解説します。
GKE 上で稼働する Grafana が、BigQuery をデータソースとして参照し、BigQuery の federated queries 機能を通じて Cloud SQL for PostgreSQL のデータを可視化します。
architecture
今回のアーキテクチャ

この構成の鍵となるのが、GKE の認証機能である Workload Identity です。Workload Identity を利用することで、サービスアカウントキーのような静的な認証情報を必要とせず、Grafana から BigQuery へ安全に接続できます。
読者がこの記事を再現するためには、以下の前提知識と環境が必要となります。

  • GKE クラスタが構築済みであること。
  • GKE クラスタで Workload Identity が有効になっていること。
  • Grafana を GKE 上にデプロイする方法を知っていること。
    この記事では、Grafana が GKE 上にデプロイされた後の、データソース設定に焦点を当てて解説を進めます。

Grafana とは

多様なデータソースからメトリクス、ログ、トレースなどのテレメトリーデータを収集し、それらを視覚化・分析・アラート通知できるオープンソースのモニタリングツールです。
特徴としては、Prometheus や BigQuery、MySQL、PostgreSQL など多くのデータソースと接続することが可能です。それにより、異なるシステムやサービスのデータを一元的に表示・分析することが可能になります。Grafana Cloud で SaaS 提供もされていますが、オープンソースでの利用も可能なため基本的に無料であることも魅力の一つです。

BigQuery の federated queries とは

BigQuery のストレージにデータをロードすることなく、外部のデータソースに対して直接クエリを実行できる機能です。クエリの相手先がデータベースエンジンであり、相手先のコンピュートリソースを使って処理された結果を BigQuery が受け取るという仕組みです。

要するに、PostgreSQL などにあるデータをわざわざ BigQuery に移行することなく直接クエリをすることができます。
そうすることで、移行の手間の排除やリアルタイムのデータの参照、BigQuery のストレージにデータを複製する必要がないため、ストレージコストを抑えることができます。

Workload Identity とは

Kubernetes のサービスアカウントなどの外部ワークロードに、Google Cloud のサービスアカウントの権限を付与する仕組みです。
これによって、GKE 上の Pod は、紐づけられた Google Cloud サービスアカウントとして振る舞うことができ、キーファイルを Pod 内に保持する必要がなくなります。
Workload Identity を利用することで、セキュリティの向上と管理の簡素化を実現することができます。

Grafana でマネージド RDB をデータソースにする際の課題

Grafana では Google Cloud のマネージド RDB である Cloud SQL もデータソースとして選択することができます。
しかし、RDB をデータソースとして選択する際のデメリットが2点あります。

ひとつめは、Grafana 内でマネージド RDB のデータソースを作成すると可視化したいデータベースが増えるごとにデータソースを作成しなければならず、管理が煩雑になってしまうという点です。
画像のように Grafana の仕様上、データソースを選択するにはデータソース一覧をスクロールするか検索をかけるしかありません。ちょっとした手間のように感じますが、実際触っているとかなりの手間に感じると思います。
Grafana-datasource
参考画像

ふたつめは、Grafana でマネージド RDB をデータソースとして設定する際に、connection の設定や TLS/SSL Auth Details の設定と接続するのに複数の情報が必要になりマネージド RDB 側にも変更を加えなければならないため、手間がかかってしまいます。これをデータベース毎に行う必要があります。
Grafana-connection
参考画像

解決策

接続の手間やデータソースが乱立してしまう問題を解決する方法として、マネージド RDB をデータソースとして選択するのではなく、BigQuery をデータソースとして選択する という方法があります。

この構成の最大のポイントは、Grafana からの接続先が BigQuery のみに集約されている点です。これにより、可視化対象のデータベースが増えても Grafana 側のデータソース設定を変更・追加する必要がなくなり、管理が非常にシンプルになります。

しかし、データソースを BigQuery にしたとしてもそのままではマネージド RDB を可視化することはできません。BigQuery の機能である「外部接続」を作成しそれに対して、federated queries をすることでデータソースを BigQuery にしてマネージド RDB を可視化することができます。
文章だけでは非常に面倒に見えますが、実際にはとても簡単です。

Grafana でデータソースを BigQuery にし、マネージド RDB を可視化する手順は以下です。

  1. Grafana 側で BigQuery のデータソースを作成する
  2. BigQuery 側でマネージド RDB への外部接続を作成する
  3. Grafana 側で BigQuery をデータソースとして選択する
  4. Grafana 側で federated queries を行い EXTERNAL_QUERY で可視化したいマネージド RDB のデータベースを選択する

順を追って説明していきます。

Grafana 側で BigQuery のデータソースを作成する

Grafana で BigQuery をデータソースとして設定する際に記載しなければいけないものはデータソースの名称のみです。
マネージド RDB で必要だった connection 設定などが一切不要になります。

名称を決め、設定画面の下にある「Save & test」を押せば設定完了です。
BigQuery-setting
参考画像

BigQuery 側でマネージド RDB への外部接続を作成する

BigQuery のコンソール画面でデータ追加を選択します。外部接続したいマネージド RDB (PostgreSQL 等)を検索し「外部データへのアクセス」内にある「BigQuery フェデレーション」を選択し、必要な情報を記入します。
BigQuery-setting-screen
参考画像

必要な情報は以下です。

  • Cloud SQL 接続名
    接続名は Cloud SQL の概要にある「このインスタンスとの接続」という場所に記載があります。
    BigQuery-setting-screen
    参考画像

  • ロケーションタイプ
    今回はシングルリージョンで asia-northeast1 (東京) を選択します。
    特別な理由がない限り Cloud SQL が存在しているリージョンと同じにするのが良いです。
    詳しい内容は以下の公式ドキュメントを参考にしてください。
    連携クエリの概要

  • データベース名
    接続した Cloud SQL の可視化したいデータベース名を記入します。

  • データベース ユーザー名
    接続した Cloud SQL で設定しているデータベースにログインできるユーザー名を記入します。

  • データベース パスワード
    可視化したいデータベースに入るために設定したパスワードを記入します。

BigQuery-setting-screen
参考画像

以上を記入すれば外部接続の設定は完了です。

サービスアカウントに権限を追加する

外部接続の作成が完了するとサービスアカウントが発行されます。
そのサービスアカウントに「SQL クライアント」ロールを付与することで BigQuery からマネージド RDB に接続することができます。
BigQuery-setting-screen
参考画像

Grafana 側で BigQuery をデータソースとして選択し可視化する

これで基本的な設定は終わったので実際に Grafana でデータソースを BigQuery にしマネージド RDB を可視化していきます。
外部接続したデータベースに対してクエリするには federated queries という機能を利用します。利用する方法としては、クエリ文に EXTERNAL_QUERY を含めればいいだけです。
以下は「データベース内に存在するテーブルの一覧情報」を可視化するためのクエリ文です。

SELECT * FROM EXTERNAL_QUERY("projectid.locationname.databasename", "SELECT * FROM INFORMATION_SCHEMA.TABLES;");

実際に私は、Redmine で管理しているチケットを種別ごとに可視化をしています。
BigQuery-setting-screen

EXTERNAL_QUERY に関する詳しい内容はこちらを参考にしてください

外部接続の設定をデータベース毎に行えば、projectid.locationname.databasenamedatabasename のみを変更するだけで可視化したいデータベースを変更することができます。よって、Grafana 内でマネージド RDB を可視化するデータソースを BigQuery で統一できるのです。
BigQuery-Datasource
参考画像

まとめ

本記事では、Grafana で複数のマネージド RDB を可視化する際に生じる、データソース管理の煩雑さや設定の手間といった課題を、BigQuery の federated queries を用いて解決する方法を紹介しました。
このアプローチの最大の利点は、Grafana のデータソースを BigQuery に一本化できる点にあります。BigQuery 側で各データベースへの外部接続を一度設定してしまえば、Grafana からは EXTERNAL_QUERY 関数の接続先情報を変更するだけで、複数のデータベースをシームレスに切り替えて可視化できます。これにより、データベースを追加するたびに Grafana でデータソースを作成・設定する手間が不要になり、管理コストを大幅に削減できます。

また、データを BigQuery に複製することなく、マネージド RDB 上のリアルタイムデータに直接クエリを実行できるため、鮮度の高い情報を即座に分析に活用できる点も大きなメリットです。

データソースが乱立していることに悩んでいる方や、より効率的なデータ可視化基盤を構築したいと考えている方にとって、本記事で紹介した BigQuery をデータソースとするアーキテクチャは非常に有効な選択肢となるでしょう。

Discussion