通过Jaeger上报Go应用数据

通过Jaeger为应用埋点并上报链路数据至可观测链路 OpenTelemetry 版后,可观测链路 OpenTelemetry 版即可开始监控应用,您可以查看应用拓扑、调用链路、异常事务、慢事务和SQL分析等一系列监控数据。本文介绍如何使用Jaeger SDK和Jaeger Agent埋点并上报Go应用数据。

重要
  • 为获得更丰富的功能、更先进的链路追踪能力,以及最佳使用体验,建议您使用OpenTelemetry协议将应用接入可观测链路 OpenTelemetry 版。我们为您提供了详细的OpenTelemetry接入指南和最佳实践,帮助您快速上手可观测链路 OpenTelemetry 版。更多信息,请参见接入应用

  • ARMS应用监控针对Golang语言提供了商业化版本的自研探针,提供了无侵入的埋点能力,拥有更加丰富的功能和更高的稳定性。详细信息,请参见开始监控Golang应用

前提条件

获取接入点信息

新版控制台

  1. 登录可观测链路 OpenTelemetry 版控制台,在左侧导航栏单击接入中心

  2. 开源框架区域单击Jaeger卡片。

  3. 在弹出的Jaeger面板中选择数据需要上报的地域。

    说明

    初次接入的地域将会自动进行资源初始化。

  4. 选择连接方式上报方式,然后复制接入点信息。

    • 连接方式:若您的服务部署在阿里云上,且所属地域与选择的接入地域一致,推荐使用阿里云内网方式,否则选择公网方式。

    • 上报方式:根据客户端支持的协议类型选择HTTP或gRPC协议上报数据。

    image

旧版控制台

  1. 登录可观测链路 OpenTelemetry 版控制台

  2. 在左侧导航栏单击集群配置,然后在右侧页面单击接入点信息页签。

  3. 在页面顶部选择需要接入的地域,然后在集群信息区域打开显示Token开关。

  4. 客户端采集工具区域单击Jaeger

    相关信息列中,获取接入点信息。jager中国.jpg

    说明

    如果应用部署于阿里云生产环境,则选择阿里云VPC网络接入点,否则选择公网接入点。

背景信息

数据是如何上报的?

  • 不通过Jaeger Agent而直接上报数据的原理如下图所示。

    image
  • 通过Jaeger Agent上报数据的原理如下图所示。

    image

方式一:通过Jaeger SDK上报数据

此处以依赖管理工具Go Modules为例,您可以通过Jaeger SDK埋点直接将数据上报到可观测链路 OpenTelemetry 版服务端。若使用其他依赖管理工具,请按实际情况操作。

  1. 引入jaeger-client-go

    go get github.com/uber/jaeger-client-go
  2. 创建Tracer对象。

    说明

    请将<endpoint>替换成可观测链路 OpenTelemetry 版控制台接入点信息页面上相应客户端和相应地域的接入点。关于获取接入点信息的方法,请参见本文前提条件。

    func NewJaegerTracer(service string) (opentracing.Tracer, io.Closer) {
    
        sender := transport.NewHTTPTransport(
           // 设置网关,网关因地域而异。
            "<endpoint>",
        )
       tracer, closer:= jaeger.NewTracer(service,
               jaeger.NewConstSampler(true),
               jaeger.NewRemoteReporter(sender))
       return tracer, closer
    }
  3. 创建span实例对象和数据透传。

    • 如果没有parentSpan:

      // 创建Span。
      span := tracer.StartSpan("myspan")
      // 设置Tag。
      clientSpan.SetTag("mytag", "123")
      // 透传traceId。
      tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
      ...
      defer  span.Finish()
    • 如果有parentSpan:

      // 从HTTP/RPC对象解析出spanCtx。
      spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
      span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
      ...
      defer  span.Finish()

    更多详细使用方法,请参见Go Doc

方式二:通过Jaeger Agent上报数据

  1. 启动Jaeger Agent。具体操作,请参见安装Jaeger Agent

  2. 引入jaeger-client-go

    go get github.com/uber/jaeger-client-go
  3. 创建Tracer对象。

    func NewJaegerTracer(serviceName string) (opentracing.Tracer, io.Closer) {
       sender, _ := jaeger.NewUDPTransport("",0)
       tracer, closer:= jaeger.NewTracer(serviceName,
            jaeger.NewConstSampler(true),
            jaeger.NewRemoteReporter(sender))
        return tracer, closer
    }
  4. 创建span实例对象和数据透传。

    • 如果没有parentSpan:

      // 创建Span。
      span := tracer.StartSpan("myspan")
      // 设置Tag。
      clientSpan.SetTag("mytag", "123")
      // 透传traceId。
      tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
      ...
      defer  span.Finish()
    • 如果有parentSpan:

      // 从HTTP/RPC对象解析出spanCtx。
      spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
      span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
      ...
      defer  span.Finish()

    更多详细使用方法,请参见Go Doc

使用示例

通过Jaeger SDK直接上报

  1. 获取接入点信息。具体操作方法,请参见本文前提条件。

  2. 运行以下命令,下载示例文件

    wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
  3. 打开示例文件夹中的examples/settings.go文件,配置TracingAnalysisEndpoint,将图示①替换为步骤1中获取的接入点信息。

    jaeger_demo

  4. 使用go mod tidy命令整理依赖。

  5. 使用go run tracingdemo命令运行示例。

通过Jaeger Agent上报

  1. 获取接入点信息。具体操作方法,请参见本文前提条件。

  2. 运行以下命令,下载示例文件

    wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
  3. 启动Jaeger Agent。具体操作,请参见安装Jaeger Agent

  4. 打开示例文件夹中的examples/settings.go文件,将AgentSwitch修改为true

    jaeger_demo

  5. 使用go mod tidy命令整理依赖。

  6. 使用go run tracingdemo命令运行示例。

常见问题

Q:在运行过程中,为什么会出现以下报错?

2021/06/28 21:11:54 ERROR: error when flushing the buffer: error from collector: 403

A:出现上述报错,说明输入的接入点信息不正确。请更正并重试。