从 Elastic 的 Go APM 代理迁移到 OpenTelemetry Go SDK

作者:来自 Elastic Damien Mathieu

正如我们之前所分享的,Elastic 致力于帮助 OpenTelemetry(OTel)取得成功,这意味着在某些情况下构建语言 SDK 的分发版本。

Elastic 在观察性和安全数据收集方面战略性地选择了 OTel 标准。此外,Elastic 承诺与 OTel 社区合作,成为观察性生态系统中最佳的数据收集基础设施。Elastic 正在加深与 OTel 的合作关系,超越了最近将 Elastic Common Schema(ECS)贡献给 OpenTelemetry、在 OTel Java 代理中调用动态语言技术(invokedynamic)以及即将捐赠的分析代理。

自 Elastic 版本 7.14 起,Elastic 已通过能够直接接收基于 OpenTelemetry 协议(OTLP)的跟踪、度量和日志,原生支持 OTel。

与其他语言 SDK 不同,Go SDK 稍有不同,因为 Go 语言本身缺乏允许构建非分支(not a fork)分发的动态性。

然而,缺乏分发并不意味着你不应该使用 OTel 从 Go 应用程序收集数据到 Elastic Stack。

Elastic 目前有一个 APM Go 代理,但我们建议切换到 OTel Go SDK。在本文中,我们将介绍两种迁移方式:

  1. 通过替换应用程序代码中的所有遥测数据(“一次性大规模迁移”)并发布更改
  2. 通过将迁移拆分成原子更改,以减少回归风险

一次性大规模迁移

从我们的 APM Go agent 迁移到 OTel SDK 的最简单方法可能是移除代理提供的所有遥测数据,并用新的 SDK 替换它们。

自动化检测

你的大部分检测可能是自动进行的,因为它是你所使用的框架或库的一部分。

例如,如果你使用 Elastic Go agent,你可能像这样使用我们的 net/http 自动化检测模块:

import ("net/http""go.elastic.co/apm/module/apmhttp/v2"
)func handler(w http.ResponseWriter, req *http.Request) {fmt.Fprintf(w, "Hello World!")
}func main() {http.ListenAndServe(":8080",apmhttp.Wrap(http.HandlerFunc(handler)),)
}

使用 OpenTelemetry,你将改用 otelhttp 模块:

import ("net/http""go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)func handler(w http.ResponseWriter, req *http.Request) {fmt.Fprintf(w, "Hello World!")
}func main() {http.ListenAndServe(":8080",otelhttp.NewHandler(http.HandlerFunc(handler), "http"),)
}

你应该对你从我们的代理使用的每个其他模块执行相同的更改。

手动检测

你的应用程序可能还有手动检测部分,这些部分是通过调用 Elastic APM agent API 直接在应用程序代码中创建跟踪和跨度(spans)的。

你可能会使用 Elastic 的 APM SDK 创建 transactions 和 spans,就像这样:

import ("go.elastic.co/apm/v2"
)func main() {// Create a transaction, and assign it to the context.tx :=  apm.DefaultTracer().StartTransaction("GET /", "request")defer tx.End()ctx = apm.ContextWithTransaction(ctx, tx)// Create a spanspan, ctx := apm.StartSpan(ctx, "span")defer span.End()
}

在 OpenTelemetry 中,无论是 transactions 还是 spans,都使用同一套 API —— 在 OTel 中,Elastic 视为 “transactions” 的内容,仅仅是没有父级的 spans(“根 spans”)。

因此,你的检测代码将变更为以下内容:

import ("go.opentelemetry.io/otel/trace"
)func main() {tracer := otel.Tracer("my library")// Create a root span.// It is assigned to the returned context automatically.ctx, span := tracer.Start(ctx, "GET /")defer span.End()// Create a child span (as the context has a parent).ctx, span := tracer.Start(ctx, "span")defer span.End()
}

在进行一次性大迁移时,你需要在发布到生产环境之前迁移所有内容。你不能将迁移过程拆分成小块进行。

对于小型应用程序或只使用自动化检测的应用程序来说,这种限制可能是可以接受的。它允许你快速验证迁移并继续前进。

然而,如果你在处理一组复杂的服务、一个大型应用程序或一个有大量手动检测的应用程序,你可能希望能够在迁移过程中多次发布代码,而不是一次性全部完成。

分步迁移

