Skip to content

Commit

Permalink
[tracing] support grpc protocol endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
tishen committed Mar 4, 2024
1 parent a9d8a9b commit 73b28fa
Show file tree
Hide file tree
Showing 55 changed files with 6,613 additions and 84 deletions.
2 changes: 1 addition & 1 deletion docs/developers/tracing.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,5 @@ Check the official [Jaeger docs](https://www.jaegertracing.io/docs/) on how to w
The configmap `config/config-tracing.yaml` contains the configuration for tracing. It contains the following fields:

* enabled: Set this to true to enable tracing
* endpoint: API endpoint for jaeger collector to send the traces. By default the endpoint is configured to be `http://jaeger-collector.jaeger.svc.cluster.local:14268/api/traces`.
* endpoint: API endpoint for jaeger collector to send the traces. By default the endpoint is configured to be `http://jaeger-collector.jaeger.svc.cluster.local:14268/api/traces`. It also support gRPC protocal endpoint, for example: `grpc://otlp-collector:4318`
* credentialsSecret: Name of the secret which contains `username` and `password` to authenticate against the endpoint
8 changes: 7 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ require (
github.com/sigstore/sigstore/pkg/signature/kms/hashivault v1.8.1
go.opentelemetry.io/otel v1.24.0
go.opentelemetry.io/otel/exporters/jaeger v1.17.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0
go.opentelemetry.io/otel/sdk v1.24.0
go.opentelemetry.io/otel/trace v1.24.0
k8s.io/utils v0.0.0-20230726121419-3b25d923346b
Expand Down Expand Up @@ -92,6 +94,7 @@ require (
github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.6 // indirect
github.com/cenkalti/backoff/v3 v3.2.2 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/cloudflare/circl v1.3.3 // indirect
github.com/containerd/log v0.1.0 // indirect
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
Expand All @@ -107,7 +110,7 @@ require (
github.com/google/s2a-go v0.1.7 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
github.com/googleapis/gax-go/v2 v2.12.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.2 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
Expand All @@ -134,6 +137,7 @@ require (
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/proto/otlp v1.1.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect
gopkg.in/go-jose/go-jose.v2 v2.6.1 // indirect
Expand Down Expand Up @@ -251,3 +255,5 @@ require (
)

replace github.com/ahmetb/gen-crd-api-reference-docs => github.com/tektoncd/ahmetb-gen-crd-api-reference-docs v0.3.1-0.20220729140133-6ce2d5aafcb4 // Waiting for https://github.com/ahmetb/gen-crd-api-reference-docs/pull/43/files to merge

replace github.com/docker/distribution => github.com/docker/distribution v2.7.1+incompatible
58 changes: 11 additions & 47 deletions go.sum

Large diffs are not rendered by default.

53 changes: 51 additions & 2 deletions pkg/tracing/tracing.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,14 @@ package tracing

import (
"context"
"net/url"
"strings"

"github.com/tektoncd/pipeline/pkg/apis/config"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
Expand Down Expand Up @@ -132,7 +136,23 @@ func (t *tracerProvider) OnSecret(secret *corev1.Secret) {
}

func (t *tracerProvider) reinitialize() {
tp, err := createTracerProvider(t.service, t.cfg, t.username, t.password)
// check the scheme and port of the endpoint before we initialize the tracer provider
endpoint := t.cfg.Endpoint
if !strings.Contains(endpoint, "://") {
// add placeholder scheme if the original ep doesn't have it so it can parsed correctly
endpoint = "placeholder://" + endpoint
}
u, err := url.Parse(endpoint)
if err != nil {
t.logger.Errorf("failed to parse the endpoint URL: %v", err.Error())
return
}
var tp trace.TracerProvider
if u.Scheme == "grpc" || u.Port() == "4317" {
tp, err = creategRPCTracerProvider(t.service, t.cfg)
} else {
tp, err = createHTTPTracerProvider(t.service, t.cfg, t.username, t.password)
}
if err != nil {
t.logger.Errorf("unable to initialize tracing with error : %v", err.Error())
return
Expand All @@ -146,7 +166,7 @@ func (t *tracerProvider) reinitialize() {
t.provider = tp
}

func createTracerProvider(service string, cfg *config.Tracing, user, pass string) (trace.TracerProvider, error) {
func createHTTPTracerProvider(service string, cfg *config.Tracing, user, pass string) (trace.TracerProvider, error) {
if !cfg.Enabled {
return noop.NewTracerProvider(), nil
}
Expand All @@ -170,3 +190,32 @@ func createTracerProvider(service string, cfg *config.Tracing, user, pass string
)
return tp, nil
}

func creategRPCTracerProvider(service string, cfg *config.Tracing) (trace.TracerProvider, error) {
if !cfg.Enabled {
return noop.NewTracerProvider(), nil
}

ctx := context.Background()
exp, err := otlptrace.New(ctx,
otlptracegrpc.NewClient(
otlptracegrpc.WithEndpoint(cfg.Endpoint),
otlptracegrpc.WithInsecure(),
// TODO: support TLS cert verification
// otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, "")),
),
)
if err != nil {
return nil, err
}
// Initialize tracerProvider with the otlptrace exporter
tp := tracesdk.NewTracerProvider(
tracesdk.WithBatcher(exp),
// Record information about the service in a Resource.
tracesdk.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(service),
)),
)
return tp, nil
}
25 changes: 25 additions & 0 deletions pkg/tracing/tracing_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,3 +239,28 @@ func TestHandlerSecretUpdate(t *testing.T) {
t.Errorf("Tracing provider is not updated when secret is updated")
}
}

func TestGRPCTracerProviderInitialization(t *testing.T) {
// Setup test logging
logger := zap.NewNop().Sugar()

// Create a new tracerProvider instance
tp := New("test-service", logger)

// Setup the tracing config to enable gRPC tracing
cfg := &config.Tracing{
Enabled: true,
Endpoint: "grpc://some-grpc-endpoint:4317", // Use a sample gRPC endpoint
}

// Simulate the OnStore callback with the new gRPC tracing config
tp.OnStore(nil)("config-tracing", cfg)

// Attempt to create a tracer and start a span
tracer := tp.Tracer("tracer")
_, span := tracer.Start(context.Background(), "gRPCTest")

if !span.IsRecording() {
t.Fatalf("Span is not recording after gRPC tracing configuration")
}
}
25 changes: 25 additions & 0 deletions vendor/github.com/cenkalti/backoff/v4/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions vendor/github.com/cenkalti/backoff/v4/LICENSE

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 32 additions & 0 deletions vendor/github.com/cenkalti/backoff/v4/README.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

66 changes: 66 additions & 0 deletions vendor/github.com/cenkalti/backoff/v4/backoff.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

62 changes: 62 additions & 0 deletions vendor/github.com/cenkalti/backoff/v4/context.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 73b28fa

Please sign in to comment.