如何将 OpenTelemetry 检测与 Elastic APM Agent 功能相结合

news2024/10/7 2:25:21

作者:Greg Kalapos

 

Elastic APM 在多个级别支持 OpenTelemetry。 我们之前在博客中介绍过的一种易于理解的场景是 APM 服务器中的直接开放遥测协议 (OTLP) 支持。 这意味着你可以将任何 OpenTelemetry 代理连接到 Elastic APM 服务器,APM 服务器会很乐意获取该数据,将其提取到 Elasticsearch® 中,并且你可以在 Kibana® 的 APM 应用程序中查看该 OpenTelemetry 数据。

这篇博文将展示一个不同的用例:在 Elastic APM 中,我们有自己的 APM 代理。 其中一些的下载量已达到数千万,其中一些早于 OpenTelemetry。 当然,我们意识到 OpenTelemetry 非常重要并且会一直存在,因此我们希望使这些代理与 OpenTelemetry 兼容。

如今,我们的大多数 Elastic APM 代理都能够将 OpenTelemetry 跨度(spans)作为跟踪的一部分发送。 这意味着,如果你的应用程序中有任何发出 OpenTelemetry 跨度(spans)的组件,它将成为 Elastic APM 代理捕获的跟踪的一部分。 这可以是你使用的已由 OpenTelemetry API 检测的库,也可以是应用程序开发人员添加到应用程序代码中以进行手动检测的任何其他 OpenTelemetry 跨度。

Elastic APM 代理的这一功能不仅可以报告这些跨度,还可以正确维护所有跨度之间的父子关系,使 OpenTelemetry 成为这些代理的一等公民。 例如,如果 Elastic APM 代理通过自动检测启动特定操作的跨度,然后在该跨度内 OpenTelemetry API 启动另一个跨度,则 OpenTelemetry 跨度将是代理创建的外部跨度的子级。 这反映在跨度的 parent.id 字段中。 反之亦然:如果 OpenTelemetry API 创建一个跨度,并且在该跨度内,Elastic APM 代理捕获另一个跨度,则由 Elastic APM 代理创建的跨度将是由 OpenTelemetry API 创建的跨度的子级。 

此功能存在于以下代理中:

  • Java
  • .NET
  • Python
  • Node.js
  • Go

在 Elastic .NET APM 代理中捕获 OpenTelemetry 跨度

作为第一个示例,我们以 ASP.NET Core 应用程序为例。 我们将 .NET Elastic APM 代理放入此应用程序中,然后打开该功能,该功能会自动桥接 OpenTelemetry 跨度,因此 Elastic APM 代理将使这些跨度成为其报告的跟踪的一部分。

以下代码片段显示了一个控制器:

namespace SampleAspNetCoreApp.Controllers
{
	public class HomeController : Controller
	{
		private readonly SampleDataContext _sampleDataContext;
		private ActivitySource _activitySource = new ActivitySource("HomeController");
		public HomeController(SampleDataContext sampleDataContext) => _sampleDataContext = sampleDataContext;
		public async Task<IActionResult> Index()
		{
			await ReadGitHubStars();
			return View();
		}
		public async Task ReadGitHubStars()
		{
			using var activity = _activitySource.StartActivity();
			var httpClient = new HttpClient();
			httpClient.DefaultRequestHeaders.Add("User-Agent", "APM-Sample-App");
			var responseMsg = await httpClient.GetAsync("https://api.github.com/repos/elastic/apm-agent-dotnet");
			var responseStr = await responseMsg.Content.ReadAsStringAsync();
			// …use responseStr
		}
	}
}

Index 方法调用 ReadGitHubStars 方法,之后我们只需从该方法返回相应的视图即可。

Elastic APM 代理会自动捕获 HttpClient 的传入 HTTP 调用和传出 HTTP 调用 — 这是我们长期以来使用的自动检测的一部分。

ReadGitHubStars 是我们使用 OpenTelemetry API 的地方。 .NET 中的 OpenTelemetry 使用 ActivitySource 和 Activity API。 _activitySource.StartActivity() 调用只是创建一个 OpenTelemetry span,该 span 通过使用 CallerMemberNameAttribute C# 语言功能自动获取方法的名称,并且该 span 将在该方法运行完成时结束。

