可参考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
}