Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add pod init container metrics #762

Merged
merged 1 commit into from
May 28, 2019
Merged
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
11 changes: 11 additions & 0 deletions docs/pod-metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,17 @@
| kube_pod_container_resource_limits | Gauge | `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; | STABLE |
| kube_pod_container_resource_limits_memory_bytes | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `node`=&lt; node-name&gt; | DEPRECATED |
| kube_pod_created | Gauge | `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; |
| kube_pod_init_container_info | Gauge | `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> `container_id`=&lt;containerid&gt; | STABLE |
| kube_pod_init_container_status_waiting | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; | STABLE |
| kube_pod_init_container_status_waiting_reason | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `reason`=&lt;ContainerCreating\|CrashLoopBackOff\|ErrImagePull\|ImagePullBackOff\|CreateContainerConfigError&gt; | STABLE |
| kube_pod_init_container_status_running | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; | STABLE |
| kube_pod_init_container_status_terminated | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; | STABLE |
| kube_pod_init_container_status_terminated_reason | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `reason`=&lt;OOMKilled\|Error\|Completed\|ContainerCannotRun\|DeadlineExceeded&gt; | STABLE |
| kube_pod_init_container_status_last_terminated_reason | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `reason`=&lt;OOMKilled\|Error\|Completed\|ContainerCannotRun\|DeadlineExceeded&gt; | STABLE |
| kube_pod_init_container_status_ready | Gauge | `container`=&lt;container-name&gt; <br> `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; | STABLE |
| kube_pod_init_container_status_restarts_total | Counter | `container`=&lt;container-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `pod`=&lt;pod-name&gt; | STABLE |
| kube_pod_init_container_resource_requests | Gauge | `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; | STABLE |
| kube_pod_init_container_resource_limits | Gauge | `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; | STABLE |
| kube_pod_spec_volumes_persistentvolumeclaims_info | Gauge | `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `volume`=&lt;volume-name&gt; <br> `persistentvolumeclaim`=&lt;persistentvolumeclaim-claimname&gt; | STABLE |
| kube_pod_spec_volumes_persistentvolumeclaims_readonly | Gauge | `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; <br> `volume`=&lt;volume-name&gt; <br> `persistentvolumeclaim`=&lt;persistentvolumeclaim-claimname&gt; | STABLE |
| kube_pod_status_scheduled_time | Gauge | `pod`=&lt;pod-name&gt; <br> `namespace`=&lt;pod-namespace&gt; | STABLE |
268 changes: 268 additions & 0 deletions internal/collector/pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,27 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_info",
Type: metric.Gauge,
Help: "Information about an init container in a pod.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses))
labelKeys := []string{"container", "image", "image_id", "container_id"}

