@cryptotaxi247 / netdata-1 / commits / e46536389

fix(go.d/k8sstate): use static list of warning/terminated reasons (#18885)

Ilya Mashchenko committed Oct 28, 2024 at 18:10 UTC e4653638978f21ec35fb002913920ed7c44492a9
6 files changed +454 -322
src/go/plugin/go.d/modules/k8s_state/charts.go
+36 -54
@@ -681,24 +681,42 @@ var (
681 {ID: "pod_%s_container_%s_state_terminated", Name: "terminated"},
682 },
683 }
684 - containersStateWaitingChartTmpl = module.Chart{
685 - IDSep: true,
686 - ID: "pod_%s_container_%s.state_waiting_reason",
687 - Title: "Container waiting state reason",
688 - Units: "state",
689 - Fam: "container waiting reason",
690 - Ctx: "k8s_state.pod_container_waiting_state_reason",
691 - Priority: prioPodContainerWaitingStateReason,
692 - }
693 - containersStateTerminatedChartTmpl = module.Chart{
694 - IDSep: true,
695 - ID: "pod_%s_container_%s.state_terminated_reason",
696 - Title: "Container terminated state reason",
697 - Units: "state",
698 - Fam: "container terminated reason",
699 - Ctx: "k8s_state.pod_container_terminated_state_reason",
700 - Priority: prioPodContainerTerminatedStateReason,
701 - }
684 + containersStateWaitingChartTmpl = func() module.Chart {
685 + chart := module.Chart{
686 + IDSep: true,
687 + ID: "pod_%s_container_%s.state_waiting_reason",
688 + Title: "Container waiting state reason",
689 + Units: "state",
690 + Fam: "container waiting reason",
691 + Ctx: "k8s_state.pod_container_waiting_state_reason",
692 + Priority: prioPodContainerWaitingStateReason,
693 + }
694 + for _, v := range containerWaitingStateReasons {
695 + chart.Dims = append(chart.Dims, &module.Dim{
696 + ID: "pod_%s_container_%s_state_waiting_reason_" + v,
697 + Name: v,
698 + })
699 + }
700 + return chart
701 + }()
702 + containersStateTerminatedChartTmpl = func() module.Chart {
703 + chart := module.Chart{
704 + IDSep: true,
705 + ID: "pod_%s_container_%s.state_terminated_reason",
706 + Title: "Container terminated state reason",
707 + Units: "state",
708 + Fam: "container terminated reason",
709 + Ctx: "k8s_state.pod_container_terminated_state_reason",
710 + Priority: prioPodContainerTerminatedStateReason,
711 + }
712 + for _, v := range containerTerminatedStateReasons {
713 + chart.Dims = append(chart.Dims, &module.Dim{
714 + ID: "pod_%s_container_%s_state_terminated_reason_" + v,
715 + Name: v,
716 + })
717 + }
718 + return chart
719 + }()
720 )
721
722 func (ks *KubeState) newContainerCharts(ps *podState, cs *containerState) *module.Charts {
@@ -728,42 +746,6 @@ func (ks *KubeState) addContainerCharts(ps *podState, cs *containerState) {
746 }
747 }
748
731 -func (ks *KubeState) addContainerWaitingStateReasonToChart(ps *podState, cs *containerState, reason string) {
732 - id := fmt.Sprintf(containersStateWaitingChartTmpl.ID, replaceDots(ps.id()), cs.name)
733 - c := ks.Charts().Get(id)
734 - if c == nil {
735 - ks.Warningf("chart '%s' does not exist", id)
736 - return
737 - }
738 - dim := &module.Dim{
739 - ID: fmt.Sprintf("pod_%s_container_%s_state_waiting_reason_%s", ps.id(), cs.name, reason),
740 - Name: reason,
741 - }
742 - if err := c.AddDim(dim); err != nil {
743 - ks.Warning(err)
744 - return
745 - }
746 - c.MarkNotCreated()
747 -}
748 -
749 -func (ks *KubeState) addContainerTerminatedStateReasonToChart(ps *podState, cs *containerState, reason string) {
750 - id := fmt.Sprintf(containersStateTerminatedChartTmpl.ID, replaceDots(ps.id()), cs.name)
751 - c := ks.Charts().Get(id)
752 - if c == nil {
753 - ks.Warningf("chart '%s' does not exist", id)
754 - return
755 - }
756 - dim := &module.Dim{
757 - ID: fmt.Sprintf("pod_%s_container_%s_state_terminated_reason_%s", ps.id(), cs.name, reason),
758 - Name: reason,
759 - }
760 - if err := c.AddDim(dim); err != nil {
761 - ks.Warning(err)
762 - return
763 - }
764 - c.MarkNotCreated()
765 -}
766 -
749 var discoveryStatusChart = module.Chart{
750 ID: "discovery_discoverers_state",
751 Title: "Running discoverers state",
src/go/plugin/go.d/modules/k8s_state/collect.go
+40 -10
@@ -5,6 +5,7 @@ package k8s_state
5 import (
6 "errors"
7 "fmt"
8 + "slices"
9 "strings"
10 "time"
11
@@ -15,6 +16,29 @@ import (
16
17 const precision = 1000
18
19 +var (
20 + containerWaitingStateReasons = []string{
21 + "PodInitializing",
22 + "ContainerCreating",
23 + "CrashLoopBackOff",
24 + "CreateContainerConfigError",
25 + "ErrImagePull",
26 + "ImagePullBackOff",
27 + "CreateContainerError",
28 + "InvalidImageName",
29 + "Other",
30 + }
31 + containerTerminatedStateReasons = []string{
32 + "OOMKilled",
33 + "Completed",
34 + "Error",
35 + "ContainerCannotRun",
36 + "DeadlineExceeded",
37 + "Evicted",
38 + "Other",
39 + }
40 +)
41 +
42 func (ks *KubeState) collect() (map[string]int64, error) {
43 if ks.discoverer == nil {
44 return nil, errors.New("nil discoverer")
@@ -165,19 +189,25 @@ func (ks *KubeState) collectPodsState(mx map[string]int64) {
189 mx[ppx+"state_terminated"] = boolToInt(cs.stateTerminated)
190 mx[ppx+"readiness"] = boolToInt(cs.ready)
191 mx[ppx+"restarts"] = cs.restarts
168 - for _, r := range cs.stateWaitingReasons {
169 - if r.new {
170 - r.new = false
171 - ks.addContainerWaitingStateReasonToChart(ps, cs, r.reason)
192 +
193 + for _, v := range containerWaitingStateReasons {
194 + mx[ppx+"state_waiting_reason_"+v] = 0
195 + }
196 + if v := cs.waitingReason; v != "" {
197 + if !slices.Contains(containerWaitingStateReasons, cs.waitingReason) {
198 + v = "Other"
199 }
173 - mx[ppx+"state_waiting_reason_"+r.reason] = boolToInt(r.active)
200 + mx[ppx+"state_waiting_reason_"+v] = 1
201 + }
202 +
203 + for _, v := range containerTerminatedStateReasons {
204 + mx[ppx+"state_terminated_reason_"+v] = 0
205 }
175 - for _, r := range cs.stateTerminatedReasons {
176 - if r.new {
177 - r.new = false
178 - ks.addContainerTerminatedStateReasonToChart(ps, cs, r.reason)
206 + if v := cs.terminatedReason; v != "" {
207 + if !slices.Contains(containerTerminatedStateReasons, cs.terminatedReason) {
208 + v = "Other"
209 }
180 - mx[ppx+"state_terminated_reason_"+r.reason] = boolToInt(r.active)
210 + mx[ppx+"state_terminated_reason_"+v] = 1
211 }
212 }
213 }
src/go/plugin/go.d/modules/k8s_state/kube_state_test.go
+343 -207
@@ -241,11 +241,13 @@ func TestKubeState_Collect(t *testing.T) {
241 "node_node01_pods_readiness_unready": 0,
242 }
243 copyAge(expected, mx)
244 +
245 assert.Equal(t, expected, mx)
246 assert.Equal(t,
247 len(nodeChartsTmpl)+len(baseCharts),
248 len(*ks.Charts()),
249 )
250 + module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
251 }
252
253 return testCase{
@@ -264,40 +266,73 @@ func TestKubeState_Collect(t *testing.T) {
266 step1 := func(t *testing.T, ks *KubeState) {
267 mx := ks.Collect()
268 expected := map[string]int64{
267 - "discovery_node_discoverer_state": 1,
268 - "discovery_pod_discoverer_state": 1,
269 - "pod_default_pod01_age": 3,
270 - "pod_default_pod01_cpu_limits_used": 400,
271 - "pod_default_pod01_cpu_requests_used": 200,
272 - "pod_default_pod01_mem_limits_used": 419430400,
273 - "pod_default_pod01_mem_requests_used": 209715200,
274 - "pod_default_pod01_cond_containersready": 1,
275 - "pod_default_pod01_cond_podinitialized": 1,
276 - "pod_default_pod01_cond_podready": 1,
277 - "pod_default_pod01_cond_podscheduled": 1,
278 - "pod_default_pod01_container_container1_readiness": 1,
279 - "pod_default_pod01_container_container1_restarts": 0,
280 - "pod_default_pod01_container_container1_state_running": 1,
281 - "pod_default_pod01_container_container1_state_terminated": 0,
282 - "pod_default_pod01_container_container1_state_waiting": 0,
283 - "pod_default_pod01_container_container2_readiness": 1,
284 - "pod_default_pod01_container_container2_restarts": 0,
285 - "pod_default_pod01_container_container2_state_running": 1,
286 - "pod_default_pod01_container_container2_state_terminated": 0,
287 - "pod_default_pod01_container_container2_state_waiting": 0,
288 - "pod_default_pod01_containers": 2,
289 - "pod_default_pod01_containers_state_running": 2,
290 - "pod_default_pod01_containers_state_terminated": 0,
291 - "pod_default_pod01_containers_state_waiting": 0,
292 - "pod_default_pod01_init_containers": 1,
293 - "pod_default_pod01_init_containers_state_running": 0,
294 - "pod_default_pod01_init_containers_state_terminated": 1,
295 - "pod_default_pod01_init_containers_state_waiting": 0,
296 - "pod_default_pod01_phase_failed": 0,
297 - "pod_default_pod01_phase_pending": 0,
298 - "pod_default_pod01_phase_running": 1,
299 - "pod_default_pod01_phase_succeeded": 0,
269 + "discovery_node_discoverer_state": 1,
270 + "discovery_pod_discoverer_state": 1,
271 + "pod_default_pod01_age": 3,
272 + "pod_default_pod01_cond_containersready": 1,
273 + "pod_default_pod01_cond_podinitialized": 1,
274 + "pod_default_pod01_cond_podready": 1,
275 + "pod_default_pod01_cond_podscheduled": 1,
276 + "pod_default_pod01_container_container1_readiness": 1,
277 + "pod_default_pod01_container_container1_restarts": 0,
278 + "pod_default_pod01_container_container1_state_running": 1,
279 + "pod_default_pod01_container_container1_state_terminated": 0,
280 + "pod_default_pod01_container_container1_state_terminated_reason_Completed": 0,
281 + "pod_default_pod01_container_container1_state_terminated_reason_ContainerCannotRun": 0,
282 + "pod_default_pod01_container_container1_state_terminated_reason_DeadlineExceeded": 0,
283 + "pod_default_pod01_container_container1_state_terminated_reason_Error": 0,
284 + "pod_default_pod01_container_container1_state_terminated_reason_Evicted": 0,
285 + "pod_default_pod01_container_container1_state_terminated_reason_OOMKilled": 0,
286 + "pod_default_pod01_container_container1_state_terminated_reason_Other": 0,
287 + "pod_default_pod01_container_container1_state_waiting": 0,
288 + "pod_default_pod01_container_container1_state_waiting_reason_ContainerCreating": 0,
289 + "pod_default_pod01_container_container1_state_waiting_reason_CrashLoopBackOff": 0,
290 + "pod_default_pod01_container_container1_state_waiting_reason_CreateContainerConfigError": 0,
291 + "pod_default_pod01_container_container1_state_waiting_reason_CreateContainerError": 0,
292 + "pod_default_pod01_container_container1_state_waiting_reason_ErrImagePull": 0,
293 + "pod_default_pod01_container_container1_state_waiting_reason_ImagePullBackOff": 0,
294 + "pod_default_pod01_container_container1_state_waiting_reason_InvalidImageName": 0,
295 + "pod_default_pod01_container_container1_state_waiting_reason_Other": 0,
296 + "pod_default_pod01_container_container1_state_waiting_reason_PodInitializing": 0,
297 + "pod_default_pod01_container_container2_readiness": 1,
298 + "pod_default_pod01_container_container2_restarts": 0,
299 + "pod_default_pod01_container_container2_state_running": 1,
300 + "pod_default_pod01_container_container2_state_terminated": 0,
301 + "pod_default_pod01_container_container2_state_terminated_reason_Completed": 0,
302 + "pod_default_pod01_container_container2_state_terminated_reason_ContainerCannotRun": 0,
303 + "pod_default_pod01_container_container2_state_terminated_reason_DeadlineExceeded": 0,
304 + "pod_default_pod01_container_container2_state_terminated_reason_Error": 0,
305 + "pod_default_pod01_container_container2_state_terminated_reason_Evicted": 0,
306 + "pod_default_pod01_container_container2_state_terminated_reason_OOMKilled": 0,
307 + "pod_default_pod01_container_container2_state_terminated_reason_Other": 0,
308 + "pod_default_pod01_container_container2_state_waiting": 0,
309 + "pod_default_pod01_container_container2_state_waiting_reason_ContainerCreating": 0,
310 + "pod_default_pod01_container_container2_state_waiting_reason_CrashLoopBackOff": 0,
311 + "pod_default_pod01_container_container2_state_waiting_reason_CreateContainerConfigError": 0,
312 + "pod_default_pod01_container_container2_state_waiting_reason_CreateContainerError": 0,
313 + "pod_default_pod01_container_container2_state_waiting_reason_ErrImagePull": 0,
314 + "pod_default_pod01_container_container2_state_waiting_reason_ImagePullBackOff": 0,
315 + "pod_default_pod01_container_container2_state_waiting_reason_InvalidImageName": 0,
316 + "pod_default_pod01_container_container2_state_waiting_reason_Other": 0,
317 + "pod_default_pod01_container_container2_state_waiting_reason_PodInitializing": 0,
318 + "pod_default_pod01_containers": 2,
319 + "pod_default_pod01_containers_state_running": 2,
320 + "pod_default_pod01_containers_state_terminated": 0,
321 + "pod_default_pod01_containers_state_waiting": 0,
322 + "pod_default_pod01_cpu_limits_used": 400,
323 + "pod_default_pod01_cpu_requests_used": 200,
324 + "pod_default_pod01_init_containers": 1,
325 + "pod_default_pod01_init_containers_state_running": 0,
326 + "pod_default_pod01_init_containers_state_terminated": 1,
327 + "pod_default_pod01_init_containers_state_waiting": 0,
328 + "pod_default_pod01_mem_limits_used": 419430400,
329 + "pod_default_pod01_mem_requests_used": 209715200,
330 + "pod_default_pod01_phase_failed": 0,
331 + "pod_default_pod01_phase_pending": 0,
332 + "pod_default_pod01_phase_running": 1,
333 + "pod_default_pod01_phase_succeeded": 0,
334 }
335 +
336 copyAge(expected, mx)
337
338 assert.Equal(t, expected, mx)
@@ -305,6 +340,7 @@ func TestKubeState_Collect(t *testing.T) {
340 len(podChartsTmpl)+len(containerChartsTmpl)*len(pod.Spec.Containers)+len(baseCharts),
341 len(*ks.Charts()),
342 )
343 + module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
344 }
345
346 return testCase{
@@ -325,78 +361,111 @@ func TestKubeState_Collect(t *testing.T) {
361 step1 := func(t *testing.T, ks *KubeState) {
362 mx := ks.Collect()
363 expected := map[string]int64{
328 - "discovery_node_discoverer_state": 1,
329 - "discovery_pod_discoverer_state": 1,
330 - "node_node01_age": 3,
331 - "node_node01_alloc_cpu_limits_used": 400,
332 - "node_node01_alloc_cpu_limits_util": 11428,
333 - "node_node01_alloc_cpu_requests_used": 200,
334 - "node_node01_alloc_cpu_requests_util": 5714,
335 - "node_node01_alloc_mem_limits_used": 419430400,
336 - "node_node01_alloc_mem_limits_util": 11428,
337 - "node_node01_alloc_mem_requests_used": 209715200,
338 - "node_node01_alloc_mem_requests_util": 5714,
339 - "node_node01_alloc_pods_allocated": 1,
340 - "node_node01_alloc_pods_available": 109,
341 - "node_node01_alloc_pods_util": 909,
342 - "node_node01_cond_diskpressure": 0,
343 - "node_node01_cond_memorypressure": 0,
344 - "node_node01_cond_networkunavailable": 0,
345 - "node_node01_cond_pidpressure": 0,
346 - "node_node01_cond_ready": 1,
347 - "node_node01_schedulability_schedulable": 1,
348 - "node_node01_schedulability_unschedulable": 0,
349 - "node_node01_containers": 2,
350 - "node_node01_containers_state_running": 2,
351 - "node_node01_containers_state_terminated": 0,
352 - "node_node01_containers_state_waiting": 0,
353 - "node_node01_init_containers": 1,
354 - "node_node01_init_containers_state_running": 0,
355 - "node_node01_init_containers_state_terminated": 1,
356 - "node_node01_init_containers_state_waiting": 0,
357 - "node_node01_pods_cond_containersready": 1,
358 - "node_node01_pods_cond_podinitialized": 1,
359 - "node_node01_pods_cond_podready": 1,
360 - "node_node01_pods_cond_podscheduled": 1,
361 - "node_node01_pods_phase_failed": 0,
362 - "node_node01_pods_phase_pending": 0,
363 - "node_node01_pods_phase_running": 1,
364 - "node_node01_pods_phase_succeeded": 0,
365 - "node_node01_pods_readiness": 100000,
366 - "node_node01_pods_readiness_ready": 1,
367 - "node_node01_pods_readiness_unready": 0,
368 - "pod_default_pod01_age": 3,
369 - "pod_default_pod01_cpu_limits_used": 400,
370 - "pod_default_pod01_cpu_requests_used": 200,
371 - "pod_default_pod01_mem_limits_used": 419430400,
372 - "pod_default_pod01_mem_requests_used": 209715200,
373 - "pod_default_pod01_cond_containersready": 1,
374 - "pod_default_pod01_cond_podinitialized": 1,
375 - "pod_default_pod01_cond_podready": 1,
376 - "pod_default_pod01_cond_podscheduled": 1,
377 - "pod_default_pod01_container_container1_readiness": 1,
378 - "pod_default_pod01_container_container1_restarts": 0,
379 - "pod_default_pod01_container_container1_state_running": 1,
380 - "pod_default_pod01_container_container1_state_terminated": 0,
381 - "pod_default_pod01_container_container1_state_waiting": 0,
382 - "pod_default_pod01_container_container2_readiness": 1,
383 - "pod_default_pod01_container_container2_restarts": 0,
384 - "pod_default_pod01_container_container2_state_running": 1,
385 - "pod_default_pod01_container_container2_state_terminated": 0,
386 - "pod_default_pod01_container_container2_state_waiting": 0,
387 - "pod_default_pod01_containers": 2,
388 - "pod_default_pod01_containers_state_running": 2,
389 - "pod_default_pod01_containers_state_terminated": 0,
390 - "pod_default_pod01_containers_state_waiting": 0,
391 - "pod_default_pod01_init_containers": 1,
392 - "pod_default_pod01_init_containers_state_running": 0,
393 - "pod_default_pod01_init_containers_state_terminated": 1,
394 - "pod_default_pod01_init_containers_state_waiting": 0,
395 - "pod_default_pod01_phase_failed": 0,
396 - "pod_default_pod01_phase_pending": 0,
397 - "pod_default_pod01_phase_running": 1,
398 - "pod_default_pod01_phase_succeeded": 0,
364 + "discovery_node_discoverer_state": 1,
365 + "discovery_pod_discoverer_state": 1,
366 + "node_node01_age": 3,
367 + "node_node01_alloc_cpu_limits_used": 400,
368 + "node_node01_alloc_cpu_limits_util": 11428,
369 + "node_node01_alloc_cpu_requests_used": 200,
370 + "node_node01_alloc_cpu_requests_util": 5714,
371 + "node_node01_alloc_mem_limits_used": 419430400,
372 + "node_node01_alloc_mem_limits_util": 11428,
373 + "node_node01_alloc_mem_requests_used": 209715200,
374 + "node_node01_alloc_mem_requests_util": 5714,
375 + "node_node01_alloc_pods_allocated": 1,
376 + "node_node01_alloc_pods_available": 109,
377 + "node_node01_alloc_pods_util": 909,
378 + "node_node01_cond_diskpressure": 0,
379 + "node_node01_cond_memorypressure": 0,
380 + "node_node01_cond_networkunavailable": 0,
381 + "node_node01_cond_pidpressure": 0,
382 + "node_node01_cond_ready": 1,
383 + "node_node01_containers": 2,
384 + "node_node01_containers_state_running": 2,
385 + "node_node01_containers_state_terminated": 0,
386 + "node_node01_containers_state_waiting": 0,
387 + "node_node01_init_containers": 1,
388 + "node_node01_init_containers_state_running": 0,
389 + "node_node01_init_containers_state_terminated": 1,
390 + "node_node01_init_containers_state_waiting": 0,
391 + "node_node01_pods_cond_containersready": 1,
392 + "node_node01_pods_cond_podinitialized": 1,
393 + "node_node01_pods_cond_podready": 1,
394 + "node_node01_pods_cond_podscheduled": 1,
395 + "node_node01_pods_phase_failed": 0,
396 + "node_node01_pods_phase_pending": 0,
397 + "node_node01_pods_phase_running": 1,
398 + "node_node01_pods_phase_succeeded": 0,
399 + "node_node01_pods_readiness": 100000,
400 + "node_node01_pods_readiness_ready": 1,
401 + "node_node01_pods_readiness_unready": 0,
402 + "node_node01_schedulability_schedulable": 1,
403 + "node_node01_schedulability_unschedulable": 0,
404 + "pod_default_pod01_age": 3,
405 + "pod_default_pod01_cond_containersready": 1,
406 + "pod_default_pod01_cond_podinitialized": 1,
407 + "pod_default_pod01_cond_podready": 1,
408 + "pod_default_pod01_cond_podscheduled": 1,
409 + "pod_default_pod01_container_container1_readiness": 1,
410 + "pod_default_pod01_container_container1_restarts": 0,
411 + "pod_default_pod01_container_container1_state_running": 1,
412 + "pod_default_pod01_container_container1_state_terminated": 0,
413 + "pod_default_pod01_container_container1_state_terminated_reason_Completed": 0,
414 + "pod_default_pod01_container_container1_state_terminated_reason_ContainerCannotRun": 0,
415 + "pod_default_pod01_container_container1_state_terminated_reason_DeadlineExceeded": 0,
416 + "pod_default_pod01_container_container1_state_terminated_reason_Error": 0,
417 + "pod_default_pod01_container_container1_state_terminated_reason_Evicted": 0,
418 + "pod_default_pod01_container_container1_state_terminated_reason_OOMKilled": 0,
419 + "pod_default_pod01_container_container1_state_terminated_reason_Other": 0,
420 + "pod_default_pod01_container_container1_state_waiting": 0,
421 + "pod_default_pod01_container_container1_state_waiting_reason_ContainerCreating": 0,
422 + "pod_default_pod01_container_container1_state_waiting_reason_CrashLoopBackOff": 0,
423 + "pod_default_pod01_container_container1_state_waiting_reason_CreateContainerConfigError": 0,
424 + "pod_default_pod01_container_container1_state_waiting_reason_CreateContainerError": 0,
425 + "pod_default_pod01_container_container1_state_waiting_reason_ErrImagePull": 0,
426 + "pod_default_pod01_container_container1_state_waiting_reason_ImagePullBackOff": 0,
427 + "pod_default_pod01_container_container1_state_waiting_reason_InvalidImageName": 0,
428 + "pod_default_pod01_container_container1_state_waiting_reason_Other": 0,
429 + "pod_default_pod01_container_container1_state_waiting_reason_PodInitializing": 0,
430 + "pod_default_pod01_container_container2_readiness": 1,
431 + "pod_default_pod01_container_container2_restarts": 0,
432 + "pod_default_pod01_container_container2_state_running": 1,
433 + "pod_default_pod01_container_container2_state_terminated": 0,
434 + "pod_default_pod01_container_container2_state_terminated_reason_Completed": 0,
435 + "pod_default_pod01_container_container2_state_terminated_reason_ContainerCannotRun": 0,
436 + "pod_default_pod01_container_container2_state_terminated_reason_DeadlineExceeded": 0,
437 + "pod_default_pod01_container_container2_state_terminated_reason_Error": 0,
438 + "pod_default_pod01_container_container2_state_terminated_reason_Evicted": 0,
439 + "pod_default_pod01_container_container2_state_terminated_reason_OOMKilled": 0,
440 + "pod_default_pod01_container_container2_state_terminated_reason_Other": 0,
441 + "pod_default_pod01_container_container2_state_waiting": 0,
442 + "pod_default_pod01_container_container2_state_waiting_reason_ContainerCreating": 0,
443 + "pod_default_pod01_container_container2_state_waiting_reason_CrashLoopBackOff": 0,
444 + "pod_default_pod01_container_container2_state_waiting_reason_CreateContainerConfigError": 0,
445 + "pod_default_pod01_container_container2_state_waiting_reason_CreateContainerError": 0,
446 + "pod_default_pod01_container_container2_state_waiting_reason_ErrImagePull": 0,
447 + "pod_default_pod01_container_container2_state_waiting_reason_ImagePullBackOff": 0,
448 + "pod_default_pod01_container_container2_state_waiting_reason_InvalidImageName": 0,
449 + "pod_default_pod01_container_container2_state_waiting_reason_Other": 0,
450 + "pod_default_pod01_container_container2_state_waiting_reason_PodInitializing": 0,
451 + "pod_default_pod01_containers": 2,
452 + "pod_default_pod01_containers_state_running": 2,
453 + "pod_default_pod01_containers_state_terminated": 0,
454 + "pod_default_pod01_containers_state_waiting": 0,
455 + "pod_default_pod01_cpu_limits_used": 400,
456 + "pod_default_pod01_cpu_requests_used": 200,
457 + "pod_default_pod01_init_containers": 1,
458 + "pod_default_pod01_init_containers_state_running": 0,
459 + "pod_default_pod01_init_containers_state_terminated": 1,
460 + "pod_default_pod01_init_containers_state_waiting": 0,
461 + "pod_default_pod01_mem_limits_used": 419430400,
462 + "pod_default_pod01_mem_requests_used": 209715200,
463 + "pod_default_pod01_phase_failed": 0,
464 + "pod_default_pod01_phase_pending": 0,
465 + "pod_default_pod01_phase_running": 1,
466 + "pod_default_pod01_phase_succeeded": 0,
467 }
468 +
469 copyAge(expected, mx)
470
471 assert.Equal(t, expected, mx)
@@ -404,6 +473,7 @@ func TestKubeState_Collect(t *testing.T) {
473 len(nodeChartsTmpl)+len(podChartsTmpl)+len(containerChartsTmpl)*len(pod.Spec.Containers)+len(baseCharts),
474 len(*ks.Charts()),
475 )
476 + module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
477 }
478
479 return testCase{
@@ -481,6 +551,7 @@ func TestKubeState_Collect(t *testing.T) {
551 len(podChartsTmpl)+len(containerChartsTmpl)*len(pod.Spec.Containers),
552 calcObsoleteCharts(*ks.Charts()),
553 )
554 + module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
555 }
556
557 return testCase{
@@ -506,7 +577,7 @@ func TestKubeState_Collect(t *testing.T) {
577 for _, c := range *ks.Charts() {
578 if strings.HasPrefix(c.ID, "pod_") {
579 ok := isLabelValueSet(c, labelKeyNodeName)
509 - assert.Falsef(t, ok, "chart '%s' has not empty %s label", c.ID, labelKeyNodeName)
580 + assert.Falsef(t, ok, "chart '%s' has no empty %s label", c.ID, labelKeyNodeName)
581 }
582 }
583 }
@@ -547,108 +618,172 @@ func TestKubeState_Collect(t *testing.T) {
618 step2 := func(t *testing.T, ks *KubeState) {
619 mx := ks.Collect()
620 expected := map[string]int64{
550 - "discovery_node_discoverer_state": 1,
551 - "discovery_pod_discoverer_state": 1,
552 - "node_node01_age": 4,
553 - "node_node01_alloc_cpu_limits_used": 800,
554 - "node_node01_alloc_cpu_limits_util": 22857,
555 - "node_node01_alloc_cpu_requests_used": 400,
556 - "node_node01_alloc_cpu_requests_util": 11428,
557 - "node_node01_alloc_mem_limits_used": 838860800,
558 - "node_node01_alloc_mem_limits_util": 22857,
559 - "node_node01_alloc_mem_requests_used": 419430400,
560 - "node_node01_alloc_mem_requests_util": 11428,
561 - "node_node01_alloc_pods_allocated": 2,
562 - "node_node01_alloc_pods_available": 108,
563 - "node_node01_alloc_pods_util": 1818,
564 - "node_node01_cond_diskpressure": 0,
565 - "node_node01_cond_memorypressure": 0,
566 - "node_node01_cond_networkunavailable": 0,
567 - "node_node01_cond_pidpressure": 0,
568 - "node_node01_cond_ready": 1,
569 - "node_node01_schedulability_schedulable": 1,
570 - "node_node01_schedulability_unschedulable": 0,
571 - "node_node01_containers": 4,
572 - "node_node01_containers_state_running": 4,
573 - "node_node01_containers_state_terminated": 0,
574 - "node_node01_containers_state_waiting": 0,
575 - "node_node01_init_containers": 2,
576 - "node_node01_init_containers_state_running": 0,
577 - "node_node01_init_containers_state_terminated": 2,
578 - "node_node01_init_containers_state_waiting": 0,
579 - "node_node01_pods_cond_containersready": 2,
580 - "node_node01_pods_cond_podinitialized": 2,
581 - "node_node01_pods_cond_podready": 2,
582 - "node_node01_pods_cond_podscheduled": 2,
583 - "node_node01_pods_phase_failed": 0,
584 - "node_node01_pods_phase_pending": 0,
585 - "node_node01_pods_phase_running": 2,
586 - "node_node01_pods_phase_succeeded": 0,
587 - "node_node01_pods_readiness": 100000,
588 - "node_node01_pods_readiness_ready": 2,
589 - "node_node01_pods_readiness_unready": 0,
590 - "pod_default_pod01_age": 4,
591 - "pod_default_pod01_cpu_limits_used": 400,
592 - "pod_default_pod01_cpu_requests_used": 200,
593 - "pod_default_pod01_mem_limits_used": 419430400,
594 - "pod_default_pod01_mem_requests_used": 209715200,
595 - "pod_default_pod01_cond_containersready": 1,
596 - "pod_default_pod01_cond_podinitialized": 1,
597 - "pod_default_pod01_cond_podready": 1,
598 - "pod_default_pod01_cond_podscheduled": 1,
599 - "pod_default_pod01_container_container1_readiness": 1,
600 - "pod_default_pod01_container_container1_restarts": 0,
601 - "pod_default_pod01_container_container1_state_running": 1,
602 - "pod_default_pod01_container_container1_state_terminated": 0,
603 - "pod_default_pod01_container_container1_state_waiting": 0,
604 - "pod_default_pod01_container_container2_readiness": 1,
605 - "pod_default_pod01_container_container2_restarts": 0,
606 - "pod_default_pod01_container_container2_state_running": 1,
607 - "pod_default_pod01_container_container2_state_terminated": 0,
608 - "pod_default_pod01_container_container2_state_waiting": 0,
609 - "pod_default_pod01_containers": 2,
610 - "pod_default_pod01_containers_state_running": 2,
611 - "pod_default_pod01_containers_state_terminated": 0,
612 - "pod_default_pod01_containers_state_waiting": 0,
613 - "pod_default_pod01_init_containers": 1,
614 - "pod_default_pod01_init_containers_state_running": 0,
615 - "pod_default_pod01_init_containers_state_terminated": 1,
616 - "pod_default_pod01_init_containers_state_waiting": 0,
617 - "pod_default_pod01_phase_failed": 0,
618 - "pod_default_pod01_phase_pending": 0,
619 - "pod_default_pod01_phase_running": 1,
620 - "pod_default_pod01_phase_succeeded": 0,
621 - "pod_default_pod02_age": 4,
622 - "pod_default_pod02_cpu_limits_used": 400,
623 - "pod_default_pod02_cpu_requests_used": 200,
624 - "pod_default_pod02_mem_limits_used": 419430400,
625 - "pod_default_pod02_mem_requests_used": 209715200,
626 - "pod_default_pod02_cond_containersready": 1,
627 - "pod_default_pod02_cond_podinitialized": 1,
628 - "pod_default_pod02_cond_podready": 1,
629 - "pod_default_pod02_cond_podscheduled": 1,
630 - "pod_default_pod02_container_container1_readiness": 1,
631 - "pod_default_pod02_container_container1_restarts": 0,
632 - "pod_default_pod02_container_container1_state_running": 1,
633 - "pod_default_pod02_container_container1_state_terminated": 0,
634 - "pod_default_pod02_container_container1_state_waiting": 0,
635 - "pod_default_pod02_container_container2_readiness": 1,
636 - "pod_default_pod02_container_container2_restarts": 0,
637 - "pod_default_pod02_container_container2_state_running": 1,
638 - "pod_default_pod02_container_container2_state_terminated": 0,
639 - "pod_default_pod02_container_container2_state_waiting": 0,
640 - "pod_default_pod02_containers": 2,
641 - "pod_default_pod02_containers_state_running": 2,
642 - "pod_default_pod02_containers_state_terminated": 0,
643 - "pod_default_pod02_containers_state_waiting": 0,
644 - "pod_default_pod02_init_containers": 1,
645 - "pod_default_pod02_init_containers_state_running": 0,
646 - "pod_default_pod02_init_containers_state_terminated": 1,
647 - "pod_default_pod02_init_containers_state_waiting": 0,
648 - "pod_default_pod02_phase_failed": 0,
649 - "pod_default_pod02_phase_pending": 0,
650 - "pod_default_pod02_phase_running": 1,
651 - "pod_default_pod02_phase_succeeded": 0,
621 + "discovery_node_discoverer_state": 1,
622 + "discovery_pod_discoverer_state": 1,
623 + "node_node01_age": 4,
624 + "node_node01_alloc_cpu_limits_used": 800,
625 + "node_node01_alloc_cpu_limits_util": 22857,
626 + "node_node01_alloc_cpu_requests_used": 400,
627 + "node_node01_alloc_cpu_requests_util": 11428,
628 + "node_node01_alloc_mem_limits_used": 838860800,
629 + "node_node01_alloc_mem_limits_util": 22857,
630 + "node_node01_alloc_mem_requests_used": 419430400,
631 + "node_node01_alloc_mem_requests_util": 11428,
632 + "node_node01_alloc_pods_allocated": 2,
633 + "node_node01_alloc_pods_available": 108,
634 + "node_node01_alloc_pods_util": 1818,
635 + "node_node01_cond_diskpressure": 0,
636 + "node_node01_cond_memorypressure": 0,
637 + "node_node01_cond_networkunavailable": 0,
638 + "node_node01_cond_pidpressure": 0,
639 + "node_node01_cond_ready": 1,
640 + "node_node01_containers": 4,
641 + "node_node01_containers_state_running": 4,
642 + "node_node01_containers_state_terminated": 0,
643 + "node_node01_containers_state_waiting": 0,
644 + "node_node01_init_containers": 2,
645 + "node_node01_init_containers_state_running": 0,
646 + "node_node01_init_containers_state_terminated": 2,
647 + "node_node01_init_containers_state_waiting": 0,
648 + "node_node01_pods_cond_containersready": 2,
649 + "node_node01_pods_cond_podinitialized": 2,
650 + "node_node01_pods_cond_podready": 2,
651 + "node_node01_pods_cond_podscheduled": 2,
652 + "node_node01_pods_phase_failed": 0,
653 + "node_node01_pods_phase_pending": 0,
654 + "node_node01_pods_phase_running": 2,
655 + "node_node01_pods_phase_succeeded": 0,
656 + "node_node01_pods_readiness": 100000,
657 + "node_node01_pods_readiness_ready": 2,
658 + "node_node01_pods_readiness_unready": 0,
659 + "node_node01_schedulability_schedulable": 1,
660 + "node_node01_schedulability_unschedulable": 0,
661 + "pod_default_pod01_age": 4,
662 + "pod_default_pod01_cond_containersready": 1,
663 + "pod_default_pod01_cond_podinitialized": 1,
664 + "pod_default_pod01_cond_podready": 1,
665 + "pod_default_pod01_cond_podscheduled": 1,
666 + "pod_default_pod01_container_container1_readiness": 1,
667 + "pod_default_pod01_container_container1_restarts": 0,
668 + "pod_default_pod01_container_container1_state_running": 1,
669 + "pod_default_pod01_container_container1_state_terminated": 0,
670 + "pod_default_pod01_container_container1_state_terminated_reason_Completed": 0,
671 + "pod_default_pod01_container_container1_state_terminated_reason_ContainerCannotRun": 0,
672 + "pod_default_pod01_container_container1_state_terminated_reason_DeadlineExceeded": 0,
673 + "pod_default_pod01_container_container1_state_terminated_reason_Error": 0,
674 + "pod_default_pod01_container_container1_state_terminated_reason_Evicted": 0,
675 + "pod_default_pod01_container_container1_state_terminated_reason_OOMKilled": 0,
676 + "pod_default_pod01_container_container1_state_terminated_reason_Other": 0,
677 + "pod_default_pod01_container_container1_state_waiting": 0,
678 + "pod_default_pod01_container_container1_state_waiting_reason_ContainerCreating": 0,
679 + "pod_default_pod01_container_container1_state_waiting_reason_CrashLoopBackOff": 0,
680 + "pod_default_pod01_container_container1_state_waiting_reason_CreateContainerConfigError": 0,
681 + "pod_default_pod01_container_container1_state_waiting_reason_CreateContainerError": 0,
682 + "pod_default_pod01_container_container1_state_waiting_reason_ErrImagePull": 0,
683 + "pod_default_pod01_container_container1_state_waiting_reason_ImagePullBackOff": 0,
684 + "pod_default_pod01_container_container1_state_waiting_reason_InvalidImageName": 0,
685 + "pod_default_pod01_container_container1_state_waiting_reason_Other": 0,
686 + "pod_default_pod01_container_container1_state_waiting_reason_PodInitializing": 0,
687 + "pod_default_pod01_container_container2_readiness": 1,
688 + "pod_default_pod01_container_container2_restarts": 0,
689 + "pod_default_pod01_container_container2_state_running": 1,
690 + "pod_default_pod01_container_container2_state_terminated": 0,
691 + "pod_default_pod01_container_container2_state_terminated_reason_Completed": 0,
692 + "pod_default_pod01_container_container2_state_terminated_reason_ContainerCannotRun": 0,
693 + "pod_default_pod01_container_container2_state_terminated_reason_DeadlineExceeded": 0,
694 + "pod_default_pod01_container_container2_state_terminated_reason_Error": 0,
695 + "pod_default_pod01_container_container2_state_terminated_reason_Evicted": 0,
696 + "pod_default_pod01_container_container2_state_terminated_reason_OOMKilled": 0,
697 + "pod_default_pod01_container_container2_state_terminated_reason_Other": 0,
698 + "pod_default_pod01_container_container2_state_waiting": 0,
699 + "pod_default_pod01_container_container2_state_waiting_reason_ContainerCreating": 0,
700 + "pod_default_pod01_container_container2_state_waiting_reason_CrashLoopBackOff": 0,
701 + "pod_default_pod01_container_container2_state_waiting_reason_CreateContainerConfigError": 0,
702 + "pod_default_pod01_container_container2_state_waiting_reason_CreateContainerError": 0,
703 + "pod_default_pod01_container_container2_state_waiting_reason_ErrImagePull": 0,
704 + "pod_default_pod01_container_container2_state_waiting_reason_ImagePullBackOff": 0,
705 + "pod_default_pod01_container_container2_state_waiting_reason_InvalidImageName": 0,
706 + "pod_default_pod01_container_container2_state_waiting_reason_Other": 0,
707 + "pod_default_pod01_container_container2_state_waiting_reason_PodInitializing": 0,
708 + "pod_default_pod01_containers": 2,
709 + "pod_default_pod01_containers_state_running": 2,
710 + "pod_default_pod01_containers_state_terminated": 0,
711 + "pod_default_pod01_containers_state_waiting": 0,
712 + "pod_default_pod01_cpu_limits_used": 400,
713 + "pod_default_pod01_cpu_requests_used": 200,
714 + "pod_default_pod01_init_containers": 1,
715 + "pod_default_pod01_init_containers_state_running": 0,
716 + "pod_default_pod01_init_containers_state_terminated": 1,
717 + "pod_default_pod01_init_containers_state_waiting": 0,
718 + "pod_default_pod01_mem_limits_used": 419430400,
719 + "pod_default_pod01_mem_requests_used": 209715200,
720 + "pod_default_pod01_phase_failed": 0,
721 + "pod_default_pod01_phase_pending": 0,
722 + "pod_default_pod01_phase_running": 1,
723 + "pod_default_pod01_phase_succeeded": 0,
724 + "pod_default_pod02_age": 4,
725 + "pod_default_pod02_cond_containersready": 1,
726 + "pod_default_pod02_cond_podinitialized": 1,
727 + "pod_default_pod02_cond_podready": 1,
728 + "pod_default_pod02_cond_podscheduled": 1,
729 + "pod_default_pod02_container_container1_readiness": 1,
730 + "pod_default_pod02_container_container1_restarts": 0,
731 + "pod_default_pod02_container_container1_state_running": 1,
732 + "pod_default_pod02_container_container1_state_terminated": 0,
733 + "pod_default_pod02_container_container1_state_terminated_reason_Completed": 0,
734 + "pod_default_pod02_container_container1_state_terminated_reason_ContainerCannotRun": 0,
735 + "pod_default_pod02_container_container1_state_terminated_reason_DeadlineExceeded": 0,
736 + "pod_default_pod02_container_container1_state_terminated_reason_Error": 0,
737 + "pod_default_pod02_container_container1_state_terminated_reason_Evicted": 0,
738 + "pod_default_pod02_container_container1_state_terminated_reason_OOMKilled": 0,
739 + "pod_default_pod02_container_container1_state_terminated_reason_Other": 0,
740 + "pod_default_pod02_container_container1_state_waiting": 0,
741 + "pod_default_pod02_container_container1_state_waiting_reason_ContainerCreating": 0,
742 + "pod_default_pod02_container_container1_state_waiting_reason_CrashLoopBackOff": 0,
743 + "pod_default_pod02_container_container1_state_waiting_reason_CreateContainerConfigError": 0,
744 + "pod_default_pod02_container_container1_state_waiting_reason_CreateContainerError": 0,
745 + "pod_default_pod02_container_container1_state_waiting_reason_ErrImagePull": 0,
746 + "pod_default_pod02_container_container1_state_waiting_reason_ImagePullBackOff": 0,
747 + "pod_default_pod02_container_container1_state_waiting_reason_InvalidImageName": 0,
748 + "pod_default_pod02_container_container1_state_waiting_reason_Other": 0,
749 + "pod_default_pod02_container_container1_state_waiting_reason_PodInitializing": 0,
750 + "pod_default_pod02_container_container2_readiness": 1,
751 + "pod_default_pod02_container_container2_restarts": 0,
752 + "pod_default_pod02_container_container2_state_running": 1,
753 + "pod_default_pod02_container_container2_state_terminated": 0,
754 + "pod_default_pod02_container_container2_state_terminated_reason_Completed": 0,
755 + "pod_default_pod02_container_container2_state_terminated_reason_ContainerCannotRun": 0,
756 + "pod_default_pod02_container_container2_state_terminated_reason_DeadlineExceeded": 0,
757 + "pod_default_pod02_container_container2_state_terminated_reason_Error": 0,
758 + "pod_default_pod02_container_container2_state_terminated_reason_Evicted": 0,
759 + "pod_default_pod02_container_container2_state_terminated_reason_OOMKilled": 0,
760 + "pod_default_pod02_container_container2_state_terminated_reason_Other": 0,
761 + "pod_default_pod02_container_container2_state_waiting": 0,
762 + "pod_default_pod02_container_container2_state_waiting_reason_ContainerCreating": 0,
763 + "pod_default_pod02_container_container2_state_waiting_reason_CrashLoopBackOff": 0,
764 + "pod_default_pod02_container_container2_state_waiting_reason_CreateContainerConfigError": 0,
765 + "pod_default_pod02_container_container2_state_waiting_reason_CreateContainerError": 0,
766 + "pod_default_pod02_container_container2_state_waiting_reason_ErrImagePull": 0,
767 + "pod_default_pod02_container_container2_state_waiting_reason_ImagePullBackOff": 0,
768 + "pod_default_pod02_container_container2_state_waiting_reason_InvalidImageName": 0,
769 + "pod_default_pod02_container_container2_state_waiting_reason_Other": 0,
770 + "pod_default_pod02_container_container2_state_waiting_reason_PodInitializing": 0,
771 + "pod_default_pod02_containers": 2,
772 + "pod_default_pod02_containers_state_running": 2,
773 + "pod_default_pod02_containers_state_terminated": 0,
774 + "pod_default_pod02_containers_state_waiting": 0,
775 + "pod_default_pod02_cpu_limits_used": 400,
776 + "pod_default_pod02_cpu_requests_used": 200,
777 + "pod_default_pod02_init_containers": 1,
778 + "pod_default_pod02_init_containers_state_running": 0,
779 + "pod_default_pod02_init_containers_state_terminated": 1,
780 + "pod_default_pod02_init_containers_state_waiting": 0,
781 + "pod_default_pod02_mem_limits_used": 419430400,
782 + "pod_default_pod02_mem_requests_used": 209715200,
783 + "pod_default_pod02_phase_failed": 0,
784 + "pod_default_pod02_phase_pending": 0,
785 + "pod_default_pod02_phase_running": 1,
786 + "pod_default_pod02_phase_succeeded": 0,
787 }
788 copyAge(expected, mx)
789
@@ -661,6 +796,7 @@ func TestKubeState_Collect(t *testing.T) {
796 len(baseCharts),
797 len(*ks.Charts()),
798 )
799 + module.TestMetricsHasAllChartsDims(t, ks.Charts(), mx)
800 }
801
802 return testCase{
src/go/plugin/go.d/modules/k8s_state/metadata.yaml
+16 -2
@@ -347,10 +347,24 @@ modules:
347 unit: state
348 chart_type: line
349 dimensions:
350 - - name: a dimension per reason
350 + - name: PodInitializing
351 + - name: ContainerCreating
352 + - name: CrashLoopBackOff
353 + - name: CreateContainerConfigError
354 + - name: ErrImagePull
355 + - name: ImagePullBackOff
356 + - name: CreateContainerError
357 + - name: InvalidImageName
358 + - name: Other
359 - name: k8s_state.pod_container_terminated_state_reason
360 description: Container terminated state reason
361 unit: state
362 chart_type: line
363 dimensions:
356 - - name: a dimension per reason
364 + - name: OOMKilled
365 + - name: Completed
366 + - name: Error
367 + - name: ContainerCannotRun
368 + - name: DeadlineExceeded
369 + - name: Evicted
370 + - name: Other
src/go/plugin/go.d/modules/k8s_state/state.go
+17 -25
@@ -36,9 +36,7 @@ func newPodState() *podState {
36
37 func newContainerState() *containerState {
38 return &containerState{
39 - new: true,
40 - stateWaitingReasons: make(map[string]*containerStateReason),
41 - stateTerminatedReasons: make(map[string]*containerStateReason),
39 + new: true,
40 }
41 }
42
@@ -138,28 +136,22 @@ type (
136
137 func (ps podState) id() string { return ps.namespace + "_" + ps.name }
138
141 -type (
142 - containerState struct {
143 - new bool
139 +type containerState struct {
140 + new bool
141
145 - name string
146 - uid string
142 + name string
143 + uid string
144
148 - podName string
149 - nodeName string
150 - namespace string
145 + podName string
146 + nodeName string
147 + namespace string
148
152 - ready bool
153 - restarts int64
154 - stateRunning bool
155 - stateWaiting bool
156 - stateTerminated bool
157 - stateWaitingReasons map[string]*containerStateReason
158 - stateTerminatedReasons map[string]*containerStateReason
159 - }
160 - containerStateReason struct {
161 - new bool
162 - reason string
163 - active bool
164 - }
165 -)
149 + ready bool
150 + restarts int64
151 + stateRunning bool
152 + stateWaiting bool
153 + stateTerminated bool
154 +
155 + waitingReason string
156 + terminatedReason string
157 +}
src/go/plugin/go.d/modules/k8s_state/update_pod_state.go
+2 -24
@@ -79,15 +79,6 @@ func (ks *KubeState) updatePodState(r resource) {
79
80 ps.phase = pod.Status.Phase
81
82 - for _, cs := range ps.containers {
83 - for _, r := range cs.stateWaitingReasons {
84 - r.active = false
85 - }
86 - for _, r := range cs.stateTerminatedReasons {
87 - r.active = false
88 - }
89 - }
90 -
82 for _, cntr := range pod.Status.ContainerStatuses {
83 cs, ok := ps.containers[cntr.Name]
84 if !ok {
@@ -108,23 +99,10 @@ func (ks *KubeState) updatePodState(r resource) {
99 cs.stateTerminated = cntr.State.Terminated != nil
100
101 if cntr.State.Waiting != nil {
111 - reason := cntr.State.Waiting.Reason
112 - r, ok := cs.stateWaitingReasons[reason]
113 - if !ok {
114 - r = &containerStateReason{new: true, reason: reason}
115 - cs.stateWaitingReasons[reason] = r
116 - }
117 - r.active = true
102 + cs.waitingReason = cntr.State.Waiting.Reason
103 }
119 -
104 if cntr.State.Terminated != nil {
121 - reason := cntr.State.Terminated.Reason
122 - r, ok := cs.stateTerminatedReasons[reason]
123 - if !ok {
124 - r = &containerStateReason{new: true, reason: reason}
125 - cs.stateTerminatedReasons[reason] = r
126 - }
127 - r.active = true
105 + cs.terminatedReason = cntr.State.Terminated.Reason
106 }
107 }
108