此外,在此 span 内,我们使用 HttpClient 类型调用 GitHub API。 对于这种类型,.NET Elastic APM 代理再次提供自动检测,因此 HTTP 调用也将被代理自动捕获为 span。

以下是该交易在 Kibana 中的水流图:

 如你所见,代理能够捕获 OpenTelemetry 范围作为跟踪的一部分。

使用 Python Elastic APM 代理在 Python 中桥接 OpenTelemetry 跨度

让我们看看在 Python 中这是如何工作的。 想法是相同的,因此之前介绍的所有概念也适用于该示例。

我们以一个非常简单的 Django 为例:

from django.http import HttpResponse
from elasticapm.contrib.opentelemetry import Tracer
import requests


def index(request):
   tracer = Tracer(__name__)
   with tracer.start_as_current_span("ReadGitHubStars"):
       url = "https://api.github.com/repos/elastic/apm-agent-python"
       response = requests.get(url)
       return HttpResponse(response)

在 Python 中启用捕获 OpenTelemetry 跨度的第一步是从 elasticapm.contrib.opentelemetry 导入 Tracer 实现。

然后在此 Tracer 上,你可以启动一个新的跨度 -- 在本例中,我们手动将该跨度命名为 ReadGitHubStars。

与前面的示例类似,对 http://127.0.0.1:8000/otelsample/ 的调用由 Elastic APM Python 代理捕获,然后由 OpenTelemetry API 创建下一个跨度,如你所见,它是由代理自动捕获,最后对 GitHub API 的 HTTP 调用由代理的自动检测再次捕获。

这是水流图中的样子:

如前所述,代理维护所有 OTel 范围的父子关系。 让我们看一下 GET api.github.com 调用的 parent.id:

正如你所看到的,这个 span 的 id 是 c98401c94d40b87a。

如果我们查看 ReadGitHubStars OpenTelemetry Span 的 span.id,那么我们可以看到该 Span 的 id 正是 c98401c94d40b87a — 因此 APM 代理在内部维护跨 OpenTelemetry 和非 OpenTelemetry Span 的父子关系,这使得 OpenTelemetry Spans 成为 Elastic APM Agents 的一等公民。

其他语言

此时,我将停止以其他语言复制完全相同的示例代码 - 我想你已经明白了这一点:在上面列出的每种语言中,我们的 Elastic APM 代理都能够桥接 OpenTelemetry 跟踪并显示它们在 Kibana 中作为原生(native)跨度。 我们还在博客中介绍了在 Java 中使用相同的 API,你可以在相应的代理文档(上面链接)中查看其余语言的示例。

何时使用此功能以及何时使用纯 OpenTelemetry SDK

这真的取决于你。 如果你只想在应用程序中使用纯粹的 OpenTelemetry,并且确实想避免任何与供应商相关的软件,那么请随意直接使用 OpenTelemetry SDK —— 这是我们明确支持的用例。 如果你走那条路,那么此功能与你不太相关。

然而,我们的 Elastic APM 代理已经拥有非常庞大的用户群,并且它们提供了 OpenTelemetry 中不存在的功能。 其中一些功能包括跨度压缩、集中配置、推断跨度、使用多个 APM 服务器进行分布式尾部采样等等。

如果你是众多现有 Elastic APM Agent 用户之一,或者由于上述功能而计划使用 Elastic APM Agent,则桥接 OpenTelemetry 跨度使你能够仍然使用 OpenTelemetry API,而不依赖于任何供应商相关的 API 使用。 这样, 你的开发团队就可以使用 OpenTelemetry 检测你的应用程序,你还可以使用 OpenTelemetry 已集成的任何第三方库,Elastic APM 代理会很乐意将这些跨度报告为他们报告的跟踪的一部分。 这样,你可以结合 OpenTelemetry 的供应商独立性,并仍然使用功能丰富的 Elastic APM 代理。

如果你希望将遥测库从 Elastic APM Agent 更改为 OpenTelemetry(反之亦然),OpenTelemetry 桥接(bridge)功能也是一个很好的工具,因为它允许你同时使用这两个库并使用原子更改来切换它们。

