Skip to content

Commit

Permalink
Fix OpenTelemetry graceful shutdown.
Browse files Browse the repository at this point in the history
When running OPA with the distributed tracing option enabled,
the OpenTelemetry trace exporter is not gracefully shut down
when the server is stopped.

This PR fixes that issues by moving the trace exporter shutdown
in the gracefulServerShutdown function.

Fixes: open-policy-agent#6651
Signed-off-by: Nicolas Chotard <nicolas.chotard@backmarket.com>
Signed-off-by: David Wobrock <david.wobrock@backmarket.com>
  • Loading branch information
nicolaschotard authored and ashutosh-narkar committed May 8, 2024
1 parent 92d6314 commit 1092a10
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 7 deletions.
14 changes: 7 additions & 7 deletions runtime/runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -540,13 +540,6 @@ func (rt *Runtime) Serve(ctx context.Context) error {
rt.logger.WithFields(map[string]interface{}{"err": err}).Error("Failed to start OpenTelemetry trace exporter.")
return err
}

defer func() {
err := rt.traceExporter.Shutdown(ctx)
if err != nil {
rt.logger.WithFields(map[string]interface{}{"err": err}).Error("Failed to shutdown OpenTelemetry trace exporter gracefully.")
}
}()
}

rt.server = server.New().
Expand Down Expand Up @@ -863,6 +856,13 @@ func (rt *Runtime) gracefulServerShutdown(s *server.Server) error {
return err
}
rt.logger.Info("Server shutdown.")

if rt.traceExporter != nil {
err = rt.traceExporter.Shutdown(ctx)
if err != nil {
rt.logger.WithFields(map[string]interface{}{"err": err}).Error("Failed to shutdown OpenTelemetry trace exporter gracefully.")
}
}
return nil
}

Expand Down
43 changes: 43 additions & 0 deletions runtime/runtime_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1235,6 +1235,49 @@ func TestServerInitializedWithBundleRegoVersion(t *testing.T) {
}
}

func TestGracefulTracerShutdown(t *testing.T) {
fs := map[string]string{
"/config.yaml": `{"distributed_tracing": {"type": "grpc"}}`,
}

test.WithTempFS(fs, func(testDirRoot string) {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Millisecond)
defer cancel() // NOTE(sr): The timeout will have been reached by the time `done` is closed.

logger := logging.New()
stdout := bytes.NewBuffer(nil)
logger.SetOutput(stdout)
logger.SetLevel(logging.Warn)

params := NewParams()
params.ConfigFile = filepath.Join(testDirRoot, "/config.yaml")
params.Addrs = &[]string{"localhost:0"}
params.GracefulShutdownPeriod = 1
params.Logger = logger

rt, err := NewRuntime(ctx, params)
if err != nil {
t.Fatalf("Unexpected error %v", err)
}

if rt.traceExporter == nil {
t.Fatal("traceExporter should not be nil")
}

done := make(chan struct{})
go func() {
rt.StartServer(ctx)
close(done)
}()
<-done

expected := "Failed to shutdown OpenTelemetry trace exporter gracefully."
if strings.Contains(stdout.String(), expected) {
t.Fatalf("Expected no output containing: \"%v\"", expected)
}
})
}

func TestUrlPathToConfigOverride(t *testing.T) {
params := NewParams()
params.Paths = []string{"https://www.example.com/bundles/bundle.tar.gz"}
Expand Down

0 comments on commit 1092a10

Please sign in to comment.