首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用收集器跟踪go中的gRPC服务(服务器端

如何使用收集器跟踪go中的gRPC服务(服务器端
EN

Stack Overflow用户
提问于 2021-02-05 18:38:29
回答 1查看 415关注 0票数 0

我在我的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的文件:

代码语言:javascript
复制
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服务器时,我这样做:

代码语言:javascript
复制
        grpcTracing.InitTracing()
        ...
    grpcServer := grpc.NewServer(
        grpc.UnaryInterceptor(grpcTracing.UnaryServerInterceptor()),
    )

这是服务器拦截器,这被称为每个请求:

代码语言:javascript
复制
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, 1, s.Proto())
    } else {
      span.SetAttributes(statusCodeAttr(grpc_codes.OK))
      messageSent.Event(ctx, 1, resp)
    }

    return resp, err
  }
}

第一个请愿书,我得到了这个消息:rpc error: code = Canceled desc = context canceled对于下一个请愿书,我得到了这个消息:exporter disconnected

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

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

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-02-05 23:41:17

我的错误在这几行中:

代码语言:javascript
复制
defer func() {
    err := exporter.Shutdown(ctx)
    if err != nil {
      log.Fatalf("failed to stop exporter: %v", err)
    }
}()

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66061732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档