From 73f10ed5ab21fc78e97206001b9d3f067407c8d4 Mon Sep 17 00:00:00 2001 From: Alex Unger <6905948+refs@users.noreply.github.com> Date: Fri, 3 Sep 2021 09:50:54 +0200 Subject: [PATCH] Create exporter based on agent endpoint configuration (#2029) --- changelog/unreleased/tracing-agent-config.md | 5 ++ cmd/revad/runtime/runtime.go | 2 +- pkg/trace/trace.go | 61 ++++++++++++++++++-- 3 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 changelog/unreleased/tracing-agent-config.md diff --git a/changelog/unreleased/tracing-agent-config.md b/changelog/unreleased/tracing-agent-config.md new file mode 100644 index 0000000000..12b0088f0f --- /dev/null +++ b/changelog/unreleased/tracing-agent-config.md @@ -0,0 +1,5 @@ +Enhancement: Tracing agent configuration + +Earlier we could only use the collector URL directly, but since an agent can be deployed as a sidecar process it makes much more sense to use it instead of the collector directly. + +https://github.com/cs3org/reva/pull/2029 \ No newline at end of file diff --git a/cmd/revad/runtime/runtime.go b/cmd/revad/runtime/runtime.go index bac257454b..458caf401d 100644 --- a/cmd/revad/runtime/runtime.go +++ b/cmd/revad/runtime/runtime.go @@ -149,7 +149,7 @@ func initServers(mainConf map[string]interface{}, log *zerolog.Logger) map[strin } func initTracing(conf *coreConf) { - rtrace.SetTraceProvider(conf.TracingCollector) + rtrace.SetTraceProvider(conf.TracingCollector, conf.TracingEndpoint) } func initCPUCount(conf *coreConf, log *zerolog.Logger) { diff --git a/pkg/trace/trace.go b/pkg/trace/trace.go index c610131711..bc506d9e58 100644 --- a/pkg/trace/trace.go +++ b/pkg/trace/trace.go @@ -19,6 +19,10 @@ package trace import ( + "fmt" + "net/url" + "strings" + "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" @@ -36,10 +40,35 @@ var ( ) // SetTraceProvider sets the TracerProvider at a package level. -func SetTraceProvider(url string) { - exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url))) - if err != nil { - panic(err) +func SetTraceProvider(collectorEndpoint string, agentEndpoint string) { + var exp *jaeger.Exporter + var err error + + if agentEndpoint != "" { + var agentHost string + var agentPort string + + agentHost, agentPort, err = parseAgentConfig(agentEndpoint) + if err != nil { + panic(err) + } + + exp, err = jaeger.New( + jaeger.WithAgentEndpoint( + jaeger.WithAgentHost(agentHost), + jaeger.WithAgentPort(agentPort), + ), + ) + if err != nil { + panic(err) + } + } + + if collectorEndpoint != "" { + exp, err = jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(collectorEndpoint))) + if err != nil { + panic(err) + } } Provider = sdktrace.NewTracerProvider( @@ -50,3 +79,27 @@ func SetTraceProvider(url string) { )), ) } + +func parseAgentConfig(ae string) (string, string, error) { + u, err := url.Parse(ae) + // as per url.go: + // [...] Trying to parse a hostname and path + // without a scheme is invalid but may not necessarily return an + // error, due to parsing ambiguities. + if err == nil && u.Hostname() != "" && u.Port() != "" { + return u.Hostname(), u.Port(), nil + } + + p := strings.Split(ae, ":") + if len(p) != 2 { + return "", "", fmt.Errorf(fmt.Sprintf("invalid agent endpoint `%s`. expected format: `hostname:port`", ae)) + } + + switch { + case p[0] == "" && p[1] == "": // case ae = ":" + return "", "", fmt.Errorf(fmt.Sprintf("invalid agent endpoint `%s`. expected format: `hostname:port`", ae)) + case p[0] == "": + return "", "", fmt.Errorf(fmt.Sprintf("invalid agent endpoint `%s`. expected format: `hostname:port`", ae)) + } + return p[0], p[1], nil +}