当前位置: 首页 > 科技观察

Sentry监控-Snuba数据中心架构(SnQL查询语言介绍)

时间:2023-03-13 09:05:09 科技观察

以下是SnQL查询结构:MATCHsimple|join|subquerySELECT[expressions]|[aggregationsBYexpressions]ARRAYJOIN[column]WHEREcondition[[AND|OR]condition]*HAVINGcondition[[AND|OR]condition]*ORDERBYexpressionsASC|DESC[,expressionsASC|DESC]*LIMITexpressionBYnLIMITnOFFSETnGRANULARITYnTOTALSboolean这些查询作为字符串发送到/:dataset/snql端点,编码为以下格式的JSON正文:{"query":"","dataset":"","consistent":bool,"turbo":bool,"debug":bool,}数据集(dataset)由使用的url隐含询问。在JSONbody中,除query之外的所有字段都是可选的。MATCH我们的数据模型由实体图表示。此子句标识我们正在查询的子图的模式。当前支持三种类型的MATCH子句:Simple:MATCH([SAMPLEn])这等同于我们当前的所有查询。这是从单个实体(事件、交易等)查询数据。通过将可选样本与实体一起添加,可以将可选样本添加到查询中。例如:MATCH(events)Subquery:MATCH{}大括号内可以是另一个完整的SQL查询。子查询的SELECT/BY子句中的任何内容都将使用指定的别名暴露在外部查询中。例如:MATCH{MATCH(transactions)SELECTavg(duration)ASavg_dBYtransaction}SELECTmax(avg_d)Join(connection):MATCH(:[SAMPLEn])-[]->(:[SAMPLEn])一个join表示一个多节点的子图(subgraph),它是一个包含不同节点之间的多种关系的子图。目前支持节点之间的1..n、n..1和1..1定向关系。对于JOIN,每个实体都必须有一个别名,这是一个唯一的字符串。采样也可以应用于连接中的任何实体。它是Snuba中Entity中指定的字符串,是一组连接条件的简写。可以有多个连接子句,以逗号分隔。例如:MATCH(e:events)-[grouped]->(g:groupedmessage),(e:events)-[assigned]->(a:groupassignee)SELECTcount()AStotBYe.project_id,g.idWHEREa.user_id=“某人的连接类型(左/内)和连接键是数据模型的一部分,而不是查询。它们在实体代码中被硬编码。这是因为没有实体可以安全地与底层的分布式版本中的任何其他实体连接数据库。match子句提供给where子句的元组看起来与传统连接子句生成的元组完全一样:[{"e.project_id":1,"g.id":10}{"e.project_id":1,"g.id":11}{"e.project_id":2,"g.id":20}...]SELECT..BY该子句指定应在输出中返回哪些结果。如果存在聚合,则BY子句中的所有内容都被视为分组键。如果我们想聚合整个结果集,我们可以不使用BY子句进行聚合,但在这种情况下,SELECT中只能包含聚合。即使有BY子句,空的SELECT子句也是无效的。SELECT子句中的表达式可以是列、算术、函数或三者的任意组合。如果查询是一个连接,则每个列都必须有一个符合条件的别名,该别名与MATCH子句中的实体别名之一相匹配。WHERE这是聚合之前发生的查询的过滤器(如SQL中的WHERE)。条件是LHSOPRHS*形式的中缀表达式,其中LHS和RHS是文字或表达式。OP指的是一个特定的运算符来比较两个值。这些运算符是=、!=、<、<=、>、>=、IN、NOTIN、LIKE、NOTLIKE、ISNULL、ISNOTNULL之一。请注意,在使用ISNULL等运算符时,RHS是可选的。可以使用布尔关键字AND或OR组合条件。它们也可以使用()进行分组。HAVING的工作方式类似于WHERE子句,但它在SELECT子句中声明的聚合之后应用。所以我们可以在这里对聚合函数的结果应用一个条件。ORDERBY指定对结果集进行排序的表达式。LIMITBY/LIMIT/OFFSET是不言自明的,它们取一个整数并在Clickhouse查询中设置相应的值。如果查询没有指定限制或偏移量,它们将分别默认为1000和0。GRANULARITY一个整数,表示对基于时间的结果进行分组的粒度。TOTALS如果设置为True,来自Snuba的响应将有一个“totals”键,其中包含所有选定行的总值。如果MATCH子句中的节点不提供采样率,则可以在此处指定SAMPLE。在这种情况下,Snuba会将样本权分配给查询中的一个节点。sample可以是介于0和1之间的浮点数,表示要采样的行的百分比。或者它可以是一个大于1的整数,表示要采样的行数。