各種のデータベースから自由にクエリした結果をMackerelに投稿できるツール「mackerel-sql-metric-collector」を紹介します - Mackerel Meetup復活記念連載 #7

こんにちは。Mackerelでアプリケーションエンジニアをやっている id:ne-sachirou です。

各種のデータベース(以下、DB)から自由にクエリした結果をMackerelに投稿できるツール「mackerel-sql-metric-collector」を紹介します。

何ができるツールか

github.com

mackerel-sql-metric-collectorは、SQLを扱えるさまざまなDBから値を集約し、その値をメトリックとしてMackerelに投稿するツールです。本記事執筆時点(2023年7月)では以下のDB製品に対応しています。

  • PostgreSQL
  • MySQL
  • SQLite3
  • Amazon Athena
  • BigQuery

使ってみる

さっそく試しに、PostgreSQLから値を集計してMackerelにメトリックを投稿してみましょう。usersというテーブルがあり、このテーブルの行数をユーザー数としてusers.countというサービスメトリックを投稿したいとします。

まずmackerel-sql-metric-collectorのバイナリをビルドします。

git clone https://github.com/mackerelio-labs/mackerel-sql-metric-collector.git
cd mackerel-sql-metric-collector
make

これでbin/mackerel-sql-metric-collectorにバイナリが生成されます。

次にYAML形式の設定ファイルを用意し、テーブルの行数を取得するSQLクエリ文と、クエリした結果をどのサービスに何というメトリック名で投稿するかを書きます。ここではSELECT COUNT(id) AS user_count FROM usersというSQLを実行し、exampleサービスのusers.countというメトリック名にしています。valueKeyの設定で、Mackerelのメトリック名countとクエリ結果のカラムuser_countを対応付けています。

YAML=$(cat <<YAML
---
- keyPrefix: users
  service: example
  valueKey:
    count: user_count
  sql: |-
    SELECT
      COUNT(id) AS user_count
    FROM
      users
YAML
)

echo "$YAML" > queries.yml

最後に次のようにmackerel-sql-metric-collectorを実行します。YOUR_DB_NAMEにはPostgreSQLのデータベース名を、****にはMackerelの対象オーガニゼーションのAPIキー(書き込み権限あり)をそれぞれ入れてください。

bin/mackerel-sql-metric-collector \
  -dsn "postgres://dbname=YOUR_DB_NAME sslmode=disable" \
  -mackerel-apikey "****" \
  -query-file queries.yml

exampleサービスにユーザー数を示すusers.countサービスメトリックが投稿されました。

users.countメトリック値として2がグラフに示されている
サービスメトリックが描画されたグラフ

やりましたね。

Mackerelチームでの使用例

Mackerelチームではmackerel-sql-metric-collectorを以下のような用途に使っています。

  • KPIのような、機能の利用状況を見る
  • Amazon AthenaからログをクエリしてSLIを算出する

集計するたびにコマンドを手で実行するのは面倒ですから、AWS上にデプロイして実行しています。

投稿先サービスやDSNはコマンドオプションの代わりに環境変数でも指定可能です。たとえばMackerelのAPIキーはAWS Systems Managerのパラメータストアから、YAML設定のquery-fileはAmazon S3から取得するよう設定できます。これをコマンドで表すと以下のようになります(***はそれぞれ環境に合わせて置き換えてください)。

DEFAULT_SERVICE="***" \
DSN="***" \
MACKEREL_APIKEY="ssm://****" \
QUERY_FILE="s3://***.yaml" \
  bin/mackerel-sql-metric-collector

AWS Lambdaにmackerel-sql-metric-collectorを入れたコンテナをデプロイし、上記のコマンドを定期実行しています。

Lambdaでmackerel-sql-metric-collectorを定期的に呼び出しメトリックを投稿
アーキテクチャ

mackerel-sql-metric-collectorでSLIを計測している例は以下の記事でも紹介しています。

mackerel.io

DBやログからメトリックを集計して確認したい場面はいろいろとあるのではないでしょうか。ぜひmackerel-sql-metric-collectorを使ってみてください。

[PR] Mackerel Meetup #14 Tokyo を開催します

Mackerel Meetup #14 Tokyoを2023年7月11日(火)に開催します。Mackerelの開発状況の共有や情報交換を行うオフラインイベントが4年ぶりに帰ってきました! Mackerelユーザーによるご講演もあります。ぜひご参加ください。
会場にてお待ちしておりますので、ぜひ実際に利用されている皆様のお声をお聞かせください!

mackerelio.connpass.com