すべてのプロダクト
Search
ドキュメントセンター

Cloud Monitor:Sentry コンソールを Real User Monitoring データの読み取りに対応させる

最終更新日:Mar 04, 2026

このトピックでは、カスタム Sentry コンテナーのデプロイ方法について説明します。これにより、Sentry コンソールで Alibaba Cloud 上に保存されたアプリケーションデータを読み取れるようになります。

前提条件

  • この機能はグレースケールテスト中です。ご利用には、チケットを送信する必要があります。

  • Sentry SDK データインジェストの構成の手順を完了している必要があります。

  • セルフホスト型の Sentry 環境をご利用中であるか、Sentry サービスをデプロイできる環境が整っている必要があります。

  • Docker および Docker Compose をインストール済みである必要があります。

背景情報

ネイティブの Sentry サービスにおけるデータ読み取りパスは、イベントストレージに ClickHouse、メタストアに PostgreSQL を依存しています。Simple Log Service (SLS) からデータを読み取るには、以下の 2 つのコアコンポーネントを置き換える必要があります:

コンポーネント

元の機能

カスタム版の機能

Sentry Web

PostgreSQL から Group、Nodestore などのデータを読み取ります

一部のデータソースを SLS にリダイレクトします

Snuba API

ClickHouse からイベントデータをクエリします

クエリエンジンを SLS に切り替えます

カスタムコンテナーはデータ読み取りロジックのみを変更します。Sentry コンソールのインターフェイスやユーザーエクスペリエンスには影響しません。

ステップ 1:カスタムコンテナーイメージの取得

Alibaba Cloud では、SLS に対応したカスタム Sentry コンテナーイメージを提供しています。

コンポーネント

レジストリアドレス

Sentry Web(SLS カスタム版)

sls-registry.cn-hangzhou.cr.aliyuncs.com/sentry/sentry:25.9.0-rum-251230

Snuba API(SLS カスタム版)

sls-registry.cn-hangzhou.cr.aliyuncs.com/sentry/snuba:25.9.0-rum-251230

ステップ 2:SLS アクセス認証情報の構成

カスタムコンテナーは、データを読み取るために SLS へのアクセスが必要です。AccessKey 認証情報を構成してください。

RAM ユーザーの作成と権限付与

  1. RAM コンソールにログインし、RAM ユーザーを作成できます。

  2. ユーザーに以下の権限を付与します:

    • AliyunLogReadOnlyAccess(Simple Log Service の読み取り専用権限)

  3. AccessKey を作成し、AccessKey ID および AccessKey Secret を記録してください。

重要 RAM ユーザーの AccessKey を使用することを推奨します。Alibaba Cloud アカウントの AccessKey を使用しないでください。

ステップ 3:環境変数の構成

Sentry サービスのルートディレクトリにある .env ファイルに、以下の構成を追加します:

# RUM イメージ構成
SENTRY_RUM_IMAGE=sls-registry.cn-hangzhou.cr.aliyuncs.com/sentry/sentry:25.9.0-rum-251230
SNUBA_RUM_IMAGE=sls-registry.cn-hangzhou.cr.aliyuncs.com/sentry/snuba:25.9.0-rum-251230
SENTRY_RUM_BIND=9001

# SLS 構成
SLS_ENDPOINT=<endpoint>
SLS_ACCESS_KEY_ID=<your_access_key_id>
SLS_ACCESS_KEY_SECRET=<your_access_key_secret>
SLS_PROJECT=<your_sls_project>
SLS_LOGSTORE=logstore-rum
SLS_TTL=30
ENABLE_SLS_NODESTORE=true
USE_SLS_GROUP_STORAGE=true

パラメーター

パラメーター

説明

SLS_ENDPOINT

SLS サービスのエンドポイントです。

cn-chengdu.log.aliyuncs.com

SLS_ACCESS_KEY_ID

RAM ユーザーの AccessKey ID です。

LTAI5t***

SLS_ACCESS_KEY_SECRET

RAM ユーザーの AccessKey Secret です。

HQsEf***

SLS_PROJECT

SLS プロジェクトの名前です。RUM サービスの基盤ストレージとして使用するプロジェクトは、コンソールから取得する必要があります。

proj-xtrace-xxxxx-cn-hangzhou

SLS_LOGSTORE

SLS Logstore の名前です。これは静的フィールドです。

