专栏首页黑客下午茶Sentry 监控 - Snuba 数据中台架构(Data Model 简介)

Sentry 监控 - Snuba 数据中台架构(Data Model 简介)

系列

本节介绍数据在 Snuba 中的组织方式以及面向用户的数据如何映射到底层数据库(如: Clickhouse)。

Snuba 数据模型横向分为逻辑模型(logical model)和物理模型(physical model)。逻辑数据模型是 Snuba 客户端通过 Snuba 查询语言可见的。此模型中的元素可能会也可能不会 1:1 映射到数据库中的表。相反,物理模型将 1:1 映射到数据库概念(如表和视图)。

这种划分背后的原因是,它允许 Snuba 通过逻辑数据模型公开一个稳定的接口,并在内部执行复杂的映射,对不同的表(物理模型的一部分)执行查询,以一种对 client 透明的方式提高性能。

本节的其余部分概述了组成两个模型的概念以及它们如何相互连接。

下面描述的主要概念是数据集(dataset)、实体(entity)和存储(storage)。

数据集

DatasetSnuba 数据的命名空间。它提供了自己的 schema,并且在逻辑模型和物理模型方面都独立于其他数据集。

数据集的示例是 discover(发现)outcomes(结果)sessions(会话)。他们之间没有任何关系。

数据集可以看作是定义其抽象数据模型及其具体数据模型的组件的容器,如下所述。

实体和实体类型

Snuba 向客户端公开的逻辑数据模型的基本块(fundamental block)是实体。在逻辑模型中,实体表示抽象概念(如 transactionerror)的实例。在实践中,Entity 对应于数据库表中的一行。Entity Type 是实体的类(如 Errors 或 Transactions)。

逻辑数据模型由一组 Entity Types 及其 relationships 组成。

每个 Entity Type 都有一个 schema,该模式由具有相关抽象数据类型的字段列表定义。 Dataset 的所有 Entity Types(可以有多个)的 schema 组成了对 Snuba client 可见的逻辑数据模型,Snuba 查询根据该模型进行验证。不应该暴露较低级别的概念。

Entity Types 明确包含在 Dataset 中。一个 Entity Type 不能出现在多个数据集中。

实体类型之间的关系

数据集中的实体类型在逻辑上是相关的。支持两种类型的关系:

  • 实体集关系(Entity Set Relationship)。这模仿了外键。这种关系旨在允许实体类型之间的连接。目前它只支持一对一一对多的关系。
  • 继承关系(Inheritance Relationship)。这模仿了名义上的子类型(subtyping)。一组实体类型可以共享一个父实体类型。子类型从父类型继承 schema。从语义上讲,父实体类型必须表示其类型从其继承的所有实体的联合。还必须能够查询父实体类型。这不能仅仅是一种逻辑关系。

实体类型和一致性

Entity TypeSnuba 可以提供一些强大的数据一致性保证的最大单元。具体来说,可以查询期望 Serializable Consistency(可序列化的一致性) 的实体类型。这不会扩展到跨越多个实体类型的任何查询,在这种情况下,我们最多将具有最终的一致性。

这也会对订阅查询(Subscription queries)产生影响。这些一次只能对一种实体类型起作用,否则,它们将需要实体类型之间的一致性,而我们不支持这种一致性。

请注意! 准确地说,一致性单位(取决于 Entity Type)甚至可以更小,并且取决于数据摄取主题(data ingestion topics)的分区方式(例如 project_id),实体类型是 Snuba 允许的最大值。

存储

Storage 表示并定义 Dataset 的物理数据模型。每个 Storage 表示在物理数据库概念中具体化,如表或具体化视图。因此,每个存储都有一个由字段及其类型定义的 schema,该字段反映了 storage 映射到的 DB table/view 的物理模式,并且能够提供生成 DDL 语句的所有详细信息,以在数据库上构建表。

Storage 能够将上面讨论的逻辑模型中的逻辑概念映射到数据库的物理概念,因此每个 Storage 都需要与一个 Entity Type 相关联。具体来说:

  • 每个 Entity Type 必须由至少一个 Readable Storage(我们可以在其上运行查询的 Storage)支持,但可以由多个 Storage(例如预聚合物化视图pre-aggregate materialized view)支持。每个 Entity Type 的多个 Storage 旨在允许查询优化。
  • 每个 Entity Type 必须由一个且仅一个用于摄取数据和填充数据库表的 Writable Storage 支持。
  • 每个 Storage 仅支持一种 Entity Type

示例

本节提供了一些示例,说明 Snuba data model 如何表示一些现实世界模型。

这些案例研究不一定反映当前的 Sentry production model,也不一定是同一部署的一部分。它们必须被视为孤立的例子。

单一实体数据集

这看起来像 Sentry 使用的 Outcomes 数据集。这实际上并没有反映截至 2020 年 4 月的 Outcomes。尽管设计 Outcomes 应该朝着这个方向发展。

Dataset 只有一种 Entity Type,代表数据集摄取的单个 Outcome。查询 raw Outcome 非常缓慢,所以我们有两个 Storage。一个是反映我们摄取的数据的 Raw storage 和一个计算每小时聚合的 materialized view,查询效率更高。Query Planner 将根据查询是否可以在聚合数据上执行来选择 storage

多个实体类型数据集

此数据集的典型示例是 Discover 数据集。

这具有三种 Entity TypeErrorsTransactions 并且它们都继承自 Events。这些形成了逻辑数据模型,因此查询 Events Entity Type 给出了 TransactionsErrors 的联合,但它只允许查询中存在两者之间的公共字段。

