请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

go 使用opentelemetry来实现简单链路追踪

go 忘记要 下载那些包了
这块百度看看

运行以下代码 首先
jaeger 需要而外开启一个端口 就是 14268 (我也不知道为什么 但是没有这个端口不行)
docker run
–rm
–name jaeger
-p6831:6831/udp
-p14268:14268
-p16686:16686
jaegertracing/all-in-one:latest

代码如下
这里我简单根据
opentelemetry 官网给出的示例
github 上
opentelemetry-go-contrib 和 opentelemetry-go
还有 you噗通 的一些帮助
写的demo

package main

import (
	"context"
	"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.10.0"
	"log"
	"time"
)

const (
	service     = "trace-demo"
	environment = "production"
	id          = 1
)

// tracerProvider returns an OpenTelemetry TracerProvider configured to use
// the Jaeger exporter that will send spans to the provided url. The returned
// TracerProvider will also use a Resource configured with all the information
// about the application.
func tracerProvider(url string) (*tracesdk.TracerProvider, error) {
	// 创建 Jaeger 导出器
	exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
	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),                    // 不清楚有啥用 去掉也没问题
		)),
	)
	return tp, nil
}

func main() {
	// 用来创建 Jaeger 导出器
	tp, err := tracerProvider("http://192.168.16.196:14268/api/traces") // ip地址记得要换
	if err != nil {
		log.Fatal(err)
	}

	// 注册我们的 TracerProvider 为全局的 所以任何导入
	// 将来的 instrumentation 将默认使用它
	otel.SetTracerProvider(tp)

	// 创建 子 context  用来传递给 子协程  用于 通信 底层实现的是 channel   cancel 用于关闭用
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	// 当应用程序退出时,干净地关闭和刷新遥测
	defer func(ctx context.Context) {
		// 在关闭应用程序时,不要使其挂起
		ctx, cancel := context.WithTimeout(ctx, time.Second*5) // 从创建后 超过5秒后 关闭
		defer cancel()
		if err := tp.Shutdown(ctx); err != nil { // Shutdown按注册span处理器的顺序关闭它们
			log.Fatal(err)
		}
	}(ctx)

	tr := tp.Tracer("component-main") // 创建链路追踪

	//ctx, span := tr.Start(context.Background(), "foo")
	ctx, span := tr.Start(ctx, "foo") // 开启链路追踪 修改了 他的源码 如果这里传递 全新的context 上面的代码是不是就没有用了?
	defer span.End()

	bar(ctx)

}

func bar(ctx context.Context) {
	// Use the global TracerProvider.
	tr := otel.Tracer("component-bar")
	_, span := tr.Start(ctx, "bar")
	span.SetAttributes(attribute.Key("testset").String("value"))
	defer span.End()

	// Do bar...
}

就是有些问题 比如怎么添加log 和 去除log
希望给 代码让我看看

正在回答

1回答

你需要添加什么log? 使用opentelemetry的log? opentelemetry本身还不支持log集成,官方自己还没有确定如何去做log集成

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信