package trace

import (
	"github.com/openzipkin/zipkin-go"
	zkHttp "github.com/openzipkin/zipkin-go/reporter/http"
	"log"
	"qteam/config"
	"sync"
)

var (
	tracer *zipkin.Tracer
	lock   sync.Mutex
)

func Tracer() (*zipkin.Tracer, error) {
	if tracer == nil {
		// 有err, 不适合用sync.Once做单例
		lock.Lock()
		defer lock.Unlock()
		if tracer == nil {
			err := InitTracer(config.GetConf().ServiceName, config.GetConf().SkyWalkingOapServer)
			if err != nil {
				return nil, err
			}
		}
	}
	return tracer, nil
}

func InitTracer(serviceName, skyWalkingOapServer string) error {
	zipkinReporter := zkHttp.NewReporter(skyWalkingOapServer)

	// create our local service endpoint
	endpoint, err := zipkin.NewEndpoint(serviceName, "192.168.110.65:8081")
	if err != nil {
		log.Fatalf("unable to create local endpoint: %+v\n", err)
	}
	sampler := zipkin.NewModuloSampler(1)
	// Initialize the tracer.
	nativeTracer, err := zipkin.NewTracer(
		zipkinReporter,
		zipkin.WithLocalEndpoint(endpoint),
		zipkin.WithSampler(sampler),
	)
	// initialize our tracer
	//nativeTracer, err := zipkin.NewTracer(zipkinReporter, zipkin.WithLocalEndpoint(endpoint))
	if err != nil {
		log.Fatalf("unable to create tracer: %+v\n", err)
	}

	// use zipkin-go-opentracing to wrap our tracer
	tracer = nativeTracer

	return err
}