Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[tracing] support grpc protocol endpoint #7721

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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