open-telemetry小demo

可参考github:

https://github.com/open-telemetry/opentelemetry-go/blob/main/example/jaeger/main.go

golang可观测性实践小demo

package main

import (
	"context"
	"log"
	"net/http"

	"github.com/gin-gonic/gin"
	"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/attribute"
	"go.opentelemetry.io/otel/codes"
	"go.opentelemetry.io/otel/exporters/jaeger"
	"go.opentelemetry.io/otel/propagation"
	"go.opentelemetry.io/otel/sdk/resource"
	sdktrace "go.opentelemetry.io/otel/sdk/trace"
	semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
	oteltrace "go.opentelemetry.io/otel/trace"
)

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

var tracer = otel.Tracer(service)

type UserInfo struct {
	Id   string `json:"id"`
	Name string `json:"name"`
}

func GetUsers(c *gin.Context) {
	id := c.Param("id")
	// 实例化开始span: 从ctx 中获取span
	// 可以在实例化span 的时候就设置一些属性
	ctx, span := tracer.Start(c.Request.Context(), "getUser", oteltrace.WithAttributes(attribute.String("id", id)))
	defer span.End()
	// 模拟执行获取用户信息的业务流程
	name := getUser(ctx, id)
	userInfo := UserInfo{
		Id:   id,
		Name: name,
	}
	c.JSON(http.StatusOK, userInfo)
}

func getUser(ctx context.Context, id string) string {
	// 实例化子span

	_, childSpan := tracer.Start(ctx, "getUserSubProcess")
	defer childSpan.End()
	// 也可以在实例化后设置span的一些属性
	var name string
	if id == "123" {
		name = "zhouzy1"
	}
	childSpan.SetAttributes(attribute.String("name", name))
	childSpan.SetStatus(codes.Ok, "get userInfo success")
	return name
}

func main() {
	tp, err := initTracer()
	if err != nil {
		log.Fatal(err)
	}
	defer func() {
		if err := tp.Shutdown(context.Background()); err != nil {
			log.Printf("Error shutting down tracer provider: %v", err)
		}
	}()
	r := gin.New()
	r.Use(otelgin.Middleware("my-server"))

	r.GET("/users/:id", GetUsers)
	_ = r.Run(":8080")
}

func initTracer() (*sdktrace.TracerProvider, error) {
	// 使用jaeger 作为exporter
	exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint("http://159.75.1.200:14268/api/traces")))
	if err != nil {
		return nil, err
	}
	// 初始化 tracer provider
	tp := sdktrace.NewTracerProvider(
		sdktrace.WithBatcher(exporter),
		sdktrace.WithResource(resource.NewWithAttributes(
			semconv.SchemaURL,
			semconv.ServiceNameKey.String(service),
			attribute.String("environment", environment),
			attribute.Int64("ID", id),
		)),
	)
	otel.SetTracerProvider(tp)
	otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
	return tp, nil
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值