出于性能原因,Errors Entity Type 由两个 Storage 支持。一个是用于摄取数据的主要 Errors Storage,另一个是read only view(只读视图),在查询时对 Clickhosue 的负载较少,但提供较低的一致性保证。 Transactions 只有一个 storage,并且有一个 Merge Table 来为 Events 提供服务(本质上是两个表联合的视图)。

连接实体类型

这是一个简单的数据集示例,其中包含可以在查询中连接在一起的多个实体类型。

GroupedMessageGroupAssingee 可以是带有 Errorsleft join 查询的一部分。其余部分与前面示例中讨论的内容类似。

本文分享自微信公众号 - 黑客下午茶(hi-weishao),作者:为少

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-10-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Sentry 监控 - Snuba 数据中台架构(Query Processing 简介)

    在数据模型上,查询处理流水线分为逻辑部分,进行产品相关处理,物理部分专注于优化查询。

    为少
  • Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)

    Snuba 是一种在 Clickhouse 之上提供丰富数据模型以及快速摄取消费者(直接从 Kafka 获取数据)和查询优化器的服务。

    为少
  • Snuba:Sentry 新的搜索基础设施(基于 ClickHouse 之上)

    Sentry 已经在名为 Search,Tagstore(用于事件标签)和 TSDB(时间序列数据库,为大多数图形提供动力)的抽象服务接口上运行。这些服务中的每...

    为少
  • 抓 Bug 神器的工作原理——聊聊 Sentry 的架构

    Sentry 是什么?这是一个用于错误上报的服务中心,使用近乎一致的 API 设计,统一了不同语言生产环境代码异常上报的难题。

    benny
  • 抓 Bug 神器的工作原理——聊聊 Sentry 的架构

    Sentry 是什么?这是一个用于错误上报的服务中心,使用近乎一致的 API 设计,统一了不同语言生产环境代码异常上报的难题。

    FesonX
  • Sentry(v20.12.1) K8S云原生架构探索,玩转前/后端监控与事件日志大数据分析,高性能高可用+可扩展可伸缩集群部署

    Sentry 算是目前开源界集错误监控,日志打点上报,事件数据实时分析最好用的软件了,没有之一。将它部署到 Kubernetes,再搭配它本身自带的利用 Cli...

    为少
  • Sentry 10 K8S 云原生架构探索,Vue App 1 分钟快速接入

    Sentry 10 算是目前开源界集错误监控,日志打点上报,事件数据实时分析最好用的软件了,没有之一。将它部署到 Kubernetes,再搭配它本身自带的利用 ...

    为少
  • Apache Sentry实战之旅(一)—— Impala+Sentry整合

    Impala默认是以impala这个超级用户运行服务,执行DML和DDL操作的,要实现不同用户之间细粒度的权限控制,需要与Sentry整合。Sentry是Apa...

    九州暮云
  • Sentry(v20.12.1) K8S 云原生架构探索,JavaScript 性能监控之采样 Transactions

    如果您希望 transactions 的 cross-section 均匀,无论您在应用程序中的何处或在什么情况下发生,并且对下文所述的默认继承和优先级行为感到...

    为少
  • Sentry(v20.12.1) K8S 云原生架构探索,JavaScript Enriching Events(丰富事件信息)

    自定义上下文允许您将任意数据附加到事件。通常,此上下文在其生命周期中捕获的任何 issue 之间都是共享的。您无法搜索这些,但可以在 issue 页面上查看它们...

    为少
  • 业务日志监控工具Sentry介绍

    “ 我们在完成业务系统上线后除了正常关注系统进程、内存、CPU等这些物理指标并进行监控外,往往也需要观察线上业务日志的运行情况,特别是新系统上线后的业务异常日志...

    用户5927304
  • 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(概述篇)

    下面是一个实现新的 Sentry SDK 的指南。它涵盖了事件提交的协议,以及客户端的典型外观和行为准则。

    为少
  • 【BDTC 2015】大数据安全分论坛:数据驱动安全

    2015年12月10-12日,由中国计算机学会(CCF)主办,CCF大数据专家委员会承办,中国科学院计算技术研究所、北京中科天玑科技有限公司与CSDN共同协办,...

    CSDN技术头条
  • Sentry(v20.12.1) K8S 云原生架构探索,JavaScript 性能监控之管理 Transactions

    @sentry/tracing 包提供了一个 BrowserTracing 集成,以添加 automatic instrumentation 来监视浏览器应用程...

    为少
  • 你不知道的前端 MVVM 模式中的数据层(万字长文,教你造轮子)

    当今时代,React、Vue、AngularJS 三大框架横行,我们很难争论出哪个是最好的框架,但三者共同点是 MVVM 的模式,用一张简单的图可以看到,MVV...

    一只图雀
  • 顶级开源项目 Sentry 20.x JS-SDK 设计艺术(理念与设计原则篇)

    本文档为 Sentry 上的 SDK 开发设置了一些常规指南。它应该帮助内部和外部开发人员了解 SDK 的设计动机以及为什么我们以某些方式做出决定。

    为少
  • Sentry 监控 - 面向全栈开发人员的分布式跟踪 101 系列教程(第一部分)

    欢迎来到我们关于全栈开发人员分布式跟踪(Distributed Tracing)的系列的第 1 部分。在本系列中,我们将学习分布式跟踪的细节,以及它如何帮助您监...

    为少
  • 基于 Vue 和 TS 的 Web 移动端项目实战心得

    来源:https://juejin.im/post/5d759f706fb9a06afa32adec

    coder_koala
  • Sentry-JS-SDK-Browser 官方示例最佳实践

    为少

扫码关注云+社区

领取腾讯云代金券