Skip to content

Commit

Permalink
fix: traces (#36)
Browse files Browse the repository at this point in the history
* fix: trace exporter

* doc: document OTEL_CONSOLE_EXPORTER

* fix: handle trace init error

* build: tidy
  • Loading branch information
raffis authored Feb 10, 2023
1 parent 5b76eb8 commit be1c4cb
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 34 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ Available env variables:
| `CONCURRENT` | The number of concurrent reconcile workers. | `4` |
| `ASSETS_PATH` | The directory where to look for keycloak-config-cli | `/assets` |
| `OTEL_EXPORTER_OTLP_ENDPOINT` | The gRPC opentelemtry-collector endpoint uri | `` |
| `OTEL_CONSOLE_EXPORTER` | By setting this to `true` the traces are also exported to stdout | ``` |

**Note:** The proxy implements opentelemetry tracing, see [further possible env](https://opentelemetry.io/docs/reference/specification/sdk-environment-variables/) variables to configure it.

Expand Down
35 changes: 1 addition & 34 deletions controllers/keycloakrealm_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,7 @@ import (

"github.com/go-logr/logr"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/contrib/propagators/b3"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/sdk/resource"
"go.opentelemetry.io/otel/sdk/trace"
oteltrace "go.opentelemetry.io/otel/trace"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -376,40 +370,13 @@ func (r *KeycloakRealmReconciler) reconcile(ctx context.Context, realm infrav1be
}

func createProxy(realm infrav1beta1.KeycloakRealm, logger logr.Logger, failedRequests chan infrav1beta1.RequestStatus) (net.Listener, error) {
resources, err := resource.New(context.Background(),
resource.WithFromEnv(),
resource.WithProcess(),
)
if err != nil {
return nil, fmt.Errorf("failed creating otlp trace resources: %w", err)
}

client := otlptracegrpc.NewClient()
exporter, err := otlptrace.New(context.Background(), client)
if err != nil {
return nil, fmt.Errorf("failed creating otlp trace exporter: %w", err)
}

tp := trace.NewTracerProvider(
trace.WithBatcher(exporter),
trace.WithResource(resources),
)

otel.SetTextMapPropagator(b3.New())
defer func() {
if err := tp.Shutdown(context.Background()); err != nil {
logger.Error(err, "failed to shutdown trace provider")
}
}()

otel.SetTracerProvider(tp)

target, err := url.Parse(realm.Spec.Address)
if err != nil {
return nil, err
}

proxy := proxy{
realm: realm,
failedRequests: failedRequests,
scheme: target.Scheme,
host: target.Host,
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
go.opentelemetry.io/otel v1.13.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.13.0
go.opentelemetry.io/otel/sdk v1.13.0
go.opentelemetry.io/otel/trace v1.13.0
k8s.io/api v0.26.1
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0 h1:Any/nVxaoMq1T2w0W85
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.13.0/go.mod h1:46vAP6RWfNn7EKov73l5KBFlNxz8kYlxR1woU+bJ4ZY=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0 h1:Wz7UQn7/eIqZVDJbuNEM6PmqeA71cWXrWcXekP5HZgU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.13.0/go.mod h1:OhH1xvgA5jZW2M/S4PcvtDlFE1VULRRBsibBrKuJQGI=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.13.0 h1:rs3xmoGZsuHJxUUzX2dwYNDc7S0L68oEo2L/MvG5cyc=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.13.0/go.mod h1:gr0y6t58jZxp9WtIAGKXxXenDWC91hmZivlGoOag3+4=
go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs=
go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A=
go.opentelemetry.io/otel/sdk v1.13.0 h1:BHib5g8MvdqS65yo2vV1s6Le42Hm6rrw08qU6yz5JaM=
Expand Down
61 changes: 61 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,21 @@ limitations under the License.
package main

import (
"context"
"flag"
"fmt"
"os"
"strings"

"github.com/spf13/pflag"
"github.com/spf13/viper"
"go.opentelemetry.io/contrib/propagators/b3"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
"go.opentelemetry.io/otel/sdk/resource"
"go.opentelemetry.io/otel/sdk/trace"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
Expand Down Expand Up @@ -142,9 +151,61 @@ func main() {

// +kubebuilder:scaffold:builder

tp, err := createOtelProvider()
defer func() {
if err := tp.Shutdown(context.Background()); err != nil {
setupLog.Error(err, "failed to shutdown trace provider")
}
}()

if err != nil {
setupLog.Error(err, "failed to setup trace provider")
}

setupLog.Info("starting manager")
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
setupLog.Error(err, "problem running manager")
os.Exit(1)
}
}

func createOtelProvider() (*trace.TracerProvider, error) {
resources, err := resource.New(context.Background(),
resource.WithFromEnv(),
resource.WithProcess(),
)
if err != nil {
return nil, fmt.Errorf("failed creating otlp trace resources: %w", err)
}

client := otlptracegrpc.NewClient()
exporter, err := otlptrace.New(context.Background(), client)
if err != nil {
return nil, fmt.Errorf("failed creating otlp trace exporter: %w", err)
}

opts := []trace.TracerProviderOption{
trace.WithBatcher(exporter),
trace.WithResource(resources),
}

if os.Getenv("OTEL_CONSOLE_EXPORTER") == "true" {
stdoutExporter, err := stdouttrace.New(
stdouttrace.WithWriter(os.Stdout),
stdouttrace.WithPrettyPrint(),
stdouttrace.WithoutTimestamps(),
)

if err != nil {
return nil, err
}

opts = append(opts, trace.WithBatcher(stdoutExporter))
}

tp := trace.NewTracerProvider(opts...)

otel.SetTextMapPropagator(b3.New())
otel.SetTracerProvider(tp)
return tp, nil
}

0 comments on commit be1c4cb

Please sign in to comment.