- 可观测性
- 后端
【免费下载链接】highlight
highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more.
本篇技术指南完整梳理 highlight.io(开源全栈可观测性平台)官方文档中 19 个集成模块的能力与接入方式:如何将 Session Replay、错误监控数据同步到 Amplitude / Mixpanel / Segment / Pendo / Intercom 等分析平台,如何在 GitHub / Jira / Linear / Height / ClickUp / Discord 中一键创建工单,如何让 Slack 实时接收告警,以及如何通过 Grafana 数据源插件做统一的可视化与告警。读完本文,你将掌握每个集成的启用步骤、关键配置参数、H.init()/H.track()/H.identify()等 SDK 调用的转发语义,并理解其背后的 OAuth 授权与数据转发实现原理。
集成模块的完整文档入口位于 docs-content/general/7_integrations,其中 index.md 是所有集成的导航页,1_overview.md 提供了模块总览。所有集成可按用途分为四类:数据/事件转发类(Amplitude、Mixpanel、Segment、Pendo、Intercom、LaunchDarkly)、工单创建类(GitHub、Jira、Linear、Height、ClickUp、Discord)、通知与部署类(Slack、Vercel、WordPress、Electron、Nuxt)、以及Grafana 数据源。
数据与事件转发类集成
这类集成解决同一个问题:让业务分析系统与可观测性数据共享同一套用户事件流。启用后,highlight.io 客户端 SDK 会在本地初始化对应分析 SDK,并把H.track()、H.identify()等调用自动转发过去。
在源码层面,客户端 SDK 的IntegrationOptions类型显式声明了 Amplitude、Intercom、Mixpanel 三个可选集成项,见 sdk/highlight-run/src/client/types/client.ts:
export declare type IntegrationOptions = { amplitude?: AmplitudeIntegrationOptions intercom?: IntercomIntegrationOptions mixpanel?: MixpanelIntegrationOptions }所有分析类集成都遵循统一的选项结构:projectToken/apiKey用于让 highlight.io 代为初始化分析 SDK,enabled: false用于显式关闭集成,disabled字段同样存在于默认选项中。
Amplitude 集成
在初始化H.init()时传入 Amplitude API Key,即可让 highlight.io 代为初始化 Amplitude 客户端:
H.init('<YOUR_PROJECT_ID>', { integrations: { amplitude: { apiKey: '<AMPLITUDE_API_KEY>', }, }, })启用后的事件转发语义如下:
H.track()→ AmplitudelogEvent():调用H.track()会转发为 Amplitude 的logEvent(),且 highlight.io 会自动追加一个highlightSessionURL属性,值为事件发生时所在会话的 URL,方便从 Amplitude 一键跳回会话回放:
H.track('signup_button_clicked', { firstTime: true, impressions: 10, }) // The Highlight track call is equivalent to this logEvent call amplitudeClient.logEvent('signup_button_clicked', { firstTime: true, impressions: 10, // This property is added by Highlight. This shows you the session where this event happened. highlightSessionURL: 'https://app.highlight.io/sessions/123', })H.identify()→ AmplitudesetUserId()+identify():调用H.identify()会依次触发 Amplitude 的setUserId()和identify():
H.identify('eliza@corp.com', { planType: 'premium', verified: false, }) // The Highlight identify call is equivalent to setUserId and identify. amplitudeClient.setUserId('eliza@corp.com') amplitudeClient.identify(new amplitude.Identify().set('planType', 'premium').set('verified', false))如不需要此行为,可显式关闭:
H.init('<YOUR_PROJECT_ID>', { integrations: { amplitude: { enabled: false, }, }, })Mixpanel 集成
如果你还没有初始化 Mixpanel,可直接在配置中传入 Mixpanel Project Token,由 highlight.io 代为初始化:
H.init('<YOUR_PROJECT_ID>', { integrations: { mixpanel: { projectToken: '<MIXPANEL_PROJECT_TOKEN>', }, }, })之后每次调用H.track()或H.identify()都会转发到 Mixpanel 的track()和identify()。与 Amplitude 一致,Mixpanel 侧也会收到名为highlightSessionURL的额外属性,指向事件发生的会话。同样支持enabled: false关闭。
Segment 集成
Segment 集成面向已有 Segment 代码库的团队:你不需要额外调用 highlight.io 的 API,highlight.io 会自动把发往 Segment 的数据同步进会话。启用方式是在初始化配置中打开开关:
H.init('<YOUR_PROJECT_ID>', { enableSegmentIntegration: true, })开启后,Segment 的identify()调用会自动转发到 highlight.io。若还需要转发analytics.track()调用,需使用HighlightSegmentMiddleware(自highlight.run2.10.0 版本起可用),并挂载到 Segment 的 source middleware 上:
import { H, HighlightSegmentMiddleware } from 'highlight.run' H.init('<YOUR_PROJECT_ID>', { enableSegmentIntegration: true, }) analytics.addSourceMiddleware(HighlightSegmentMiddleware)从源码实现看,segment-integration-listener.tsx 通过监听 XHR 请求与 localStorage 变更两条链路捕获 Segment 数据:它 monkey-patch 了XMLHttpRequest.prototype.send,在请求体 JSON 中识别type === 'track'或type === 'identify'的数据并转发;同时监听 Segment 写入 localStorage 的ajs_user_id、ajs_user_traits、ajs_anonymous_id键(见SEGMENT_LOCAL_STORAGE_KEYS枚举),从而在无埋点改动的条件下拿到用户身份与事件。这是理解"自动转发"背后原理的关键代码。
搜索会话时,可直接使用segment-event过滤器在会话搜索界面中检索 Segment 事件,命中的事件会被标记source: 'segment'属性(见 client/index.tsx 中的事件写入逻辑)。
Pendo 集成
Pendo 集成目前处于 alpha 阶段,需要联系 highlight.io 官方(support@highlight.io)申请开通。启用方式与 Mixpanel 完全一致,传入 Pendo Project Token 即可:
H.init('<YOUR_PROJECT_ID>', { integrations: { pendo: { projectToken: '<PENDO_PROJECT_TOKEN>', }, }, })H.track()与H.identify()会转发到 Pendo 的track()与identify(),同样附带highlightSessionURL属性,并支持enabled: false关闭。
Intercom 集成
Intercom 集成是"后台自动完成"的:只要 highlight.io 与 Intercom 都已配置好,双方即自动打通,无需额外配置。如需关闭,在客户端配置中设置:
H.init('<YOUR_PROJECT_ID>', { integrations: { intercom: { enabled: false, }, }, })- 消息场景:当用户在 Intercom 中向你的团队发消息时,highlight.io 会给该用户追加一个名为
highlightSessionUrl的自定义用户属性,值为该用户最近一次会话的 URL,帮助你快速还原用户发消息前的完整操作路径。 H.track()→ IntercomtrackEvent:调用H.track()会转发为Intercom('trackEvent', ...):
H.track('signup_button_clicked', { firstTime: true, impressions: 10, }) // The Highlight track call is equivalent to this Intercom call Intercom('trackEvent', 'signup_button_clicked', { firstTime: true, impressions: 10, })LaunchDarkly 集成
LaunchDarkly 集成(文档见 launchdarkly-integration.md)实现了双向联动:既能把 Feature Flag 评估结果上报给 highlight.io,也能把用户上下文在双方之间互传。启用只需两步——初始化 highlight.io 与 LaunchDarkly 客户端后调用H.registerLD():
H.init("<YOUR_PROJECT_ID>", {}); const ldClient = initialize("<YOUR_LD_CLIENT_TOKEN>"); H.registerLD(ldClient);highlight.io API → LaunchDarkly 的转发:
| highlight.io 调用 | LaunchDarkly 行为 |
|---|---|
H.init() | 以$ld:telemetry:initialize事件调用track(),代表会话初始化 |
H.track() | 以$ld:telemetry:track事件调用track() |
H.consumeError() | 以$ld:telemetry:error事件调用track() |
H.recordMetric() | 以$ld:telemetry:metric事件调用track() |
LaunchDarkly API → highlight.io 的转发:
ldClient.identify()→ 转发到 highlight.io 的H.identify()ldClient.variation()→ 转发到H.track(),并把 Flag 评估记录为当前 trace 中的一个 span
在客户端 SDK 中,registerLD方法被声明为registerLD: (client: LDClientMin) => void(见 sdk/highlight-run/src/client/types/types.ts),并有对应单测覆盖其调用行为(sdk/highlight-run/src/tests/index.test.tsx)。
工单创建类集成
这类集成把"排障 → 建单"压缩成一次点击:在会话回放、错误详情或评论中直接创建 GitHub Issue、Jira Task、Linear Issue、Height Task、ClickUp Task 或 Discord 消息,工单正文自动填充错误上下文并回链到对应会话。
后端统一由 backend/integrations/integrations.go 管理这些集成的 OAuth 授权与令牌生命周期:
getOAuthConfig()按集成类型(Height / Jira / GitLab)返回对应的 OAuth 配置;GetAndSetWorkspaceToken()用授权回调拿到的code换取令牌,并写入工作区的IntegrationWorkspaceMapping表;GetWorkspaceAccessToken()在读取令牌时会检查oldToken.Valid(),过期则自动用 refresh token 刷新并回写,这一机制保证了集成的长期可用性;IsProjectIntegrated()结合工作区令牌与项目映射表判断某项目是否已接入某集成。
各类工单集成(除 ClickUp 使用项目级映射外)都复用这套工作区级 OAuth 流程。以 ClickUp 为例,backend/clickup/clickup.go 定义了https://api.clickup.com/api/v2的 API 基址、OAuth endpoint,并要求环境变量CLICKUP_CLIENT_ID、CLICKUP_CLIENT_SECRET与REACT_APP_FRONTEND_URI均已配置,回调地址固定为{FrontendUri}/callback/clickup。
GitHub
启用方式:进入 integrations 页面,点击 GitHub 区域的 "Connect" 按钮。启用后支持三项能力:
- 评论建 Issue:评论(Comments)可以创建 GitHub Issue,正文自动填充评论内容并回链到会话;
- 错误分组建 Issue:错误分组界面提供快捷入口,可创建预填错误上下文、链向完整错误现场的 GitHub Issue;
- 增强错误堆栈:利用 GitHub 上文件内容增强后端错误堆栈(详见 Enhancing Errors with GitHub)。
后端实现方面,backend/integrations/github/github.go 采用GitHub App installation 工作流(而非 OAuth 用户授权),这样能访问整个组织而非单个用户拥有的仓库。客户端接口ClientInterface暴露了CreateIssue、ListRepos、GetRepoContent、GetRepoBlob、GetLatestCommitHash、SearchIssues等能力——其中GetRepoContent/GetRepoBlob/GetLatestCommitHash正是"用 GitHub 文件上下文增强堆栈"的底层支撑。创建客户端时要求配置GITHUB_APP_ID与GITHUB_PRIVATE_KEY环境变量。
Jira / Linear / Height / ClickUp
这四个集成的接入方式与 GitHub 完全一致:进入 integrations 页面点击对应区域的 "Connect" 按钮,之后即可:
- 评论创建工单(Jira Task / Linear Issue / Height Task / ClickUp Task),正文预填评论内容并回链会话;
- 在错误分组界面一键创建预填错误上下文的工单。
对应文档分别为 jira-integration.md、linear-integration.md、height-integration.md、clickup-integration.md。Height 的 OAuth 配置与 API 封装在 backend/integrations/height/height.go 中,API 基址为https://api.height.app。
Discord
连接 Discord 后,highlight.io 会基于会话、错误等事件向你的频道发送实时消息。启用步骤:
- 进入 integrations,打开 Discord 集成的开关;
- 之后在 alerts 页面创建的任何告警上,都可以选择添加 Discord 频道作为通知目标。
通知类:Slack 集成
连接 Slack 后,highlight.io 能基于应用与平台上的不同事件向团队发送实时消息。启用方式:进入 alerts 页面,点击 "Sync with Slack" 按钮。启用后支持两类通知:
- 评论中被 @ 的用户,会收到对应的 Slack 消息;
- 告警会发送 Slack 消息到订阅了该告警的频道或用户。
前端侧,告警通知目标的选择逻辑位于 frontend/src/pages/Alerts/components/AlertNotifyForm/AlertNotifyForm.tsx,它统一管理 Slack、Discord 等渠道作为告警接收方。
部署与框架类集成
Vercel
Vercel 集成(文档见 vercel-integration.md)通过 Vercel Marketplace 安装(https://vercel.com/integrations/highlight/),提供两类能力:
SDK 集成:关联 Vercel 项目与 highlight.io 项目后,Vercel 会自动设置HIGHLIGHT_SOURCEMAP_API_KEY环境变量。若你使用@highlight-run/sourcemap-uploader或withHighlightConfig上传 sourcemap,这些工具会自动读取该 API Key,实现构建后源码映射的自动上传。Next.js 接入细节见 Next.js 集成总览。
Log Drain 集成:对于服务端应用,Vercel 会把构建日志、Lambda 与 Edge Function(服务端)日志、静态访问日志转发到 highlight.io,可在 Dashboard 的 "Logs" 标签页中查看。是否采集这些日志,可在计费设置中通过限制日志量来配置。该能力的开启方式详见 Vercel 托管说明。
WordPress
wordpress-integration.md 介绍了官方 WordPress 插件(对应仓库 sdk/highlight-wordpress),为 WordPress 站点提供会话录制、错误监控、网络请求录制与 Console 日志录制。
安装:在 WordPress 后台 "Plugins" → "Add New" 搜索 "Highlight.io",安装 "Highlight.io Session Recording" 插件并激活,然后进入插件设置页配置。
配置:唯一必填项是你的 highlight.io Project ID(可在项目设置页获取)。高级选项包括:
- Custom Service Name:自定义服务名,便于在 Dashboard 中区分不同环境或站点;
- Tracing Origins:控制哪些域名被追踪,适用于多子域或外部服务的复杂部署;
- Network Recording:开启后录制网络请求,便于调试 API 调用或第三方集成。
这些设置最终都会映射到H.init()的对应配置项,可参考 客户端 SDK 文档。插件会在前端自动注入 highlight.io 脚本并按你的设置初始化。
最佳实践:上线前先在 staging 环境测试;定期复核 Tracing Origins 与网络录制设置,在采集必要数据与保护用户隐私之间取得平衡;使用有描述性的服务名以便在 Dashboard 中识别站点。
故障排查:确认 Project ID 填写正确;确认插件已激活且为最新版本;检查浏览器 Console 中是否有 JavaScript 错误干扰脚本执行;若开启网络录制,确认它没有与其他插件或安全措施冲突。
Electron
electron-integration.md 面向桌面端 Electron 应用:当应用最小化或失焦时自动暂停录制,恢复可见时再继续会话,以降低 highlight.io 对桌面用户性能与电池的影响。
前提:使用highlight.run4.3.4 或更高版本。然后用BrowserWindow对象调用configureElectronHighlight:
const mainWindow = new BrowserWindow(...) configureElectronHighlight(mainWindow)其底层实现是把主进程的focus/blur事件转发给渲染进程,让录制 SDK 感知可见性变化:
mainWindow.on('focus', () => { mainWindow.webContents.send('highlight.run', { visible: true }); }); window.on('blur', () => { mainWindow.webContents.send('highlight.run', { visible: false }); });Nuxt
nuxt-integration/index.md 提供了 Nuxt 3 的完整接入流程,覆盖 Session Replay 与错误监控。
快速开始:安装依赖后,分别添加客户端与服务端插件,配置nuxt.config.ts,最后验证安装。
客户端插件plugins/highlight.client.ts——在app:beforeMount钩子中初始化:
import { H } from "highlight.run"; export default defineNuxtPlugin((nuxtApp) => { const { projectID, version } = useRuntimeConfig().highlight; nuxtApp.hook("app:beforeMount", () => { H.init(projectID, { environment: process.env.NODE_ENV, version, networkRecording: { enabled: true, recordHeadersAndBody: true, }, tracingOrigins: true, consoleMethodsToRecord: ["error", "warn"], }); }); });服务端插件server/plugins/highlight.ts——初始化 Node SDK 并挂接 Nitro 错误钩子,通过H.parseHeaders()从请求头还原会话上下文后上报错误:
import { H, type NodeOptions } from "@highlight-run/node" export default defineNitroPlugin((nitro) => { const { projectID } = useRuntimeConfig().highlight; const highlightConfig: NodeOptions = { projectID }; if (!H.isInitialized()) { H.init(highlightConfig) } nitro.hooks.hook("error", async (error, { event }) => { const headers = event?.node.req.headers! const parsed = H.parseHeaders(headers) if (parsed !== undefined) { H.consumeError(error, parsed?.secureSessionId, parsed?.requestId) } }) })配置nuxt.config.ts:通过runtimeConfig注入项目 ID 与版本号:
export default defineNuxtConfig({ runtimeConfig: { highlight: { projectID: 'YOUR_PROJECT_ID', version: '1.0.0', } } })验证安装:在浏览器打开 Nuxt 应用并到会话 Dashboard 确认新会话;触发客户端或服务端错误并确认出现在错误 Dashboard;用浏览器 DevTools 检查 highlight.io 的网络请求。
手动上报(可选):对于 Nitro 未自动捕获的错误,可显式调用H.consumeError(error)。
常见问题:会话 ID 为空时,需确认客户端 SDK 已初始化,且所有相关请求头都被转发到服务端(尤其是经过反向代理或自定义服务时);sourcemap 不生效时,确认已上传且未被构建产物剥离;Nitro 错误钩子之外的错误不会自动上报,需手动处理;插件未运行时,检查文件是否放在正确位置(客户端为plugins/highlight.client.ts,服务端为server/plugins/highlight.ts);密钥与项目 ID 建议使用 Nuxt 的runtimeConfig管理。
Grafana 数据源集成
Grafana 是文档中能力最深的集成模块(目录 grafana-integration,插件源码在 sdk/highlightinc-highlight-datasource),它把 highlight.io 的 traces、logs、errors、sessions 指标以 Grafana Data Source 的形式暴露出来,让你在自建或云托管 Grafana 中编写查询、构建仪表盘、配置告警,甚至可以直连底层 ClickHouse 分析存储跑 SQL。
能力边界:demo 环境可直接试用;云托管项目需为 Enterprise 客户;自托管(hobby 或 enterprise 部署)开箱即用。
安装与配置
插件已发布在 Grafana 插件目录,安装后新增 Data Source 并填写以下字段:
| 字段 | 说明 |
|---|---|
Highlight Backend URL | 查询 highlight.io 数据的 URL;云托管填https://pri.highlight.io |
OAuth Token URL | 获取 OAuth 访问令牌的 URL;云托管填https://pri.highlight.io/oauth/token |
Project ID | highlight.io 项目 ID,取自项目 URL slug(https://app.highlight.io/{project_id}/);多项目可配置多个 Data Source;demo 项目填1344 |
Client ID | 云托管填 OAuth 客户端 ID(首次配置可联系官方获取);自托管按下方流程自建;demo 项目留空 |
Client Secret | 云托管填 OAuth 客户端 Secret;自托管自建;demo 项目留空 |
填写后点击Save & test即会运行健康检查,验证 Data Source 能否查询 highlight.io 数据。
自托管的 OAuth 配置
自托管场景下,Data Source 以一个 highlight.io 用户(ADMIN_ID)的身份通过 OAuth 认证。需要自己创建CLIENT_ID/CLIENT_SECRET并授权相应 GraphQL 操作,可执行如下 SQL:
insert into o_auth_client_stores (id, secret, domains, app_name, admin_id) values ('<CLIENT_ID>', '<CLIENT_SECRET>', '{highlight.io}', 'highlight.io', <ADMIN_ID>); insert into o_auth_operations (client_id, authorized_graph_ql_operation, minute_rate_limit) values ('<CLIENT_ID>', 'admin', 600), ('<CLIENT_ID>', 'traces_metrics', 600), ('<CLIENT_ID>', 'traces_keys', 600), ('<CLIENT_ID>', 'logs_metrics', 600), ('<CLIENT_ID>', 'logs_keys', 600), ('<CLIENT_ID>', 'errors_metrics', 600), ('<CLIENT_ID>', 'errors_keys', 600), ('<CLIENT_ID>', 'sessions_metrics', 600), ('<CLIENT_ID>', 'sessions_keys', 600)每条授权记录都对应metrics(指标聚合查询)与keys(字段建议/补全查询)两类 GraphQL 操作,并配置了每分钟 600 次的速率限制。
查询编辑器
在 Dashboard 中新建可视化并选择 highlight.io Data Source 后,可用查询编辑器构建聚合查询,核心字段如下:
| 字段 | 说明 |
|---|---|
Resource | 被查询的 highlight.io 资源:traces、logs、sessions 或 errors |
Function | 组内与分桶内的聚合方法,如 count、avg、p50;作用于指标时,数值字段会作为搜索建议展示 |
Filter | highlight.io 过滤表达式,仅匹配符合条件的资源,遵循通用搜索语法 |
Group by | 一个或多个分组维度;分类字段会作为搜索建议展示 |
Limit N | 指定 Group by 后仅返回前 N 个分组 |
Limit by function | 返回 Top N 前对分组排序所用的聚合方法 |
Bucket by | 分桶维度,支持按时间戳分桶或不分桶 |
查询能力由插件后端的 Go 实现提供(sdk/highlightinc-highlight-datasource/pkg/plugin/datasource.go),它通过metrics/keys两类 GraphQL 操作与 highlight.io 后端交互。
示例查询
文档提供了三个可直接套用的查询范例(也可导入官方示例 Dashboard JSON):
- 高频 HTTP 请求:客户端所有网络活动都以 trace 存储,
span_name为请求 URL。用过滤表达式span_name=("GET *" OR "POST *")并按span_name分组,配合limit 10 by count展示 Top 10 高频请求; - 最慢 HTTP 请求:把聚合函数换成
P95(duration)(duration 单位为纳秒),即可绘制 P95 时延并按 Top 10 最慢 trace 排序; - 错误频率:按时间绘制错误计数并按
service_version分组,可及时发现新版本引入的错误类型。
用数据源配置告警
在 Grafana Alerting 页面创建告警规则并选择 highlight.io Data Source,可对任意数值型 highlight.io 查询设置阈值告警。关键区别:告警场景通常应关闭分桶(No Bucketing),以得到整个时间范围内的单一数值而非时间序列;若保持按时间戳分桶,则需要额外的 Reduce 步骤才能应用阈值。告警不限于错误,例如可以在某个网络资源响应过慢或活跃用户数跌破阈值时触发通知。
集成背后的通用机制小结
纵览全部 19 个集成,可以归纳出 highlight.io 集成体系的三个通用设计:
- OAuth 统一授权:工单类集成共享
[integrations.go](https://link.gitcode.com/i/dfe9ffc48fab44a59a5023c4f952bd8e)的令牌管理与自动刷新机制,接入方只需在 integrations 页面点击 Connect 完成授权,令牌存储于工作区级映射表,过期自动续期; - SDK 级事件转发:分析类集成通过
H.init()的integrations配置注入第三方 SDK,并复用H.track()/H.identify()统一入口转发事件,同时附加highlightSessionURL属性回链会话,实现可观测性数据与业务分析的闭环; - 查询能力开放:Grafana 数据源把底层指标以
metrics/keysGraphQL 操作暴露给外部系统,并可选直连 ClickHouse,让团队用自己熟悉的工具做统一可视化与告警。
如需了解某个集成的完整细节,可直接阅读 docs-content/general/7_integrations 目录下的对应文档,以及 客户端 SDK 文档 中H.init()、H.track()、H.identify()的完整 API 说明。
- 可观测性
- 后端
【免费下载链接】highlight
highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more.
相关推荐
Dapr Metrics 指标体系全解析:从系统服务到运行时组件的可观测性指南
Dapr Metrics 指标体系全解析:从系统服务到运行时组件的可观测性指南 导读 本文基于 Dapr 官方开发文档《Dapr metrics》编写,系统梳理
后端微服务云原生消息队列AI Agentpdfme插件开发深度解析:自定义PDF渲染与UI组件
pdfme插件开发深度解析:自定义PDF渲染与UI组件 pdfme是一个基于TypeScript和React构建的PDF生成库,它提供了强大的插件系统,让开发者
后端前端开发工具highlight.io 集成 Angular:从 SDK 初始化到全栈可观测性的完整接入指南
highlight.io 集成 Angular:从 SDK 初始化到全栈可观测性的完整接入指南 本文基于 highlight.io 官方文档 Angular 接
可观测性后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考