news 2026/9/26 4:30:40

highlight.io 会话过滤完整指南:从摄取采样、速率限制到 manualStart 自定义录制控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
highlight.io 会话过滤完整指南:从摄取采样、速率限制到 manualStart 自定义录制控制
  • 可观测性
  • 后端

【免费下载链接】highlight

highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more.

项目地址:https://gitcode.com/gh_mirrors/hi/highlight
点击查看免费下载

session replay(会话回放)是 highlight.io 全栈可观测性平台的核心能力之一,但当业务流量上升、或你只关心特定类型的会话时,未经筛选的录制会迅速淹没你的 session feed。highlight.io 提供了从服务端摄取(ingestion)过滤到客户端自定义控制的多层会话过滤方案:既可以在数据进入系统之前就丢弃大部分无关流量,也可以在客户端通过manualStart精确决定"何时录、录什么"。

本指南以 filtering-sessions.md 为核心脉络,系统讲解 highlight.io 的全部会话过滤手段,包括三种摄取过滤器(采样、限流、排除查询)、按用户标识过滤、仅保留有错误的会话、基于自定义逻辑的manualStart方案,以及彻底关闭录制的disableSessionRecording,并结合仓库源码说明每一层过滤在底层是如何生效的。

为什么需要过滤会话?

在你的应用中,并不是所有会话都值得被完整录制和分析:

  • 大量内部员工、爬虫或测试账号的访问会污染 session 列表,让你难以找到真正需要排查的用户路径;
  • 某些环境(如development、staging)产生的会话对你的错误排查没有价值;
  • 当产品出现流量尖峰时,会话录制成本与存储压力会急剧上升。

highlight.io 的会话过滤机制就是为这些场景设计的。一个需要特别记住的关键规则是:

被过滤掉的会话不计入你的计费配额。

也就是说,无论你是通过摄取过滤器在服务端丢弃数据,还是在客户端主动停止录制,highlight 都只会按照实际保留下来(retained)的数据进行计费,这让你可以在控制成本的同时,只保留对排障真正有意义的回放。

设置摄取过滤器(Ingestion Filters)

摄取过滤器是在数据进入 highlight.io 之前进行的第一道闸门,运行在服务端。你可以按产品维度(sessions、errors、logs、traces 四种数据类型)分别独立配置,共支持以下三种过滤方式,三者可以组合使用。

1. 按百分比采样(Sampling)

按比例随机保留一部分数据。例如,你可以配置只摄取全部会话的 1%:

  • 对于每一条到达的数据,highlight 会基于该产品模型的标识符(identifier)做一次随机化决策,从而保证同一数据始终被一致地保留或丢弃;
  • 对于traces(链路追踪),随机决策基于Trace ID,这样同一 trace 下的所有子 span 会同进同出——要么整条链路都被摄取,要么整条都被丢弃,避免出现残缺不全的链路。

在源码中,采样率以项目级配置的形式持久化在数据库中。以 backend/model/model.go 为例,模型为五种产品各保存了一个采样率字段,且默认值均为1(即默认全量采样):

SessionSamplingRate float64 `gorm:"default:1"` ErrorSamplingRate float64 `gorm:"default:1"` LogSamplingRate float64 `gorm:"default:1"` TraceSamplingRate float64 `gorm:"default:1"` MetricSamplingRate float64 `gorm:"default:1"`

对应地,私有 GraphQL API 的EditProjectSettingsmutation 也接收一个sampling输入对象,其中包含session_sampling_rate、error_sampling_rate、log_sampling_rate、trace_sampling_rate、metric_sampling_rate等字段(见 backend/private-graph/graph/generated/generated.go 中的Sampling类型定义)。也就是说,你在前端项目设置页面里配置的每一项采样率,最终都会写入这些字段,供摄取管道的随机采样逻辑读取。

2. 分钟级速率限制(Rate Limit)

在1 分钟的时间窗口内限制摄取的数据点上限。例如,配置每分钟最多摄取 100 个会话:

  • 当你的产品出现流量尖峰时,这一设置可以限制被记录的会话数量,避免突发的海量流量打爆存储与预算;
  • 速率限制同样按产品独立配置(sessions / errors / logs / traces 各自拥有独立的每分钟上限)。

在数据模型中,对应的字段为SessionMinuteRateLimit、ErrorMinuteRateLimit、LogMinuteRateLimit、TraceMinuteRateLimit、MetricMinuteRateLimit(backend/model/model.go)。这些字段为可空指针类型,未设置(NULL)即表示不启用限流;配置后在 GraphQL 的Sampling类型中对应session_minute_rate_limit、error_minute_rate_limit等Int64字段(generated.go)。

3. 排除查询(Exclusion Query)

设置一个排除规则查询,命中的数据将直接不被摄取。例如,配置排除查询为environment: development,那么所有带有development环境标签的会话都会被丢弃。

