Sentry

監視プラットフォームエラートラッキングパフォーマンス監視アプリケーション監視デバッグ可観測性

監視プラットフォーム

Sentry

概要

Sentryはリアルタイムエラートラッキングとアプリケーションパフォーマンス監視に特化したプラットフォームです。エラーの詳細な集約・分析により、アプリケーション品質向上をサポートし、エラー監視分野でトップクラスの精度と詳細性を誇ります。開発チームの生産性向上に直結する機能で開発者から高い支持を獲得しています。

詳細

Sentryはエラートラッキングとパフォーマンス監視の専門プラットフォームとして、「一つのことを非常によく行う」哲学に基づいて設計されています。

主要機能

  • リアルタイムエラートラッキング: 詳細なスタックトレースとコンテキスト情報
  • パフォーマンス監視: トランザクション追跡とパフォーマンス分析
  • リリース監視: デプロイメント追跡とリリース品質分析
  • イシューアラート: スマートなアラートとノイズ削減
  • ソースマップサポート: JavaScriptの詳細なエラー解析
  • 統合機能: Slack、GitHub、Jira等との豊富な統合
  • チーム協働: エラーの割り当て、解決ワークフロー

技術的特徴

  • 多言語サポート: 30以上のプログラミング言語とフレームワークに対応
  • セッションリプレイ: ユーザーセッションの完全な再現
  • リアルタイム通知: エラー発生時の即座の通知
  • 詳細なコンテキスト: ユーザー、デバイス、環境情報の収集
  • 高精度のフィルタリング: ノイズの少ない意味のあるアラート

メリット・デメリット

メリット

  • エラー監視分野で業界最高レベルの精度と詳細性
  • 開発者に優しい直感的なインターフェース
  • 無料ティアが充実しており小規模プロジェクトでも利用可能
  • セットアップが非常に簡単
  • 豊富な言語とフレームワークサポート
  • 強力なデバッグ機能とコンテキスト情報
  • オープンソース版も利用可能

デメリット

  • インフラストラクチャ監視機能は限定的
  • ログ管理機能が他の総合プラットフォームより弱い
  • 大規模環境でのコスト増加
  • エラー以外のメトリクス収集は別ツールが必要
  • 限定的なカスタムダッシュボード機能

参考ページ

設定・監視例

基本セットアップ

// JavaScript/Node.js でのSentry初期化
import * as Sentry from "@sentry/node";

Sentry.init({
  dsn: "YOUR_DSN_HERE",
  tracesSampleRate: 1.0, // パフォーマンス監視
  profilesSampleRate: 1.0, // プロファイリング
});

メトリクス収集

# Python でのSentryエラー追跡
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

sentry_sdk.init(
    dsn="YOUR_DSN_HERE",
    integrations=[DjangoIntegration()],
    traces_sample_rate=1.0,
    send_default_pii=True,
)

# カスタムエラー送信
try:
    risky_operation()
except Exception as e:
    sentry_sdk.capture_exception(e)

# カスタムメッセージ送信
sentry_sdk.capture_message("Something went wrong", level="error")

アラート設定

// エラー発生時の詳細なコンテキスト追加
Sentry.configureScope((scope) => {
  scope.setUser({
    id: "12345",
    email: "[email protected]",
    username: "user123"
  });
  
  scope.setContext("payment", {
    amount: 100.0,
    currency: "USD",
    payment_method: "credit_card"
  });
  
  scope.setTag("environment", "production");
  scope.setLevel("error");
});

ダッシュボード作成

// パフォーマンス監視の設定
Sentry.startSpan({
  op: "http.request",
  name: "API Call"
}, () => {
  // APIコール
  return fetch('/api/data')
    .then(response => response.json())
    .catch(error => {
      Sentry.captureException(error);
      throw error;
    });
});

// 手動トランザクション作成
const transaction = Sentry.startTransaction({
  name: "User Checkout Process",
  op: "transaction",
});

Sentry.getCurrentHub().configureScope(scope => scope.setSpan(transaction));

try {
  await processCheckout();
  transaction.setStatus("ok");
} catch (error) {
  transaction.setStatus("internal_error");
  Sentry.captureException(error);
} finally {
  transaction.finish();
}

ログ分析

# Django でのSentry統合
# settings.py
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.integrations.logging import LoggingIntegration

# ログ統合設定
sentry_logging = LoggingIntegration(
    level=logging.INFO,        # INFO以上をキャプチャ
    event_level=logging.ERROR  # ERRORをイベントとして送信
)

sentry_sdk.init(
    dsn="YOUR_DSN_HERE",
    integrations=[
        DjangoIntegration(),
        sentry_logging,
    ],
    traces_sample_rate=1.0,
)

インテグレーション設定

// React アプリケーションでのSentry設定
import React from "react";
import * as Sentry from "@sentry/react";
import { BrowserRouter } from "react-router-dom";

Sentry.init({
  dsn: "YOUR_DSN_HERE",
  integrations: [
    new Sentry.BrowserTracing({
      routingInstrumentation: Sentry.reactRouterV6Instrumentation(
        React.useEffect,
        useLocation,
        useNavigationType,
        createRoutesFromChildren,
        matchRoutes,
      ),
    }),
  ],
  tracesSampleRate: 1.0,
});

// Sentryでラップされたコンポーネント
const SentryRoutes = Sentry.withSentryRouting(Routes);

function App() {
  return (
    <BrowserRouter>
      <SentryRoutes>
        {/* ルート定義 */}
      </SentryRoutes>
    </BrowserRouter>
  );
}

エラー分析

// 詳細なエラー分析とフィルタリング
Sentry.init({
  dsn: "YOUR_DSN_HERE",
  beforeSend(event, hint) {
    // デバッグ環境でのエラーは送信しない
    if (event.environment === 'development') {
      return null;
    }
    
    // 特定のエラーをフィルタリング
    if (event.exception) {
      const error = hint.originalException;
      if (error && error.message.includes('Script error')) {
        return null;
      }
    }
    
    return event;
  },
  
  // アップタイムボットのエラーを除外
  beforeSend(event) {
    const userAgent = event.request?.headers?.["user-agent"];
    if (userAgent && userAgent.includes("SentryUptimeBot")) {
      return null;
    }
    return event;
  }
});