分步迁移是一种你可以逐步发布原子性改变并保持应用程序正常工作的方式。然后,你可以在最后,当你准备好时,才进行最终的切换。

为了帮助进行分步迁移,我们提供了我们的 APM Go agent 和 OpenTelemetry 之间的桥梁。

这座桥梁允许你同时运行我们的 agent 和 OTel,并且可以在同一个进程中使用这两个库的检测,数据将被传输到相同的位置并以相同的格式。

你可以像这样配置我们的代理与 OTel 的桥接 (bridge):

import ("go.elastic.co/apm/v2""go.elastic.co/apm/module/apmotel/v2""go.opentelemetry.io/otel"
)func main() {provider, err := apmotel.NewTracerProvider()if err != nil {log.Fatal(err)}otel.SetTracerProvider(provider)
}

一旦设置了这个配置,OTel 创建的每个 span 都将被传输到 Elastic APM agent。

有了这个桥梁,你可以通过以下过程使迁移更加安全:

  • 将桥接器添加到你的应用程序中。
  • 逐个切换一个检测(自动化或手动)从代理到 OpenTelemetry,就像上面的一次性大迁移一样,但一次只进行一个。
    • 重复以上步骤,直到所有内容都已迁移。
  • 删除桥梁和我们的代理,并配置 OpenTelemetry 通过其 SDK 传输数据。

这些步骤中的每一个都可以作为应用程序中的一个单一更改,并立即投入生产。

如果在迁移过程中出现任何问题,你应该能够立即看到并修复它,然后再继续进行。

使用 OTel 构建可观察性的好处

由于 OTel 迅速成为行业标准,并且 Elastic 致力于使其变得更好,因此对工程团队来说迁移到 OTel 可能会带来很多好处。

在 Go 中,无论是通过一次性大规模迁移还是使用 Elastic 的 OTel 桥梁,这样做都将使您能够受益于全球社区维护的仪器化工具,从而使您的可观察性更加有效,并更好地了解应用程序中发生的情况。

本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。 当前不可用的任何特性或功能可能无法按时交付或根本无法交付。

原文:Migrating from Elastic’s Go APM agent to OpenTelemetry Go SDK | Elastic Blog

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

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

相关文章

9个技巧使你的Python代码更Pythonic!

如何区分漂亮和丑陋的代码? 更重要的是,如何写出漂亮的 Python 代码? 本文将通过初学者容易理解的例子展示9个神话般的Python技巧,以帮助你在日常工作中编写更多的Pythonic程序。 01 product() 使用 product() 函数避免嵌套的…

Zabbix 监控软件(一)

通常我们服务搭建成功 但不清楚服务器的运行状况,这时候就需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界…

R语言入门:“Hellinger“转化和“normalize“转化(弦转化)的公式表示与R代码实现

1、写在前面 vegan包中的decostand()函数为群落生态学研究提供了一些流行的(和有效的)标准化方法。有关decostand()函数标准化的一些标准化方法可以看我的另一篇笔记:R语言入门:vegan包使用decostand()函数标准化方法 由于在网络上没有找到关于这两个转…

互联网技术知识点总览——操作系统知识点框架图

简介 本文对操作系统的知识点整体框架进行梳理和分享如下:

【问题解决】Fatal error “unsafe repository (‘git目录名‘ is owned by someone else)“

问题复现 近期升级了 Git v2.37.0,发现在git bash进入git目录执行git命令时出现错误:Fatal error "unsafe repository (git目录名 is owned by someone else)",无法使用git做一些操作。 问题解决 两个方法:降级到v2.…

避障型激光传感器SE-0522/0526/0533/1022/1026/1033应用与接线说明

避障型激光传感器SE-0522/0526/0533/1022/1026/1033是根据飞行时间(TOF 测量原理)运行,在极高的同步时钟下,以 均匀的时间间隔发射激光,激光光束遇到物体时 会反射回来,扫描传感器接收到反射 的光束后&…

正式项目的验收文件模板

了解了!下面是一个更完整和专业的研发项目验收报告的Word文档模板的详细内容,你可以将其复制到Word中并进行相应的格式调整以符合你的需求: 项目验收报告 项目名称:[输入项目名称] 项目编号:[输入项目编号] 项目负责人…

docker安装clickhouse数据库