logstore-rum

SLS_TTL

データクエリ期間(日数)です。

30

ENABLE_SLS_NODESTORE

SLS によるイベント詳細の保存を有効化します。

true

USE_SLS_GROUP_STORAGE

課題集約情報(Group)の SLS 保存を有効化します。

true

ステップ 4:Docker Compose オーバーライド構成の作成

Sentry サービスのルートディレクトリに、docker-compose.override.yml ファイルを作成します:

services:
  # ============================================
  # Snuba API - RUM 版
  # ============================================
  snuba-api-rum:
    restart: unless-stopped
    image: "${SNUBA_RUM_IMAGE}"
    depends_on:
      clickhouse:
        condition: service_healthy
      kafka:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      SNUBA_SETTINGS: self_hosted
      CLICKHOUSE_HOST: clickhouse
      DEFAULT_BROKERS: "kafka:9092"
      REDIS_HOST: redis
      UWSGI_MAX_REQUESTS: "10000"
      UWSGI_DISABLE_LOGGING: "true"
      SENTRY_EVENT_RETENTION_DAYS:
      # 構成
      SLS_ENDPOINT: ${SLS_ENDPOINT:-cn-chengdu.log.aliyuncs.com}
      SLS_ACCESS_KEY_ID: ${SLS_ACCESS_KEY_ID:-}
      SLS_ACCESS_KEY_SECRET: ${SLS_ACCESS_KEY_SECRET:-}
      SLS_PROJECT: ${SLS_PROJECT:-}
      SLS_LOGSTORE: ${SLS_LOGSTORE:-logstore-rum}
      SLS_TTL: ${SLS_TTL:-30}
      USE_SLS_FOR_REFERRERS: sls
    healthcheck:
      test:
        - "CMD"
        - "/bin/bash"
        - "-c"
        - 'exec 3<>/dev/tcp/127.0.0.1/1218 && echo -e "GET /health HTTP/1.1\r\nhost: 127.0.0.1\r\n\r\n" >&3 && grep ok -s -m 1 <&3'
      interval: "$HEALTHCHECK_INTERVAL"
      timeout: "$HEALTHCHECK_TIMEOUT"
      retries: $HEALTHCHECK_RETRIES
      start_period: "$HEALTHCHECK_START_PERIOD"

  # ============================================
  # Web サービス - RUM 版
  # ============================================
  web-rum:
    restart: unless-stopped
    image: "${SENTRY_RUM_IMAGE}"
    depends_on:
      redis:
        condition: service_healthy
      kafka:
        condition: service_healthy
      pgbouncer:
        condition: service_healthy
      memcached:
        condition: service_started
      smtp:
        condition: service_started
      seaweedfs:
        condition: service_started
      snuba-api-rum:
        condition: service_healthy
      symbolicator:
        condition: service_started
    entrypoint: "/etc/sentry/entrypoint.sh"
    command: ["run", "web"]
    ulimits:
      nofile:
        soft: 4096
        hard: 4096
    environment:
      PYTHONUSERBASE: "/data/custom-packages"
      SENTRY_CONF: "/etc/sentry"
      SNUBA: "http://snuba-api-rum:1218"
      VROOM: "http://vroom:8085"
      DEFAULT_CA_BUNDLE: "/etc/ssl/certs/ca-certificates.crt"
      REQUESTS_CA_BUNDLE: "/etc/ssl/certs/ca-certificates.crt"
      GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR: "/etc/ssl/certs/ca-certificates.crt"
      COMPOSE_PROFILES:
      SENTRY_EVENT_RETENTION_DAYS:
      SENTRY_MAIL_HOST:
      SENTRY_MAX_EXTERNAL_SOURCEMAP_SIZE:
      # 構成
      SLS_ENDPOINT: ${SLS_ENDPOINT:-cn-chengdu.log.aliyuncs.com}
      SLS_ACCESS_KEY_ID: ${SLS_ACCESS_KEY_ID:-}
      SLS_ACCESS_KEY_SECRET: ${SLS_ACCESS_KEY_SECRET:-}
      SLS_PROJECT: ${SLS_PROJECT:-}
      SLS_LOGSTORE: ${SLS_LOGSTORE:-logstore-rum}
      SLS_TTL: ${SLS_TTL:-30}
      ENABLE_SLS_NODESTORE: ${ENABLE_SLS_NODESTORE:-true}
      USE_SLS_GROUP_STORAGE: ${USE_SLS_GROUP_STORAGE:-true}
    volumes:
      - "sentry-data:/data"
      - "./sentry:/etc/sentry"
      - "./geoip:/geoip:ro"
      - "./certificates:/usr/local/share/ca-certificates:ro"
    healthcheck:
      test:
        - "CMD"
        - "/bin/bash"
        - "-c"
        - 'exec 3<>/dev/tcp/127.0.0.1/9000 && echo -e "GET /_health/ HTTP/1.1\r\nhost: 127.0.0.1\r\n\r\n" >&3 && grep ok -s -m 1 <&3'
      interval: "$HEALTHCHECK_INTERVAL"
      timeout: "$HEALTHCHECK_TIMEOUT"
      retries: $HEALTHCHECK_RETRIES
      start_period: "$HEALTHCHECK_START_PERIOD"

  # ============================================
  # Nginx - デュアルポート構成
  # ============================================
  nginx:
    ports:
      - "$SENTRY_BIND:80/tcp"
      - "${SENTRY_RUM_BIND:-9001}:81/tcp"
    depends_on:
      web:
        condition: service_healthy
        restart: true
      web-rum:
        condition: service_healthy
        restart: true
      relay:
        condition: service_healthy
        restart: true

