Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 7e1c63b

Browse files
committedNov 12, 2022
TEP-0124 implement opentelemetry and jaeger tracing
Adds opentelemetry instrumentation code to pipelinerun and taskrun reconcilers. Also made required changes in the main.go to include jaeger as tracing backend
1 parent 38c739a commit 7e1c63b

File tree

199 files changed

+37424
-48
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

199 files changed

+37424
-48
lines changed
 

‎cmd/controller/main.go

+79-2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ limitations under the License.
1717
package main
1818

1919
import (
20+
"context"
2021
"flag"
2122
"log"
2223
"net/http"
2324
"os"
25+
"time"
2426

2527
"github.com/tektoncd/pipeline/pkg/apis/pipeline"
2628
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
@@ -36,11 +38,23 @@ import (
3638
"knative.dev/pkg/injection"
3739
"knative.dev/pkg/injection/sharedmain"
3840
"knative.dev/pkg/signals"
41+
42+
"go.opentelemetry.io/otel"
43+
"go.opentelemetry.io/otel/exporters/jaeger"
44+
"go.opentelemetry.io/otel/propagation"
45+
"go.opentelemetry.io/otel/sdk/resource"
46+
tracesdk "go.opentelemetry.io/otel/sdk/trace"
47+
semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
48+
"go.opentelemetry.io/otel/trace"
3949
)
4050

4151
const (
4252
// ControllerLogKey is the name of the logger for the controller cmd
4353
ControllerLogKey = "tekton-pipelines-controller"
54+
// TraceProvider name for pipeline reconciler
55+
TracerProviderPipelineRun = "pipeline-reconciler"
56+
// TraceProvider name for taskrun reconciler
57+
TracerProviderTaskRun = "taskrun-reconciler"
4458
)
4559

4660
func main() {
@@ -102,17 +116,80 @@ func main() {
102116
log.Fatal(http.ListenAndServe(":"+port, mux))
103117
}()
104118

119+
// initialize opentelemetry
120+
tpPipelineRun, err := tracerProvider(TracerProviderPipelineRun)
121+
if err != nil {
122+
log.Printf("failed to initialize tracerProvider for pipelinerun, falling back to no-op provider, %s", err.Error())
123+
tpPipelineRun = trace.NewNoopTracerProvider()
124+
}
125+
tpTaskrun, err := tracerProvider(TracerProviderTaskRun)
126+
if err != nil {
127+
log.Printf("failed to initialize tracerProvider for taskrun, falling back to no-op provider, %s", err.Error())
128+
tpTaskrun = trace.NewNoopTracerProvider()
129+
}
130+
otel.SetTextMapPropagator(propagation.TraceContext{})
131+
ctx, cancel := context.WithCancel(ctx)
132+
defer cancel()
133+
105134
ctx = filteredinformerfactory.WithSelectors(ctx, v1beta1.ManagedByLabelKey)
106135
sharedmain.MainWithConfig(ctx, ControllerLogKey, cfg,
107-
taskrun.NewController(opts, clock.RealClock{}),
108-
pipelinerun.NewController(opts, clock.RealClock{}),
136+
taskrun.NewController(opts, clock.RealClock{}, tpTaskrun),
137+
pipelinerun.NewController(opts, clock.RealClock{}, tpPipelineRun),
109138
run.NewController(),
110139
resolutionrequest.NewController(clock.RealClock{}),
111140
// TODO(jerop, abayer) uncomment after we align on retries in customruns
112141
// customrun.NewController(),
113142
)
143+
144+
// Cleanly shutdown and flush telemetry when the application exits.
145+
defer func(ctx context.Context) {
146+
// Do not make the application hang when it is shutdown.
147+
ctx, cancel = context.WithTimeout(ctx, time.Second*5)
148+
defer cancel()
149+
150+
// shutdown is only needed when tracerProvider is inialized with jaeger
151+
// not needed when tracerProvider is NewNoopTracerProvider
152+
if tp, ok := tpPipelineRun.(*tracesdk.TracerProvider); ok {
153+
tp.Shutdown(ctx)
154+
}
155+
if tp, ok := tpTaskrun.(*tracesdk.TracerProvider); ok {
156+
tp.Shutdown(ctx)
157+
}
158+
}(ctx)
114159
}
115160

116161
func handler(w http.ResponseWriter, r *http.Request) {
117162
w.WriteHeader(http.StatusOK)
118163
}
164+
165+
// tracerProvider returns an OpenTelemetry TracerProvider configured to use
166+
// the Jaeger exporter that will send spans to the provided url. The returned
167+
// TracerProvider will also use a Resource configured with all the information
168+
// about the application.
169+
func tracerProvider(service string) (trace.TracerProvider, error) {
170+
// Create the Jaeger exporter
171+
// The following env variables are used by the sdk for creating the exporter
172+
// - OTEL_EXPORTER_JAEGER_ENDPOINT is the HTTP endpoint for sending spans directly to a collector.
173+
// - OTEL_EXPORTER_JAEGER_USER is the username to be sent as authentication to the collector endpoint.
174+
// - OTEL_EXPORTER_JAEGER_PASSWORD is the password to be sent as authentication to the collector endpoint.
175+
176+
if _, e := os.LookupEnv("OTEL_EXPORTER_JAEGER_ENDPOINT"); !e {
177+
// jaeger endpoint is not defined, disable tracing and return no-op tracerProvider
178+
return trace.NewNoopTracerProvider(), nil
179+
}
180+
181+
exp, err := jaeger.New(jaeger.WithCollectorEndpoint())
182+
if err != nil {
183+
return nil, err
184+
}
185+
// Initialize tracerProvider with the jaeger exporter
186+
tp := tracesdk.NewTracerProvider(
187+
tracesdk.WithBatcher(exp),
188+
// Record information about the service in a Resource.
189+
tracesdk.WithResource(resource.NewWithAttributes(
190+
semconv.SchemaURL,
191+
semconv.ServiceNameKey.String(service),
192+
)),
193+
)
194+
return tp, nil
195+
}

‎config/controller.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,13 @@ spec:
124124
value: /etc/ssl/certs
125125
- name: METRICS_DOMAIN
126126
value: tekton.dev/pipeline
127+
# The following variables can be uncommented with correct values to enable Jaeger tracing
128+
#- name: OTEL_EXPORTER_JAEGER_ENDPOINT
129+
# value: http://jaeger-collector.jaeger:14268/api/traces
130+
#- name: OTEL_EXPORTER_JAEGER_USER
131+
# value: username
132+
#- name: OTEL_EXPORTER_JAEGER_PASSWORD
133+
# value: password
127134
securityContext:
128135
allowPrivilegeEscalation: false
129136
capabilities:

0 commit comments

Comments
 (0)
Please sign in to comment.