Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/metrics/workload/pod-metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,14 @@
| kube_pod_deletion_timestamp | Gauge | Unix deletion timestamp | seconds | `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `uid`=&lt;pod-uid&gt; | EXPERIMENTAL | - |
| kube_pod_restart_policy | Gauge | Describes the restart policy in use by this pod | | `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `type`=&lt;Always\|Never\|OnFailure&gt; <br> `uid`=&lt;pod-uid&gt; | STABLE | - |
| kube_pod_init_container_info | Gauge | Information about an init container in a pod | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `image`=&lt;image-name&gt; <br> `image_id`=&lt;image-id&gt; <br> `image_spec`=&lt;image-spec&gt; <br> `container_id`=&lt;containerid&gt; <br> `uid`=&lt;pod-uid&gt; <br> `restart_policy`=&lt;restart-policy&gt; | STABLE | - |
| kube_pod_init_container_state_started | Gauge | Start time in unix timestamp for a pod init container | seconds | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `uid`=&lt;pod-uid&gt; | EXPERIMENTAL | - |
| kube_pod_init_container_status_waiting | Gauge | Describes whether the init container is currently in waiting state | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `uid`=&lt;pod-uid&gt; | STABLE | - |
| kube_pod_init_container_status_waiting_reason | Gauge | Describes the reason the init container is currently in waiting state | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `reason`=&lt;container-waiting-reason&gt; <br> `uid`=&lt;pod-uid&gt; | EXPERIMENTAL | - |
| kube_pod_init_container_status_running | Gauge | Describes whether the init container is currently in running state | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `uid`=&lt;pod-uid&gt; | STABLE | - |
| kube_pod_init_container_status_terminated | Gauge | Describes whether the init container is currently in terminated state | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `uid`=&lt;pod-uid&gt; | STABLE | - |
| kube_pod_init_container_status_terminated_reason | Gauge | Describes the reason the init container is currently in terminated state | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `reason`=&lt;container-terminated-reason&gt; <br> `uid`=&lt;pod-uid&gt; | EXPERIMENTAL | - |
| kube_pod_init_container_status_last_terminated_reason | Gauge | Describes the last reason the init container was in terminated state | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `reason`=&lt;last-terminated-reason&gt; <br> `uid`=&lt;pod-uid&gt; | EXPERIMENTAL | - |
| kube_pod_init_container_status_last_terminated_timestamp | Gauge | Last terminated time for a pod init container in unix timestamp | seconds | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `uid`=&lt;pod-uid&gt; | EXPERIMENTAL | - |
| kube_pod_init_container_status_ready | Gauge | Describes whether the init containers readiness check succeeded | | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `uid`=&lt;pod-uid&gt; | STABLE | - |
| kube_pod_init_container_status_restarts_total | Counter | The number of restarts for the init container | integer | `container`=&lt;container-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `pod`=&lt;pod-name&gt; <br> `uid`=&lt;pod-uid&gt; | STABLE | - |
| kube_pod_init_container_resource_limits | Gauge | The number of CPU cores requested limit by an init container | `cpu`=&lt;core&gt; <br> `memory`=&lt;bytes&gt; | `resource`=&lt;resource-name&gt; <br> `unit`=&lt;resource-unit&gt; <br> `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `node`=&lt; node-name&gt; <br> `uid`=&lt;pod-uid&gt; | EXPERIMENTAL | - |
Expand Down
61 changes: 61 additions & 0 deletions internal/store/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ func podMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generat
createPodInitContainerInfoFamilyGenerator(),
createPodInitContainerResourceLimitsFamilyGenerator(),
createPodInitContainerResourceRequestsFamilyGenerator(),
createPodInitContainerStateStartedFamilyGenerator(),
createPodInitContainerStatusLastTerminatedReasonFamilyGenerator(),
createPodInitContainerStatusLastTerminatedTimestampFamilyGenerator(),
createPodInitContainerStatusReadyFamilyGenerator(),
createPodInitContainerStatusRestartsTotalFamilyGenerator(),
createPodInitContainerStatusRunningFamilyGenerator(),
Expand Down Expand Up @@ -1061,6 +1063,65 @@ func createPodInitContainerStatusWaitingReasonFamilyGenerator() generator.Family
)
}

func createPodInitContainerStateStartedFamilyGenerator() generator.FamilyGenerator {
return *generator.NewFamilyGeneratorWithStability(
"kube_pod_init_container_state_started",
"Start time in unix timestamp for a pod init container.",
metric.Gauge,
basemetrics.ALPHA,
"",
wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := []*metric.Metric{}

for _, cs := range p.Status.InitContainerStatuses {
if cs.State.Running != nil {
ms = append(ms, &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: float64((cs.State.Running.StartedAt).Unix()),
})
} else if cs.State.Terminated != nil {
ms = append(ms, &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: float64((cs.State.Terminated.StartedAt).Unix()),
})
}
}

return &metric.Family{
Metrics: ms,
}
}),
)
}

func createPodInitContainerStatusLastTerminatedTimestampFamilyGenerator() generator.FamilyGenerator {
return *generator.NewFamilyGeneratorWithStability(
"kube_pod_init_container_status_last_terminated_timestamp",
"Last terminated time for a pod init container in unix timestamp.",
metric.Gauge,
basemetrics.ALPHA,
"",
wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, 0, len(p.Status.InitContainerStatuses))
for _, cs := range p.Status.InitContainerStatuses {
if cs.LastTerminationState.Terminated != nil {
ms = append(ms, &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: float64(cs.LastTerminationState.Terminated.FinishedAt.Unix()),
})
}
}

return &metric.Family{
Metrics: ms,
}
}),
)
}

func createPodAnnotationsGenerator(allowAnnotations []string) generator.FamilyGenerator {
return *generator.NewFamilyGeneratorWithStability(
"kube_pod_annotations",
Expand Down
108 changes: 107 additions & 1 deletion internal/store/pod_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2282,6 +2282,112 @@ func TestPodStore(t *testing.T) {
"kube_pod_scheduler",
},
},
{
Obj: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "pod8",
Namespace: "ns8",
UID: "uid8",
},
Spec: v1.PodSpec{
InitContainers: []v1.Container{
{
Name: "initcontainer1",
Image: "k8s.gcr.io/init1_spec",
},
{
Name: "initcontainer2",
Image: "k8s.gcr.io/init2_spec",
},
},
},
Status: v1.PodStatus{
InitContainerStatuses: []v1.ContainerStatus{
{
Name: "initcontainer1",
State: v1.ContainerState{
Running: &v1.ContainerStateRunning{
StartedAt: metav1.Time{
Time: time.Unix(1501777018, 0),
},
},
},
},
{
Name: "initcontainer2",
State: v1.ContainerState{
Terminated: &v1.ContainerStateTerminated{
StartedAt: metav1.Time{
Time: time.Unix(1501777018, 0),
},
},
},
},
},
},
},
Want: `
# HELP kube_pod_init_container_state_started Start time in unix timestamp for a pod init container.
# TYPE kube_pod_init_container_state_started gauge
kube_pod_init_container_state_started{container="initcontainer1",namespace="ns8",pod="pod8",uid="uid8"} 1.501777018e+09
kube_pod_init_container_state_started{container="initcontainer2",namespace="ns8",pod="pod8",uid="uid8"} 1.501777018e+09
`,
MetricNames: []string{
"kube_pod_init_container_state_started",
},
},
{
Obj: &v1.Pod{
ObjectMeta: metav1.ObjectMeta{
Name: "pod9",
Namespace: "ns9",
UID: "uid9",
},
Spec: v1.PodSpec{
InitContainers: []v1.Container{
{
Name: "initcontainer1",
Image: "k8s.gcr.io/init1_spec",
},
},
},
Status: v1.PodStatus{
InitContainerStatuses: []v1.ContainerStatus{
{
Name: "initcontainer1",
State: v1.ContainerState{
Running: &v1.ContainerStateRunning{
StartedAt: metav1.Time{
Time: time.Unix(1501777018, 0),
},
},
},
LastTerminationState: v1.ContainerState{
Terminated: &v1.ContainerStateTerminated{
Reason: "OOMKilled",
ExitCode: 137,
FinishedAt: metav1.Time{
Time: time.Unix(1501779547, 0),
},
},
},
},
},
},
},
Want: `
# HELP kube_pod_init_container_state_started Start time in unix timestamp for a pod init container.
# HELP kube_pod_init_container_status_last_terminated_timestamp Last terminated time for a pod init container in unix timestamp.
# TYPE kube_pod_init_container_state_started gauge
# TYPE kube_pod_init_container_status_last_terminated_timestamp gauge
kube_pod_init_container_state_started{container="initcontainer1",namespace="ns9",pod="pod9",uid="uid9"} 1.501777018e+09
kube_pod_init_container_status_last_terminated_timestamp{container="initcontainer1",namespace="ns9",pod="pod9",uid="uid9"} 1.501779547e+09
`,
MetricNames: []string{
"kube_pod_init_container_state_started",
"kube_pod_init_container_status_last_terminated_timestamp",
},
},
}

for i, c := range cases {
Expand Down Expand Up @@ -2386,7 +2492,7 @@ func BenchmarkPodStore(b *testing.B) {
},
}

expectedFamilies := 55
expectedFamilies := 57
for n := 0; n < b.N; n++ {
families := f(pod)
if len(families) != expectedFamilies {
Expand Down
4 changes: 4 additions & 0 deletions pkg/app/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,9 @@ func TestFullScrapeCycle(t *testing.T) {
# HELP kube_pod_init_container_info [STABLE] Information about an init container in a pod.
# HELP kube_pod_init_container_resource_limits The number of requested limit resource by an init container.
# HELP kube_pod_init_container_resource_requests The number of requested request resource by an init container.
# HELP kube_pod_init_container_state_started Start time in unix timestamp for a pod init container.
# HELP kube_pod_init_container_status_last_terminated_reason Describes the last reason the init container was in terminated state.
# HELP kube_pod_init_container_status_last_terminated_timestamp Last terminated time for a pod init container in unix timestamp.
# HELP kube_pod_init_container_status_ready [STABLE] Describes whether the init containers readiness check succeeded.
# HELP kube_pod_init_container_status_restarts_total [STABLE] The number of restarts for the init container.
# HELP kube_pod_init_container_status_running [STABLE] Describes whether the init container is currently in running state.
Expand Down Expand Up @@ -283,7 +285,9 @@ func TestFullScrapeCycle(t *testing.T) {
# TYPE kube_pod_init_container_info gauge
# TYPE kube_pod_init_container_resource_limits gauge
# TYPE kube_pod_init_container_resource_requests gauge
# TYPE kube_pod_init_container_state_started gauge
# TYPE kube_pod_init_container_status_last_terminated_reason gauge
# TYPE kube_pod_init_container_status_last_terminated_timestamp gauge
# TYPE kube_pod_init_container_status_ready gauge
# TYPE kube_pod_init_container_status_restarts_total counter
# TYPE kube_pod_init_container_status_running gauge
Expand Down