內容整理自官方開發文檔
系列
- 1 分鍾快速使用 Docker 上手最新版 Sentry-CLI - 創建版本
- 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps
- Sentry For React 完整接入詳解
- Sentry For Vue 完整接入詳解
- Sentry-CLI 使用詳解
- Sentry Web 性能監控 - Web Vitals
- Sentry Web 性能監控 - Metrics
- Sentry Web 性能監控 - Trends
- Sentry Web 前端監控 - 最佳實踐(官方教程)
- Sentry 后端監控 - 最佳實踐(官方教程)
- Sentry 監控 - Discover 大數據查詢分析引擎
- Sentry 監控 - Dashboards 數據可視化大屏
- Sentry 監控 - Environments 區分不同部署環境的事件數據
- Sentry 監控 - Security Policy 安全策略報告
- Sentry 監控 - Search 搜索查詢實戰
- Sentry 監控 - Alerts 告警
- Sentry 監控 - Distributed Tracing 分布式跟蹤
- Sentry 監控 - 面向全棧開發人員的分布式跟蹤 101 系列教程(一)
- Sentry 監控 - Snuba 數據中台架構簡介(Kafka+Clickhouse)
- Sentry 監控 - Snuba 數據中台架構(Data Model 簡介)
- Sentry 監控 - Snuba 數據中台架構(Query Processing 簡介)
- Sentry 官方 JavaScript SDK 簡介與調試指南
- Sentry 監控 - Snuba 數據中台架構(編寫和測試 Snuba 查詢)
- Sentry 監控 - Snuba 數據中台架構(SnQL 查詢語言簡介)
- Sentry 監控 - Snuba 數據中台本地開發環境配置實戰
- Sentry 監控 - 私有 Docker Compose 部署與故障排除詳解
- Sentry 開發者貢獻指南 - 前端(ReactJS生態)
目錄
- 服務管理 (
devservices
)- 查看服務的日志
- 為
redis
、postgres
和clickhouse
運行CLI
客戶端 - 移除容器狀態
- 端口分配
- 找出您的機器上正在運行的內容
- 異步 Worker
- 注冊任務
- 運行
Worker
- 啟動
Cron
進程 - 配置
Broker
Redis
RabbitMQ
- Email
- 出站
Email
- 入站
Email
Mailgun
- 出站
- 節點存儲
Django
后端- 自定義后端
- 文件存儲
- 文件系統后端
Google Cloud
存儲后端Amazon S3
后端MinIO S3
后端
- 時間序列存儲
RedisSnuba
后端(推薦)Dummy
后端Redis
后端
- 寫
Buffer
- 配置
Redis
- 配置
- 指標
Statsd
后端Datadog
后端DogStatsD
后端Logging
后端
- 配額
- 事件配額
- 配置
- 全系統速率限制
- 基於用戶的速率限制
- 基於項目的速率限制
Notification
速率限制- 配置
- 事件配額
- Notification 摘要
- 配置
- 后端
Dummy
后端Redis
后端- 示例配置
- Relay
- Snuba
- 后端
Chart
渲染- 在
Sentry
的后端使用Chartcuterie
- 配置
chart
以進行渲染- 服務初始化
- 添加/刪除
chart
類型
- 在開發中運行
Chartcuterie
- 在本地更新
chart type
- 在本地更新
- 在
- 工作原理
Chartcuterie
啟動- 來自
Sentry
的Render
調用
服務管理 (devservices)
Sentry
為 Docker
提供了一個抽象,以在開發中運行所需的服務,稱為 devservices
。
Usage: sentry devservices [OPTIONS] COMMAND [ARGS]...
Manage dependent development services required for Sentry.
Do not use in production!
Options:
--help Show this message and exit.
Commands:
attach Run a single devservice in foreground, as...
down Shut down all services.
rm Delete all services and associated data.
up Run/update dependent services.
查看服務的日志
# Follow snuba logs
docker logs -f sentry_snuba
為 redis、postgres 和 clickhouse 運行 CLI 客戶端
# redis
docker exec -it sentry_redis redis-cli
# clickhouse
docker exec -it sentry_clickhouse clickhouse-client
# psql
docker exec -it sentry_postgres psql -U postgres
移除容器狀態
如果你真的搞砸了你的容器或卷,你可以使用 devservices rm
重新開始。
# 刪除與所有服務關聯的所有數據(容器、卷和網絡)
sentry devservices rm
例如,假設我們在進行遷移時設法損壞了 postgres
數據庫,並且您想重置 postgres
數據,您可以執行以下操作:
# 刪除與單個服務關聯的所有數據(容器、卷和網絡)
sentry devservices rm postgres
端口分配
以下是 Sentry
服務使用的端口或開發設置中 Sentry
服務的任何依賴項的簡單列表。它有兩個目的:
- 找出為什么在您的工作機器上使用端口以及殺死哪個進程以使其空閑。
- 找出哪些端口可以安全地分配給新服務。
Port | Service | Description |
---|---|---|
9000 | Clickhouse | Devservice clickhouse . Snuba 的數據庫。 |
8123 | Clickhouse | |
9009 | Clickhouse | |
3021 | Symbolicator | Devservice symbolicator . 用於處理堆棧跟蹤。 |
1218 | Snuba | Devservice snuba . 用於搜索事件。 |
9092 | Kafka | Devservice kafka . 用於 relay-sentry 通信和可選的用於 sentry-snuba 通信 |
6379 | Redis | Devservice redis (或者可能通過 rustier 設置中的 Homebrew 安裝),負責緩存、relay 項目配置和 Celery 隊列 |
5432 | Postgres | Devservice postgres (或者可能通過 rustier 設置中的 Homebrew 安裝) |
7899 | Relay | Devservice relay . 為 SDK 提供將事件發送到的 API (也稱為事件攝取event ingestion )。Webpack 在 8000 端口反向代理到此服務器。使用 sentry devserver 啟動/停止。 |
8000 | Sentry Dev | Sentry API +前端。Webpack 監聽此端口並代理 API 請求 Django app |
8001 | uWSGI | 使用 sentry devserver 啟動/停止。為 Django app/API 提供服務。Webpack 在 8000 端口反向代理到此服務器。 |
7999 | Sentry frontend prod proxy | 用於測試針對 prod API 的本地 UI 更改 |
8000 | Develop docs | 圍繞本文檔的網站。 與 Sentry Dev 的沖突。 |
3000 | User docs | 面向用戶的文檔。如果 Relay 在 devservice 之外運行,則可能與 Relay 沖突。 |
9001 | Sentry Dev Styleguide server | 運行 sentry devserver --styleguide 時綁定 |
9000 | sentry run web |
sentry run web 的傳統默認端口,更改為 9001 以避免與 Clickhouse 沖突。 |
9001 | sentry run web |
沒有 webpack 或 Relay 的准系統前端。Sentry Dev 可能更好。與 Sentry Dev Styleguide server 沖突。 |
8000 | Relay mkdocs documentation | 在某些時候,這將合並到我們現有的文檔存儲庫中。與 Sentry Dev 的沖突。 |
- Relay
- Snuba
- Develop docs
- User docs
找出您的機器上正在運行的內容
- 使用
lsof -nP -i4 | grep LISTEN
在macOS
上查找被占用的端口。 Docker for Mac
的Dashboard UI
顯示您正在運行的docker 容器/開發服務
以及分配的端口
和啟動/停止
選項。
異步 Worker
Sentry
帶有一個內置隊列,以更異步的方式處理任務。
例如,當一個事件進入而不是立即將其寫入數據庫時,它會向隊列發送一個 job
,以便可以立即返回請求,並且后台 worker
會實際處理保存該數據。
Sentry
依賴 Celery 庫來管理 worker
。
- ttps://docs.celeryproject.org/
注冊任務
Sentry
使用特殊的裝飾器配置任務,使我們能夠更明確地控制可調用對象。
from sentry.tasks.base import instrumented_task
@instrumented_task(
name="sentry.tasks.do_work",
queue="important_queue",
default_retry_delay=60 * 5,
max_retries=None,
)
def do_work(kind_of_work, **kwargs):
# ...
有幾個重要的點:
-
_必須_聲明
task
名稱。Task
名稱是Celery
如何識別消息(請求)以及需要哪個函數和工作線程來處理這些消息。
如果task
沒有命名,celery
將從模塊
和函數
名稱派生一個名稱,
這使得名稱與代碼的位置相關聯,並且對於未來的代碼維護更加脆弱。 -
Task
必須接受\*\*kwargs
來處理滾動兼容性。這確保
task
將接受恰好在隊列中的任何消息,而不是因未知參數而失敗。
它有助於回滾更改,部署不是即時的,並且可能會使用多個版本的參數生成消息。雖然這允許在不完全任務失敗的情況下向前和向后滾動,
但在更改參數時仍必須注意worker
處理具有舊
參數和新
參數的消息。
這確實減少了這種遷移中所需更改的數量,並為operator
提供了更多的靈活性,
但是由於未知參數
而導致的消息丟失
仍然是不可接受
的。 -
Task
_應該_在失敗時自動重試。 -
Task
參數_應該_是原始類型並且很小。Task
參數被序列化到通過broker
發送的消息中,worker
需要再次反序列化它們。
對復雜類型執行此操作是脆弱的,應該避免。例如。更喜歡將ID
傳遞給task
,
該ID
可用於從緩存而不是數據本身加載數據。
Task
參數被序列化到通過broker
發送的消息中,worker
需要再次對它們進行反序列化。
對復雜類型執行此操作是脆弱的,應該避免。
例如,寧願向task
傳遞ID
,該ID
可用於從緩存加載數據,而不是數據本身。類似地,為了保持消息
broker
和worker
有效運行,
將大值序列化到消息中會導致大消息
、大隊列
和更多(反)序列化開銷
,因此應該避免
。 -
必須將
task
的模塊添加到CELERY_IMPORTS
。src/sentry/conf/server.py
.
Celery worker
必須按name
查找task
,
只有當worker
導入帶有裝飾任務函數的模塊時才能這樣做,
因為這是按name
注冊task
的內容。因此,每個包含task
的模塊都必須添加到src/sentry/conf/server.py
中的CELERY_IMPORTS
設置中。
運行 Worker
可以使用 Sentry CLI 運行 Worker
。
$ sentry run worker
啟動 Cron 進程
Sentry
通過 cron
進程安排 routine job
:
SENTRY_CONF=/etc/sentry sentry run cron
配置 Broker
Sentry
支持兩個主要 broker
,可根據您的 workload
進行調整:RabbitMQ
和 Redis
。
Redis
默認 broker
是 Redis
,可以在大多數情況下工作。使用 Redis
的主要限制是所有待處理的工作都必須放在內存中。
BROKER_URL = "redis://localhost:6379/0"
如果您的 Redis
連接需要密碼進行身份驗證,則需要使用以下格式:
BROKER_URL = "redis://:password@localhost:6379/0"
RabbitMQ
如果您在 高 workload
下運行,或者擔心將待處理的 workload
放入內存中,那么 RabbitMQ
是支持 Sentry worker
的理想選擇。
BROKER_URL = "amqp://guest:guest@localhost:5672/sentry"
Sentry
提供對出站
和傳入
電子郵件的支持。
入站電子郵件的使用相當有限,目前僅支持處理對 error
和 note
通知的回復。
出站 Email
您需要為出站電子郵件配置 SMTP
提供商。
TODO: 撰寫 mail
預覽后端。
-
mail.backend
-
在 `config.yml` 中聲明。 用於發送電子郵件的后端。選項是
smtp
、console
和dummy
。默認為
smtp
。如果您想禁用電子郵件傳送,請使用dummy
。 -
mail.from
-
在 `config.yml` 中聲明。 From
header 中用於出站電子郵件的電子郵件地址。默認為
root@localhost
。強烈建議更改此值以確保可靠的電子郵件傳送。 -
mail.host
-
在 `config.yml` 中聲明。 用於 SMTP 連接的主機名。
默認為
localhost
. -
mail.port
-
在 `config.yml` 中聲明。 用於 SMTP 連接的連接端口。
默認為
25
。 -
mail.username
-
在 `config.yml` 中聲明。 使用 SMTP 服務器進行身份驗證時使用的用戶名。
默認為
(empty)
。 -
mail.password
-
在 `config.yml` 中聲明。 使用 SMTP 服務器進行身份驗證時使用的密碼。
默認為
(empty)
。 -
mail.use-ssl
-
在 `config.yml` 中聲明。 Sentry 在連接到 SMTP 服務器時是否應該使用 SSL?
默認為
false
。 -
mail.use-tls
-
在 `config.yml` 中聲明。 Sentry 在連接到 SMTP 服務器時應該使用 TLS 嗎?
默認為
false
。 -
mail.list-namespace
-
在 `config.yml` 中聲明。 此 Sentry 服務器發送的電子郵件的郵件列表命名空間。這應該是您擁有的域(通常與
mail.from
配置參數值的域部分相同)或localhost
。
入站 Email
對於配置,您可以從不同的后端進行選擇。
Mailgun
首先選擇一個域來處理入站電子郵件。我們發現如果您維護一個與其他任何事物分開的域,這是最簡單的。
在我們的示例中,我們將選擇 inbound.sentry.example.com
。您需要根據 Mailgun
文檔為給定域配置 DNS
記錄。
在 mailgun
中創建一個新路由:
Priority:
0
Filter Expression:
catch_all()
Actions:
forward("https://sentry.example.com/api/hooks/mailgun/inbound/")
Description:
Sentry inbound handler
使用適當的設置配置 Sentry
:
# 您的 Mailgun API key(用於驗證傳入的 webhook)
mail.mailgun-api-key: ""
# 將 SMTP hostname 設置為您配置的入站域
mail.reply-hostname: "inbound.sentry.example.com"
# 通知 Sentry 發送適當的郵件頭以啟用
# 收到答復
mail.enable-replies: true
就是這樣!您現在可以通過電子郵件客戶端響應有關錯誤的活動通知。
節點存儲
Sentry
提供了一個名為 ‘nodestore’
的抽象,用於存儲 key/value
blob。
默認后端只是將它們作為 gzipped blob
存儲在默認數據庫的 ‘nodestore_node’
表中。
Django 后端
Django
后端使用 gzipped json blob-as-text
模式將所有數據存儲在 ‘nodestore_node’
表中。
后端不提供任何選項,因此只需將其設置為空字典即可。
SENTRY_NODESTORE = 'sentry.nodestore.django.DjangoNodeStorage'
SENTRY_NODESTORE_OPTIONS = {}
自定義后端
如果你有一個最喜歡的數據存儲解決方案,它只需要在一些規則下運行,它就可以與 Sentry
的 blob
存儲一起工作:
- 設置
key/value
- 獲取
key
- 刪除
key
有關實現自己的后端的更多信息,請查看 sentry.nodestore.base.NodeStorage
。
文件存儲
Sentry
提供了一個名為 ‘filestore’
的抽象,用於存儲文件(例如發布工件)。
默認后端將文件存儲在不適合生產使用的 /tmp/sentry-files
中。
文件系統后端
filestore.backend: "filesystem"
filestore.options:
location: "/tmp/sentry-files"
Google Cloud 存儲后端
除了下面的配置之外,您還需要確保 shell
環境設置了變量 GOOGLE_APPLICATION_CREDENTIALS
。
有關詳細信息,請參閱 用於設置身份驗證的 Google Cloud 文檔。
filestore.backend: "gcs"
filestore.options:
bucket_name: "..."
Amazon S3 后端
S3
存儲后端支持使用 access key
或 IAM
實例角色進行身份驗證。
使用后者時,省略 access_key
和 secret_key
。
默認情況下,S3
對象是使用 public-read
ACL 創建的,這意味着除了 PutObject
、GetObject
和 DeleteObject
之外,
所使用的帳戶/角色
還必須具有 PutObjectAcl
權限。
如果您不希望您上傳的文件可公開訪問,您可以將 default_acl
設置為 private
。
filestore.backend: "s3"
filestore.options:
access_key: "..."
secret_key: "..."
bucket_name: "..."
default_acl: "..."
MinIO S3 后端
filestore.backend: "s3"
filestore.options:
access_key: "..."
secret_key: "..."
bucket_name: "..."
endpoint_url: "https://minio.example.org/"
時間序列存儲
Sentry
提供存儲時間序列數據
的服務。這主要用於顯示事件和項目的匯總信息,以及(實時)計算事件發生率。
RedisSnuba 后端(推薦)
這是唯一一個 100% 正確工作的后端:
SENTRY_TSDB = 'sentry.tsdb.redissnuba.RedisSnubaTSDB'
該后端與 Snuba
通信以獲取與事件攝取(event ingestion)
相關的指標,並與 Redis
通信以獲取其他所有內容。
Snuba
需要運行自己的結果消費者(outcomes consumer)
,目前這不是 devservices
的一部分。
包裝的 Redis TSDB
可以這樣配置(有關 Redis
選項,請參閱下文):
SENTRY_TSDB_OPTIONS = {
'redis': ... # RedisTSDB 的選項字典在這里
}
Dummy 后端
顧名思義,所有 TSDB
數據將在寫入時刪除並在讀取時替換為零:
SENTRY_TSDB = 'sentry.tsdb.dummy.DummyTSDB'
Redis 后端
“裸”
Redis
后端讀取和寫入所有數據到 Redis
。與事件攝取(Organization Stats
)相關的各個列將顯示歸零數據,因為該數據僅在 Snuba
中可用。
SENTRY_TSDB = 'sentry.tsdb.redis.RedisTSDB'
默認情況下,這將使用名為 default
的 Redis
集群。要使用不同的集群,請提供 cluster
選項,如下所示:
SENTRY_TSDB_OPTIONS = {
'cluster': 'tsdb',
}
寫 Buffer
Sentry
通過在一段時間內 buffer
寫入和刷新對數據庫的批量更改來管理數據庫行爭用。 如果您具有高並發性,這將非常有用,尤其是當它們經常是同一個事件時。
例如,如果您碰巧每秒接收 100,000
個事件,並且其中 10%
向數據庫報告連接問題(它們將被組合在一起),
啟用 buffer
后端將改變事情,以便每個計數更新實際上是放入隊列中,所有更新都以隊列可以跟上的速度執行。
配置
要指定后端,只需修改配置中的 SENTRY_BUFFER
和 SENTRY_BUFFER_OPTIONS
值:
SENTRY_BUFFER = 'sentry.buffer.base.Buffer'
Redis
配置 Redis
后端需要隊列,否則您將看不到任何收益(事實上,您只會對性能產生負面影響)。
配置是直截了當的:
SENTRY_BUFFER = 'sentry.buffer.redis.RedisBuffer'
默認情況下,這將使用名為 default
的 Redis
集群。要使用不同的集群,請提供 cluster
選項,如下所示:
SENTRY_BUFFER_OPTIONS = {
'cluster': 'buffer',
}
指標
Sentry
提供了一種稱為 ‘metrics’
的抽象,用於內部監控,通常是計時和各種計數器。
默認后端只是丟棄它們(盡管某些值仍保留在內部時間序列數據庫中)。
Statsd 后端
SENTRY_METRICS_BACKEND = 'sentry.metrics.statsd.StatsdMetricsBackend'
SENTRY_METRICS_OPTIONS = {
'host': 'localhost',
'port': 8125,
}
Datadog 后端
Datadog
將要求您將 datadog
包安裝到您的 Sentry
環境中:
$ pip install datadog
在你的 sentry.conf.py
中:
SENTRY_METRICS_BACKEND = 'sentry.metrics.datadog.DatadogMetricsBackend'
SENTRY_METRICS_OPTIONS = {
'api_key': '...',
'app_key': '...',
'tags': {},
}
安裝后,Sentry
指標將通過 HTTPS
發送到 Datadog REST API。
DogStatsD 后端
使用 DogStatsD
后端需要一個 Datadog Agent 與 DogStatsD
后端一起運行(默認情況下在端口 8125
)。
您還必須將 datadog
Python
包安裝到您的 Sentry
環境中:
$ pip install datadog
在你的 sentry.conf.py
中:
SENTRY_METRICS_BACKEND = 'sentry.metrics.dogstatsd.DogStatsdMetricsBackend'
SENTRY_METRICS_OPTIONS = {
'statsd_host': 'localhost',
'statsd_port': 8125,
'tags': {},
}
配置完成后,指標后端將發送到 DogStatsD
服務器,然后通過 HTTPS
定期刷新到 Datadog
。
Logging 后端
LoggingBackend
將所有操作報告給 sentry.metrics
logger。
除了指標名稱和值之外,日志消息還包括額外的數據,例如可以使用自定義格式化程序顯示的 instance
和 tags
值。
SENTRY_METRICS_BACKEND = 'sentry.metrics.logging.LoggingBackend'
LOGGING['loggers']['sentry.metrics'] = {
'level': 'DEBUG',
'handlers': ['console:metrics'],
'propagate': False,
}
LOGGING['formatters']['metrics'] = {
'format': '[%(levelname)s] %(message)s; instance=%(instance)r; tags=%(tags)r',
}
LOGGING['handlers']['console:metrics'] = {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'metrics',
}
配額
使用 Sentry
的工作方式,您可能會發現自己處於這樣一種情況:您會看到太多的入站流量,而沒有一個好的方法來丟棄多余的消息。對此有幾種解決方案,如果您遇到此問題,您可能希望全部使用它們。
事件配額
Sentry
中限制工作負載的主要機制之一涉及設置事件配額。這些可以在每個項目和系統范圍內進行配置,並允許您限制在 60
秒時間內接受的最大事件數。
配置
主要實現使用 Redis
,只需要你配置連接信息:
SENTRY_QUOTAS = 'sentry.quotas.redis.RedisQuota'
默認情況下,這將使用名為 default
的 Redis
集群。要使用不同的集群,請提供 cluster
選項,如下所示:
SENTRY_QUOTA_OPTIONS = {
'cluster': 'quota',
}
如果您有其他需求,您可以像 Redis
實現一樣自由擴展基本 Quota
類。
全系統速率限制
您可以配置系統范圍的最大每分鍾速率限制:
system.rate-limit: 500
例如,在您項目的 sentry.conf.py
中,您可以執行以下操作:
from sentry.conf.server import SENTRY_OPTIONS
SENTRY_OPTIONS['system.rate-limit'] = 500
或者,如果您導航到 /manage/settings/
,您將找到一個管理面板,其中包含一個用於設置 Rate Limit
的選項,該選項存儲在上述配額實施中。
基於用戶的速率限制
您可以配置基於用戶的每分鍾最大速率限制:
auth.user-rate-limit: 100
auth.ip-rate-limit: 100
基於項目的速率限制
要進行基於項目的速率限制,請單擊項目的 Settings
。
在 Client Keys (DSN)
tab 下,找到你想要限速的 key
,點擊對應的 Configure
按鈕。這應該會顯示 key/project-specific
的速率限制設置。
Notification 速率限制
在某些情況下,可能會擔心限制諸如出站電子郵件通知之類的內容。為了解決這個問題,Sentry
提供了一個支持任意速率限制的速率限制子系統。
配置
與事件配額一樣,主要實現使用 Redis
:
SENTRY_RATELIMITER = 'sentry.ratelimits.redis.RedisRateLimiter'
默認情況下,這將使用名為 default
的 Redis 集群。要使用不同的集群,請提供 cluster
選項,如下所示:
SENTRY_RATELIMITER_OPTIONS = {
'cluster': 'ratelimiter',
}
Notification 摘要
Sentry
提供了一項服務,該服務將在通知發生時收集通知,並安排它們作為聚合 “digest”
通知進行傳送。
配置
盡管 digest
系統配置了一組合理的默認選項,但可以使用 SENTRY_DIGESTS_OPTIONS
設置來微調 digest
后端行為,以滿足您獨特安裝的需要。
所有后端共享下面定義的一組通用選項,而某些后端還可能定義特定於其各自實現的附加選項。
minimum_delay
: minimum_delay
選項定義了默認的最小時間量(以秒為單位),以在初始調度后在調度 digest
之間等待交付。這可以在 Notification
設置中按項目覆蓋。
maximum_delay
: maximum_delay
選項定義了在調度 digest
之間等待傳送的默認最長時間(以秒為單位)。這可以在 Notification
設置中按項目覆蓋。
increment_delay
: increment_delay
選項定義了在最后一次處理 digest
之后的 maximum_delay
之前,事件的每個觀察應該延遲調度多長時間。
capacity
: capacity
選項定義了時間線內應包含的最大 item
數。這是硬限制還是軟限制取決於后端 - 請參閱 truncation_chance
選項。
truncation_chance
: truncation_chance
選項定義了 add
操作觸發時間線截斷以使其大小接近定義容量的概率。值為 1
將導致時間線在每次 add
操作時被截斷(有效地使其成為硬限制),而較低的概率會增加時間線超過其預期容量的機會,但通過避免截斷來執行操作會提高 add
的性能,截斷是一項潛在的昂貴操作,尤其是在大型數據集上。
后端
Dummy 后端
Dummy
后端禁用摘要調度,所有通知都會在發生時發送(受速率限制)。這是在版本 8
之前創建的安裝的默認 digest
后端。
可以通過 SENTRY_DIGESTS
設置指定 dummy
后端:
SENTRY_DIGESTS = 'sentry.digests.backends.dummy.DummyBackend'
Redis 后端
Redis
后端使用 Redis
來存儲 schedule
和待處理 notification
數據。這是自版本 8
以來創建的安裝的默認 digest
后端。
Redis
后端可以通過 SENTRY_DIGESTS
設置來指定:
SENTRY_DIGESTS = 'sentry.digests.backends.redis.RedisBackend'
Redis
后端接受基本集之外的幾個選項,通過 SENTRY_DIGESTS_OPTIONS
提供:
cluster
: cluster
選項定義了應該用於存儲的 Redis
集群。如果未指定集群,則使用 default
集群。
在將數據寫入 digest 后端后更改
cluster
值或集群配置可能會導致意外影響 - 即,它會在集群大小更改期間造成數據丟失的可能性。應在運行系統上小心調整此選項。
ttl
: ttl
選項定義 record
、timeline
和 digest
的生存時間(以秒為單位)。這可以(也應該)是一個相對較高的值,因為 timeline
、digest
和 record
在處理后都應該被刪除——這主要是為了確保在配置錯誤的情況下過時的數據不會停留太久 . 這應該大於最大調度延遲,以確保不會過早驅逐數據。
示例配置
SENTRY_DIGESTS = 'sentry.digests.backends.redis.RedisBackend'
SENTRY_DIGESTS_OPTIONS = {
'capacity': 100,
'cluster': 'digests',
}
Relay
Relay
是一種用於事件過濾、速率限制和處理的服務。 它可以作為:
-
Sentry 安裝的存儲端點。Relay developer
documentation -
您的應用程序和 Sentry 之間的附加中間層。Relay product
documentation
Snuba
后端 Chart 渲染
Sentry
的前端為用戶提供了各種類型的詳細交互式圖表,高度符合 Sentry
產品的外觀和感覺。
從歷史上看,這些圖表只是我們在 Web
應用程序中才有的東西。
然而,在某些情況下,在應用程序的某些上下文中顯示圖表非常有價值。例如
-
Slack 展開 Discover 圖表、指標警報通知、問題詳細信息或 Sentry 中的任何其他鏈接,其中在 Slack 中查看圖表可能很有用。
-
通知
和摘要電子郵件
。將趨勢
可視化為圖表。
幸運的是,Sentry
為內部 Chartcuterie NodeJS
服務提供了內置功能,它可以通過 HTTP API
以圖像格式生成圖形。
圖表是使用前端使用的相同 ECharts 庫生成的。
Chartcuterie
與 Sentry
的前端共享代碼,這意味着可以在前端和后端 Chartcuterie
生成的圖表之間輕松維護圖表的外觀。
在 Sentry 的后端使用 Chartcuterie
使用 Chartcuterie
生成圖表非常簡單。
導入 generate_chart
函數,提供 chart
類型和 data
對象,獲取公共圖片 URL
。
from sentry.charts import generate_chart, ChartType
# The shape of data is determined by the RenderDescriptor in the
# configuration module for the ChartType being rendered.
data = {}
chart_url = generate_chart(ChartType.MY_CHART_TYPE, data)
配置 chart 以進行渲染
Chartcuterie
從 sentry.io
加載一個外部 JavaScirpt
模塊,該模塊決定了它如何呈現圖表。
該模塊直接配置 EChart 的 options
對象,
包括在 POST /render
調用時提供給 Chartcuterie
的系列數據的轉換。
該模塊作為 getsentry/sentry
的一部分存在,
可以在 static/app/chartcuterie/config.tsx 中找到。
- https://echarts.apache.org/en/option.html
- https://github.com/getsentry/sentry/blob/master/static/app/chartcuterie/config.tsx
服務初始化
可以配置一個可選的初始化函數 init
在服務啟動時運行。
這個函數可以訪問 Chartcuterie
的全局 echarts
對象,
並且可以使用它來注冊實用程序(例如 registerMaps
)。
添加/刪除 chart 類型
Chart
渲染是基於 每個 "chart type" 配置的。
對於每種類型的 chart
,您都需要在前端應用程序和后端 chart
模塊中聲明一個眾所周知的名稱。
-
在前端,在 static/app/charctuerie/types.tsx 中添加一個
ChartType
。 -
在 static/app/chartcuterie/config.tsx中注冊
chart
的RenderDescriptor
,它描述了外觀和系列轉換。您可以為此使用register
函數。 -
在后端,在
sentry.charts.types
模塊中添加一個匹配的ChartType
。 -
在
Sentry
中部署您的更改。配置模塊將在5
分鍾內自動傳播到Chartcuterie
。您無需部署
Charcuterie
。
不要在配置模塊的同時部署使用新 chart type 的功能。由於存在傳播延遲,因此不能保證新 chart type 在部署后立即可用。
配置模塊包括部署的 sentry.io
提交 SHA
,它允許 Chartcuterie
在每個輪詢 tick
時檢查它是否收到了新的配置模塊。
在開發中運行 Chartcuterie
要在本地開發人員環境中啟用 Chartcuterie
,請首先在 config.yml
中啟用它:
# 啟用 charctuerie
chart-rendering.enabled: true
目前您需要在您的開發環境中手動構建配置模塊。
yarn build-chartcuterie-config
然后您可以啟動 Chartcuterie devservice
。如果 devservice
沒有啟動,
請檢查 chart-render.enabled
key 是否正確設置為 true
(使用 sentry config get chart-rendering.enabled
)。
sentry devservices up chartcuterie
您可以通過檢查日志來驗證服務是否已成功啟動
docker logs -f sentry_chartcuterie
應該是這樣的
info: Using polling strategy to resolve configuration...
info: Polling every 5s for config...
info: Server listening for render requests on port 9090
info: Resolved new config via polling: n styles available. {"version":"xxx"}
info: Config polling switching to idle mode
info: Polling every 300s for config...
您的開發環境現在已准備好調用 Chartcuterie
的本地實例。
在本地更新 chart type
當前,您需要在每次更改時使用 yarn build-chartcuterie-config
重建配置模塊。 這在未來可能會得到改善。
工作原理
下面是 Chartcuterie service
的幾個 service
圖以及它如何與 Sentry
應用程序服務器交互。
Chartcuterie 啟動
來自 Sentry 的 Render 調用
公眾號:黑客下午茶