本文将为您介绍如何通过 opentelemetry - grpc-go 上报 Go 应用数据。
操作步骤
步骤1:获取接入点和 Token
1. 登录 腾讯云可观测平台 控制台。
2. 在左侧菜单栏中选择应用性能监控 > 数据接入。
3. 接入应用时选择 GO 语言与 grpc-go 拦截器上报方式的数据采集方式。
4. 在选择接入方式步骤获取您的接入点和 Token,如下图所示:
步骤2:修改接入点信息
说明
我们采用 grpc-go 拦截器方式上报数据,需要修改接入点信息为:ap-guangzhou.apm.tencentcs.com:14268/api/traces,可以直接将数据上报到 collector,无需使用 agent。
步骤3:引入依赖
需要引入 opentelemetry 的 SDK 埋点依赖。
步骤4:trace 初始化
// Init配置OpenTelemetryfunc Init() *sdktrace.TracerProvider {if ctx == nil {ctx = context.Background()}//创建新的exporter,设置基本的endpointopts := []otlptracegrpc.Option{otlptracegrpc.WithEndpoint("<接入点>"),otlptracegrpc.WithInsecure(),}exporter, err := otlptracegrpc.New(ctx, opts...)if err != nil {log.Fatal(err)}//设置Token,也可以设置环境变量:OTEL_RESOURCE_ATTRIBUTES=token=xxxxxxxxxr, err := resource.New(ctx, []resource.Option{//设置Token值resource.WithAttributes(attribute.KeyValue{Key: "token", Value: attribute.StringValue("<Token>"),}),//设置服务名resource.WithAttributes(attribute.KeyValue{Key: "service.name", Value: attribute.StringValue("audotanggrpcdemo"),}),}...)if err != nil {log.Fatal(err)}//创建新的TracerProvidertp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample()),sdktrace.WithBatcher(exporter),sdktrace.WithResource(r),)otel.SetTracerProvider(tp)otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))return tp}
步骤5:选择上报端类型上报应用数据
服务端配置
1. 初始化 TracerProvider。
//初始化tracetp := trace.Init()defer func() {if err := tp.Shutdown(context.Background()); err != nil {log.Printf("Error shutting down tracer provider: %v", err)}}()//指定hosthost := os.Getenv("grpc1")lis, err := net.Listen("tcp", host+":7778")if err != nil {log.Fatalf("failed to listen: %v", err)}
2. 配置拦截器
s := grpc.NewServer(grpc.UnaryInterceptor(otelgrpc.UnaryServerInterceptor()),grpc.StreamInterceptor(otelgrpc.StreamServerInterceptor()),)
3. 启动 server 服务
//在gRPC服务器处注册我们的服务api.RegisterHelloServiceServer(s, &server{})reflection.Register(s)if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
客户端配置
1. 初始化 TracerProvider。
//初始化tracetp := trace.Init()defer func() {if err := tp.Shutdown(context.Background()); err != nil {log.Printf("Error shutting down tracer provider: %v", err)}}()
2. 建立连接,配置拦截器。
//向服务端建立连接,配置拦截器conn, err := grpc.DialContext(context.Background(), "localhost:7778", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock())
3. 进行 GRPC 调用。
c := api.NewHelloServiceClient(conn)for {callSayHelloClientStream(c)time.Sleep(100 * time.Millisecond)}