ステップ 5:Sentry Python ファイルの構成

sentry/sentry.conf.example.py ファイルを編集し、ファイル末尾に以下の構成を追加します:

# ---------------------------------------------------------
# RUM NodeStore 構成
# ---------------------------------------------------------
import os

# 環境変数構成の取得
_enable_sls_nodestore = os.environ.get("ENABLE_SLS_NODESTORE", "").lower() in ("true", "1", "yes")
_use_sls_group_storage = os.environ.get("USE_SLS_GROUP_STORAGE", "").lower() in ("true", "1", "yes")
_sls_endpoint = os.environ.get("SLS_ENDPOINT", "")
_sls_access_key_id = os.environ.get("SLS_ACCESS_KEY_ID", "")
_sls_access_key_secret = os.environ.get("SLS_ACCESS_KEY_SECRET", "")
_sls_project = os.environ.get("SLS_PROJECT", "")
_sls_nodestore_logstore = os.environ.get("SLS_LOGSTORE", "logstore-rum")
_sls_ttl = int(os.environ.get("SLS_TTL", "30") or 30)

if _enable_sls_nodestore and _sls_endpoint and _sls_access_key_id and _sls_access_key_secret and _sls_project:
    SENTRY_NODESTORE = "sentry_nodestore_sls.SLSNodeStorage"
    SENTRY_NODESTORE_OPTIONS = {
        "endpoint": _sls_endpoint,
        "access_key_id": _sls_access_key_id,
        "access_key_secret": _sls_access_key_secret,
        "project": _sls_project,
        "logstore": _sls_nodestore_logstore,
        "compression": True,
        "retry_attempts": 3,
        "retry_delay": 0.5,
        "default_ttl_days": _sls_ttl or None,
    }
    print("=" * 70)
    print("==> NodeStore: SLS(Direct Mode ONLY)")
    print(f"==> SLS エンドポイント: {_sls_endpoint}")
    print(f"==> SLS プロジェクト:  {_sls_project}")
    print(f"==> SLS Logstore: {_sls_nodestore_logstore}")
    print(f"==> TTL(日数):   {SENTRY_NODESTORE_OPTIONS['default_ttl_days']}")
    print("=" * 70)
else:
    print("=" * 70)
    print("==> NodeStore: Django(データベース)")
    print("==> データは PostgreSQL に保存されます")
    if not _enable_sls_nodestore:
        print("==> 情報: SLS を使用するには、.env.custom で ENABLE_SLS_NODESTORE=true を設定してください")
    elif not _sls_endpoint or not _sls_access_key_id:
        print("==> 警告: .env.custom に SLS 認証情報が構成されていません")
    print("=" * 70)

# ---------------------------------------------------------
# RUM Group Search 構成
# ---------------------------------------------------------
if _use_sls_group_storage and _sls_endpoint and _sls_access_key_id and _sls_access_key_secret and _sls_project:
    SENTRY_SEARCH = "sentry.search.sls.backend.SLSGroupSearchBackend"
    print("=" * 70)
    print("==> 検索バックエンド: SLS Group Search")
    print(f"==> バックエンド: {SENTRY_SEARCH}")
    print("=" * 70)
