你的应用是个黑匣子?是时候改变了
\n\n你是否曾有过这样的想法:“为什么我的 Node.js 服务运行缓慢,尽管代码很完美?”或者收到用户的投诉,却无法理解哪里出了问题?熟悉吗?欢迎来到一个没有 JavaScript 可观测性 你就只能盲目工作的世界。
\n\n可观测性不仅仅是一个流行词。它是一种将你的代码从黑匣子转变为透明系统的方法。我们将学会向它提问:“谁该负责?”(链路追踪)、“现在正在发生什么?”(指标)以及“昨天凌晨 3:15 发生了什么?”(日志)。
\n\n在本文中,我们将剖析 Node.js 可观测性的三大支柱:链路追踪、指标和日志。你将获得现成的代码示例,并了解如何从今天开始实施这些实践。我们开始吧!
\n\nJavaScript 中的链路追踪:请求的旅程
\n\n想象一下,用户点击“提交订单”按钮。这个请求会经过 API 网关、认证服务、购物车、支付网关和数据库。如果出了问题,该去哪里查找?链路追踪(或分布式追踪)为你提供了这次旅程的地图。
\n\n用简单的话解释什么是链路追踪
\n\n链路追踪是一种跟踪特定请求通过所有微服务和函数路径的方法。每一步都是一个 span,整个链条就是一个 trace。你可以看到每个阶段花费了多少时间以及错误发生在哪里。
\n\nOpenTelemetry:JavaScript 可观测性的标准
\n\nOpenTelemetry (OTel) 是用于收集链路、指标和日志的行业标准。它受到所有主要云平台和工具(Jaeger、Zipkin、Grafana)的支持。
\n\n安装:
\nnpm install @opentelemetry/api @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node\n\nExpress 应用的基础链路追踪示例:
\nconst { 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\nPrometheus 和 Node.js 客户端
\n\nPrometheus 是收集指标的事实标准。它通过 HTTP 从你的应用中“拉取”数据。