Jaeger SDK使用教程-go

4 篇文章 0 订阅

Jaeger支持两种SDK,

官方建议迁移到OpenTelemetry SDK,Client除安全修复,已不再更新;

请提前搭建Jaeger环境,没搭建的看这里

一、OpenTelemetry SDK使用:

直接上示例代码,没有什么比看代码更直观的了

package main

import (
	"context"
	"fmt"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/exporters/jaeger"
	"go.opentelemetry.io/otel/sdk/resource"
	tracesdk "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.9.0"
	"log"
	"time"
)

const (
	service     = "jaeger-OTtrace-demo-01"
	environment = "production"
	id          = 1
)

func tracerProvider(url string) (*tracesdk.TracerProvider, error) {
	// Create the Jaeger exporter
	//exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
	exp, err := jaeger.New(jaeger.WithAgentEndpoint(jaeger.WithAgentHost("10.1.87.69"), jaeger.WithAgentPort("6831")))
	if err != nil {
		return nil, err
	}
	tp := tracesdk.NewTracerProvider(
		// Always be sure to batch in production.
		tracesdk.WithBatcher(exp),
		// Record information about this application in a Resource.
		tracesdk.WithResource(resource.NewWithAttributes(
			semconv.SchemaURL,
			semconv.ServiceNameKey.String(service),
			attribute.String("environment", environment),
			attribute.Int64("ID", id),
		)),
	)
	//tp.RegisterSpanProcessor()
	return tp, nil
}

func main() {
	tp, err := tracerProvider("http://10.2.97.109:14268/api/traces")
	if err != nil {
		log.Fatal(err)
	}

	// Register our TracerProvider as the global so any imported
	// instrumentation in the future will default to using it.
	otel.SetTracerProvider(tp)

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// Cleanly shutdown and flush telemetry when the application exits.
	defer func(ctx context.Context) {
		// Do not make the application hang when it is shutdown.
		ctx, cancel = context.WithTimeout(ctx, time.Second*5)
		defer cancel()
		if err := tp.Shutdown(ctx); err != nil {
			log.Fatal(err)
		}
	}(ctx)

	tr := tp.Tracer(service)
	startTime := time.Now().UnixNano() / 1e6
	for i := 0; i < 10000; i++ {
		_, span := tr.Start(ctx, "foo")
		span.SetName("bar")
		span.SetAttributes(attribute.String("foo", "bar"))
		//span.SetAttributes(attribute.Int64("baz", 1))
		//span.SetAttributes(attribute.Float64("qux", 1.0))
		//span.SetAttributes(attribute.Bool("quux", true))
		span.End()
	}

	fmt.Println(time.Now().UnixNano()/1e6 - startTime)
	time.Sleep(time.Second * 15)
}

二、Jaeger-Client使用

1.通过agent发送
package main

import (
	"context"
	"fmt"
	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	"github.com/uber/jaeger-client-go/config"
	"io"
	"sync"
	"time"
)

func _NewJaegerTracer(serviceName string) (opentracing.Tracer, io.Closer) {
	sender, _ := jaeger.NewUDPTransport("10.2.187.169:6831", 0)
	tracer, closer := jaeger.NewTracer(serviceName,
		jaeger.NewConstSampler(true),
		jaeger.NewRemoteReporter(sender))
	return tracer, closer
}

func initJaeger(service string) (opentracing.Tracer, io.Closer) {
	cfg := &config.Configuration{
		Sampler: &config.SamplerConfig{
			Type:  "const",
			Param: 1,
		},
		Reporter: &config.ReporterConfig{
			LogSpans: true,
			//LocalAgentHostPort: "10.1.87.69:6831",
			LocalAgentHostPort: "10.2.187.169:6121",
		},
	}
	//tracer, closer, err := cfg.New(service, config.Logger(jaeger.StdLogger))
	tracer, closer, err := cfg.NewTracer()
	if err != nil {
		panic(fmt.Sprintf("ERROR: cannot init Jaeger: %v\n", err))
	}
	return tracer, closer
}

func foo3(req string, ctx context.Context) (reply string) {
	//1.创建子span
	span, _ := opentracing.StartSpanFromContext(ctx, "span_foo3")
	defer func() {
		//4.接口调用完,在tag中设置request和reply
		span.SetTag("request", req)
		span.SetTag("reply", reply)
		span.Finish()
	}()

	println(req)
	//2.模拟处理耗时
	time.Sleep(time.Second / 2)
	//3.返回reply
	reply = "foo3Reply"
	return
}

//跟foo3一样逻辑
func foo4(req string, ctx context.Context) (reply string) {
	span, _ := opentracing.StartSpanFromContext(ctx, "span_foo4")
	defer func() {
		span.SetTag("request", req)
		span.SetTag("reply", reply)
		span.Finish()
	}()

	println(req)
	time.Sleep(time.Second / 2)
	reply = "foo4Reply"
	return
}

func stressTest(tracer opentracing.Tracer, closer io.Closer) {
	//defer closer.Close()
	span := tracer.StartSpan("span_root")
	//ctx := opentracing.ContextWithSpan(context.Background(), span)
	//r1 := foo3("Hello foo3", ctx)
	//r2 := foo4("Hello foo4", ctx)
	//fmt.Println(r1, r2)
	span.Finish()
	//wg.Done()
}

var wg sync.WaitGroup //定义一个同步等待的组

func __main() {
	tracer, closer := NewJaegerTracer("jaeger-demo-2")
	opentracing.SetGlobalTracer(tracer) //StartspanFromContext创建新span时会用到
	startTime := time.Now().UnixNano() / 1e6
	for i := 0; i < 1000; i++ {
		stressTest(tracer, closer)
	}
	fmt.Println(time.Now().UnixNano()/1e6 - startTime)
	time.Sleep(time.Second * 15)
}

2.发送给Collector
package main

import (
	"fmt"
	"github.com/opentracing/opentracing-go"
	"github.com/uber/jaeger-client-go"
	"github.com/uber/jaeger-client-go/transport"
	"io"
	"time"
)

func NewJaegerTracer(service string) (opentracing.Tracer, io.Closer) {

	sender := transport.NewHTTPTransport(
		// 设置网关,网关因地域而异。
		"http://10.2.187.169:14268/api/traces",
	)
	tracer, closer := jaeger.NewTracer(service,
		jaeger.NewConstSampler(true),
		jaeger.NewRemoteReporter(sender))
	return tracer, closer
}

func stress(tracer opentracing.Tracer) {
	// 创建Span。
	span := tracer.StartSpan("myspan")
	// 设置Tag。
	span.SetTag("mytag", "123")
	span.Finish()
}

func _main() {
	tracer, _ := NewJaegerTracer("jaeger-collector-01")

	startTime := time.Now().UnixNano() / 1e6
	for i := 0; i < 1000; i++ {
		stress(tracer)
	}
	fmt.Println(time.Now().UnixNano()/1e6 - startTime)
	time.Sleep(time.Second * 15)
}

参考:

  1. https://blog.csdn.net/liyunlong41/article/details/87932953
  2. https://help.aliyun.com/document_detail/90505.html
  3. https://github.com/open-telemetry/opentelemetry-go/blob/main/example/jaeger/main.go
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值