Skip to main content
本指南介绍如何使用 OpenTelemetry 为一个简单的 Node.js 应用埋点,并将其日志、指标和链路追踪发送到托管 ClickStack。后端的埋点无需更改应用源代码。 HackerNews Analyzer 是一个小型 Node.js 应用,用于查询托管在公网 ClickHouse 演示实例中的 HackerNews 数据集。每个图表、表格和搜索框背后都对应一个真实的 ClickHouse 查询,因此每次交互都会生成一条 trace,其中主 span 是后端发往 ClickHouse 的 HTTPS 调用。

前置条件

  • 一个可用且可访问的 OTel collector,并已配置为将数据摄取到你的托管 ClickStack 服务中。你需要其 OTLP 端点和摄取令牌。
  • Node 18+ 和 npm。
1

克隆并运行应用程序

克隆仓库,安装依赖项,并创建 .env 文件:
ClickHouse 数据源默认指向公网只读演示集群,因此应用无需额外配置即可运行。启动它:
打开 http://localhost:5001。你会看到年份选择器、汇总统计信息、活动图表、热门用户和域名表,以及一个搜索框。可以随意点一点:切换年份,深入查看具体帖子。
此时,应用程序已经运行,但尚未接入遥测。ClickStack 中还没有数据:它正在等待遥测数据。这就是“之前”的状态。
2

获取连接信息

应用程序需要以下两个值才能连接到 collector:
  • OTEL_EXPORTER_OTLP_ENDPOINT:你的 collector 暴露的 OTLP 端点 (OTLP over HTTP 通常使用端口 4318) 。
  • OTEL_EXPORTER_OTLP_HEADERS:携带摄取令牌的授权请求头,格式为 authorization=<token>
打开 .env 并设置它们:
SDK 使用 OTEL_EXPORTER_OTLP_HEADERS 为三种信号设置授权请求头:链路追踪、指标和日志。如果你的 collector 在本地运行且不强制启用身份验证,可以将该值留空 (OTEL_EXPORTER_OTLP_HEADERS=authorization=) ;但该变量必须存在,因为如果未设置,或其值完全为空,SDK 会完全跳过初始化。
3

为应用添加插桩

插桩分为三个部分:安装 SDKs、切换启动命令,以及启用浏览器 SDK。这些操作都不会改变应用程序的业务逻辑。

安装 SDKs

同时安装后端和浏览器 OpenTelemetry SDKs:

使用 opentelemetry-instrument CLI

应用程序由 run.sh 启动,文件底部有两行 exec:一行启用,另一行被注释掉。切换启用的那一行,让 Node 通过 opentelemetry-instrument 启动:
这就是后端的全部改动。自动插桩会在进程启动时由 opentelemetry-instrument 加载。

启用 Browser SDK

要采集分布式链路追踪 (从浏览器到后端) 和会话回放,请在 src/web/telemetry.ts 中启用 Browser SDK。取消对 import 和 HyperDX.init({...}) 代码块的注释:
无需额外修改 .env__OTLP_ENDPOINT____OTLP_AUTH_TOKEN__ 是由 vite.config.ts 注入的编译时常量:端点对应 OTEL_EXPORTER_OTLP_ENDPOINT,令牌则从 OTEL_EXPORTER_OTLP_HEADERS 中解析出来,与后端使用的值相同。
摄取令牌会被打包进公开的浏览器 bundle 中,任何检查 Network 选项卡的人都可以读取它。
4

生成流量并查看遥测数据

重启应用程序,使新的启动命令和新构建的浏览器端打包产物生效:
重新加载浏览器选项卡,让 Vite 提供更新后的 bundle,然后多刷新应用几次、切换年份,再点开几篇 story 来生成流量。打开 ClickStack UI:
  1. 前往 搜索,将时间范围过滤到最近 5 分钟。hn-analyzer-api 的日志会不断流入。
  1. 点开一个请求,沿着 trace 向上查看。你会看到 Express handler span、一个指向 ClickHouse 集群且显示真实网络耗时的子 HTTP span,以及同一条 trace 上已关联的 console.log 记录。
  1. 打开 Session Replay,回放带可拖动进度条的浏览器会话视频,并与 trace 时间线同步。
日志、指标、链路追踪和会话回放都会汇集到同一个 UI 中,共享同一种查询语言,并自动完成关联。

了解更多

最后修改于 2026年7月3日