Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[chore][receiver/k8sclusterreceiver] Enable goleak check #30898

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
57358bb
[chore][receiver/k8sclusterreceiver] Enable goleak check
crobert-1 Jan 30, 2024
48db175
TEST: Check if foreground propagation will block
crobert-1 Jan 31, 2024
9a084cc
TEST: Always have propagation policy be foreground
crobert-1 Jan 31, 2024
a87c370
Attempt to block until all objects are fully deleted in test
crobert-1 Jan 31, 2024
756666d
Merge changes from main
crobert-1 Mar 25, 2024
6a446d4
Fix linting errors, skip test to check if its causing goleak
crobert-1 Mar 25, 2024
0d620bd
Use context with cancel on k8s client calls
crobert-1 Mar 25, 2024
c079580
Use proper context passed in
crobert-1 Mar 25, 2024
b8971fd
[DRAFT] Fixed leak, but lots of unnecessary code
crobert-1 Mar 26, 2024
ff9c14f
Cleanup
crobert-1 Mar 26, 2024
865f5b9
Remove unnecessary eventually block
crobert-1 Mar 26, 2024
2b6cc22
Fix lint errors, change things back to original
crobert-1 Mar 26, 2024
60c550d
make gotidy, make lint
crobert-1 Mar 26, 2024
d06885d
reset go mods
crobert-1 Mar 26, 2024
d592359
reset more go mods
crobert-1 Mar 26, 2024
5a2ef16
more reset go mods
crobert-1 Mar 26, 2024
e88f8e0
Update expected metrics to generic go client for testing
crobert-1 Mar 26, 2024
f729562
Keep context reference, cancel on shutdown
crobert-1 Mar 26, 2024
58e3c29
TEST: See if delete is causing leak
crobert-1 Mar 26, 2024
ce5d7cf
Use httpclient for other k8s client as well, uncomment delete
crobert-1 Mar 27, 2024
3374f86
Debug: Use separate http client for discovery k8s client
crobert-1 Mar 27, 2024
d82c025
Remove unnecessary context cancel, use a single client for k8s testing
crobert-1 Mar 27, 2024
02a828b
Remove unused variable
crobert-1 Mar 27, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 28 additions & 5 deletions internal/k8stest/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@ package k8stest // import "github.com/open-telemetry/opentelemetry-collector-con
import (
"errors"
"fmt"
"net/http"

"k8s.io/apimachinery/pkg/util/net"
"k8s.io/client-go/discovery"
memory "k8s.io/client-go/discovery/cached"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
"k8s.io/client-go/tools/clientcmd"
)
Expand All @@ -18,10 +21,11 @@ type K8sClient struct {
DynamicClient *dynamic.DynamicClient
DiscoveryClient *discovery.DiscoveryClient
Mapper *restmapper.DeferredDiscoveryRESTMapper

httpClient *http.Client
}

func NewK8sClient(kubeconfigPath string) (*K8sClient, error) {

if kubeconfigPath == "" {
return nil, errors.New("Please provide file path to load kubeconfig")
}
Expand All @@ -30,17 +34,36 @@ func NewK8sClient(kubeconfigPath string) (*K8sClient, error) {
return nil, fmt.Errorf("unable to load kubeconfig from %s: %w", kubeconfigPath, err)
}

dynamicClient, err := dynamic.NewForConfig(restConfig)
restConfig.Proxy = net.NewProxierWithNoProxyCIDR(http.ProxyFromEnvironment)
httpClient, err := rest.HTTPClientFor(restConfig)
if err != nil {
return nil, err
}

dynamicClient, err := dynamic.NewForConfigAndClient(restConfig, httpClient)
if err != nil {
return nil, fmt.Errorf("error creating dynamic client: %w", err)
}

discoveryClient, err := discovery.NewDiscoveryClientForConfig(restConfig)
discoveryClient, err := discovery.NewDiscoveryClientForConfigAndClient(restConfig, httpClient)
if err != nil {
return nil, fmt.Errorf("error creating discovery client: %w", err)
}

mapper := restmapper.NewDeferredDiscoveryRESTMapper(memory.NewMemCacheClient(discoveryClient))
return &K8sClient{
DynamicClient: dynamicClient, DiscoveryClient: discoveryClient, Mapper: mapper}, nil

k8sClient := &K8sClient{
DynamicClient: dynamicClient,
DiscoveryClient: discoveryClient,
Mapper: mapper,
httpClient: httpClient,
}

return k8sClient, nil
}

func (k *K8sClient) Shutdown() {
if k.httpClient != nil {
net.CloseIdleConnectionsFor(k.httpClient.Transport)
}
}
11 changes: 8 additions & 3 deletions internal/k8stest/k8s_objects.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,13 @@ func DeleteObject(client *K8sClient, obj *unstructured.Unstructured) error {
// cluster-scoped resources
resource = client.DynamicClient.Resource(gvr.Resource)
}

gracePeriod := int64(0)
deletePolicy := metav1.DeletePropagationForeground
return resource.Delete(context.Background(), obj.GetName(), metav1.DeleteOptions{
PropagationPolicy: &deletePolicy,
})
options := metav1.DeleteOptions{
GracePeriodSeconds: &gracePeriod,
PropagationPolicy: &deletePolicy,
}

return resource.Delete(context.Background(), obj.GetName(), options)
}
1 change: 1 addition & 0 deletions receiver/k8sclusterreceiver/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ func TestE2E(t *testing.T) {

k8sClient, err := k8stest.NewK8sClient(testKubeConfig)
require.NoError(t, err)
defer func() { k8sClient.Shutdown() }()

metricsConsumer := new(consumertest.MetricsSink)
shutdownSink := startUpSink(t, metricsConsumer)
Expand Down
2 changes: 2 additions & 0 deletions receiver/k8sclusterreceiver/factory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,15 @@ func TestFactoryDistributions(t *testing.T) {
err := r.Start(context.Background(), componenttest.NewNopHost())
require.NoError(t, err)
require.Nil(t, r.resourceWatcher.osQuotaClient)
assert.NoError(t, r.Shutdown(context.Background()))

// openshift
rCfg.Distribution = "openshift"
r = newTestReceiver(t, rCfg)
err = r.Start(context.Background(), componenttest.NewNopHost())
require.NoError(t, err)
require.NotNil(t, r.resourceWatcher.osQuotaClient)
assert.NoError(t, r.Shutdown(context.Background()))
}

func newTestReceiver(t *testing.T, cfg *Config) *kubernetesReceiver {
Expand Down
14 changes: 14 additions & 0 deletions receiver/k8sclusterreceiver/package_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package k8sclusterreceiver

import (
"testing"

"go.uber.org/goleak"
)

func TestMain(m *testing.M) {
goleak.VerifyTestMain(m)
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ resourceLogs:
values:
- key: manager
value:
stringValue: k8sobjectsreceiver.test
stringValue: Go-http-client
- key: operation
value:
stringValue: Update
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ resourceLogs:
values:
- key: manager
value:
stringValue: k8sobjectsreceiver.test
stringValue: Go-http-client
- key: operation
value:
stringValue: Update
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ resourceLogs:
values:
- key: manager
value:
stringValue: k8sobjectsreceiver.test
stringValue: Go-http-client
- key: operation
value:
stringValue: Update
Expand Down
Loading