BigQueryのクエリ結果をMackerelのメトリックとして取得するプラグインを作りました

背景

  • GCP単独でサービスを構築している場合、Cloud Monitoringはとても便利な監視のためのツールです
  • しかし、サービスをマルチクラウドで構築している場合、複数のクラウドサービスに監視の設定やダッシュボードを作っていく必要があり、面倒です
    • 自分が趣味で運用しているML-NewsもAWSとGCPを使って動いている
  • 一箇所に監視やダッシュボードを集めたい、というケースではMackerelが力を発揮します
    • 注意: 私はMackerelアンバダサーであり、バイアスが入っているとは思います
  • GCPで監視したい対象として、まず利用料金があります
    • GCPの利用料金はBigQueryにExportできます
    • これをMackerelでも見れるようにしたい
  • その他、BigQueryのデータセット内の主要なテーブルの行数の増加具合なども見たくなります
  • BigQueryのクエリ結果をMackerelに放り込めると便利なことが多そう

作ったもの

  • BigQueryのクエリ結果をMackerelのメトリックとして取得できるプラグインを作りました
    • mkrを使っている人はmkr plugin install syou6162/mackerel-plugin-bigquery-query-result-importer@v0.0.1でダウンロードできます

一般的なクエリだと色んな形式が想定できてしまい、Mackerelのメトリックとして表現しようがなくなってしまいます。よって、一番使いそうだったGROUP BYしたキーと集約された値をメトリックとして表現することにしました。こんな感じ。カラム名はLabelValueになるようにクエリを調整してください。

SELECT
  key AS Label,
  COUNT(*) AS Value
FROM
  my-project.my_dataset.my_table
GROUP BY
  key

例: GCPのサービス毎の今月の請求額を可視化する

具体例があると分かりやすいと思うので、みんな使いそうな例を。以下のクエリを--queryに食わせましょう(実際にconfに書くときは改行なしで書いてね)。BigQuery / GKEなどサービス毎に今月の請求額を積み上げグラフで可視化します。グラフではサービス毎に出しておいて、監視は式監視で設定しておくのがオススメです。AWSの費用とGCPの費用を合算したグラフをダッシュボードに出しといてもいいですね(Mackerelならではですね)。

SELECT
  service.description AS Label,
  SUM(cost) + SUM(IFNULL((SELECT SUM(c.amount) FROM UNNEST(credits) c), 0)) AS Value,
FROM
  `my-project.source__billing.gcp_billing_export_v1_xxxxxxxxxxxxxxxxxxx`
WHERE
  DATE(_PARTITIONTIME) BETWEEN DATE_TRUNC(CURRENT_DATE(), MONTH) AND LAST_DAY(CURRENT_DATE())
GROUP BY
  service.description

f:id:syou6162:20220205120416p:plain
GCPのサービス毎の今月の請求額を可視化した例

クエリの詳細については以下のドキュメントが参考になると思います。

注意点

使うのは簡単ですが、使う際はBigQueryのスキャン量に注意してください。mackerel-agentで使う場合、1分に一度クエリを実行しに行ってしまうので実行回数が多く、トータルでのスキャン量も多くなることが予想されます。オススメの使い方としては

  • グラフ定義を行なうときだけmackerel-agentを使う
  • メトリック投稿はmackerel-plugin-bigquery-query-result-importer --project_id my-project ... | mkr throwのようにmkr throwを使い、N時間に一度バッチ処理に挟む

というのがオススメです。用法用量を守って、楽しいMackerel & BigQuery生活をお楽しみください。