跟踪节点。
#node #opentelemetry #tracing #jaeger

关于微服务的可观察性,跟踪对于捕获诸如慢速请求和数据库查询之类的服务的瓶颈很重要。 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';
// ...