在Go的服务器上添加Jaeger的Opentracing形式的分布式跟踪~EHW2018的”应用8″

总结

这篇文章是为了「Enterprise “hello, world” 2018 Advent Calendar 2018」中的12/25日期而写的。在这个Advent Calendar中,我们尽量让每篇文章涵盖一个主题,同时考虑到跨多个文章的故事线。

本篇将讨论的主题是如何在Go服务器中使用Jaeger并添加OpenTracing格式的分布式追踪功能。

我们将使用在EHW2018中创建的Go-lang+Gin的API服务器作为Go服务器的目标。

前提 tí)

抱歉

    • このEnterpfise “hello, world”シリーズは、ネタのためのエントリです。実環境でそのまま利用ことを目的とはしていません。

 

    動かしやすさを優先してセキュリティを意図的に低くする設定など入れてありますのでご注意ください。

对于目标读者而言

「企業『你好,世界』2018」的笑话设定如下所示。

为了测量对已创建的应用程序的请求,需要应用分布式跟踪库。同时也希望添加一个机制,将测量数据作为核心。

为在Jaeger中处理数据做准备。

Jaeger是什么?

Jaeger是CNCF(Cloud Native Computing Foundation)项目之一,主要用于在采用微服务架构的系统中跟踪组件之间的调用的工具。

jaeger-site.PNG

OpenTracing是一个开源的分布式追踪规范,用于跟踪和监控分布式系统中的请求。

Jaeger使用Opentracing格式作为数据记录格式。为了获取测量数据,Opentracing格式提供了适用于多种语言的库。

opentracing-site.png

使用容器来启动Jaeger服务器

Jaeger可以将日志存储在Cassandra、Elasticsearch和Kafka中,但为了简单起见,在本篇文章中仅使用单一容器来进行使用。

我会按照Jaeger的网站上的指示进行工作。根据记录条目的三天前发布了1.10版本,所以我会使用这个版本。

根据网站的描述,我试着写了一个docker-compose.yml文件。大致如下所示。

version: '3.7'

services:

  jaeger:
    image: jaegertracing/all-in-one:1.10
    container_name: jaeger 
    environment:
      - COLLECTOR_ZIPKIN_HTTP_PORT=9411
    ports:
      - "5775:5775/udp"
      - "6831:6831/udp"
      - "6832:6832/udp"
      - "5778:5778"
      - "16686:16686"
      - "14268:14268"
      - "9411:9411"

使用docker-compose进行启动。

$ sudo docker-compose up

应用程序的响应

使用库

使用Jaeger提供的客户端库来为Go语言进行开发。

Source:

请原生中文重述以下内容,只需要一个选项:

1. 数据源
2. 来源
3. 参考资料

导入指定的客户端库。
获取指标的API本身将采用go版本的opentracing格式。

import (
    "github.com/fvbock/endless"
    "github.com/gin-gonic/gin"

    opentracing "github.com/opentracing/opentracing-go"
    "github.com/uber/jaeger-lib/metrics"

    "github.com/uber/jaeger-client-go"
    jaegercfg "github.com/uber/jaeger-client-go/config"
        jaegerlog "github.com/uber/jaeger-client-go/log"    
)

由于提供了示例,我们将使用初始化方法作为参考。在此条目中,我们使用提供的示例中的开发设置而不是生产环境设置。在开发和生产环境中,需要将事件记录的方式有所区别,例如记录所有目标事件或进行一定程度的抽样记录。

    // Sample configuration for testing. Use constant sampling to sample every trace
    // and enable LogSpan to log every span via configured Logger.
    cfg := jaegercfg.Configuration{
        Sampler: &jaegercfg.SamplerConfig{
            Type:  jaeger.SamplerTypeConst,
            Param: 1,
        },
        Reporter: &jaegercfg.ReporterConfig{
            LogSpans: true,
        },
    }

    // Example logger and metrics factory. Use github.com/uber/jaeger-client-go/log
    // and github.com/uber/jaeger-lib/metrics respectively to bind to real logging and metrics
    // frameworks.
    jLogger := jaegerlog.StdLogger
    jMetricsFactory := metrics.NullFactory

    // Initialize tracer with a logger and a metrics factory
    closer, err := cfg.InitGlobalTracer(
        "greetings-server",
        jaegercfg.Logger(jLogger),
        jaegercfg.Metrics(jMetricsFactory),
    )
    if err != nil {
        log.Printf("Could not initialize jaeger tracer: %s", err.Error())
        return
    }
defer closer.Close()

在API的终点中,放入记录opentracing“span”的设置。
opentracing的优点是可以追踪由多个“span”组成的“trace”,作为分布式环境中一系列的流程。而在这里,我们插入了用于以单独的span进行追踪的代码。

在OpenTracing的库中,您可以使用context.Context,而在Gin的gin.Context中,在本篇文章中,您也可以将其作为StartSpanFromContext的参数使用。

由于需要完成 span,所以我们使用了 go 的 defer。

    router.GET("/api/greeting", func(ctx *gin.Context) {
        span, _ := opentracing.StartSpanFromContext(ctx, "api-greeting")
        defer span.Finish()

        ctx.JSON(200, gin.H{
            "message": "hello, world",
        })
    })

启动应用

使用`dep ensure`命令导入所需的库,然后开始执行。

$ go run greetings-server.go

执行

调用API

我会在浏览器中尝试访问”http://localhost:8080/api/greeting”。

Screenshot_2019-02-19_05-23-10.png

在Jaeger服务器上进行确认。

我尝试在浏览器中访问”http://localhost:16686″。

在左侧的“查找跟踪”菜单中,以“greeting-server”(在源代码中指定的服务名称)的形式选择“服务”,然后点击菜单下方的“查找跟踪”按钮。

Screenshot_2019-02-19_05-22-23.png

画面右上方的圈圈标志指示了浏览器从API接收到访问的时机。当您在浏览器中多次进行API调用后,再次点击“查找跟踪”按钮,将会增加并显示跟踪数。

概括起来

在这篇文章中,我们将讨论作为「Enterprise “hello, world” 2018 Advent Calendar 2018」(EHW2018)的第25天,在Go服务器中使用Jaeger来实现Opentracing形式的分布式追踪。

这个条目的源代码已经上传到GitHub上。

EHW2018,这是我在这个帖子中的第25个回复。圣诞快乐。

bannerAds