推荐答案
使用 Jaeger 跟踪 Node.js 应用的分布式调用链
安装 Jaeger 客户端库:
npm install jaeger-client
初始化 Jaeger 客户端:
// www.javascriptcn.com code example const jaeger = require('jaeger-client'); const { initTracer } = require('jaeger-client'); const config = { serviceName: 'my-nodejs-app', sampler: { type: 'const', param: 1, }, reporter: { logSpans: true, agentHost: 'localhost', agentPort: 6832, }, }; const options = { logger: { info(msg) { console.log('INFO ', msg); }, error(msg) { console.log('ERROR', msg); }, }, }; const tracer = initTracer(config, options);创建 Span 并记录调用链:
const span = tracer.startSpan('my-operation'); span.setTag('custom-tag', 'value'); // 执行一些操作 span.finish();跨服务传播上下文:
const headers = {}; tracer.inject(span.context(), jaeger.FORMAT_HTTP_HEADERS, headers); // 将 headers 传递给下一个服务提取上下文并继续跟踪:
const parentSpanContext = tracer.extract(jaeger.FORMAT_HTTP_HEADERS, headers); const childSpan = tracer.startSpan('child-operation', { childOf: parentSpanContext }); childSpan.finish();
使用 Zipkin 跟踪 Node.js 应用的分布式调用链
安装 Zipkin 客户端库:
npm install zipkin zipkin-transport-http zipkin-instrumentation-fetch
初始化 Zipkin 客户端:
// www.javascriptcn.com code example const { Tracer, BatchRecorder, ExplicitContext } = require('zipkin'); const { HttpLogger } = require('zipkin-transport-http'); const zipkinFetch = require('zipkin-instrumentation-fetch'); const ctxImpl = new ExplicitContext(); const recorder = new BatchRecorder({ logger: new HttpLogger({ endpoint: 'http://localhost:9411/api/v2/spans', }), }); const tracer = new Tracer({ ctxImpl, recorder });创建 Span 并记录调用链:
const span = tracer.createSpan('my-operation'); span.setTag('custom-tag', 'value'); // 执行一些操作 span.finish();跨服务传播上下文:
const headers = {}; tracer.inject(span.context(), zipkin.FORMAT_HTTP_HEADERS, headers); // 将 headers 传递给下一个服务提取上下文并继续跟踪:
const parentSpanContext = tracer.extract(zipkin.FORMAT_HTTP_HEADERS, headers); const childSpan = tracer.createSpan('child-operation', { childOf: parentSpanContext }); childSpan.finish();
本题详细解读
Jaeger 和 Zipkin 的基本概念
- Jaeger 和 Zipkin 都是开源的分布式跟踪系统,用于监控和诊断微服务架构中的性能问题。
- 它们通过记录请求在不同服务之间的传播路径(调用链)来帮助开发者理解系统的行为。
使用 Jaeger 的步骤
- 安装 Jaeger 客户端库:通过 npm 安装
jaeger-client库。 - 初始化 Jaeger 客户端:配置 Jaeger 客户端,包括服务名称、采样器和报告器。
- 创建 Span 并记录调用链:使用
tracer.startSpan创建 Span,并通过span.setTag添加自定义标签。 - 跨服务传播上下文:使用
tracer.inject将上下文注入到 HTTP 头中,以便在服务间传递。 - 提取上下文并继续跟踪:使用
tracer.extract从 HTTP 头中提取上下文,并创建子 Span 继续跟踪。
使用 Zipkin 的步骤
- 安装 Zipkin 客户端库:通过 npm 安装
zipkin和相关库。 - 初始化 Zipkin 客户端:配置 Zipkin 客户端,包括上下文实现和记录器。
- 创建 Span 并记录调用链:使用
tracer.createSpan创建 Span,并通过span.setTag添加自定义标签。 - 跨服务传播上下文:使用
tracer.inject将上下文注入到 HTTP 头中,以便在服务间传递。 - 提取上下文并继续跟踪:使用
tracer.extract从 HTTP 头中提取上下文,并创建子 Span 继续跟踪。
关键点
- Span:表示调用链中的一个操作或步骤。
- Context Propagation:通过 HTTP 头或其他方式在服务间传递上下文信息,确保调用链的连续性。
- Sampling:控制哪些请求被记录,以减少性能开销。
通过以上步骤,开发者可以在 Node.js 应用中实现分布式调用链的跟踪,从而更好地理解和优化系统的性能。