Skip to content

Commit

Permalink
k8sclusterreceiver: Remove redundant intermediary options struct (#817)
Browse files Browse the repository at this point in the history
* k8sclusterreceiver: Remove redundant intermediary options struct

* Improve coverage
  • Loading branch information
asuresh4 committed Aug 28, 2020
1 parent 474f09b commit 4db9452
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 52 deletions.
15 changes: 2 additions & 13 deletions receiver/k8sclusterreceiver/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,20 +41,9 @@ type Config struct {
makeClient func(apiConf k8sconfig.APIConfig) (k8s.Interface, error)
}

func (cfg *Config) getReceiverOptions() (*receiverOptions, error) {
func (cfg *Config) getK8sClient() (k8s.Interface, error) {
if cfg.makeClient == nil {
cfg.makeClient = k8sconfig.MakeClient
}
client, err := cfg.makeClient(cfg.APIConfig)
if err != nil {
return nil, err
}

return &receiverOptions{
name: cfg.Name(),
client: client,
collectionInterval: cfg.CollectionInterval,
nodeConditionTypesToReport: cfg.NodeConditionTypesToReport,
metadataExporters: cfg.MetadataExporters,
}, nil
return cfg.makeClient(cfg.APIConfig)
}
13 changes: 2 additions & 11 deletions receiver/k8sclusterreceiver/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"go.opentelemetry.io/collector/config/configmodels"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/receiver/receiverhelper"
"k8s.io/client-go/kubernetes"

"github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/k8sconfig"
)
Expand All @@ -37,14 +36,6 @@ const (

var defaultNodeConditionsToReport = []string{"Ready"}

type receiverOptions struct {
name string
client kubernetes.Interface
collectionInterval time.Duration
nodeConditionTypesToReport []string
metadataExporters []string
}

func createDefaultConfig() configmodels.Receiver {
return &Config{
ReceiverSettings: configmodels.ReceiverSettings{
Expand All @@ -64,11 +55,11 @@ func createMetricsReceiver(
consumer consumer.MetricsConsumer) (component.MetricsReceiver, error) {
rCfg := cfg.(*Config)

rOptions, err := rCfg.getReceiverOptions()
k8sClient, err := rCfg.getK8sClient()
if err != nil {
return nil, err
}
return newReceiver(params.Logger, rOptions, consumer)
return newReceiver(params.Logger, rCfg, consumer, k8sClient)
}

// NewFactory creates a factory for k8s_cluster receiver.
Expand Down
32 changes: 31 additions & 1 deletion receiver/k8sclusterreceiver/factory_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/configmodels"
"go.opentelemetry.io/collector/exporter/exportertest"
"go.uber.org/zap"
"k8s.io/client-go/kubernetes"

"github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/k8sconfig"
Expand Down Expand Up @@ -67,9 +68,38 @@ func TestFactory(t *testing.T) {
return nil, nil
}
r, err = f.CreateMetricsReceiver(
context.Background(), component.ReceiverCreateParams{},
context.Background(), component.ReceiverCreateParams{Logger: zap.NewNop()},
rCfg, &exportertest.SinkMetricsExporter{},
)
require.NoError(t, err)
require.NotNil(t, r)

// Test metadata exporters setup.
rCfg.MetadataExporters = []string{"exampleexporter/withoutmetadata"}
require.Error(t, r.Start(context.Background(), nopHostWithExporters{}))
}

// nopHostWithExporters mocks a receiver.ReceiverHost for test purposes.
type nopHostWithExporters struct {
}

var _ component.Host = (*nopHostWithExporters)(nil)

func (n nopHostWithExporters) ReportFatalError(error) {
}

func (n nopHostWithExporters) GetFactory(component.Kind, configmodels.Type) component.Factory {
return nil
}

func (n nopHostWithExporters) GetExtensions() map[configmodels.Extension]component.ServiceExtension {
return nil
}

func (n nopHostWithExporters) GetExporters() map[configmodels.DataType]map[configmodels.Exporter]component.Exporter {
return map[configmodels.DataType]map[configmodels.Exporter]component.Exporter{
configmodels.MetricsDataType: {
mockExporterConfig{ExporterName: "exampleexporter/withoutmetadata"}: MockExporter{},
},
}
}
10 changes: 10 additions & 0 deletions receiver/k8sclusterreceiver/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n
github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk=
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM=
Expand Down Expand Up @@ -209,6 +210,7 @@ github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTD
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg=
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
Expand Down Expand Up @@ -354,6 +356,7 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
Expand Down Expand Up @@ -389,6 +392,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
Expand Down Expand Up @@ -465,6 +469,7 @@ github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
Expand Down Expand Up @@ -513,6 +518,7 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
Expand Down Expand Up @@ -1315,11 +1321,13 @@ k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6 h1:Oh3Mzx5pJ+yIumsAD0MOECPVeXsVot0UkiaCGVyfGQY=
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
k8s.io/utils v0.0.0-20200414100711-2df71ebbae66/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
k8s.io/utils v0.0.0-20200724153422-f32512634ab7 h1:bYyloM4UeWug24euLZfEH7muFQoqvFj9h/pxAnOZLt4=
k8s.io/utils v0.0.0-20200724153422-f32512634ab7/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f h1:gi7cb8HTDZ6q8VqsUpkdoFi3vxwHMneQ6+Q5Ap5hjPE=
mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w=
Expand All @@ -1331,8 +1339,10 @@ rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
21 changes: 9 additions & 12 deletions receiver/k8sclusterreceiver/receiver.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"go.opentelemetry.io/collector/consumer/pdatautil"
"go.opentelemetry.io/collector/obsreport"
"go.uber.org/zap"
"k8s.io/client-go/kubernetes"
)

const (
Expand All @@ -35,26 +36,26 @@ var _ component.MetricsReceiver = (*kubernetesReceiver)(nil)
type kubernetesReceiver struct {
resourceWatcher *resourceWatcher

options *receiverOptions
config *Config
logger *zap.Logger
consumer consumer.MetricsConsumer
cancel context.CancelFunc
}

func (kr *kubernetesReceiver) Start(ctx context.Context, host component.Host) error {
var c context.Context
c, kr.cancel = context.WithCancel(obsreport.ReceiverContext(ctx, typeStr, transport, kr.options.name))
c, kr.cancel = context.WithCancel(obsreport.ReceiverContext(ctx, typeStr, transport, kr.config.Name()))

exporters := host.GetExporters()
if err := kr.resourceWatcher.setupMetadataExporters(
exporters[configmodels.MetricsDataType], kr.options.metadataExporters); err != nil {
exporters[configmodels.MetricsDataType], kr.config.MetadataExporters); err != nil {
return err
}

go func() {
kr.resourceWatcher.startWatchingResources(c.Done())

ticker := time.NewTicker(kr.options.collectionInterval)
ticker := time.NewTicker(kr.config.CollectionInterval)
defer ticker.Stop()

for {
Expand Down Expand Up @@ -90,18 +91,14 @@ func (kr *kubernetesReceiver) dispatchMetrics(ctx context.Context) {

// newReceiver creates the Kubernetes cluster receiver with the given configuration.
func newReceiver(
logger *zap.Logger, rOptions *receiverOptions,
consumer consumer.MetricsConsumer) (component.MetricsReceiver, error) {

resourceWatcher, err := newResourceWatcher(logger, rOptions)
if err != nil {
return nil, err
}
logger *zap.Logger, config *Config, consumer consumer.MetricsConsumer,
client kubernetes.Interface) (component.MetricsReceiver, error) {
resourceWatcher := newResourceWatcher(logger, client, config.NodeConditionTypesToReport)

return &kubernetesReceiver{
resourceWatcher: resourceWatcher,
logger: logger,
options: rOptions,
config: config,
consumer: consumer,
}, nil
}
16 changes: 5 additions & 11 deletions receiver/k8sclusterreceiver/receiver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,24 +99,18 @@ func setupReceiver(
consumer consumer.MetricsConsumer) (*kubernetesReceiver, error) {

logger := zap.NewNop()
rOptions := &receiverOptions{
collectionInterval: 1 * time.Second,
nodeConditionTypesToReport: []string{"Ready"},
client: client,
}

rw, err := newResourceWatcher(logger, rOptions)

if err != nil {
return nil, err
config := &Config{
CollectionInterval: 1 * time.Second,
NodeConditionTypesToReport: []string{"Ready"},
}

rw := newResourceWatcher(logger, client, config.NodeConditionTypesToReport)
rw.dataCollector.SetupMetadataStore(&corev1.Service{}, &testutils.MockStore{})

return &kubernetesReceiver{
resourceWatcher: rw,
logger: logger,
options: rOptions,
config: config,
consumer: consumer,
}, nil
}
10 changes: 6 additions & 4 deletions receiver/k8sclusterreceiver/watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,18 @@ type resourceWatcher struct {
type metadataConsumer func(metadata []*collection.KubernetesMetadataUpdate) error

// newResourceWatcher creates a Kubernetes resource watcher.
func newResourceWatcher(logger *zap.Logger, rOptions *receiverOptions) (*resourceWatcher, error) {
func newResourceWatcher(
logger *zap.Logger, client kubernetes.Interface,
nodeConditionTypesToReport []string) *resourceWatcher {
rw := &resourceWatcher{
client: rOptions.client,
client: client,
logger: logger,
dataCollector: collection.NewDataCollector(logger, rOptions.nodeConditionTypesToReport),
dataCollector: collection.NewDataCollector(logger, nodeConditionTypesToReport),
}

rw.prepareSharedInformerFactory()

return rw, nil
return rw
}

func (rw *resourceWatcher) prepareSharedInformerFactory() {
Expand Down

0 comments on commit 4db9452

Please sign in to comment.