Skip to content

Commit 970b16d

Browse files
authored
kubeletstats receiver: add working-set and page-fault metrics (#666)
1 parent 928f209 commit 970b16d

File tree

4 files changed

+82
-4
lines changed

4 files changed

+82
-4
lines changed

receiver/kubeletstatsreceiver/kubelet/mem.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ func memMetrics(prefix string, s *stats.MemoryStats) []*metricspb.Metric {
2424
memAvailableMetric(prefix, s),
2525
memUsageMetric(prefix, s),
2626
memRssMetric(prefix, s),
27+
memWorkingSetMetric(prefix, s),
28+
memPageFaultsMetric(prefix, s),
29+
memMajorPageFaultsMetric(prefix, s),
2730
}
2831
}
2932

@@ -38,3 +41,15 @@ func memUsageMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric {
3841
func memRssMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric {
3942
return intGauge(prefix+"memory.rss", "By", s.RSSBytes)
4043
}
44+
45+
func memWorkingSetMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric {
46+
return intGauge(prefix+"memory.working_set", "By", s.WorkingSetBytes)
47+
}
48+
49+
func memPageFaultsMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric {
50+
return intGauge(prefix+"memory.page_faults", "1", s.PageFaults)
51+
}
52+
53+
func memMajorPageFaultsMetric(prefix string, s *stats.MemoryStats) *metricspb.Metric {
54+
return intGauge(prefix+"memory.major_page_faults", "1", s.MajorPageFaults)
55+
}

receiver/kubeletstatsreceiver/kubelet/metrics.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ func MetricsData(
2727
summary *stats.Summary,
2828
metadata Metadata,
2929
typeStr string,
30-
metricGroupsToCollect map[MetricGroup]bool) []*consumerdata.MetricsData {
30+
metricGroupsToCollect map[MetricGroup]bool,
31+
) []*consumerdata.MetricsData {
3132
acc := &metricDataAccumulator{
3233
metadata: metadata,
3334
logger: logger,

receiver/kubeletstatsreceiver/kubelet/metrics_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,65 @@ func TestLabels(t *testing.T) {
9595
require.Equal(t, labelValue.Value, "myval")
9696
require.True(t, labelValue.HasValue)
9797
}
98+
99+
func TestWorkingSetMem(t *testing.T) {
100+
metrics := indexedFakeMetrics()
101+
nodeWsMetrics := metrics["k8s.node.memory.working_set"]
102+
wsMetric := nodeWsMetrics[0]
103+
value := wsMetric.Timeseries[0].Points[0].Value
104+
ptv := value.(*metricspb.Point_Int64Value)
105+
require.Equal(t, int64(1234567890), ptv.Int64Value)
106+
requireContains(t, metrics, "k8s.pod.memory.working_set")
107+
requireContains(t, metrics, "container.memory.working_set")
108+
}
109+
110+
func TestPageFaults(t *testing.T) {
111+
metrics := indexedFakeMetrics()
112+
nodePageFaults := metrics["k8s.node.memory.page_faults"]
113+
value := nodePageFaults[0].Timeseries[0].Points[0].Value
114+
ptv := value.(*metricspb.Point_Int64Value)
115+
require.Equal(t, int64(12345), ptv.Int64Value)
116+
requireContains(t, metrics, "k8s.pod.memory.page_faults")
117+
requireContains(t, metrics, "container.memory.page_faults")
118+
}
119+
120+
func TestMajorPageFaults(t *testing.T) {
121+
metrics := indexedFakeMetrics()
122+
nodePageFaults := metrics["k8s.node.memory.major_page_faults"]
123+
value := nodePageFaults[0].Timeseries[0].Points[0].Value
124+
ptv := value.(*metricspb.Point_Int64Value)
125+
require.Equal(t, int64(12), ptv.Int64Value)
126+
requireContains(t, metrics, "k8s.pod.memory.major_page_faults")
127+
requireContains(t, metrics, "container.memory.major_page_faults")
128+
}
129+
130+
func requireContains(t *testing.T, metrics map[string][]*metricspb.Metric, metricName string) {
131+
_, found := metrics[metricName]
132+
require.True(t, found)
133+
}
134+
135+
func indexedFakeMetrics() map[string][]*metricspb.Metric {
136+
mds := fakeMetrics()
137+
metrics := make(map[string][]*metricspb.Metric)
138+
for _, md := range mds {
139+
for _, metric := range md.Metrics {
140+
metricName := metric.MetricDescriptor.Name
141+
list := metrics[metricName]
142+
list = append(list, metric)
143+
metrics[metricName] = list
144+
}
145+
}
146+
return metrics
147+
}
148+
149+
func fakeMetrics() []*consumerdata.MetricsData {
150+
rc := &fakeRestClient{}
151+
statsProvider := NewStatsProvider(rc)
152+
summary, _ := statsProvider.StatsSummary()
153+
mgs := map[MetricGroup]bool{
154+
ContainerMetricGroup: true,
155+
PodMetricGroup: true,
156+
NodeMetricGroup: true,
157+
}
158+
return MetricsData(zap.NewNop(), summary, Metadata{}, "foo", mgs)
159+
}

receiver/kubeletstatsreceiver/testdata/stats-summary.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@
6565
"time": "2020-04-20T22:52:27Z",
6666
"availableBytes": 2620624896,
6767
"usageBytes": 3608727552,
68-
"workingSetBytes": 1410809856,
68+
"workingSetBytes": 1234567890,
6969
"rssBytes": 607125504,
70-
"pageFaults": 24915,
71-
"majorPageFaults": 0
70+
"pageFaults": 12345,
71+
"majorPageFaults": 12
7272
},
7373
"network": {
7474
"time": "2020-04-20T22:52:27Z",

0 commit comments

Comments
 (0)