Skip to content

Commit 97e5200

Browse files
authored
Fix kubeletstats logging and self reported metrics (#357)
* Add logging on errors in Runnable Kubeletstats receiver was missing log statements on important errors. * Fix self reported metrics * Fix obsreport calls
1 parent 5d4921e commit 97e5200

File tree

3 files changed

+100
-19
lines changed

3 files changed

+100
-19
lines changed

receiver/kubeletstatsreceiver/receiver.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type receiver struct {
3838

3939
// Creates and starts the kubelet stats runnable.
4040
func (r *receiver) Start(ctx context.Context, host component.Host) error {
41-
runnable := newRunnable(ctx, r.consumer, r.rest, r.logger)
41+
runnable := newRunnable(ctx, r.cfg.Name(), r.consumer, r.rest, r.logger)
4242

4343
cfg := r.cfg.(*Config)
4444
r.runner = interval.NewRunner(cfg.CollectionInterval, runnable)

receiver/kubeletstatsreceiver/runnable.go

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,27 @@ import (
2929
var _ interval.Runnable = (*runnable)(nil)
3030

3131
type runnable struct {
32-
ctx context.Context
33-
provider *kubelet.StatsProvider
34-
consumer consumer.MetricsConsumerOld
35-
logger *zap.Logger
36-
restClient kubelet.RestClient
32+
ctx context.Context
33+
receiverName string
34+
provider *kubelet.StatsProvider
35+
consumer consumer.MetricsConsumerOld
36+
logger *zap.Logger
37+
restClient kubelet.RestClient
3738
}
3839

3940
func newRunnable(
4041
ctx context.Context,
42+
receiverName string,
4143
consumer consumer.MetricsConsumerOld,
4244
restClient kubelet.RestClient,
4345
logger *zap.Logger,
4446
) *runnable {
4547
return &runnable{
46-
ctx: ctx,
47-
consumer: consumer,
48-
restClient: restClient,
49-
logger: logger,
48+
ctx: ctx,
49+
receiverName: receiverName,
50+
consumer: consumer,
51+
restClient: restClient,
52+
logger: logger,
5053
}
5154
}
5255

@@ -57,19 +60,24 @@ func (r *runnable) Setup() error {
5760
}
5861

5962
func (r *runnable) Run() error {
60-
const dataformat = "kubelet"
6163
const transport = "http"
62-
ctx := obsreport.StartMetricsReceiveOp(r.ctx, dataformat, transport)
6364
summary, err := r.provider.StatsSummary()
6465
if err != nil {
65-
obsreport.EndMetricsReceiveOp(ctx, dataformat, 0, 0, err)
66+
r.logger.Error("StatsSummary failed", zap.Error(err))
6667
return nil
6768
}
6869
mds := kubelet.MetricsData(summary, typeStr)
70+
ctx := obsreport.ReceiverContext(r.ctx, typeStr, transport, r.receiverName)
6971
for _, md := range mds {
70-
err = r.consumer.ConsumeMetricsData(r.ctx, *md)
71-
numTimeSeries, numPoints := obsreport.CountMetricPoints(*md)
72-
obsreport.EndMetricsReceiveOp(ctx, dataformat, numTimeSeries, numPoints, err)
72+
ctx = obsreport.StartMetricsReceiveOp(ctx, typeStr, transport)
73+
err = r.consumer.ConsumeMetricsData(ctx, *md)
74+
var numTimeSeries, numPoints int
75+
if err != nil {
76+
r.logger.Error("ConsumeMetricsData failed", zap.Error(err))
77+
} else {
78+
numTimeSeries, numPoints = obsreport.CountMetricPoints(*md)
79+
}
80+
obsreport.EndMetricsReceiveOp(ctx, typeStr, numTimeSeries, numPoints, err)
7381
}
7482
return nil
7583
}

receiver/kubeletstatsreceiver/runnable_test.go

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,25 @@ package kubeletstatsreceiver
1616

1717
import (
1818
"context"
19+
"errors"
1920
"io/ioutil"
2021
"testing"
2122

2223
"github.com/stretchr/testify/require"
2324
"go.opentelemetry.io/collector/consumer/consumerdata"
2425
"go.uber.org/zap"
26+
"go.uber.org/zap/zaptest/observer"
2527

2628
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kubeletstatsreceiver/kubelet"
2729
)
2830

31+
const dataLen = 19
32+
2933
func TestRunnable(t *testing.T) {
3034
consumer := &fakeConsumer{}
3135
r := newRunnable(
3236
context.Background(),
37+
"",
3338
consumer,
3439
&fakeRestClient{},
3540
zap.NewNop(),
@@ -38,29 +43,97 @@ func TestRunnable(t *testing.T) {
3843
require.NoError(t, err)
3944
err = r.Run()
4045
require.NoError(t, err)
41-
require.Equal(t, 19, len(consumer.mds))
46+
require.Equal(t, dataLen, len(consumer.mds))
47+
}
48+
49+
func TestClientErrors(t *testing.T) {
50+
tests := []struct {
51+
name string
52+
fail bool
53+
numLogs int
54+
}{
55+
{"no error", false, 0},
56+
{"rest error", true, 1},
57+
}
58+
for _, test := range tests {
59+
t.Run(test.name, func(t *testing.T) {
60+
core, observedLogs := observer.New(zap.ErrorLevel)
61+
r := newRunnable(
62+
context.Background(),
63+
"",
64+
&fakeConsumer{},
65+
&fakeRestClient{fail: test.fail},
66+
zap.New(core),
67+
)
68+
err := r.Setup()
69+
require.NoError(t, err)
70+
err = r.Run()
71+
require.NoError(t, err)
72+
require.Equal(t, test.numLogs, observedLogs.Len())
73+
})
74+
}
75+
}
76+
77+
func TestConsumerErrors(t *testing.T) {
78+
tests := []struct {
79+
name string
80+
fail bool
81+
numLogs int
82+
}{
83+
{"no error", false, 0},
84+
{"consume error", true, dataLen},
85+
}
86+
for _, test := range tests {
87+
t.Run(test.name, func(t *testing.T) {
88+
core, observedLogs := observer.New(zap.ErrorLevel)
89+
r := newRunnable(
90+
context.Background(),
91+
"",
92+
&fakeConsumer{fail: test.fail},
93+
&fakeRestClient{},
94+
zap.New(core),
95+
)
96+
err := r.Setup()
97+
require.NoError(t, err)
98+
err = r.Run()
99+
require.NoError(t, err)
100+
require.Equal(t, test.numLogs, observedLogs.Len())
101+
})
102+
}
42103
}
43104

44105
type fakeConsumer struct {
45-
mds []consumerdata.MetricsData
106+
fail bool
107+
mds []consumerdata.MetricsData
46108
}
47109

48110
func (c *fakeConsumer) ConsumeMetricsData(
49111
ctx context.Context,
50112
md consumerdata.MetricsData,
51113
) error {
114+
if c.fail {
115+
return errors.New("")
116+
}
52117
c.mds = append(c.mds, md)
53118
return nil
54119
}
55120

56121
var _ kubelet.RestClient = (*fakeRestClient)(nil)
57122

58-
type fakeRestClient struct{}
123+
type fakeRestClient struct {
124+
fail bool
125+
}
59126

60127
func (f *fakeRestClient) StatsSummary() ([]byte, error) {
128+
if f.fail {
129+
return nil, errors.New("")
130+
}
61131
return ioutil.ReadFile("testdata/stats-summary.json")
62132
}
63133

64134
func (f *fakeRestClient) Pods() ([]byte, error) {
135+
if f.fail {
136+
return nil, errors.New("")
137+
}
65138
return ioutil.ReadFile("testdata/pods.json")
66139
}

0 commit comments

Comments
 (0)