系列
- 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 简介与调试指南
本指南将引导您完成编写和测试 Snuba 查询的过程。
探索 Snuba 数据模型
为了构建 Snuba 查询,第一步是能够知道您应该查询哪个数据集,您应该选择哪些实体以及每个实体的 schema 是什么。
有关数据集和实体的介绍,请参阅 Snuba 数据模型部分。
数据集可以在这个模块中找到。每个数据集都是一个引用实体的类。
系统中的实体列表可以通过 snuba entity 命令找到:
1 | sh复制代码snuba entities list |
会返回如下内容:
1 | sh复制代码Declared Entities: |
一旦我们找到了我们感兴趣的实体,我们就需要了解在该实体上声明的 schema 和 relationship。 相同的命令描述了一个实体:
1 | sh复制代码snuba entities describe groupedmessage |
会返回:
1 | python复制代码Entity groupedmessage |
它提供列的列表及其类型以及与数据模型中定义的其他实体的关系。
准备对 Snuba 的查询
Snuba 查询语言称为 SnQL。它记录在 SnQL 查询语言部分。所以本节不赘述。
有一个 python sdk 可用于构建 Snuba 查询,它可以用于任何 Python 客户端,包括 Sentry。 snuba-sdk。
查询表示为一个 Query 对象,如:
1 | python复制代码query = Query( |
有关如何构建查询的更多详细信息,请参见 sdk 文档。
一旦查询对象准备就绪,它就可以发送到 Snuba。
使用 Sentry 向 Snuba 发送查询
查询 Snuba 时最常见的用例是通过 Sentry。本节说明如何在 Sentry 代码库中构建查询并将其发送到 Snuba。
Sentry 导入了上述的 Snuba sdk。这是构建 Snuba 查询的推荐方法。
一旦创建了 Query 对象,Sentry 提供的 Snuba client api 就可以并且应该用于将查询发送到 Snuba。
api 在这个模块中。 它负责缓存、重试并允许批量查询。
该方法返回一个字典,其中包含响应中的数据和其他元数据:
1 | json复制代码{ |
data 部分是一个列表,每行一个字典。meta 包含响应中包含的列的列表,其数据类型由 Clickhouse 推断。
通过 Web UI 发送测试查询
Snuba 具有可用于发送查询的最小 Web UI。
您可以在本地运行 Snuba,
并且可以通过 http://localhost:1218/[DATASET NAME]/snql 访问 Web UI。
应该在 query 属性中提供 SnQL 查询,并且响应的结构与上一节中讨论的相同。
通过 curl 发送查询
Web UI 仅将 payload 作为 POST 发送。因此,使用 curl 或任何其他 HTTP 客户端可以实现相同的结果。
请求和响应格式
请求格式在上面截图中可见:
query包含字符串形式的SnQL查询。dataset是数据集名称(如果尚未在url中指定。debug使Snuba在响应中提供详尽的统计信息,包括Clickhouse查询。consistent强制Clickhouse查询以单线程模式执行,并且如果Clickhouse表被复制,它将强制Snuba始终命中同一个节点。可以保证顺序一致性,因为这是消费者默认写入的节点。这是通过设置为in_order的负载平衡Clickhouse属性实现的。turbo为TURBO_SAMPLE_RATE Snuba设置中定义的查询设置采样率。它还可以防止Snuba将FINAL模式应用于Clickhouse查询,以防在替换后需要保证正确的结果。
Snuba 可以使用 4 个 http code 进行响应。200 表示成功的查询,如果查询无法正确验证,则为 400。500 通常意味着与 Clickhouse 相关的问题(从超时到连接问题),尽管 Snuba 仍然无法提前识别一些无效查询。Snuba 有一个内部速率限制器,所以 429 也是一个可能的返回码。
成功查询的响应格式与上面讨论的相同。完整版本如下所示(在 debug 模式下)
1 | json复制代码{ |
timing 部分包含查询的时间戳和持续时间。有趣的是,持续时间被分解为几个阶段:marks_ms。
sql 元素是 Clickhouse 查询。
stats 字典包含以下 key
clickhouse_table是snuba在查询处理过程中选取的表。final表示Snuba是否决定向Clickhouse发送FINAL查询,这会迫使Clickhouse立即应用相关的合并(Merge Tree)。细节sample是应用的采样率。project_rate是查询时Snuba每秒收到的特定项目的请求数。project_concurrent是查询时涉及特定项目的并发查询数。global_rate与project_rate相同,但不专注于一个项目。global_concurrent与project_concurrent相同,但不专注于一个项目。query_id是此查询的唯一标识符。
查询验证问题通常采用以下格式:
1 | json复制代码{ |
Clickhouse 错误将具有类似的结构。type 字段将显示 clickhouse,该消息将包含有关异常的详细信息。与查询验证错误相反,在 Clickhouse 错误的情况下,实际执行了查询,因此存在为成功查询描述的所有时间和统计信息。
本文转载自: 掘金