下一步

在这篇博文中,我们讨论了如何桥接 OpenTelemetry 跨度与 Elastic APM 代理。 当然,OpenTelemetry 不仅仅是跟踪。 我们知道这一点,并且计划涵盖更多领域:目前我们正在以非常类似的方式在我们的 Elastic APM 代理中桥接 OpenTelemetry 指标。 你可以在这里查看进展情况。

了解有关将 Elastic APM 添加为 Elastic Observability 部署一部分的更多信息。

原文:How to combine OpenTelemetry instrumentation with Elastic APM Agent features | Elastic Blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟高清1路RX—XS9950,可替代TP9950

1通道模拟高清复合视频解码芯片可替代TP9950&#xff0c;兼容CVI、AHD、TVI和CVBS&#xff0c;最高支持 1 路1080p30fps&#xff0c;同时支持音频接入&#xff1b;支持BT656和MIPI输出&#xff0c;包含 AFE、EQ 和 ADC&#xff0c;AFE支持通道带宽、输入信号增益可调节&#xf…

二维码生成器简单使用

生成器工具类 以下是一个简单的 QRCodeUtil 示例&#xff0c;这个工具类使用了 zxing 库来生成二维码图片&#xff1a; import com.google.zxing.BarcodeFormat; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter;import javax.image…

数据可视化分析,2023结婚全品类消费趋势洞察报告

结婚消费与人们的关系密切相关。结婚是一个重要的人生事件&#xff0c;往往伴随着大量的消费。人们倾向于在婚礼仪式、婚纱摄影、宴会等方面进行豪华的投资&#xff0c;以展示社会地位和个人品味。此外&#xff0c;结婚还涉及到婚戒、婚庆、蜜月旅行等费用。然而&#xff0c;随…

基于 NNCF 和 Optimum 面向 Intel CPU 对 Stable Diffusion 优化

&#x1f917; 宝子们可以戳 阅读原文 查看文中所有的外部链接哟&#xff01; 基于隐空间的扩散模型 (Latent Diffusion Model)&#xff0c;是解决文本到图片生成问题上的颠覆者。Stable Diffusion 是最著名的一例&#xff0c;广泛应用在商业和工业。Stable Diffusion 的想法简…

【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

2023机器人操作系统(ROS)暑期学校预热-线下时间/地点-(转发)

原文地址&#xff1a; https://mp.weixin.qq.com/s/McjBgCpecL6OMgpcrPyY_Q 中国机器人操作系统&#xff08;ROS&#xff09;暑期学校自2015年举办以来&#xff0c;被中国机器人业界和学界&#xff0c;以及ROS开源基金会誉为除了ROSCon之外规模最大、参与人数最多、最成功的RO…

Redis的4种分布式限流算法

限流 服务系统流量多,的确是一件好事,但是如果过载,把系统打挂了,那大家都要吃席了。 所以,在各种大促活动之前,要对系统进行压测,评估整个系统的峰值QPS,要做一些限流的设置,超过一定阈值,就拒绝处理或者延后处理,避免把系统打挂的情况出现。 限流和熔断有什么区…

ES6、ES7、ES8、ES9、ES10、ES11、ES12都增加了哪些新特性?

摘要&#xff1a; 前端开发的都知道&#xff0c;JavaScript经历了不同标本的迭代&#xff0c;从1到12的不断完善中会添加不同的新特性来解决前一个阶段的瑕疵&#xff0c;让我们开发更加便捷与写法更加简洁&#xff01; 我记得我第一次接触js的时候是从大学的《21天精通JavaScr…

syri软件的安装

目录 1. 下载syri软件 ​2. 其他软件的安装和环境配置 3. plotsr软件的安装 1. 下载syri软件 网址&#xff1a;syri 该软件基于 3.5 版本 python&#xff0c;请提前使用 conda 创建 python 3.5 版本 环境并安装依赖模块 点击 view project on github 点击 9 release 我选择…

Matplotlib入门与实践(一)

Matplotlib 是一个 Python 的 2D绘图库&#xff0c;它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib&#xff0c;开发者可以仅需要几行代码&#xff0c;便可以生成绘图&#xff0c;直方图&#xff0c;功率谱&#xff0c;条形图&#xff0c;错误…