for i, cs := range p.Status.InitContainerStatuses {
ms[i] = &metric.Metric{
LabelKeys: labelKeys,
LabelValues: []string{cs.Name, cs.Image, cs.ImageID, cs.ContainerID},
Value: 1,
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_waiting",
Type: metric.Gauge,
Expand All @@ -353,6 +374,26 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_waiting",
Type: metric.Gauge,
Help: "Describes whether the init container is currently in waiting state.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses))

for i, cs := range p.Status.InitContainerStatuses {
ms[i] = &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: boolFloat64(cs.State.Waiting != nil),
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_waiting_reason",
Type: metric.Gauge,
Expand All @@ -375,6 +416,28 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_waiting_reason",
Type: metric.Gauge,
Help: "Describes the reason the init container is currently in waiting state.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses)*len(containerWaitingReasons))

for i, cs := range p.Status.InitContainerStatuses {
for j, reason := range containerWaitingReasons {
ms[i*len(containerWaitingReasons)+j] = &metric.Metric{
LabelKeys: []string{"container", "reason"},
LabelValues: []string{cs.Name, reason},
Value: boolFloat64(waitingReason(cs, reason)),
}
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_running",
Type: metric.Gauge,
Expand All @@ -395,6 +458,26 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_running",
Type: metric.Gauge,
Help: "Describes whether the init container is currently in running state.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses))

for i, cs := range p.Status.InitContainerStatuses {
ms[i] = &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: boolFloat64(cs.State.Running != nil),
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_terminated",
Type: metric.Gauge,
Expand All @@ -415,6 +498,26 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_terminated",
Type: metric.Gauge,
Help: "Describes whether the init container is currently in terminated state.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses))

for i, cs := range p.Status.InitContainerStatuses {
ms[i] = &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: boolFloat64(cs.State.Terminated != nil),
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_terminated_reason",
Type: metric.Gauge,
Expand All @@ -437,6 +540,28 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_terminated_reason",
Type: metric.Gauge,
Help: "Describes the reason the init container is currently in terminated state.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses)*len(containerTerminatedReasons))

for i, cs := range p.Status.InitContainerStatuses {
for j, reason := range containerTerminatedReasons {
ms[i*len(containerTerminatedReasons)+j] = &metric.Metric{
LabelKeys: []string{"container", "reason"},
LabelValues: []string{cs.Name, reason},
Value: boolFloat64(terminationReason(cs, reason)),
}
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_last_terminated_reason",
Type: metric.Gauge,
Expand All @@ -459,6 +584,28 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_last_terminated_reason",
Type: metric.Gauge,
Help: "Describes the last reason the init container was in terminated state.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses)*len(containerTerminatedReasons))

for i, cs := range p.Status.InitContainerStatuses {
for j, reason := range containerTerminatedReasons {
ms[i*len(containerTerminatedReasons)+j] = &metric.Metric{
LabelKeys: []string{"container", "reason"},
LabelValues: []string{cs.Name, reason},
Value: boolFloat64(lastTerminationReason(cs, reason)),
}
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_ready",
Type: metric.Gauge,
Expand All @@ -479,6 +626,26 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_ready",
Type: metric.Gauge,
Help: "Describes whether the init containers readiness check succeeded.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses))

for i, cs := range p.Status.InitContainerStatuses {
ms[i] = &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: boolFloat64(cs.Ready),
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_status_restarts_total",
Type: metric.Counter,
Expand All @@ -499,6 +666,26 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_status_restarts_total",
Type: metric.Counter,
Help: "The number of restarts for the init container.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := make([]*metric.Metric, len(p.Status.InitContainerStatuses))

for i, cs := range p.Status.InitContainerStatuses {
ms[i] = &metric.Metric{
LabelKeys: []string{"container"},
LabelValues: []string{cs.Name},
Value: float64(cs.RestartCount),
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_resource_requests",
Type: metric.Gauge,
Expand Down Expand Up @@ -615,6 +802,64 @@ var (
}
}),
},
{
Name: "kube_pod_init_container_resource_limits",
Type: metric.Gauge,
Help: "The number of requested limit resource by the init container.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := []*metric.Metric{}

for _, c := range p.Spec.InitContainers {
lim := c.Resources.Limits

for resourceName, val := range lim {
switch resourceName {
case v1.ResourceCPU:
ms = append(ms, &metric.Metric{
Value: float64(val.MilliValue()) / 1000,
LabelValues: []string{c.Name, p.Spec.NodeName, sanitizeLabelName(string(resourceName)), string(constant.UnitCore)},
})
case v1.ResourceStorage:
fallthrough
case v1.ResourceEphemeralStorage:
fallthrough
case v1.ResourceMemory:
ms = append(ms, &metric.Metric{
LabelValues: []string{c.Name, p.Spec.NodeName, sanitizeLabelName(string(resourceName)), string(constant.UnitByte)},
Value: float64(val.Value()),
})
default:
if isHugePageResourceName(resourceName) {
ms = append(ms, &metric.Metric{
LabelValues: []string{c.Name, p.Spec.NodeName, sanitizeLabelName(string(resourceName)), string(constant.UnitByte)},
Value: float64(val.Value()),
})
}
if isAttachableVolumeResourceName(resourceName) {
ms = append(ms, &metric.Metric{
Value: float64(val.Value()),
LabelValues: []string{c.Name, p.Spec.NodeName, sanitizeLabelName(string(resourceName)), string(constant.UnitByte)},
})
}
if isExtendedResourceName(resourceName) {
ms = append(ms, &metric.Metric{
Value: float64(val.Value()),
LabelValues: []string{c.Name, p.Spec.NodeName, sanitizeLabelName(string(resourceName)), string(constant.UnitInteger)},
})
}
}
}
}

for _, metric := range ms {
metric.LabelKeys = []string{"container", "node", "resource", "unit"}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_resource_requests_cpu_cores",
Type: metric.Gauge,
Expand All @@ -638,6 +883,29 @@ var (
}
}),
},
{
Name: "kube_init_pod_container_resource_requests_cpu_cores",
Type: metric.Gauge,
Help: "The number of requested cpu cores by an init container.",
GenerateFunc: wrapPodFunc(func(p *v1.Pod) *metric.Family {
ms := []*metric.Metric{}

for _, c := range p.Spec.InitContainers {
req := c.Resources.Requests
if cpu, ok := req[v1.ResourceCPU]; ok {
ms = append(ms, &metric.Metric{
LabelKeys: []string{"container", "node"},
LabelValues: []string{c.Name, p.Spec.NodeName},
Value: float64(cpu.MilliValue()) / 1000,
})
}
}

return &metric.Family{
Metrics: ms,
}
}),
},
{
Name: "kube_pod_container_resource_requests_memory_bytes",
Type: metric.Gauge,
Expand Down
Loading