else:
    print("=" * 70)
    print("==> 検索バックエンド: Snuba(デフォルト)")
    print(f"==> バックエンド: {SENTRY_SEARCH}")
    if not _use_sls_group_storage:
        print("==> 情報: SLS Group Search を使用するには、USE_SLS_GROUP_STORAGE=true を設定してください")
    print("=" * 70)

# 一時変数のクリーンアップ
del _enable_sls_nodestore, _use_sls_group_storage, _sls_endpoint, _sls_access_key_id, _sls_access_key_secret
del _sls_project, _sls_nodestore_logstore

ステップ 6:Nginx のデュアルポート構成

nginx.conf ファイルを編集し、Real User Monitoring(RUM)版サービス向けのポートリスナーを追加して、両方の環境へのアクセスを可能にします。ポート 80 は Standard Edition 用、ポート 81 は Alibaba Cloud 版用です。

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
	worker_connections 1024;
}


http {
	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	log_format main '$remote_addr - $remote_user [$time_local] "$request" '
	'$status $body_bytes_sent "$http_referer" '
	'"$http_user_agent" "$http_x_forwarded_for"';

	access_log /var/log/nginx/access.log main;

	sendfile on;
	tcp_nopush on;
	tcp_nodelay on;
	reset_timedout_connection on;

	keepalive_timeout 75s;

	gzip off;
	server_tokens off;

	server_names_hash_bucket_size 64;
	types_hash_max_size 2048;
	types_hash_bucket_size 64;
	client_body_buffer_size 64k;
	client_max_body_size 100m;

	proxy_http_version 1.1;
	proxy_redirect off;
	proxy_buffer_size          128k;
	proxy_buffers              4 256k;
	proxy_busy_buffers_size    256k;
	proxy_next_upstream error timeout invalid_header http_502 http_503 non_idempotent;
	proxy_next_upstream_tries 2;

	# Docker デフォルトアドレスプール
	set_real_ip_from 172.17.0.0/16;
	set_real_ip_from 172.18.0.0/16;
	set_real_ip_from 172.19.0.0/16;
	set_real_ip_from 172.20.0.0/14;
	set_real_ip_from 172.24.0.0/14;
	set_real_ip_from 172.28.0.0/14;
	set_real_ip_from 192.168.0.0/16;
	set_real_ip_from 10.0.0.0/8;
	real_ip_header X-Forwarded-For;
	real_ip_recursive on;

	proxy_set_header Connection '';
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_set_header X-Request-Id $request_id;
	proxy_read_timeout 30s;
	proxy_send_timeout 5s;

	upstream relay {
		server relay:3000;
		keepalive 2;
	}

	# Standard Edition Sentry
	upstream sentry {
		server web:9000;
		keepalive 2;
	}

	# RUM 版 Sentry
	upstream sentry_rum {
		server web-rum:9000;
		keepalive 2;
	}

    # RUM データを Alibaba Cloud RUM に転送(イメージのデュアルライトが有効な場合のみ使用)
    upstream rum_forwarder {
        # エンドポイント
		server <endpoint>:80;
		keepalive 2;
	}
    # ============================================
    # RUM 転送パスマッピング
    # Sentry プロジェクト ID を対応する Alibaba Cloud RUM サービスにマッピング
    # ============================================
	map $request_uri $forwarder_path {
        # デフォルト転送パス(実際の workspace_name および rum_service_id に置き換え)
        default /rum/sentry/<workspace_name>/<rum_service_id>;
        # プロジェクト ID ごとに異なる転送パスを構成する例:
        # "~^/api/1/envelope/"  /rum/sentry/<workspace_name>/<rum_service_id_for_project_1>;
        # "~^/api/2/envelope/"  /rum/sentry/<workspace_name>/<rum_service_id_for_project_2>;
	}
	# Standard Edition Sentry - ポート 80
	server {
		listen 80;

		location /api/store/ {
			proxy_pass http://relay;
		}
		location ~ ^/api/[1-9]\d*/ {
			proxy_pass http://relay;
			mirror /rum_mirror;
			mirror_request_body on;
		}
		location = /rum_mirror {
			internal;
			
			proxy_pass http://rum_forwarder$forwarder_path$request_uri;
			# エンドポイント
			proxy_set_header Host <endpoint>;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-Forwarded-Proto $scheme;
			proxy_set_header X-Request-Id $request_id;
			proxy_set_header Connection '';

			proxy_read_timeout 5s;
			proxy_send_timeout 5s;
			proxy_connect_timeout 5s;

			proxy_ignore_client_abort on;
		}
		location ^~ /api/0/relays/ {
			proxy_pass http://relay;
		}
		location ^~ /js-sdk/ {
			root /var/www/;
			add_header Access-Control-Allow-Origin *;
		}
		location / {
			proxy_pass http://sentry;
		}
		location /_assets/ {
			proxy_pass http://sentry/_static/dist/sentry/;
			proxy_hide_header Content-Disposition;
		}
		location /_static/ {
			proxy_pass http://sentry;
			proxy_hide_header Content-Disposition;
		}
	}

	# RUM 版 Sentry - ポート 81
	server {
		listen 81;

		location /api/store/ {
			proxy_pass http://relay;
		}
		location ~ ^/api/[1-9]\d*/ {
			proxy_pass http://relay;
			mirror /rum_mirror;
			mirror_request_body on;
		}
		location = /rum_mirror {
			internal;
			
			proxy_pass http://rum_forwarder$forwarder_path$request_uri;
			# エンドポイント
			proxy_set_header Host <endpoint>;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header X-Forwarded-Proto $scheme;
			proxy_set_header X-Request-Id $request_id;
			proxy_set_header Connection '';

			proxy_read_timeout 5s;
			proxy_send_timeout 5s;
			proxy_connect_timeout 5s;

			proxy_ignore_client_abort on;
		}
		location ^~ /api/0/relays/ {
			proxy_pass http://relay;
		}
		location ^~ /js-sdk/ {
			root /var/www/;
			add_header Access-Control-Allow-Origin *;
		}
		location / {
			proxy_pass http://sentry_rum;
		}
		location /_assets/ {
			proxy_pass http://sentry_rum/_static/dist/sentry/;
			proxy_hide_header Content-Disposition;
		}
		location /_static/ {
			proxy_pass http://sentry_rum;
			proxy_hide_header Content-Disposition;
		}
	}
}

