微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用收集器跟踪 gRPC 服务服务器端

如何解决如何使用收集器跟踪 gRPC 服务服务器端

我正在使用收集器来跟踪我的 Java 服务中的跨度,此服务是 http 和 grpc。收集器端点是 localhost:55680。此 java 服务跟踪成功。

现在,我想使用这个收集器来跟踪我基于 gRPC 的 go 服务。

在我的 go 服务中,我从 repo opentelemetry-go-contrib 复制了这个文件:interceptor.go 和 grpctrace.go,这里 https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/instrumentation/google.golang.org/grpc/otelgrpc

现在,我创建一个名为 config.go 的文件

package grpcTracing

import (
  "context"
  "log"

  "go.opentelemetry.io/otel"
  "go.opentelemetry.io/otel/exporters/otlp"
  "go.opentelemetry.io/otel/exporters/otlp/otlpgrpc"
  "go.opentelemetry.io/otel/label"
  "go.opentelemetry.io/otel/propagation"
  "go.opentelemetry.io/otel/sdk/resource"
  sdktrace "go.opentelemetry.io/otel/sdk/trace"
)

// Init configures an OpenTelemetry exporter and trace provider
func InitTracing() {

  ctx := context.Background()

  driver := otlpgrpc.NewDriver(
    otlpgrpc.WithInsecure(),otlpgrpc.WithEndpoint("localhost:55680"),)

  exporter,err := otlp.NewExporter(ctx,driver) // Configure as needed.
  if err != nil {
    log.Fatal(err)
  }
  defer func() {
    err := exporter.Shutdown(ctx)
    if err != nil {
      log.Fatalf("Failed to stop exporter: %v",err)
    }
  }()

  service := "test-service"

  tracerProvider := sdktrace.NewTracerProvider(
    sdktrace.WithConfig(sdktrace.Config{DefaultSampler: sdktrace.AlwaysSample()}),sdktrace.WithResource(resource.NewWithAttributes(
      label.Key("service.name").String(service),)),sdktrace.WithBatcher(exporter),)


  if err != nil {
    log.Fatal(err)
  }
  otel.SetTracerProvider(tracerProvider)
  otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{},propagation.Baggage{}))
}

现在,当我启动我的 gRPC 服务器时,我会这样做:


        grpcTracing.InitTracing()
        ...
    grpcServer := grpc.NewServer(
        grpc.UnaryInterceptor(grpcTracing.UnaryServerInterceptor()),)

这是服务器拦截器,每个请求都会调用它:

func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
  return func(
    ctx context.Context,req interface{},info *grpc.UnaryServerInfo,handler grpc.UnaryHandler,) (interface{},error) {
    requestMetadata,_ := Metadata.FromIncomingContext(ctx)
    Metadatacopy := requestMetadata.copy()

    entries,spanCtx := Extract(ctx,&Metadatacopy,opts...)
    ctx = baggage.ContextWithValues(ctx,entries...)

    tracer := newConfig(opts).TracerProvider.Tracer(
      instrumentationName,trace.WithInstrumentationVersion(otelcontrib.SemVersion()),)

    name,attr := spanInfo(info.FullMethod,peerFromCtx(ctx))
    ctx,span := tracer.Start(
      trace.ContextWithRemoteSpanContext(ctx,spanCtx),name,trace.WithSpanKind(trace.SpanKindServer),trace.WithAttributes(attr...),)
    defer span.End()

    messageReceived.Event(ctx,1,req)

    resp,err := handler(ctx,req)
    if err != nil {
      s,_ := status.FromError(err)
      span.SetStatus(codes.Error,s.Message())
      span.SetAttributes(statusCodeAttr(s.Code()))
      messageSent.Event(ctx,s.Proto())
    } else {
      span.SetAttributes(statusCodeAttr(grpc_codes.OK))
      messageSent.Event(ctx,resp)
    }

    return resp,err
  }
}

第一次请愿,我收到这样的信息: rpc error: code = Canceled desc = context canceled 对于下一个请愿书,我收到以下消息: exporter disconnected

我查看了收集器日志,似乎没有请求来。

知道为什么它不起作用吗?我做错了什么?

谢谢!!!

解决方法

我的错误在这一行:

defer func() {
    err := exporter.Shutdown(ctx)
    if err != nil {
      log.Fatalf("failed to stop exporter: %v",err)
    }
}()

我删除了这一行,它起作用了!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。