@@ -14,6 +14,7 @@ import (
1414 "go.opentelemetry.io/otel"
1515 "go.opentelemetry.io/otel/attribute"
1616 "go.opentelemetry.io/otel/metric"
17+ "go.opentelemetry.io/otel/codes"
1718 "go.opentelemetry.io/otel/propagation"
1819 "go.opentelemetry.io/otel/semconv/v1.39.0/httpconv"
1920 "go.opentelemetry.io/otel/trace"
@@ -24,6 +25,8 @@ import (
2425 sdkmetric "go.opentelemetry.io/otel/sdk/metric"
2526 "go.opentelemetry.io/otel/sdk/metric/metricdata"
2627 "go.opentelemetry.io/otel/sdk/metric/metricdata/metricdatatest"
28+ sdktrace "go.opentelemetry.io/otel/sdk/trace"
29+ "go.opentelemetry.io/otel/sdk/trace/tracetest"
2730)
2831
2932func TestGetSpanNotInstrumented (t * testing.T ) {
@@ -446,6 +449,50 @@ func TestNewMiddlewareWithConfig_Metric(t *testing.T) {
446449 }, sm .Metrics [0 ], metricdatatest .IgnoreTimestamp (), metricdatatest .IgnoreValue (), metricdatatest .IgnoreExemplars ())
447450}
448451
452+ func TestSpanStatusOnHTTP500 (t * testing.T ) {
453+ tests := []struct {
454+ name string
455+ handler echo.HandlerFunc
456+ }{
457+ {
458+ name : "handler writes 500 status code directly" ,
459+ handler : func (c * echo.Context ) error {
460+ return c .String (http .StatusInternalServerError , "internal server error" )
461+ },
462+ },
463+ {
464+ name : "handler returns echo HTTP error with 500" ,
465+ handler : func (c * echo.Context ) error {
466+ return echo .NewHTTPError (http .StatusInternalServerError , "internal server error" )
467+ },
468+ },
469+ }
470+
471+ for _ , tt := range tests {
472+ t .Run (tt .name , func (t * testing.T ) {
473+ exporter := tracetest .NewInMemoryExporter ()
474+ tp := sdktrace .NewTracerProvider (sdktrace .WithSyncer (exporter ))
475+
476+ e := echo .New ()
477+ e .Use (NewMiddlewareWithConfig (Config {
478+ ServerName : "foobar" ,
479+ TracerProvider : tp ,
480+ }))
481+ e .GET ("/error" , tt .handler )
482+
483+ r := httptest .NewRequest (http .MethodGet , "/error" , http .NoBody )
484+ w := httptest .NewRecorder ()
485+ e .ServeHTTP (w , r )
486+
487+ assert .Equal (t , http .StatusInternalServerError , w .Result ().StatusCode )
488+
489+ spans := exporter .GetSpans ()
490+ assert .Len (t , spans , 1 )
491+ assert .Equal (t , codes .Error , spans [0 ].Status .Code )
492+ })
493+ }
494+ }
495+
449496func TestConfig_OnNextError (t * testing.T ) {
450497 tests := []struct {
451498 name string
0 commit comments