1.创建目录 mkdir -p /data/clickhouse/data mkdir -p /data/clickhouse/conf mkdir -p /data/clickhouse/log2.拉取镜像 docker pull clickhouse/clickhouse-server3.创建临时容器 docker run -d --rm --name clickhouse-server --ulimit nofile262144:262144 clickhouse/c…

2024 发布Maven项目到中央仓库

注册sonatype账号 Maven中央仓库并不支持直接发布jar包,sonatype是其指定的第三方仓库之一,发布到此的项目会被定时同步到中央仓库 官方教程地址:https://central.sonatype.org/register/central-portal/ 访问网址:https://centra…

新项目应该选mongodb还是postgresql?

文章目录 MongoDBPostgreSQL大数据处理时的优势对比实际使用经验 选择MongoDB还是PostgreSQL作为新项目的数据库,主要取决于项目的具体需求、数据模型、应用场景以及团队熟悉程度等因素。下面将从几个关键角度对两者进行对比分析。 MongoDB 数据模型:Mo…

开发工具——postman使用教程详解

一、概念 1、Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件,Postman分为Postman native app和Postman Chrome app两个版本。目前Chrome app已停止维护,官方不推荐使用该版本。 2、官网下载地址:http://www.getpostman.com…

softmax回归的从零开始实现

1.初始化模型参数 import torch from IPython import display from d2l import torch as d2l batch_size 256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) num_inputs 784 num_outputs 10 W torch.normal(0, 0.01, size(num_inputs, num_outputs), r…

【数据结构】复习题(二)

Hello!大家好,这一篇数据结构复习题是我上个学期复习的时候写的(刚刚在草稿箱发现了!)有一些题目过程都是配了图片的,希望对正在复习数据结构的宝宝们有帮助哦!(还有一个数据结构复习题(一)可以…

代码随想录算法训练营第60天|84.柱状图中最大的矩形

代码随想录算法训练营第60天|84.柱状图中最大的矩形 |有了之前单调栈的铺垫,这道题目就不难了。 84.柱状图中最大的矩形 https://programmercarl.com/0084.%E6%9F%B1%E7%8A%B6%E5%9B%BE%E4%B8%AD%E6%9C%80%E5%A4%A7%E7%9A%84%E7%9F%A9%E5%BD%A2.html class Soluti…

Ant Design Pro + springboot实现文件上传功能

前端代码 <a-upload:fileList"fileList":beforeUpload"beforeUpload":customRequest"customRequest" ><a-button style"margin-left: 50px" type"primary" ref"btn">导入配置文件 </a-button>…

代码随想录算法训练营第三十二天| 122.买卖股票的最佳时机II ,55. 跳跃游戏,45.跳跃游戏II

目录 题目链接&#xff1a;122.买卖股票的最佳时机II 思路 代码 题目链接&#xff1a;55. 跳跃游戏 思路 代码 题目链接&#xff1a;45.跳跃游戏II 思路 代码 总结 题目链接&#xff1a;122.买卖股票的最佳时机II 思路 每天可以重复买卖&#xff0c;所以只需要计算每…

Spring JdbcTemplate基本使用

1. JdbcTemplate概述 它是spring框架中提供的一个对象&#xff0c;是对原始繁琐的JdbcAPI对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibermateTemplate&#xff0c;操作nosql数据库的RedisTemplate&#xff0c;操作消息队…

p2949(简单反悔贪心)

题目链接 #include<bits/stdc.h> using namespace std; const int N2e520; using ll long long; long long ans; struct node{int x,y;bool operator < (node p) const{return x<p.x; //按截至时间从小到大排序 } }a[N]; long long ti; int main() {map<int,in…

Hadoop学习总结(Hive的远程服务、数据模型操作、数据操作)

在启动hive时要先启动Hadoop。 在SecurityCRT 或者在 Xshell 进行虚拟机链接 &#xff08;这里使用Xshell &#xff09; 一、Hive 的管理 1、CLI 方式 &#xff08;1&#xff09;启动 Hive 直接输入 hive &#xff08;2&#xff09;退出 直接输入以下一条命令&#xff0…

预付费电表管理系统:WEB端的高效解决方案

1.系统概述 预付费电表管理系统&#xff0c;尤其是基于WEB端的版本&#xff0c;是一种现代化的电力管理工具&#xff0c;旨在提高能源效率&#xff0c;优化电费支付流程&#xff0c;并提供实时的用电数据监控。它通过互联网技术&#xff0c;使得用户能够在线充值、查询电量、远…