OpenTelemetry 入门

OpenTelemetry 是什么?

OpenTelemetry (OTel) 是一个开源可观测性框架,允许开发团队以单一、统一的格式生成、处理和传输遥测数据(telemetry data)

OpenTelemetry 提供与供应商无关的 SDK、API 和工具,因此你的数据可以发送到任何可观测性后端进行分析。

数据埋点

应用程序的监测数据可以使用自动或手动方式生成

传播器

可以将 W3C tracecontextbaggageb3 等传播器(Propagators)添加到配置中

  • Trace context:用于在 HTTP headers 中编码 trace 数据,以便在不同的服务间传递这些数据
  • Baggage:用于在 span 之间传递键值对数据,例如用户ID、请求 ID 等。
  • B3:用于在 HTTP headers 中编码 trace 数据,以便在不同的服务间传递这些数据(主要用于 Zipkin 或其兼容的系统)。

采样

采样是一种通过减少收集和发送到后端的追踪样本数量来控制 OpenTelemetry 引入的噪声和开销的机制。

OpenTelemetry 协议(OTLP)

OpenTelemetry 协议(OTLP)规范描述了遥测数据在遥测源、收集器和遥测后端之间的编码、传输和传递机制。

每种语言的 SDK 都提供了一个 OTLP 导出器,可以配置该导出器来通过 OTLP 导出数据。然后,OpenTelemetry SDK 会将事件转换为 OTLP 数据。

OTLP 是代理(配置为导出器)和收集器(配置为接收器)之间的通信

采集器

收集器是 OpenTelemetry 的一个组件,它接收遥测数据(span、metrics、logs 等),处理(预处理数据)并导出数据(将其发送到想要的通信后端)


Receivers

接收器 Receivers 是数据进入收集器的方式,可以是推送或拉取。OpenTelemetry 收集器可以以多种格式接收遥测数据。

Processors

处理器在接收和导出之间处理数据,且是可选的,非必要。

批处理器接收跨度、指标或日志,并将它们放入批次中。批处理有助于更好地压缩数据,减少传输数据所需的传出连接数量。该处理器支持基于大小和时间的批处理。

Exporters

导出器是 OpenTelemetry 的一个组件,也是数据发送到不同系统/后端的方式。比如 console exporter 是一种常见的导出器,对于开发和调试任务非常有用,他会将数据打印到控制台。

在 exporters 部分,可以添加更多目的地或形式:https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporters

快速体验------以JS为例

官方实现:https://github.com/open-telemetry/opentelemetry-js

1、安装

yaml 复制代码
npm install --save @opentelemetry/api
npm install --save @opentelemetry/sdk-node
npm install --save @opentelemetry/auto-instrumentations-node

2、设置追踪

js 复制代码
// tracing.js

'use strict'

const process = require('process');
const opentelemetry = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { ConsoleSpanExporter } = require('@opentelemetry/sdk-trace-base');
const { resourceFromAttributes } = require('@opentelemetry/resources');
const { ATTR_SERVICE_NAME } = require('@opentelemetry/semantic-conventions');

// configure the SDK to export telemetry data to the console
// enable all auto-instrumentations from the meta package
const traceExporter = new ConsoleSpanExporter();
const sdk = new opentelemetry.NodeSDK({
  resource: resourceFromAttributes({
    [ATTR_SERVICE_NAME]: 'my-service',
  }),
  traceExporter,
  instrumentations: [getNodeAutoInstrumentations()]
});

// initialize the SDK and register with the OpenTelemetry API
// this enables the API to record telemetry
sdk.start();

// gracefully shut down the SDK on process exit
process.on('SIGTERM', () => {
  sdk.shutdown()
    .then(() => console.log('Tracing terminated'))
    .catch((error) => console.log('Error terminating tracing', error))
    .finally(() => process.exit(0));
});

3、运行

yaml 复制代码
node -r ./tracing.js app.js
相关推荐
Mr.Jessy3 小时前
JavaScript高级:构造函数与原型
开发语言·前端·javascript·学习·ecmascript
白兰地空瓶5 小时前
🚀你以为你在写 React?其实你在“搭一套前端操作系统”
前端·react.js
爱上妖精的尾巴5 小时前
6-4 WPS JS宏 不重复随机取值应用
开发语言·前端·javascript
似水流年QC6 小时前
深入探索 WebHID:Web 标准下的硬件交互实现
前端·交互·webhid
陪我去看海6 小时前
测试 mcp
前端
speedoooo7 小时前
在现有App里嵌入一个AI协作者
前端·ui·小程序·前端框架·web app
全栈胖叔叔-瓜州7 小时前
关于llamasharp 大模型多轮对话,模型对话无法终止,或者输出角色标识User:,或者System等角色标识问题。
前端·人工智能
三七吃山漆7 小时前
攻防世界——wife_wife
前端·javascript·web安全·网络安全·ctf
用户47949283569157 小时前
面试官问"try-catch影响性能吗",我用数据打脸
前端·javascript·面试
GISer_Jing7 小时前
前端营销技术实战:数据+AI实战指南
前端·javascript·人工智能