查询端点
streams.query 权限。
请求体
查询字符串参数
clusters 用于为联邦搜索选择远程集群。
响应
响应包含columns、数组形式的 rows、scanned_rows 与 took_ms:
联邦查询的响应还可能带有联邦元数据。
发送
Accept: application/x-ndjson 可以逐行流式返回 JSON 对象,最后附带一条包含 scanned_rows 与 took_ms 的 {"__meta__": {...}} 记录。流式查询会绕过结果缓存。时间范围与异步任务
交互式查询请使用有界的time_range。MoleSignal 把查询规模估算为“时间范围的秒数 × [querier].estimate_throughput_per_sec”。当估算值达到 [querier].auto_async_threshold_rows 时,查询会作为持久化的搜索任务运行。在默认配置下,对应 50,000 秒,约 13.9 小时的时间范围。
异步查询返回 202,并给出需要跟踪的任务:
Prefer 请求头控制运行方式:
用以下端点跟踪任务:
任务的结果保留七天。任务的状态有
pending、running、done、failed 与 cancelled。
任务还会返回 kind(query 或 backfill,回填任务带有 pipeline_id)、attempt、提交的 request,以及以 user_id 和 submitted_by 表示的提交人。
调用方可以读取和修改自己提交的任务。拥有 org.settings.manage 的调用方可以读取和修改组织内的全部任务。其他用户的任务返回 404,与不存在的任务相同。列表和汇总只统计调用方可以读取的任务。数据流 下的 搜索任务 页面显示同样的任务,参见数据流。
SQL
SQL 语句在FROM 中写出数据流名称,请求中的 stream 字段指明同一个主数据流:
跨信号 JOIN
日志、指标与链路存放在同一份存储中,因此一条查询就可以把它们关联起来。在stream 中指明主数据流,其他数据流直接按名称引用。例如,用 trace_id 把错误日志关联到对应的 Span:
RUM 行的当前版本
rum_views_latest 和 rum_sessions_latest 读取 rum_views 和 rum_sessions,每个视图或会话只留最新版本。stream 里写流名,或者写视图本身;请求的时间范围会限定这些行,所以 SELECT count(*) FROM rum_views_latest WHERE "application.id" = 'shop' 数的是范围内开始的视图。数据流的字段遮掩同样适用。
文本搜索
MATCH_TEXT 把多个词理解为 token 级 AND,"a b" 表示短语,error* 与 *error 是通配符,另有 a OR b,以及用 -a 排除某个词。创建数据流或编辑 schema 时添加该索引,参见数据流。
SQL 中的时间戳
_timestamp 是 Timestamp(µs, "UTC") 类型的列。与 _timestamp 比较的整数字面量按自 Unix 纪元起的微秒数处理,因此下面两个过滤条件选出的行相同:
_timestamp 与表达式或其它列比较,请先用 to_timestamp_micros(...) 转换。用 CAST(_timestamp AS BIGINT) 可以读出一行的微秒数。
加密字段
decrypt(field) 会还原被标记为加密的字段的明文,参见数据流。
PromQL
把language 设为 promql,即可对指标数据流运行 PromQL。指标选择器指定一个指标,装着它的每个指标数据流都会参与回答:metric_name 保存指标名,value 列保存样本,其余列是标签。通过该端点时,MoleSignal 把表达式作为 instant 查询,在 time_range.end 处求值,每个时间序列返回一行,先是 value,再是各个标签:
*_over_time 函数、含 topk 与 limitk 的标准聚合、histogram_quantile、label_replace 与 label_join、数学与三角函数、配合 on、ignoring、group_left、group_right 向量匹配的 and、or、unless 集合运算、选择器修饰符 @ 与 offset,以及子查询。
PromQL 支持矩阵
支持的函数、运算符、修饰符完整清单,以及已知差异(native-histogram 函数、二元
default)。事件上下文(search around)
POST /api/v1/query/search_around 返回某条事件前后紧邻的事件,方便调查时查看一行日志的上下文,参见事件上下文。
检查与控制
POST /api/v1/query/inspect只做规划不执行,返回查询元数据与逻辑计划。POST /api/v1/query/recommendations不执行查询,只分析查询画像。GET /api/v1/query/running与POST /api/v1/query/{id}/cancel供组织管理员查看和取消活动查询。GET /api/v1/query/sql/capabilities与GET /api/v1/query/promql/capabilities列出供编辑器使用的受支持函数。
streams.query;活动查询管理需要 org.settings.read 或 org.settings.manage。
联邦搜索
给查询端点添加?clusters=local,cluster-name 即可发起联邦搜索。无法访问的远程集群会在联邦元数据中显示为降级,不会被悄悄当成本地数据,参见分角色部署。
存储字段
数据流的字段取决于发送端提供的内容。以下是 OTLP 接入产生的字段。资源与记录的属性会成为保留原始键名的顶层字段(例如service.name),并保留各自的数值类型。
OTLP 日志字段
链路 Span 字段
Span 由
trace_id 与 span_id 标识,重复发送的 Span 会被当作重复数据丢弃。
OTLP 指标字段
MoleSignal 把每个 OTLP 数据点展平为一个指标事件。资源、scope 与数据点的属性仍是可查询的字段。下表中的保留字段优先于同名属性。
直方图的分桶边界与计数,以及 summary 的分位数,都不会被保存。
Delta 数据点按接收时的样子保存。PromQL 的 rate 家族按存储的 temporality 计算:
increase 累加窗口内的 delta 值,rate 再除以 range,irate 用最后一个 delta 值除以它的区间。对于 cumulative 单调 Sum,会处理 counter 重置。如果导出端在同一个窗口内改变了 temporality,只计算最新一段语义连续的样本。
通过 HTTP 发送 OTLP 时,指标、日志与链路都支持 protobuf(http/protobuf)和 JSON。JSON 编码把 64 位整数写成字符串,例如 "asInt": "340" 与 "count": "4"。MoleSignal 对字符串和普通数字一视同仁。
缓存
查询使用进程内缓存,覆盖已打开的索引句柄、已关闭时间窗的结果、检索词项计数与索引 footer。对于远程对象存储,磁盘缓存会把对象的字节范围保存在./data/cache/objects 下,默认 10 GiB。缓存对响应契约透明,请通过 /metrics 观察缓存行为,容量设置参见配置。