提示:这个排除查询复用了 highlight.io 的查询语法,与你在 session feed、日志搜索中使用的搜索语法一致(该语法的完整定义可参见 antlr/SearchGrammar.g4)。因此你熟悉的字段(如environment、browser、visitedURL等)都可以直接用于排除规则。

对应的存储字段为SessionExclusionQuery、ErrorExclusionQuery、LogExclusionQuery、TraceExclusionQuery、MetricExclusionQuery(backend/model/model.go),在 GraphQL 中对应Sampling类型下的session_exclusion_query等字段(generated.go)。

计费规则:只为实际保留的数据付费

三种摄取过滤器共享同一条计费原则:只按实际保留的数据计费。

例如,配置仅摄取 1% 的会话,则你只会被收取这 1% 会话的费用——会话的计量口径为 events-and-users.md 中定义的会话:会话在H.init(或手动延迟录制时的H.start)时开始,同一会话最长持续录制 4 小时,每个浏览器标签页实例独立成会话;单标签页关闭后 15 分钟内重新打开会恢复原会话,超过 15 分钟则开启新会话。

所有摄取过滤器的配置入口位于项目设置页面的Filters(过滤)标签页中,按产品(sessions、errors、logs、traces)分别展开配置。

按用户标识符过滤会话

有时你可能希望彻底排除某个特定用户的会话(例如内部人员、测试账号或已知的问题用户)。highlight.io 支持在项目设置中维护一个"Filtered Sessions"(已过滤会话)列表,把你希望排除的用户标识符添加进去即可。

需要特别注意的是,匹配依据是调用H.identify方法时传入的第一个参数identifier。从源码看,SDK 的identify(user_identifier, user_object)方法(sdk/highlight-run/src/client/index.tsx)会把第一个参数写入会话数据sessionData.userIdentifier,并在初始化时从存储中恢复后自动调用(同文件第 356-357 行)。因此,请务必保证你在H.identify中使用的 identifier 与你在 "Filtered Sessions" 输入框中填写的字符串完全一致。

只保留有错误的会话:Has Error过滤

如果你主要使用 highlight.io 做错误监控(error monitoring),而不是回放分析,那么你并不需要为每一个正常会话都录制回放。此时可以在项目设置中定位到会话相关的摄取过滤器,通过设置Has Error: false过滤器,让系统只记录发生过错误的会话。

这一设置与下面的disableSessionRecording是两种不同的"只留错误"思路:

  • Has Error: false是服务端过滤,从源头丢弃没有错误的会话,既节省存储也节省计费;
  • disableSessionRecording是客户端开关,彻底不录制回放数据,但错误、日志等产品仍然正常工作。

基于自定义逻辑过滤:manualStart手动控制录制

服务端摄取过滤器解决的是"数据进来之后要不要"的问题,但有些过滤逻辑依赖运行时状态,例如:

只录制已登录用户的会话,跳过未登录访客的会话。

这种场景无法用静态规则表达,highlight.io 为此提供了manualStart配置项,把"何时开始录制"的决策权完全交给你。其原理是:设置manualStart: true后,SDK不会在页面加载时自动开始录制。从源码可以看到,初始化逻辑在 sdk/highlight-run/src/index.tsx 处显式判断了该选项:

if (!options?.manualStart) { await highlight_obj.initialize() }

即只有manualStart为false(默认值)时才自动调用initialize()开始录制;为true时则跳过,等待你在合适的时机手动调用H.start()。该选项的官方注释(sdk/highlight-run/src/client/types/types.ts)也明确指出:它应与H.start()/H.stop()配合,用于自行控制录制时机,默认值为false。

配置方式如下:

H.init('<YOUR_PROJECT_ID>', { manualStart: true, // ... 其他选项 })

然后在你的业务逻辑中,用H.start手动开始会话:

useEffect(() => { if (userIsLoggedIn) { H.start() } }, [userIsLoggedIn])

对应的H.stop()在底层调用stopRecording(manual)(sdk/highlight-run/src/client/index.tsx):它会停止 rrweb 的录制观察器、停止所有事件监听器,并将录制状态置为NotRecording,同时写入一条Stop自定义事件用于审计。SDK 的测试用例也覆盖了这一流程——highlight.start()、highlight.stop()、highlight.identify('123', {})均在 sdk/highlight-run/src/tests/index.test.tsx 中被断言,你可以将其作为"如何编写基于manualStart的过滤逻辑"的参考模板。

彻底禁用会话录制:disableSessionRecording

如果你使用 highlight.io只做错误监控或日志记录,完全不需要 session replay 功能,那么最干净的做法是在初始化时设置disableSessionRecording: true:

import { H } from 'highlight.run'; H.init('<YOUR_PROJECT_ID>', { disableSessionRecording: true, // ... });

从源码看,该选项的默认值为false(types.ts),其语义是"完全关闭用户会话回放的录制",并明确提示:除非你只用 highlight.io 做错误监控,否则不要开启它。开启后,SDK 在初始化会话时不仅不录制回放,还会联动关闭网络请求录制——在 client/index.tsx 中,enableNetworkRecording的判定逻辑如下:

if (this.options.disableSessionRecording) { enableNetworkRecording = false } else if (this.options.disableNetworkRecording !== undefined) { enableNetworkRecording = false } else if (typeof this.options.networkRecording === 'boolean') { enableNetworkRecording = false } else { enableNetworkRecording = this.options.networkRecording?.recordHeadersAndBody || false }

即disableSessionRecording: true时网络内容录制也会被一并关闭,最终通过initializeSession的disable_session_recording参数(client/index.tsx)同步到服务端。而错误监控、日志等其他产品功能不受影响,仍然正常工作。

小结:如何组合使用这些过滤手段

highlight.io 的会话过滤体系可以归纳为三层防线,你可以根据场景自由组合:

过滤手段生效位置典型场景配置入口
采样(Sampling)服务端摄取控制总体数据量,如只保留 1%项目设置 → Filters
分钟级速率限制服务端摄取应对流量尖峰,如每分钟 100 个会话项目设置 → Filters
排除查询服务端摄取排除特定环境/属性,如environment: development项目设置 → Filters
Filtered Sessions 列表服务端摄取排除特定用户(按H.identify的 identifier 匹配)项目设置 → Session Replay
Has Error: false服务端摄取只保留发生过错误的会话项目设置 → Filters
manualStart+H.start/H.stop客户端基于运行时状态(如登录态)自定义录制时机H.init配置
disableSessionRecording客户端只使用错误监控/日志,完全关闭回放H.init配置

选择建议:

  • 想控制成本与数据量,优先配置采样与速率限制;
  • 想清理噪音(排除内部流量、无价值环境、特定用户),使用排除查询与 Filtered Sessions;
  • 需要精确到运行时机的过滤(如未登录不录制),用manualStart;
  • 只想用错误监控或日志,直接disableSessionRecording: true。

无论选择哪一层,highlight.io 都只会对实际保留的数据计费。如果需要进一步了解会话如何被定义与计量(4 小时上限、15 分钟恢复窗口、每标签页独立会话),可阅读 events-and-users.md;关于H.identify等 SDK 方法更完整的签名说明,见 docs-content/sdk/client.md。

  • 可观测性
  • 后端

【免费下载链接】highlight

highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more.

项目地址:https://gitcode.com/gh_mirrors/hi/highlight
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 4:30:25

ASP+SQL Server民航售票管理系统毕设实战:环境搭建、核心业务与避坑指南

简介&#xff1a;这份毕业设计资料包面向计算机相关专业学生与ASP初学者&#xff0c;提供一套基于ASP与SQL Server开发的民航售票管理系统完整实现&#xff0c;可用于课程设计、毕业设计参考或Web开发入门练手。系统涵盖会员注册、管理员后台、留言管理、航班查询、网上订票与退…

作者头像 李华
网站建设 2026/9/26 4:30:24

Kotlin外卖App课设拆解:三层架构与数据库设计实战

简介&#xff1a;这是一套面向高校学生与Android开发初学者的完整课程设计项目&#xff0c;采用Kotlin语言开发&#xff0c;涵盖外卖应用的客户端、服务端与数据库三层架构&#xff0c;适合作为大三课程设计参考或移动开发入门实战案例。压缩包共270个文件&#xff0c;约150MB&…

作者头像 李华
网站建设 2026/9/26 4:28:22

朴素贝叶斯情感文本分析分类实战:原理、源码与调优

简介&#xff1a;面向机器学习与自然语言处理课程期末大作业场景&#xff0c;这一项目基于朴素贝叶斯算法完成情感文本分析与分类&#xff0c;适合计算机相关专业学生系统复现算法流程、完成课程设计或期末大作业。压缩包共12个文件&#xff0c;以Python脚本、CSV数据集、预训练…

作者头像 李华
网站建设 2026/9/26 4:27:13

快递代取小程序毕设实战:订单状态机与Spring Boot后端

简介&#xff1a;这是一份基于微信小程序的快递代取系统毕业设计源码&#xff0c;主要面向计算机相关专业学生和需要快速搭建小程序项目的开发者&#xff0c;适用于毕业设计、课程设计或真实业务演练。项目采用微信开发者工具与Java后端实现&#xff0c;功能覆盖用户信息管理、…

作者头像 李华
网站建设 2026/9/26 4:26:33

办公Agent怎么选:从任务场景到工作流匹配的TaoToken配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华