当前位置:首页 > 科技  > 软件

OpenTelemetry 深度定制:跨服务追踪的实战技巧

来源: 责编: 时间:2024-06-27 17:20:03 269观看
导读背景图片我们的需求是这样的:图片假设现在有三个服务:ServiceA、ServiceB、ServiceC。ServiceA 对外提供了一个 http 接口 request,在这个接口会调用 ServiceB 的 order 订单接口创建订单,同时 serviceB 调用 serviceC 的

背景

图片图片5Iq28资讯网——每日最新资讯28at.com

我们的需求是这样的:5Iq28资讯网——每日最新资讯28at.com

图片图片5Iq28资讯网——每日最新资讯28at.com

假设现在有三个服务:ServiceA、ServiceB、ServiceC。5Iq28资讯网——每日最新资讯28at.com

ServiceA 对外提供了一个 http 接口 request,在这个接口会调用 ServiceB 的 order 订单接口创建订单,同时 serviceB 调用 serviceC 的 pay 接口。5Iq28资讯网——每日最新资讯28at.com

图片图片5Iq28资讯网——每日最新资讯28at.com

整个调用关系如上图所示。5Iq28资讯网——每日最新资讯28at.com

默认情况下 span 中的 attribute 会记录当前 span 的一些信息,比如:5Iq28资讯网——每日最新资讯28at.com

图片图片5Iq28资讯网——每日最新资讯28at.com

这些都是当前一些当前 span 内置的信息,比如当前 gRPC 接口的一些基本数据:服务名、ip、端口等信息。5Iq28资讯网——每日最新资讯28at.com

但这里并没有上游的一些信息,虽然我们可以通过 Jaeger 的树状图得知上游是哪个应用调用过来的,但是一旦某个 span 下有多个子 span 的调用,就没办法很直观知道这个子 span 的上游是由谁发起的调用。5Iq28资讯网——每日最新资讯28at.com

比如如下这个链路:5Iq28资讯网——每日最新资讯28at.com

图片图片5Iq28资讯网——每日最新资讯28at.com

当一个调用链非常长,同时也非常复杂时,没办法第一时间知道某一个 span 的上游到底是谁发起的,需要手动一层层的去折叠,或者全靠眼睛去找。5Iq28资讯网——每日最新资讯28at.com

预期效果

图片图片5Iq28资讯网——每日最新资讯28at.com

为此我们希望的效果是可以通过给每一个子 span 中加入两个 attribute,来标明它的父调用来源。5Iq28资讯网——每日最新资讯28at.com

比如在 serviceB 中的所有 span 中都会加上两个标签:来源是 serviceA,同时是 serviceA 的 request 接口发起的请求。5Iq28资讯网——每日最新资讯28at.com

而在 serviceC 中同样可以知道来源是 serviceB 的 Order 接口发起的调用。5Iq28资讯网——每日最新资讯28at.com

我启动了三个 demo 应用,分别是 create1,create2,create3.5Iq28资讯网——每日最新资讯28at.com

create1 中会提供一个 request 接口,在这里面调用 create2 的 create2 接口,create2 的接口里接着调用 create3 的 create3 接口。5Iq28资讯网——每日最新资讯28at.com

create1:5Iq28资讯网——每日最新资讯28at.com

@RequestMapping("/request")      public String request(@RequestParam String name) {         HelloRequest request = HelloRequest.newBuilder()               .setName(name)               .build();         log.info("request: {}", request);         String message = myServiceStub.create2(request).getMessage();         Executors.newFixedThreadPool(1).execute(() -> {            myServiceStub.create2(request).getMessage();         });       return message;      }

create2:5Iq28资讯网——每日最新资讯28at.com

@Override  public void create2(HelloRequest request, StreamObserver<HelloReply> responseObserver) {      HelloReply reply = HelloReply.newBuilder()              .setMessage("Create2 ==> " + request.getName())              .build();      log.info("Create2: {}", reply.getMessage());      myMethod(request.getName());      myServiceStub.create3(request);    responseObserver.onNext(reply);      responseObserver.onCompleted();  }

create3:5Iq28资讯网——每日最新资讯28at.com

@Override  public void create3(HelloRequest request, StreamObserver<HelloReply> responseObserver) {      HelloReply reply = HelloReply.newBuilder()              .setMessage("Create3 ==> " + request.getName())              .build();      log.info("Create3: {}", reply.getMessage());      myMethod(request.getName());      responseObserver.onNext(reply);      responseObserver.onCompleted();  }
java -javaagent:opentelemetry-javaagent-2.4.0-SNAPSHOT.jar /-Dotel.javaagent.extensinotallow=otel-extensions-custom-context-1.0-SNAPSHOT.jar /-Dotel.traces.exporter=otlp /-Dotel.logs.exporter=none /-Dotel.service.name=create2 /-Dotel.exporter.otlp.protocol=grpc /-Dotel.propagators=tracecontext,baggage,demo /-Dotel.exporter.otlp.endpoint=http://127.0.0.1:5317 /      -jar target/demo-0.0.1-SNAPSHOT.jar --spring.application.name=create2 --server.port=9191 --grpc.server.port=9292 --grpc.client.myService.address=static://127.0.0.1:9393

只是每个应用都需要使用我这边单独打的 agent 包以及一个 extension(tel-extensions-custom-context-1.0-SNAPSHOT.jar) 才能生效。5Iq28资讯网——每日最新资讯28at.com

最终的效果如下:5Iq28资讯网——每日最新资讯28at.com

图片图片5Iq28资讯网——每日最新资讯28at.com

Baggage

在讲具体的实现之前需要先了解几个 Trace 中的概念,在这里主要用到的是一个称为 Baggage 的对象。5Iq28资讯网——每日最新资讯28at.com

在之前的文章中其实提到过它的原理以及使用场景:从 Dapper 到 OpenTelemetry:分布式追踪的演进之旅5Iq28资讯网——每日最新资讯28at.com

图片图片5Iq28资讯网——每日最新资讯28at.com

Baggage 的中文翻译是:包裹

本文链接:http://www.28at.com/showinfo-26-96995-0.htmlOpenTelemetry 深度定制:跨服务追踪的实战技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Vue 3.4 重磅升级:defineModel 宏如何彻底改变前端状态管理!

下一篇: 千万不要再用错了这个 Lodash 方法了!可能酿成大祸!

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的&ldquo;在线鉴别&rdquo;,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 信通院:小米、华为等11家应用商店基本完成APP签名及验签工作

    中国信通院表示,目前,小米、华为、OPPO、vivo、360手机助手、百度手机助手、应用宝、豌豆荚和努比亚等9家应用商店,以及抖音和快手2家新型应用分发平
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
Top