diff --git a/pkg/kubelet/cri/remote/remote_runtime_test.go b/pkg/kubelet/cri/remote/remote_runtime_test.go index 1407a4bc9b9..cfe4aadbfd9 100644 --- a/pkg/kubelet/cri/remote/remote_runtime_test.go +++ b/pkg/kubelet/cri/remote/remote_runtime_test.go @@ -17,16 +17,23 @@ limitations under the License. package remote import ( + "context" "os" "testing" "time" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "go.opentelemetry.io/otel/sdk/trace/tracetest" oteltrace "go.opentelemetry.io/otel/trace" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" internalapi "k8s.io/cri-api/pkg/apis" + //kubeapi "k8s.io/cri-api/pkg/apis/runtime/v1" apitest "k8s.io/cri-api/pkg/apis/testing" + "k8s.io/kubernetes/pkg/features" fakeremote "k8s.io/kubernetes/pkg/kubelet/cri/remote/fake" "k8s.io/kubernetes/pkg/kubelet/util" ) @@ -50,11 +57,44 @@ func createAndStartFakeRemoteRuntime(t *testing.T) (*fakeremote.RemoteRuntime, s func createRemoteRuntimeService(endpoint string, t *testing.T) internalapi.RuntimeService { runtimeService, err := NewRemoteRuntimeService(endpoint, defaultConnectionTimeout, oteltrace.NewNoopTracerProvider()) + require.NoError(t, err) return runtimeService } +func createRemoteRuntimeServiceWithTracerProvider(endpoint string, tp oteltrace.TracerProvider, t *testing.T) internalapi.RuntimeService { + runtimeService, err := NewRemoteRuntimeService(endpoint, defaultConnectionTimeout, tp) + require.NoError(t, err) + + return runtimeService +} + +func TestGetSpans(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.KubeletTracing, true)() + fakeRuntime, endpoint := createAndStartFakeRemoteRuntime(t) + defer func() { + fakeRuntime.Stop() + // clear endpoint file + if addr, _, err := util.GetAddressAndDialer(endpoint); err == nil { + if _, err := os.Stat(addr); err == nil { + os.Remove(addr) + } + } + }() + exp := tracetest.NewInMemoryExporter() + tp := sdktrace.NewTracerProvider( + sdktrace.WithBatcher(exp), + ) + ctx := context.Background() + rtSvc := createRemoteRuntimeServiceWithTracerProvider(endpoint, tp, t) + _, err := rtSvc.Version(apitest.FakeVersion) + require.NoError(t, err) + err = tp.ForceFlush(ctx) + require.NoError(t, err) + assert.NotEmpty(t, exp.GetSpans()) +} + func TestVersion(t *testing.T) { fakeRuntime, endpoint := createAndStartFakeRemoteRuntime(t) defer func() { @@ -67,8 +107,8 @@ func TestVersion(t *testing.T) { } }() - r := createRemoteRuntimeService(endpoint, t) - version, err := r.Version(apitest.FakeVersion) + rtSvc := createRemoteRuntimeService(endpoint, t) + version, err := rtSvc.Version(apitest.FakeVersion) require.NoError(t, err) assert.Equal(t, apitest.FakeVersion, version.Version) assert.Equal(t, apitest.FakeRuntimeName, version.RuntimeName) diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/tracetest/test.go b/vendor/go.opentelemetry.io/otel/sdk/trace/tracetest/test.go new file mode 100644 index 00000000000..ad1d2f226f3 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/tracetest/test.go @@ -0,0 +1,85 @@ +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package tracetest is a testing helper package for the SDK. User can +// configure no-op or in-memory exporters to verify different SDK behaviors or +// custom instrumentation. +package tracetest // import "go.opentelemetry.io/otel/sdk/trace/tracetest" + +import ( + "context" + "sync" + + "go.opentelemetry.io/otel/sdk/trace" +) + +var _ trace.SpanExporter = (*NoopExporter)(nil) + +// NewNoopExporter returns a new no-op exporter. +func NewNoopExporter() *NoopExporter { + return new(NoopExporter) +} + +// NoopExporter is an exporter that drops all received SpanSnapshots and +// performs no action. +type NoopExporter struct{} + +// ExportSpans handles export of SpanSnapshots by dropping them. +func (nsb *NoopExporter) ExportSpans(context.Context, []*trace.SpanSnapshot) error { return nil } + +// Shutdown stops the exporter by doing nothing. +func (nsb *NoopExporter) Shutdown(context.Context) error { return nil } + +var _ trace.SpanExporter = (*InMemoryExporter)(nil) + +// NewInMemoryExporter returns a new InMemoryExporter. +func NewInMemoryExporter() *InMemoryExporter { + return new(InMemoryExporter) +} + +// InMemoryExporter is an exporter that stores all received spans in-memory. +type InMemoryExporter struct { + mu sync.Mutex + ss []*trace.SpanSnapshot +} + +// ExportSpans handles export of SpanSnapshots by storing them in memory. +func (imsb *InMemoryExporter) ExportSpans(_ context.Context, ss []*trace.SpanSnapshot) error { + imsb.mu.Lock() + defer imsb.mu.Unlock() + imsb.ss = append(imsb.ss, ss...) + return nil +} + +// Shutdown stops the exporter by clearing SpanSnapshots held in memory. +func (imsb *InMemoryExporter) Shutdown(context.Context) error { + imsb.Reset() + return nil +} + +// Reset the current in-memory storage. +func (imsb *InMemoryExporter) Reset() { + imsb.mu.Lock() + defer imsb.mu.Unlock() + imsb.ss = nil +} + +// GetSpans returns the current in-memory stored spans. +func (imsb *InMemoryExporter) GetSpans() []*trace.SpanSnapshot { + imsb.mu.Lock() + defer imsb.mu.Unlock() + ret := make([]*trace.SpanSnapshot, len(imsb.ss)) + copy(ret, imsb.ss) + return ret +} diff --git a/vendor/modules.txt b/vendor/modules.txt index bf12a56809f..9025a6c988d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -998,6 +998,7 @@ go.opentelemetry.io/otel/sdk/instrumentation go.opentelemetry.io/otel/sdk/internal go.opentelemetry.io/otel/sdk/resource go.opentelemetry.io/otel/sdk/trace +go.opentelemetry.io/otel/sdk/trace/tracetest # go.opentelemetry.io/otel/sdk/export/metric v0.20.0 => go.opentelemetry.io/otel/sdk/export/metric v0.20.0 ## explicit; go 1.14 go.opentelemetry.io/otel/sdk/export/metric