使用OpenTelemetry&Jaeger揭示应用程序跟踪
#教程 #node #devops #monitoring

随着安全性,监视和可观察性对于应用程序变得重要。强烈建议您查看应用程序在生产中运行时的行为。但是测试和检查生产方面的成本很多。在我们部署应用程序之前,最好查看应用程序日志和跟踪。它可以帮助您知道任何错误,然后才能进入客户的手中。

今天,我们将看到如何使用OpenTelemetry和Jaeger跟踪和仪器Node.js应用程序。

什么是opentelemetry?

OpenTelemetry pipeline 来源信用:DZone

OpenTelemetry是一个开源可观察性框架,如今在软件行业中引起了极大的关注。它通过提供一组工具,API和仪器库来帮助组织,以启用来自软件系统的遥测数据的收集,生成和导出。 OpentElemetry已成为一种标准的可观察性工具,有助于从系统中收集指标,痕迹和日志。这可以帮助组织在接触客户之前找到错误的方式。

几乎没有努力,开发人员可以通过设置OpenTelemetry来了解其应用程序和服务的情况。它支持各种编程语言,包括JavaScript,Python,Java,GO和.NET,使其用于不同类型的应用程序。

什么是Jaeger?

jaeger architecture 来源信用:Jaeger

Jaeger是一个由Uber构建的开源分布式跟踪平台,该平台现在已成为CNCF基金会的一部分。 Jaeger在分布式追踪和可观察性方面已成为著名的名字。分布式跟踪是在公司采用微服务体系结构的时候,它需要在这些微服务,网络方面等之间建立联系。

Jaeger提供了分布式系统中不同组件之间请求流的可见性,从而使开发人员和操作团队能够了解请求如何在各种服务中传播和交互。它可以追踪请求,因为它们通过多个微服务遍历,从而提供了延迟,瓶颈和错误的见解。

教程

  • 通过运行以下命令来初始化一个新的node.js项目:
npm init -y
  • 通过运行以下命令:
npm install @opentelemetry/api @opentelemetry/node
  • 通过运行以下命令来安装Jaeger出口程序包:
npm install @opentelemetry/exporter-jaeger

仪器您的node.js应用程序

  • 例如,创建一个新的JavaScript文件,例如index.js,并在其中添加以下代码。
const { NodeTracerProvider } = require('@opentelemetry/node');
const { SimpleSpanProcessor } = require('@opentelemetry/tracing');
const { JaegerExporter } = require('@opentelemetry/exporter-jaeger');
const { trace } = require('@opentelemetry/api');

// Set up the tracer provider and exporter
const provider = new NodeTracerProvider();
const exporter = new JaegerExporter({
  serviceName: 'your-service-name',
  // Set other configuration options as needed
});

// Create a span processor and register it with the tracer provider
const spanProcessor = new SimpleSpanProcessor(exporter);
provider.addSpanProcessor(spanProcessor);

// Set the tracer provider as the global tracer provider
provider.register();

// Perform a database query within a span
async function performDatabaseQuery() {
  // Start a new span
  const span = trace.getTracer('example').startSpan('database-query');

  // Simulate a database query
  const result = await executeDatabaseQuery();

  // End the span
  span.end();

  return result;
}

// Simulated database query
function executeDatabaseQuery() {
  // Simulate a delay
  const delay = Math.random() * 1000;
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Query result');
    }, delay);
  });
}

// Entry point
async function main() {
  // Perform a database query within a trace
  const result = await performDatabaseQuery();
  console.log(result);
}

// Run the application
main().catch((err) => {
  console.error('An error occurred:', err);
  process.exit(1);
});

在此示例中,我们模拟在跨度内执行数据库查询。当您运行更新的index.js文件时,它将为数据库查询操作生成轨迹,并将其发送到Jaeger以在Jaeger UI中可视化。

在Jaegerexporter配置的ServiceName字段中,您应该用适当的名称替换“您的服务名称”。

  • 使用以下命令运行node.js应用程序
node index.js

运行index.js文件时,输出将是模拟数据库查询的结果。

确切的输出将有所不同,因为查询结果的模拟延迟是随机的。但是,它将类似于:

Query result

  • 设置Jaeger 使用Docker在本地运行Jaeger
docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -e COLLECTOR_OTLP_ENABLED=true \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.46

现在,您只需在http://localhost:16686上打开Jaeger UI。
jaeger dashboard

  • 运行数据库查询几次,您可以从Jaeger UI中看到痕迹。

jaeger tutorial

jaeger example

query

您可以深入了解痕迹。
database query

您可以通过更改服务和操作选项卡来使用Jaeger UI。
jaeger and opentelmetry

教程提供了一个逐步指南,用于使用OpenTelemetry跟踪Node.js应用程序,并可视化Jaeger UI中的痕迹。通过将OpentElemetry集成到您的应用程序中,您就可以获得捕获和传播分布式痕迹,使您能够监视和分析系统的性能和行为。使用Jaeger出口商,您可以将这些痕迹发送到流行的开源跟踪系统Jaeger。

通过遵循以下步骤,您可以有效地跟踪Node.js应用程序,获得宝贵的见解并优化分布式系统的性能。

查看我有关从头开始设置CI/CD的其他文章。

另外,请看一下我讨论“开发人员的可观察性”的视频。