ステップ 7:サービスの起動

以下のコマンドを実行してサービスを起動します:

docker compose -f docker-compose.yml -f docker-compose.override.yml up -d

サービスのステータスを確認します:

docker compose ps

web-rum および snuba-api-rum コンテナーのステータスが Up (healthy) であることを確認してください。

ステップ 8:読み取り機能の検証

  1. RUM 版 Sentry コンソールに http://<your-host>:9001 でアクセスします。

  2. 作成したプロジェクトに移動し、Issues リストを表示します。

  3. SLS から読み取ったエラーおよびイベントデータが正しく表示されることを確認します。

Issues リストが空の場合、以下の点を確認してください:

  • データインジェストが正常に動作していること。

  • SLS アクセス認証情報が正しく構成されていること。

  • コンテナーログにエラーメッセージが表示されていないか。

    • コンテナーログを確認できます:

      docker compose logs -f web-rum
      docker compose logs -f snuba-api-rum

エンドポイント

環境

エンドポイント

説明

Standard Edition Sentry

http://<your-host>:9000

ClickHouse にデータストレージを備えた Alibaba Cloud イメージ

RUM 版 Sentry

http://<your-host>:9001

カスタムイメージ。データは SLS に保存されます。

よくある質問

Q: カスタム版コンテナーに置き換えた後、Sentry コンソールの機能に影響がありますか?

A: カスタムコンテナーはデータ読み取りロジックのみを変更します。コンソールのインターフェイス、操作性、および機能はネイティブ版と同一です。

Q: ClickHouse と SLS の両方から同時にデータを読み取ることはできますか?

A: 現在のバージョンでは、混合読み取りはサポートされていません。カスタムコンテナーを有効化すると、すべてのイベントデータが SLS から読み取られます。

Q: ネイティブの Sentry コンテナーに戻すにはどうすればよいですか?

A: web-rum および snuba-api-rum サービスを停止し、ポート 9000 で Standard Edition Sentry をご利用ください。

Q: SLS 内のデータの保持期間はどのくらいですか?

A: デフォルトのデータ保持期間は 30 日間です。