skywalking和open-telemetry的Nodejs探针安装评测

admin 1年前 ⋅ 61 阅读
ad

最近,需要对Nodejs服务进行监控分析,想要对open-telemetry和skywalking的Nodejs探针采集到的数据做个对比评测看看。

如大家所知,open-telemetry提供了一套 API、库、代理和工具,用于收集应用程序的追踪数据、度量指标和日志。OpenTelemetry 支持多种编程语言,为开发者提供了一个厂商中立的方式来收集和发送遥测数据。它旨在帮助开发者更好地理解和监控他们的软件性能和行为,特别是在分布式系统和微服务架构中。而SkyWalking是一个开源的应用性能监控系统,它提供全面的观测能力,包括服务拓扑图、性能度量、追踪分析和告警功能。SkyWalking 支持多种语言和框架,能够监控和追踪分布式系统中的复杂交互。它旨在帮助开发者和运维人员理解系统的行为和性能,从而快速定位和解决问题。

一、skywalking中nodejs安装

首先文档地址:https://github.com/apache/skywalking-nodejs,文档很简洁,安装起来相对容易。SkyWalking NodeJS SDK 需要 SkyWalking 后端 (OAP) 8.0+ 和 NodeJS >= 14,其他版本官方表示未经测试,不能保证正常运行。

1. 从 npmjs 安装 SkyWalking NodeJS 包

npm install --save skywalking-backend-js

2. 引入后,并启动监听程序

import agent from 'skywalking-backend-js';

agent.start();

3. 当然,第二步中并没有相关的配置项

agent.start({
  serviceName: 'webfunny_monitor',
  serviceInstance: 'webfunny-instance-name',
  collectorAddress: 'my.collector.address:port',
});

总体来说,这个就算配置完成了。值得注意的是,skywalking追踪信息收集器有两个,一个是 gRPC的用于后端服务,一个是Http 收集客户端浏览器的采集信息,Http默认端口 12800,GRPC默认端11800。由于skywalking-backend-js采用的是GRPC协议上报的,所以需要启动GRPC的接收服务,以及对外端口号,11800。

二、skywalking-backend-js日志上报效果

想要得到上报结果,必须提前运行好skywalking的后台服务,并且开通11800端口号的对外授权。

常规数据分析:

虚拟数据库分析效果:

三、skywalking-backend-js探针拓展能力

由于skywalking-backend-js 专门是给Apache SkyWalking 后端设计的,所以探针不支持将数据上报到其他服务的能力。如果想要去拓展探针,首先,了解 SkyWalking agent 收集的数据格式和协议是很重要的。这包括跟踪数据、指标数据等。你需要确保目标服务能够接收并正确处理这种格式的数据。

总体来说,skywalking的nodejs探针部署起来还是比较容易的。

四、open-telemetry中nodejs安装

文档地址:https://opentelemetry.io/docs/instrumentation/js/getting-started/nodejs/#setup,探针安装的方式也非常简单,只有一点容易掉坑里。

原文说明:

The instrumentation setup and configuration must be run before your application code. One tool commonly used for this task is the –require flag.

Create a file named instrumentation.ts (or instrumentation.js if not using TypeScript) , which will contain your instrumentation setup code.

人家要求探针必须必比app.js先执行,而我却把安装代码放在app.js执行,所以一直没搞定,以此备注,谨防掉坑。

错误示范:

直接在app.js里边执行,导致无法生效

const Koa = require('koa')

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-node');
const {
  getNodeAutoInstrumentations,
} = require('@opentelemetry/auto-instrumentations-node');
const {
  PeriodicExportingMetricReader,
  ConsoleMetricExporter,
} = require('@opentelemetry/sdk-metrics');

const sdk = new NodeSDK({
  traceExporter: new ConsoleSpanExporter(),
  metricReader: new PeriodicExportingMetricReader({
    exporter: new ConsoleMetricExporter(),
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});

sdk.start();


const app = new Koa()

正确示范:

先创建otel.js文件

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');

// 配置 SDK
const sdk = new NodeSDK({
  traceExporter: new ConsoleSpanExporter(),
  instrumentations: [
    getNodeAutoInstrumentations()
    // 可以在这里添加其他自定义的 instrumentations
  ],
  // 添加其他配置(如 exporter, propagator 等)
});

sdk.start()

在app.js文件中最先引入即可

require('./otel.js');  // 最先引入
const Koa = require('koa')

安装完成后,采集到了真正有效的数据,探针采集效果如下:

五、open-telemetry中nodejs探针的拓展能力

拓展文档:https://opentelemetry.io/docs/instrumentation/js/manual/,刚才提到了,skywalking-nodejs探针没那么方便的进行拓展,是因为它是为skywalking量身定做的。而OTEL的nodejs探针则是一种上报的协议或者方法,可以支持向任何服务进行上报,前提是你也已经有了可以接收和处理日志的服务器了。

 

/*otel.js*/
const opentelemetry = require('@opentelemetry/sdk-node');
const {
  getNodeAutoInstrumentations,
} = require('@opentelemetry/auto-instrumentations-node');
const {
  OTLPTraceExporter,
} = require('@opentelemetry/exporter-trace-otlp-proto');
const {
  OTLPMetricExporter,
} = require('@opentelemetry/exporter-metrics-otlp-proto');
const { PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics');

const sdk = new opentelemetry.NodeSDK({
  traceExporter: new OTLPTraceExporter({
    // optional - default url is http://localhost:4318/v1/traces
    url: '<your-otlp-endpoint>/v1/traces',
    // optional - collection of custom headers to be sent with each request, empty by default
    headers: {},
  }),
  metricReader: new PeriodicExportingMetricReader({
    exporter: new OTLPMetricExporter({
      url: '<your-otlp-endpoint>/v1/metrics', // url is optional and can be omitted - default is http://localhost:4318/v1/metrics
      headers: {}, // an optional object containing custom headers to be sent with each request
      concurrencyLimit: 1, // an optional limit on pending requests
    }),
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();

如果你已经有了一个后端服务可以解析otel产生的日志了,就可以直接调用了。

整体来说两种探针的使用方式都还行,但是skywaling具备了探针和后端分析服务,可能会更加便捷一些。

关于纵目

江苏纵目信息科技有限公司是一家专注于运维监控软件产品研发与销售的高科技企业。覆盖全链路应用性能监控、IT基础设施监控、物联网数据采集数据观测等场景,基于Skywalking、Zabbix、ThingsBoard等开源体系构建了ArgusAPM、ArgusOMS、ZeusIoT等产品,致力于帮助各行业客户构建集聚可观测性的统一运维平台、物联网大数据平台。

  点赞 0   收藏 0
  • admin
    共发布2篇文章 获得0个收藏
全部评论: 0