关于微服务的可观察性,跟踪对于捕获诸如慢速请求和数据库查询之类的服务的瓶颈很重要。 OpentElemetry是一组监视工具,可支持与Jaeger,Zipkin和NewRelic等分布式跟踪平台集成,仅举几例。这篇文章涵盖了Jaeger的Node.js项目的追踪设置。
首先设置Docker通过docker-compose up
命令组成。 Jaeger UI将在http://localhost:16686上找到。
version: '3.8'
services:
jaeger:
image: jaegertracing/all-in-one:1.46
environment:
- COLLECTOR_ZIPKIN_HTTP_PORT=:9411
- COLLECTOR_OTLP_ENABLED=true
ports:
- 6831:6831/udp
- 6832:6832/udp
- 5778:5778
- 16685:16685
- 16686:16686
- 14268:14268
- 14269:14269
- 14250:14250
- 9411:9411
- 4317:4317
- 4318:4318
下面的代码显示通过Jaeger设置跟踪。 Jaeger不需要单独的出口包,因为OpentElemetry本地支持它。其他人需要使用出口包。 jaeger ui中的滤镜轨迹按服务名称或存储在日志中的跟踪ID。
使用资源和语义资源属性为跟踪设置新字段,例如服务名称或服务版本。自动仪器标识诸如Express之类的框架,诸如HTTP之类的协议,Postgres之类的数据库以及项目中使用的Winston等日志记录。
过程跨度(分布式系统中的工作单位)分批优化跟踪性能。另外,在优雅的关闭期间终止追踪。
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { Resource } from '@opentelemetry/resources';
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
import { NodeSDK } from '@opentelemetry/sdk-node';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions';
const traceExporter = new OTLPTraceExporter({
url: 'http://localhost:4318/v1/traces',
});
const sdk = new NodeSDK({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: `<service-name>-${process.env.NODE_ENV}`,
[SemanticResourceAttributes.SERVICE_VERSION]: process.env.npm_package_version ?? '0.0.0',
env: process.env.NODE_ENV || '',
}),
instrumentations: [getNodeAutoInstrumentations()],
spanProcessor: new BatchSpanProcessor(traceExporter),
});
sdk.start();
process.on('SIGTERM', () => {
sdk.shutdown()
.then(() => console.log('Tracing terminated'))
.catch((error) => console.error('Error terminating tracing', error))
.finally(() => process.exit(0));
});
导入跟踪配置作为条目文件中的第一件事。快乐的追踪!
import './tracing';
// ...