JavaScript 中的可观测性:Node.js 的链路追踪、指标与日志

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

你的应用是个黑匣子?是时候改变了

\n\n

你是否曾有过这样的想法:“为什么我的 Node.js 服务运行缓慢,尽管代码很完美?”或者收到用户的投诉,却无法理解哪里出了问题?熟悉吗?欢迎来到一个没有 JavaScript 可观测性 你就只能盲目工作的世界。

\n\n

可观测性不仅仅是一个流行词。它是一种将你的代码从黑匣子转变为透明系统的方法。我们将学会向它提问:“谁该负责?”(链路追踪)、“现在正在发生什么?”(指标)以及“昨天凌晨 3:15 发生了什么?”(日志)。

\n\n

在本文中,我们将剖析 Node.js 可观测性的三大支柱:链路追踪、指标和日志。你将获得现成的代码示例,并了解如何从今天开始实施这些实践。我们开始吧!

\n\n

JavaScript 中的链路追踪:请求的旅程

\n\n

想象一下,用户点击“提交订单”按钮。这个请求会经过 API 网关、认证服务、购物车、支付网关和数据库。如果出了问题,该去哪里查找?链路追踪(或分布式追踪)为你提供了这次旅程的地图。

\n\n

用简单的话解释什么是链路追踪

\n\n

链路追踪是一种跟踪特定请求通过所有微服务和函数路径的方法。每一步都是一个 span,整个链条就是一个 trace。你可以看到每个阶段花费了多少时间以及错误发生在哪里。

\n\n

OpenTelemetry:JavaScript 可观测性的标准

\n\n

OpenTelemetry (OTel) 是用于收集链路、指标和日志的行业标准。它受到所有主要云平台和工具(Jaeger、Zipkin、Grafana)的支持。

\n\n

安装:

\n
npm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node
\n\n

Express 应用的基础链路追踪示例:

\n
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');\nconst { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');\nconst { ConsoleSpanExporter } = require('@opentelemetry/exporter-console');\nconst { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express');\nconst { HttpInstrumentation } = require('@opentelemetry/instrumentation-http');\n\nconst provider = new NodeTracerProvider();\nprovider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));\nprovider.register();\n\nconst { getTracer } = require('@opentelemetry/api');\nconst tracer = getTracer('my-app');\n\n// 自动追踪 HTTP 和 Express\nconst { registerInstrumentations } = require('@opentelemetry/instrumentation');\nregisterInstrumentations({\n  tracerProvider: provider,\n  instrumentations: [\n    new ExpressInstrumentation(),\n    new HttpInstrumentation()\n  ]\n});\n\n// 现在每个请求都会创建一个包含 spans 的 trace\nconst express = require('express');\nconst app = express();\n\napp.get('/api/order', async (req, res) => {\n  // 为业务逻辑手动创建 span\n  const span = tracer.startSpan('processPayment');\n  try {\n    // ... 你的逻辑\n    await new Promise(r => setTimeout(r, 100)); // 模拟\n    span.setStatus({ code: 1 }); // OK\n  } catch (err) {\n    span.setStatus({ code: 2, message: err.message }); // ERROR\n    throw err;\n  } finally {\n    span.end();\n  }\n  res.send('Order created');\n});\n\napp.listen(3000);
\n\n

现在你将在控制台中看到结构化数据:哪个请求、每个中间件花费了多少时间、错误发生在哪里。这就是 javascript 可观测性 的实际应用。

\n\n

指标:你应用的脉搏

\n\n

链路追踪对于单个请求很有用,但整体情况如何?每秒有多少请求?延迟是多少?你的 Node.js 消耗了多少内存?这些由指标负责。

\n\n

Prometheus 和 Node.js 客户端

\n\n

Prometheus 是收集指标的事实标准。它通过 HTTP 从你的应用中“拉取”数据。

博客

书籍推荐