[Docker] Docker镜像管理和操作实践(二) 文末送书

前言&#xff1a; Docker镜像是容器化应用程序的打包和分发单元&#xff0c;包含了应用程序及其所有依赖项&#xff0c;实现了应用程序的可移植性和一致性。 文章目录 使用Dockerfile创建自定义镜像实践练手1. 创建基于ubuntu的自定义镜像&#xff0c;并安装nginx2. 配置Redis容…

React中 Real DOM 和 Virtual DOM 的区别?优缺点?

一、是什么 Real DOM&#xff0c;真实 DOM&#xff0c;意思为文档对象模型&#xff0c;是一个结构化文本的抽象&#xff0c;在页面渲染出的每一个结点都是一个真实 DOM 结构&#xff0c;如下&#xff1a; Virtual Dom&#xff0c;本质上是以 JavaScript 对象形式存在的对 DOM …

mysql索引的简单使用

删除 goods 表中的 goods_desc 字段及货号字段,并增加 click_count 字段 在 goods_name 列上加唯一性索引&#xff08;用alter table方式&#xff09; alter table add unique index uniqididx(goods_name);去查看索引 发现有goods_name的唯一索引 在 shop_price 列上加普通…

视频分类(Classification)和摘要(Captioning)总结

论文&#xff1a;Deep Learning for Video Classification and Captioning 视频分类是指将大量的视频数据按照一定的标准和规则进行分类和归类&#xff0c;以便于用户快速找到自己感兴趣的视频内容。视频分类可以基于不同的特征和属性进行&#xff0c;例如内容主题、风格、语言…

服务器数据恢复-HP服务器双循环校验raid5数据恢复案例

服务器数据恢复环境&#xff1a; 一台HP ProLiant DL系列某型号服务器&#xff0c;hp smart array控制器&#xff0c;挂载了一台国产磁盘阵列&#xff0c;磁盘阵列中是一组由十几块SCSI硬盘组建的RAID5&#xff0c;RAID中的冗余采用双循环的校验方式。 服务器操作系统为LINUX&a…

机器学习实战:Python基于LASSO回归进行正则化(十二)

文章目录 1 前言1.1 LASSO的介绍1.2 LASSO的应用 2. diabetes数据集实战演示2.1 导入函数2.2 导入数据2.3 拟合模型&#xff08;AIC/BIC&#xff09;2.4 AIC/BIC可视化2.5 拟合交叉验证模型及可视化 3. Hitters数据集实战演示3.1 导入函数3.2 导入数据3.3 数据预处理3.4 定义变…

Git全栈体系(二)

第四章 Git 分支操作 一、什么是分支 在版本控制过程中&#xff0c;同时推进多个任务&#xff0c;为每个任务&#xff0c;我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来&#xff0c;开发自己分支的时候&#xff0c;不会影响主…

STM32 DMA 传输类型调试记录

外设到内存 模式&#xff1a;单次、外设地址不自增&#xff0c;内存地址自增 hdma_usart1_rx.Instance DMA1_Channel5; // 使用通道 5 hdma_usart1_rx.Init.Direction DMA_PERIPH_TO_MEMORY; // 方向&#xff1a;外设 to 内存 hdma_usart1_rx.Init.PeriphInc DMA_PINC…

云开发校园微社区-二手交易兼职交友微信小程序

云开发校园微社区微信小程序开源源码&#xff0c;这是一款云开发校园微社区-二手交易_兼职_交友_项目微信小程序开源源码&#xff0c;可以给你提供快捷方便的校园生活&#xff0c;有很多有趣实用的板块和功能&#xff0c;如&#xff1a;闲置交易、表白交友、疑问互答、任务兼职…

css3其他效果

1&#xff09;媒体查询 不同分辨率下不同的样式&#xff0c;适应不同的屏幕 最大宽度&#xff0c;最小宽度 2&#xff09;颜色渐变 渐变之后是一张图片 background-image 默认效果是从上到下&#xff08;to bottom&#xff09;的渐变 linear-gradient是线性渐变 要是想改变方…