このトピックでは、カスタム 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 カスタム版) |
|
Snuba API(SLS カスタム版) |
|
ステップ 2:SLS アクセス認証情報の構成
カスタムコンテナーは、データを読み取るために SLS へのアクセスが必要です。AccessKey 認証情報を構成してください。
RAM ユーザーの作成と権限付与
RAM コンソールにログインし、RAM ユーザーを作成できます。
ユーザーに以下の権限を付与します:
AliyunLogReadOnlyAccess(Simple Log Service の読み取り専用権限)
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 サービスのエンドポイントです。 |
|
SLS_ACCESS_KEY_ID | RAM ユーザーの AccessKey ID です。 |
|
SLS_ACCESS_KEY_SECRET | RAM ユーザーの AccessKey Secret です。 |
|
SLS_PROJECT | SLS プロジェクトの名前です。RUM サービスの基盤ストレージとして使用するプロジェクトは、コンソールから取得する必要があります。 |
|
SLS_LOGSTORE | SLS Logstore の名前です。これは静的フィールドです。 |
|
SLS_TTL | データクエリ期間(日数)です。 |
|
ENABLE_SLS_NODESTORE | SLS によるイベント詳細の保存を有効化します。 |
|
USE_SLS_GROUP_STORAGE | 課題集約情報(Group)の SLS 保存を有効化します。 |
|
ステップ 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 psweb-rum および snuba-api-rum コンテナーのステータスが Up (healthy) であることを確認してください。
ステップ 8:読み取り機能の検証
RUM 版 Sentry コンソールに
http://<your-host>:9001でアクセスします。作成したプロジェクトに移動し、Issues リストを表示します。
SLS から読み取ったエラーおよびイベントデータが正しく表示されることを確認します。
Issues リストが空の場合、以下の点を確認してください:
データインジェストが正常に動作していること。
SLS アクセス認証情報が正しく構成されていること。
コンテナーログにエラーメッセージが表示されていないか。
コンテナーログを確認できます:
docker compose logs -f web-rum docker compose logs -f snuba-api-rum
エンドポイント
環境 | エンドポイント | 説明 |
Standard Edition Sentry |
| ClickHouse にデータストレージを備えた Alibaba Cloud イメージ |
RUM 版 Sentry |
| カスタムイメージ。データは 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 日間です。