Opentracing, не в состоянии вложить пролет в один и тот же след

У меня есть конечная точка "/foo" и связанный с ней http-обработчик. Когда к этой конечной точке передается запрос get, запускается другая служба grpc.

Промежуточное программное обеспечение используется:

В моем примере я использую функцию промежуточного программного обеспечения go-stdlib / nethttp, чтобы обернуть мой обработчик "/foo" для прохождения трассирующего трассировщика.

На стороне Grpc я использую метод otgrpc "otgrpc.OpenTracingClientInterceptor", чтобы передать трассировщик.

Я получаю 2 пролета на моем сервере zipkin. Один для запроса GET и один для вызова GRPC - каждый в своей собственной трассе. Я не могу вкладывать пролеты в один и тот же след. В идеале я не должен получить дублирующую трассу, а скорее одну трассу с двумя промежутками в ней. Что-то вроде этого:

test_app ================================ trace
 /foo -----------------------------------span
            grpccall -------------------- span

Но вот что я получаю:

test_app ================================ trace
/foo ------------------------------------   span

test_app
grpc-------------------------------------  span

Поделиться моим примером кода здесь. Хотя я уверен, что мне нужно запустить диапазон и запустить дочерний диапазон из родительского диапазона, я не могу сделать это в этом конкретном фрагменте ограниченного кода.

Client.go

package main

import (
    "flag"
    "github.com/opentracing-contrib/go-stdlib/nethttp"
    "log"
    "net"
    "net/http"
    "os"

    "github.com/grpc-ecosystem/grpc-opentracing/go/otgrpc"
    "google.golang.org/grpc"
    pb "google.golang.org/grpc/examples/helloworld/helloworld"

    "/test_zipkin/internal/server"
    opentracing "github.com/opentracing/opentracing-go"
    zipkintracer "github.com/openzipkin/zipkin-go-opentracing"
)

var (
    zipkinURL  = "http://localhost:9411/api/v1/spans"
    serverPort = flag.String("port", "8000", "server port")
)

const (
    address         = "localhost:50051"
    defaultName     = "world"
    spansAPI        = "http://localhost:9411/api/v1/spans"
    serviceHostPort = "localhost:8000"
    serviceAddress  = "0.0.0.0:50051"
    serviceName     = "test_app"
)

func main() {

    logger1 := log.New(os.Stdout, log.Prefix(), log.Flags())
    var tracer opentracing.Tracer
    logger := zipkintracer.LogWrapper(logger1)

    collector, err := zipkintracer.NewHTTPCollector(
        spansAPI,
        zipkintracer.HTTPLogger(logger),
    )
    if err != nil {
        logger.Log("err", err)
        os.Exit(-1)
    }
    defer collector.Close()
    debug := true
    recorder := zipkintracer.NewRecorder(collector, debug, serviceAddress, serviceName)
    tracer, err = zipkintracer.NewTracer(
        recorder,
        zipkintracer.TraceID128Bit(true),
    )
    opentracing.InitGlobalTracer(tracer)

    if err != nil {
        logger.Log("err", err)
        os.Exit(-1)
    }

  //GRPC connection set up
    conn, err := grpc.Dial(address, grpc.WithInsecure(),
        grpc.WithUnaryInterceptor(
            otgrpc.OpenTracingClientInterceptor(tracer)),
    )
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    GreeterCLient := pb.NewGreeterClient(conn)
    w := server.New(GreeterCLient)

    httpMux := http.NewServeMux()
    foo := w

  //handler for foo endpoint
    {
        httpMux.Handle("/foo", nethttp.Middleware(tracer, foo))
    }

    s := &http.Server{
        Handler: httpMux,
        Addr:    *serverPort,
    }

    ln, err := net.Listen("tcp", "0.0.0.0:8089")

    if err != nil {
        log.Fatalf("Cannot initialize HTTP transport: %v", err)
    }
    s.Serve(ln)

}

Server.go:

package server

import (
    "fmt"
    "log"
    "net/http"
    "os"
    "time"

    "golang.org/x/net/context"
    "google.golang.org/grpc/examples/helloworld/helloworld"
)

type foo struct {
    GreeterClient helloworld.GreeterClient
}

const (
    defaultName = "foo"
)

func New(GreeterClient helloworld.GreeterClient) http.Handler {
    return &foo{
        GreeterClient: GreeterClient,
    }
}

func (f *foo) ServeHTTP(w http.ResponseWriter, req *http.Request) {

    fmt.Fprintf(w, "foo endpoint was called ... next making grpc call")

    // Contact the server and print out its response.
    name := defaultName
    if len(os.Args) > 1 {
        name = os.Args[1]
    }

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := f.GreeterClient.SayHello(ctx, &helloworld.HelloRequest{Name: name})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.Message)
}

0 ответов

Другие вопросы по тегам