...

Source file src/github.com/go-openapi/runtime/client/opentelemetry_test.go

Documentation: github.com/go-openapi/runtime/client

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  	"testing"
     7  
     8  	"github.com/go-openapi/runtime"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  	"go.opentelemetry.io/otel"
    12  	"go.opentelemetry.io/otel/attribute"
    13  	"go.opentelemetry.io/otel/codes"
    14  	"go.opentelemetry.io/otel/propagation"
    15  	tracesdk "go.opentelemetry.io/otel/sdk/trace"
    16  	"go.opentelemetry.io/otel/sdk/trace/tracetest"
    17  	"go.opentelemetry.io/otel/trace"
    18  )
    19  
    20  func Test_OpenTelemetryRuntime_submit(t *testing.T) {
    21  	t.Parallel()
    22  
    23  	exporter := tracetest.NewInMemoryExporter()
    24  
    25  	tp := tracesdk.NewTracerProvider(
    26  		tracesdk.WithSampler(tracesdk.AlwaysSample()),
    27  		tracesdk.WithSyncer(exporter),
    28  	)
    29  
    30  	otel.SetTracerProvider(tp)
    31  
    32  	tracer := tp.Tracer("go-runtime")
    33  	ctx, span := tracer.Start(context.Background(), "op")
    34  	defer span.End()
    35  
    36  	assertOpenTelemetrySubmit(t, testOperation(ctx), exporter, 1)
    37  }
    38  
    39  func Test_OpenTelemetryRuntime_submit_nilAuthInfo(t *testing.T) {
    40  	t.Parallel()
    41  
    42  	exporter := tracetest.NewInMemoryExporter()
    43  
    44  	tp := tracesdk.NewTracerProvider(
    45  		tracesdk.WithSampler(tracesdk.AlwaysSample()),
    46  		tracesdk.WithSyncer(exporter),
    47  	)
    48  
    49  	otel.SetTracerProvider(tp)
    50  
    51  	tracer := tp.Tracer("go-runtime")
    52  	ctx, span := tracer.Start(context.Background(), "op")
    53  	defer span.End()
    54  
    55  	operation := testOperation(ctx)
    56  	operation.AuthInfo = nil
    57  	assertOpenTelemetrySubmit(t, operation, exporter, 1)
    58  }
    59  
    60  func Test_OpenTelemetryRuntime_submit_nilContext(t *testing.T) {
    61  	exporter := tracetest.NewInMemoryExporter()
    62  
    63  	tp := tracesdk.NewTracerProvider(
    64  		tracesdk.WithSampler(tracesdk.AlwaysSample()),
    65  		tracesdk.WithSyncer(exporter),
    66  	)
    67  
    68  	otel.SetTracerProvider(tp)
    69  
    70  	tracer := tp.Tracer("go-runtime")
    71  	ctx, span := tracer.Start(context.Background(), "op")
    72  	defer span.End()
    73  	operation := testOperation(ctx)
    74  	operation.Context = nil
    75  
    76  	assertOpenTelemetrySubmit(t, operation, exporter, 0) // just don't panic
    77  }
    78  
    79  func Test_injectOpenTelemetrySpanContext(t *testing.T) {
    80  	t.Parallel()
    81  
    82  	exporter := tracetest.NewInMemoryExporter()
    83  
    84  	tp := tracesdk.NewTracerProvider(
    85  		tracesdk.WithSampler(tracesdk.AlwaysSample()),
    86  		tracesdk.WithSyncer(exporter),
    87  	)
    88  
    89  	otel.SetTracerProvider(tp)
    90  
    91  	tracer := tp.Tracer("go-runtime")
    92  	ctx, span := tracer.Start(context.Background(), "op")
    93  	defer span.End()
    94  	operation := testOperation(ctx)
    95  
    96  	header := map[string][]string{}
    97  	tr := newOpenTelemetryTransport(&mockRuntime{runtime.TestClientRequest{Headers: header}}, "", nil)
    98  	tr.config.Propagator = propagation.TraceContext{}
    99  	_, err := tr.Submit(operation)
   100  	require.NoError(t, err)
   101  
   102  	assert.Len(t, header, 1)
   103  }
   104  
   105  func assertOpenTelemetrySubmit(t *testing.T, operation *runtime.ClientOperation, exporter *tracetest.InMemoryExporter, expectedSpanCount int) {
   106  	header := map[string][]string{}
   107  	tr := newOpenTelemetryTransport(&mockRuntime{runtime.TestClientRequest{Headers: header}}, "remote_host", nil)
   108  
   109  	_, err := tr.Submit(operation)
   110  	require.NoError(t, err)
   111  
   112  	spans := exporter.GetSpans()
   113  	assert.Len(t, spans, expectedSpanCount)
   114  
   115  	if expectedSpanCount != 1 {
   116  		return
   117  	}
   118  
   119  	span := spans[0]
   120  	assert.Equal(t, "getCluster", span.Name)
   121  	assert.Equal(t, "go-openapi", span.InstrumentationLibrary.Name)
   122  	assert.Equal(t, codes.Error, span.Status.Code)
   123  	assert.Equal(t, []attribute.KeyValue{
   124  		attribute.String("net.peer.name", "remote_host"),
   125  		attribute.String("http.route", "/kubernetes-clusters/{cluster_id}"),
   126  		attribute.String("http.method", http.MethodGet),
   127  		attribute.String("span.kind", trace.SpanKindClient.String()),
   128  		attribute.String("http.scheme", schemeHTTPS),
   129  		// NOTE: this becomes http.response.status_code with semconv v1.21
   130  		attribute.Int("http.status_code", 490),
   131  	}, span.Attributes)
   132  }
   133  

View as plain text