こんにちは!プロダクトの裏側で静かに、でも確実にユーザー体験を支えているエンジニアの皆さん。日々のエラーログとの格闘、本当にお疲れ様です。
突然ですが、こんな経験はありませんか?
「Sentryでエラー通知が飛んできた。でも、これって今すぐ対応すべき重大なバグなんだっけ? それとも、売上に全く影響しない些細な例外なんだっけ……?」
エラーのスタックトレースを見るだけでは、それが「ビジネスにどれだけのインパクトを与えているか」までは分かりません。エンジニアリングの目的は、単にエラーをゼロにすることではなく、ビジネスの価値を守り、最大化することです。
今回は、Sentryを単なる「エラーログ置き場」から「ビジネスの健康状態を測る羅針盤」へと進化させる秘密兵器、Sentryの「Metrics(カスタムメトリクス)」機能を徹底解説します。
これをマスターすれば、エラー発生時の「カート離脱率」や「トランザクション量」をリアルタイムで把握し、経営層やプロダクトマネージャーをうならせるレポートが作れるようになりますよ。さあ、一緒に扉を開けましょう!
—
1. Sentryの「Metrics」ってなんだろう?(基本のキ)
これまで、Sentryといえば「Exception(例外)」や「Message(ログ)」をキャッチするツールでした。もちろんそれだけでも強力ですが、これらはすべて「何かが壊れたとき」のデータです。
一方、Metrics(メトリクス)は、数値データを時系列で継続的に集計・監視する仕組みです。Sentryのカスタムメトリクスは、業界標準である StatsD の構文互換で作られています。
なぜ、エラー監視ツールで「ビジネス指標」を測るのか?
普通のモニタリングツール(DatadogやPrometheusなど)でもメトリクスは測れます。しかし、SentryのMetricsを使う最大のメリットは、「エラー」と「ビジネス数値(トランザクションやカート離脱)」が完全なコンテキスト(文脈)で紐づく点にあります。
- 「決済エラーが5件発生した(これまでのSentry)」
- 「決済エラーが5件発生した。その結果、直近10分間で30万円分のカート離脱(機会損失)が発生している(Sentry Metricsの力)」
この視点の違いが、あなたのエンジニアとしての価値を何倍にも高めてくれます。
—
2. 最速セットアップ:プロジェクトへの導入と基本設定
それでは、実際に手を動かして環境を整えていきましょう。今回は現代のWebアプリケーションの代表格である Node.js (TypeScript / Express) をベースに解説します。
Step 1: SDKのインストール
SentryのSDKは、バージョン7.x以降であればデフォルトでMetrics機能が組み込まれています。最新のパッケージをインストールしましょう。
npm install @sentry/node
Step 2: 初期化とMetrics設定
アプリケーションのエントリーポイント(`app.ts`など)でSentryを初期化します。ここがすべての起点です。
import as Sentry from “@sentry/node”;
// Sentryの初期化
Sentry.init({
dsn: “YOUR_SENTRY_DSN_HERE”,
// パフォーマンスモニタリングのサンプルレート
tracesSampleRate: 1.0,
// 環境の指定
environment: process.env.NODE_ENV || “development”,
});
console.log(“Sentry initialized with Metrics support!”);
たったこれだけです。特別なプラグインを追加する必要はありません。Sentry SDKは裏側で自動的にバッファリングと集計を行い、効率的にSentryのサーバーへメトリクスを送信してくれます。
—
3. HelloWorldを超えて:実践!カート離脱率とトランザクションの計測
ここからが本番です。ECサイトを想定し、「正常なトランザクション量」と「エラーによるカート離脱」をSentryのMetricsでトラッキングしてみましょう。
SentryのMetricsには主に以下の種類がありますが、今回は最もよく使う2つをマスターします。
1. Counter(カウンター): イベントの発生回数を数える(例:ボタンクリック、購入完了)
2. Distribution(ディストリビューション): 値の分布を測る(例:決済金額、処理時間)
以下のサンプルコードを見てください。
import as Sentry from “@sentry/node”;
import express from “express”;
const app = express();
app.use(express.json());
// 1. ユーザーがカートに商品を追加したときの処理
app.post(“/api/cart/add”, (req, res) => {
const { userId, itemId, price } = req.body;
try {
// 処理のシミュレーション…
// 【Counter】カート追加イベントをカウント (increment)
// 第一引数: メトリクス名 (形式: c:custom.metric_name@unit)
// 第二引数: 増分 (デフォルトは1)
// 第三引数: タグ (後でフィルタリングするため必須!)
Sentry.metrics.increment(“ecommerce.cart_added”, 1, {
tags: { item_category: “electronics” }
});
res.status(200).json({ success: true, message: “Cart updated” });
} catch (error) {
// エラー時の処理
Sentry.captureException(error);
res.status(500).json({ error: “Internal Server Error” });
}
});
// 2. 決済処理とエラー・カート離脱のトラッキング
app.post(“/api/checkout”, async (req, res) => {
const { userId, totalAmount } = req.body;
try {
// 決済処理でエラーが起きたと仮定
const isPaymentGatewayDown = Math.random() < 0.3; // 30%の確率で失敗するデモ
if (isPaymentGatewayDown) {
throw new Error("Payment Gateway Timeout");
}
// 【Counter】正常なトランザクション成功を記録
Sentry.metrics.increment("ecommerce.transaction_success", 1);
// 【Distribution】売上金額の分布を記録
Sentry.metrics.distribution("ecommerce.checkout_amount", totalAmount, {
unit: "dollar"
});
res.status(200).json({ success: true, message: "Checkout completed" });
} catch (error) {
// 【Counter】エラーによるカート離脱(機会損失)を記録!
Sentry.metrics.increment("ecommerce.cart_abandoned_due_to_error", 1, {
tags: { error_type: error instanceof Error ? error.message : "unknown" }
});
// 通常のエラートラッキングも同時に行う
Sentry.captureException(error);
res.status(502).json({
success: false,
message: "Checkout failed. Your cart is preserved."
});
}
});
app.listen(3000, () => {
console.log(“Server running on port 3000”);
});
—
4. 精度高い動作確認:データが届いているか確認する
コードを書いたら、実際にリクエストを飛ばして動作確認(HelloWorld)をしましょう。
cURLを使ったテスト送信
ターミナルから決済APIを何度か叩いて、意図的にエラーと成功を発生させます。
決済成功のテスト
curl -X POST http://localhost:3000/api/checkout \
-H “Content-Type: application/json” \
-d ‘{“userId”: “user_123”, “totalAmount”: 150}’
決済エラー(カート離脱)のテスト
curl -X POST http://localhost:3000/api/checkout \
-H “Content-Type: application/json” \
-d ‘{“userId”: “user_456”, “totalAmount”: 300}’
Sentryダッシュボードでの確認
1. Sentryの管理画面にログインします。
2. 左側メニューの 「Metrics」(または Discover / Dashboards 内)を開きます。
3. 先ほどコード内で指定した `ecommerce.cart_abandoned_due_to_error` や `ecommerce.checkout_amount` がグラフとしてリアルタイムに描画されていることを確認してください。
もしデータが表示されない場合は、Sentry SDKの初期化が正しく行われているか、またバッファがフラッシュされるまで数秒〜数十秒待つ必要がある点に注意してください(Sentryはネットワーク負荷を抑えるため、メトリクスを一定時間バッファリングして送信します)。
—
5. 【極限の知見】エラー相関分析でビジネスを守る
ここからが、伝説のオブザーバビリティ・アーキテクトからの伝授です。
SentryのMetricsを集めるだけでは、まだ「半人前」です。真骨頂は、「エラーとビジネス指標の相関をダッシュボード上で可視化し、アラートを自動化すること」にあります。
1. ダッシュボードの構築テクニック
Sentryの「Dashboards」機能を使って、以下のウィジェットを1つの画面に並べてみてください。
- Widget A(時系列グラフ): `rate(ecommerce.cart_abandoned_due_to_error)` (エラー起因の離脱数)
- Widget B(時系列グラフ): `rate(ecommerce.transaction_success)` (正常な売上数)
- Widget C(Issues): 直近発生している決済関連のエラーリスト
この画面をチームのモニター(またはSlack連携)に常時映しておくだけで、「あ、今カート離脱のメトリクスが跳ね上がったぞ。原因はあのAPIのタイムアウトエラーだな」と、ユーザーからの問い合わせが来る前に障害を察知できるようになります。
2. アラートの閾値設定の極意
エラーの「回数」だけでアラートを設定していませんか? それは夜中にエンジニアを起こす「ノイズの嵐」を生む原因になります。
次のように、ビジネス指標をベースにしたアラートを設定しましょう。
- 悪しきアラート: 「`Payment Gateway Timeout` エラーが10回発生したら通知」
- 神アラート: 「過去5分間の `ecommerce.cart_abandoned_due_to_error` が、正常な `ecommerce.transaction_success` の割合に対して 20%を超えた場合にSlackへ緊急通知」
これこそが、ビジネスインパクトに基づいた真のオブザーバビリティです。開発チームは「ただのバグ修正者」から「プロダクトの収益を守る守護神」へと進化します。
—
まとめ
今回は、Sentryの「Metrics」機能を使ったカスタムビジネス指標のトラッキングと、エラー相関分析の基礎から実践までを解説しました。
- Sentryは単なるエラーログツールではなく、Metricsを組み合わせることでビジネスインパクトを測る強力な武器になる。
- `Sentry.metrics.increment` や `distribution` を使って、コードの要所にトランザクションや離脱データを埋め込む。
- エラーとビジネス数値を紐づけたダッシュボードとアラートを作り、ノイズのない健全な監視体制を作る。
これをマスターすれば、毎日のエラー対応に追われるだけの作業が、「プロダクトの品質と売上をコントロールする」エキサイティングな仕事へと劇的に変わります。
さあ、今日のデプロイから、あなたのコードにビジネスの文脈を刻み込みましょう!