关于jaeger:gozero-dockercompose-搭建课件服务八集成jaeger链路追踪

0、索引go-zero docker-compose 搭建课件服务(一):编写服务api和proto go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务 go-zero docker-compose 搭建课件服务(三):编写courseware api服务 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 go-zero docker-compose 搭建课件服务(五):欠缺user服务 go-zero docker-compose 搭建课件服务(六):欠缺jwt鉴权和返回构造 go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控 go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪 0.1源码地址https://github.com/liuyuede123/go-zero-courseware 1、链路追踪一个内部申请须要外部若干服务的联动响应,这时候残缺的调用轨迹将逾越多个服务,同时包含服务间的网络传输信息与各个服务外部的调用堆栈信息。追踪的次要目标是排查故障,如剖析调用链的哪一部分、哪个办法呈现谬误或阻塞,输入输出是否合乎预期,等等。 链路追踪中有几个比拟重要的概念: trace:从客户端发动申请到达零碎的边界开始,记录申请流经的每一个服务,直到到向客户端返回响应为止,这整个过程就称为一次tracespan:因为每次 Trace 都可能会调用数量不定、坐标不定的多个服务,为了可能记录具体调用了哪些服务,以及调用的程序、开始时点、执行时长等信息,每次开始调用服务前都要先埋入一个调用记录,这个记录称为一个Span。应含有工夫戳、起止工夫、Trace 的 ID、以后 Span 的 ID、父 Span 的 ID 等可能满足追踪须要的信息OpenTracing:OpenTracing 是一套与平台无关、与厂商无关、与语言无关的追踪协定标准,只有遵循 OpenTracing 标准,任何公司的追踪探针、存储、界面都能够随时切换,也能够互相搭配应用。 参考:凤凰架构 2、jaegerJaeger 受 Dapper 和 OpenZipkin 的启发,是 Uber Technologies 以开源模式公布的分布式跟踪零碎。 它由检测 SDK、用于数据收集和存储的后端、用于可视化数据的 UI 以及用于聚合跟踪剖析的 Spark/Flink 框架组成。 jaeger架构如下: Instrumentation SDKs:集成到应用程序和框架中以捕捉跟踪数据的库。 从历史上看,Jaeger 我的项目反对应用各种编程语言编写的本人的客户端库。 它们当初被弃用,取而代之的是 OpenTelemetryJaeger Agent: Jaeger 代理是一个网络守护程序,用于侦听通过 UDP 从 Jaeger 客户端接管到的 span。 它收集成批的它们,而后将它们一起发送给收集器。 如果 SDK 被配置为将 span 间接发送到收集器,则不须要代理Jaeger Collector: Jaeger 收集器负责从 Jaeger 代理接管跟踪,执行验证和转换,并将它们保留到选定的存储后端Storage Backends: Jaeger 反对各种存储后端来存储跨度。 反对的存储后端有 In-Memory、Cassandra、Elasticsearch 和 Badger(用于单实例收集器部署)Jaeger Query:这是一项服务,负责从 Jaeger 存储后端检索跟踪信息,并使其可供 Jaeger UI 拜访。Jaeger UI:一个 React 应用程序,可让您可视化跟踪并剖析它们。 对于调试零碎问题很有用。Ingester:只有当咱们应用 Kafka 作为收集器和存储后端之间的缓冲区时,ingester 才是相干的。 它负责从 Kafka 接收数据并将其摄取到存储后端。 更多信息能够在官网 Jaeger Tracing 文档中找到。3、go-zero中集成jaeger首先咱们须要在我的项目根目录下减少jaeger和elasticsearch的Dockerfile。 ...

September 5, 2022 · 2 min · jiezi

关于jaeger:The-Life-of-a-Span

最近在应用Opentracing + Jaeger监控本人的云端微服务程序时,遇到了难以排查的内存泄露问题。在进行性能测试时,内存中堆满了JaegerSpan,JaegerSpanContext,以及其中的字符串,看代码却不知从何下手排查。 因而翻译这篇来自Kiali开发工程师Juraci Paixao Kroehling的文章The Life of a Span,来理解一下Span的生命周期,心愿能给问题排查带来一些启发。 以下为原文翻译: “Span”是分布式链路追踪中的一个独立单元,本篇文章将应用一个Jaeger利用的例子来展现span的生命周期,以及span是如何达到后盾收集剖析零碎的。 在OpenTracing,以及很多其它分布式链路追踪的世界里,“Span”形容的是一个存储独立工作单元信息的数据结构。在大多数案例中,程序员只会关注如何实例化一个tracer,并且应用各种工具库来记录感兴趣的Span数据,至于Span是如何达到后端收集服务如Jaeger的,大多数程序员并不分明。 明天就让咱们来一探魔法背地的神秘。 在后续的文字中,咱们会聚焦于默认配置下所有组件的工作形式,这样你就能分明比对各个配置项之间的差别,并依据本人所作的配置晓得本人的分布式链路追踪在后盾是如何工作的了。 咱们会应用Jaeger Java Client的一个利用示例来进行阐明,其它语言的jaeger client库也是基于相似原理进行工作。 利用配置这篇博客中应用的例子非常简单,不会像通常大家做的那样在GlobalTracer中注册追踪器。例子只会启动一个Eclipse Vert.x,而后为receiver接管到的每个HTTP申请创立Span。例子中的代码能够在GitLab上找到,摘录最要害的局部如下: package com.example.demo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import io.jaegertracing.Configuration;import io.opentracing.Scope;import io.opentracing.Tracer;import io.vertx.core.AbstractVerticle;import io.vertx.core.Vertx;public class MainVerticle extends AbstractVerticle { private static final Logger logger = LoggerFactory.getLogger(MainVerticle.class); public static void main(String[] args) { Vertx.vertx().deployVerticle(new MainVerticle()); } @Override public void start() throws Exception { String serviceName = System.getenv("JAEGER_SERVICE_NAME"); if (null == serviceName || serviceName.isEmpty()) { serviceName = "vertx-create-span"; } System.setProperty("JAEGER_SERVICE_NAME", serviceName); Tracer tracer = Configuration.fromEnv().getTracer(); vertx.createHttpServer().requestHandler(req -> { try (Scope ignored = tracer.buildSpan("operation").startActive(true)) { logger.debug("Request received"); req.response().putHeader("content-type", "text/plain").end("Hello from Vert.x!"); } }).listen(8080); logger.info("HTTP server started on port 8080"); }}在启动过程中,Jaeger Java Client会在背地创立一个RemoteReporter实例,从而启动一个守护线程来一直冲刷缓存中存储的Span(参见JAEGER_REPORTER_FLUSH_INTERVAL)。 ...

May 3, 2022 · 4 min · jiezi