mirror of
https://github.com/gomods/athens
synced 2026-02-03 07:30:32 +00:00
* feat: add golangci-lint linting * chore: fix linter issues * feat: add linting into the workflow * docs: update lint docs * fix: cr suggestions * fix: remove old formatting and vetting scripts * fix: add docker make target * fix: action go caching * fix: depreciated actions checkout version * fix: cr suggestion * fix: cr suggestions --------- Co-authored-by: Manu Gupta <manugupt1@gmail.com>
94 lines
3.1 KiB
Go
Executable File
94 lines
3.1 KiB
Go
Executable File
package observ
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"contrib.go.opencensus.io/exporter/jaeger"
|
|
"contrib.go.opencensus.io/exporter/stackdriver"
|
|
datadog "github.com/DataDog/opencensus-go-exporter-datadog"
|
|
"github.com/gomods/athens/pkg/errors"
|
|
"go.opencensus.io/trace"
|
|
)
|
|
|
|
// RegisterExporter determines the type of TraceExporter service for exporting traces from opencensus
|
|
// User can choose from multiple tracing services (datadog, jaegar)
|
|
// RegisterExporter returns the 'Flush' function for that particular tracing service.
|
|
func RegisterExporter(traceExporter, url, service, env string) (func(), error) {
|
|
const op errors.Op = "observ.RegisterExporter"
|
|
switch traceExporter {
|
|
case "jaeger":
|
|
return registerJaegerExporter(url, service, env)
|
|
case "datadog":
|
|
return registerDatadogExporter(url, service, env)
|
|
case "stackdriver":
|
|
return registerStackdriverExporter(url, env)
|
|
case "":
|
|
return nil, errors.E(op, "Exporter not specified. Traces won't be exported")
|
|
default:
|
|
return nil, errors.E(op, fmt.Sprintf("Exporter %s not supported. Please open PR or an issue at github.com/gomods/athens", traceExporter))
|
|
}
|
|
}
|
|
|
|
// registerJaegerExporter creates a jaeger exporter for exporting traces to opencensus.
|
|
// Currently uses the 'TraceExporter' variable in the config file.
|
|
// It should in the future have a nice sampling rate defined.
|
|
func registerJaegerExporter(url, service, env string) (func(), error) {
|
|
const op errors.Op = "observ.registerJaegarExporter"
|
|
if url == "" {
|
|
return nil, errors.E(op, "Exporter URL is empty. Traces won't be exported")
|
|
}
|
|
ex, err := jaeger.NewExporter(jaeger.Options{
|
|
Endpoint: url,
|
|
Process: jaeger.Process{
|
|
ServiceName: service,
|
|
Tags: []jaeger.Tag{
|
|
// IP Tag ensures Jaeger's clock isn't skewed.
|
|
// If/when we have traces across different servers,
|
|
// we should make this IP dynamic.
|
|
jaeger.StringTag("ip", "127.0.0.1"),
|
|
},
|
|
},
|
|
})
|
|
if err != nil {
|
|
return nil, errors.E(op, err)
|
|
}
|
|
traceRegisterExporter(ex, env)
|
|
return ex.Flush, nil
|
|
}
|
|
|
|
func traceRegisterExporter(exporter trace.Exporter, env string) {
|
|
trace.RegisterExporter(exporter)
|
|
if env == "development" {
|
|
trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})
|
|
}
|
|
}
|
|
|
|
// registerDatadogTracerExporter creates a datadog exporter.
|
|
// Currently uses the 'TraceExporter' variable in the config file.
|
|
func registerDatadogExporter(url, service, env string) (func(), error) {
|
|
ex := datadog.NewExporter(
|
|
datadog.Options{
|
|
TraceAddr: url,
|
|
Service: service,
|
|
})
|
|
traceRegisterExporter(ex, env)
|
|
return ex.Stop, nil
|
|
}
|
|
|
|
func registerStackdriverExporter(projectID, env string) (func(), error) {
|
|
const op errors.Op = "observ.registerStackdriverExporter"
|
|
ex, err := stackdriver.NewExporter(stackdriver.Options{ProjectID: projectID})
|
|
if err != nil {
|
|
return nil, errors.E(op, err)
|
|
}
|
|
traceRegisterExporter(ex, env)
|
|
return ex.Flush, nil
|
|
}
|
|
|
|
// StartSpan takes in a Context Interface and opName and starts a span. It returns the new attached ObserverContext
|
|
// and span.
|
|
func StartSpan(ctx context.Context, op string) (context.Context, *trace.Span) {
|
|
return trace.StartSpan(ctx, op)
|
|
}
|