Skip to content

Commit 72ff481

Browse files
andyxningbrancz
authored andcommitted
fix pod unknown stats
1 parent b1bf9a0 commit 72ff481

39 files changed

Lines changed: 15377 additions & 8 deletions

File tree

Godeps/Godeps.json

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

collectors/pod.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"k8s.io/api/core/v1"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"k8s.io/client-go/kubernetes"
29+
"k8s.io/kubernetes/pkg/util/node"
2930
)
3031

3132
var (
@@ -352,12 +353,14 @@ func (pc *podCollector) collectPod(ch chan<- prometheus.Metric, p v1.Pod) {
352353
labelKeys, labelValues := kubeLabelsToPrometheusLabels(p.Labels)
353354
addGauge(podLabelsDesc(labelKeys), 1, labelValues...)
354355

355-
if p := p.Status.Phase; p != "" {
356-
addGauge(descPodStatusPhase, boolFloat64(p == v1.PodPending), string(v1.PodPending))
357-
addGauge(descPodStatusPhase, boolFloat64(p == v1.PodRunning), string(v1.PodRunning))
358-
addGauge(descPodStatusPhase, boolFloat64(p == v1.PodSucceeded), string(v1.PodSucceeded))
359-
addGauge(descPodStatusPhase, boolFloat64(p == v1.PodFailed), string(v1.PodFailed))
360-
addGauge(descPodStatusPhase, boolFloat64(p == v1.PodUnknown), string(v1.PodUnknown))
356+
if phase := p.Status.Phase; phase != "" {
357+
addGauge(descPodStatusPhase, boolFloat64(phase == v1.PodPending), string(v1.PodPending))
358+
addGauge(descPodStatusPhase, boolFloat64(phase == v1.PodSucceeded), string(v1.PodSucceeded))
359+
addGauge(descPodStatusPhase, boolFloat64(phase == v1.PodFailed), string(v1.PodFailed))
360+
// This logic is directly copied from: https://github.com/kubernetes/kubernetes/blob/d39bfa0d138368bbe72b0eaf434501dcb4ec9908/pkg/printers/internalversion/printers.go#L597-L601
361+
// For more info, please go to: https://github.com/kubernetes/kube-state-metrics/issues/410
362+
addGauge(descPodStatusPhase, boolFloat64(phase == v1.PodRunning && !(p.DeletionTimestamp != nil && p.Status.Reason == node.NodeUnreachablePodReason)), string(v1.PodRunning))
363+
addGauge(descPodStatusPhase, boolFloat64(phase == v1.PodUnknown || (p.DeletionTimestamp != nil && p.Status.Reason == node.NodeUnreachablePodReason)), string(v1.PodUnknown))
361364
}
362365

363366
if !p.CreationTimestamp.IsZero() {

collectors/pod_test.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"k8s.io/api/core/v1"
2424
"k8s.io/apimachinery/pkg/api/resource"
2525
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26+
"k8s.io/kubernetes/pkg/util/node"
2627
)
2728

2829
type mockPodStore struct {
@@ -481,15 +482,35 @@ func TestPodCollector(t *testing.T) {
481482
Namespace: "ns1",
482483
},
483484
Status: v1.PodStatus{
484-
Phase: "Running",
485+
Phase: v1.PodRunning,
485486
},
486487
}, {
487488
ObjectMeta: metav1.ObjectMeta{
488489
Name: "pod2",
489490
Namespace: "ns2",
490491
},
491492
Status: v1.PodStatus{
492-
Phase: "Pending",
493+
Phase: v1.PodPending,
494+
},
495+
},
496+
{
497+
ObjectMeta: metav1.ObjectMeta{
498+
Name: "pod3",
499+
Namespace: "ns3",
500+
},
501+
Status: v1.PodStatus{
502+
Phase: v1.PodUnknown,
503+
},
504+
},
505+
{
506+
ObjectMeta: metav1.ObjectMeta{
507+
Name: "pod4",
508+
Namespace: "ns4",
509+
DeletionTimestamp: &metav1.Time{},
510+
},
511+
Status: v1.PodStatus{
512+
Phase: v1.PodRunning,
513+
Reason: node.NodeUnreachablePodReason,
493514
},
494515
},
495516
},
@@ -504,6 +525,16 @@ func TestPodCollector(t *testing.T) {
504525
kube_pod_status_phase{namespace="ns2",phase="Running",pod="pod2"} 0
505526
kube_pod_status_phase{namespace="ns2",phase="Succeeded",pod="pod2"} 0
506527
kube_pod_status_phase{namespace="ns2",phase="Unknown",pod="pod2"} 0
528+
kube_pod_status_phase{namespace="ns3",phase="Failed",pod="pod3"} 0
529+
kube_pod_status_phase{namespace="ns3",phase="Pending",pod="pod3"} 0
530+
kube_pod_status_phase{namespace="ns3",phase="Running",pod="pod3"} 0
531+
kube_pod_status_phase{namespace="ns3",phase="Succeeded",pod="pod3"} 0
532+
kube_pod_status_phase{namespace="ns3",phase="Unknown",pod="pod3"} 1
533+
kube_pod_status_phase{namespace="ns4",phase="Failed",pod="pod4"} 0
534+
kube_pod_status_phase{namespace="ns4",phase="Pending",pod="pod4"} 0
535+
kube_pod_status_phase{namespace="ns4",phase="Running",pod="pod4"} 0
536+
kube_pod_status_phase{namespace="ns4",phase="Succeeded",pod="pod4"} 0
537+
kube_pod_status_phase{namespace="ns4",phase="Unknown",pod="pod4"} 1
507538
`,
508539
metrics: []string{"kube_pod_status_phase"},
509540
}, {

vendor/golang.org/x/text/internal/gen.go

Lines changed: 52 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/golang.org/x/text/internal/internal.go

Lines changed: 51 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/golang.org/x/text/internal/match.go

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)