こんにちは。Mackerelでアプリケーションエンジニアをやっている id:ne-sachirou です。
各種のデータベース(以下、DB)から自由にクエリした結果をMackerelに投稿できるツール「mackerel-sql-metric-collector」を紹介します。
何ができるツールか
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
サービスメトリックが投稿されました。

やりましたね。
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を入れたコンテナをデプロイし、上記のコマンドを定期実行しています。

mackerel-sql-metric-collectorでSLIを計測している例は以下の記事でも紹介しています。
DBやログからメトリックを集計して確認したい場面はいろいろとあるのではないでしょうか。ぜひmackerel-sql-metric-collectorを使ってみてください。
[PR] Mackerel Meetup #14 Tokyo を開催します
Mackerel Meetup #14 Tokyoを2023年7月11日(火)に開催します。Mackerelの開発状況の共有や情報交換を行うオフラインイベントが4年ぶりに帰ってきました! Mackerelユーザーによるご講演もあります。ぜひご参加ください。
会場にてお待ちしておりますので、ぜひ実際に利用されている皆様のお声をお聞かせください!