最近,需要对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具备了探针和后端分析服务,可能会更加便捷一些。