Skip to content

Commit

Permalink
Adding pod_status_unknown as a Pod condition metric and removed the p…
Browse files Browse the repository at this point in the history
…od_status_initialized metric (#66)

* Adding pod_status_unknown as a Pod condition metric and removed the pod_status_initialized metric
  • Loading branch information
nathalapooja committed Aug 1, 2023
1 parent e032a05 commit 10a8fba
Show file tree
Hide file tree
Showing 5 changed files with 235 additions and 77 deletions.
4 changes: 3 additions & 1 deletion internal/aws/containerinsight/const.go
Expand Up @@ -114,7 +114,6 @@ const (
StatusUnknown = "status_unknown"
StatusReady = "status_ready"
StatusScheduled = "status_scheduled"
StatusInitialized = "status_initialized"

RunningPodCount = "number_of_running_pods"
RunningContainerCount = "number_of_running_containers"
Expand Down Expand Up @@ -258,6 +257,9 @@ func init() {
StatusTerminated: UnitCount,
StatusWaiting: UnitCount,
StatusWaitingReasonCrashed: UnitCount,
StatusUnknown: UnitCount,
StatusReady: UnitCount,
StatusScheduled: UnitCount,

// cluster metrics
NodeCount: UnitCount,
Expand Down
81 changes: 42 additions & 39 deletions receiver/awscontainerinsightreceiver/README.md
Expand Up @@ -633,45 +633,48 @@ kubectl apply -f config.yaml
<br/><br/>

### Pod
| Metric | Unit |
|---------------------------------------|---------------|
| pod_cpu_limit | Millicore |
| pod_cpu_request | Millicore |
| pod_cpu_reserved_capacity | Percent |
| pod_cpu_usage_system | Millicore |
| pod_cpu_usage_total | Millicore |
| pod_cpu_usage_user | Millicore |
| pod_cpu_utilization | Percent |
| pod_cpu_utilization_over_pod_limit | Percent |
| pod_memory_cache | Bytes |
| pod_memory_failcnt | Count |
| pod_memory_hierarchical_pgfault | Count/Second |
| pod_memory_hierarchical_pgmajfault | Count/Second |
| pod_memory_limit | Bytes |
| pod_memory_mapped_file | Bytes |
| pod_memory_max_usage | Bytes |
| pod_memory_pgfault | Count/Second |
| pod_memory_pgmajfault | Count/Second |
| pod_memory_request | Bytes |
| pod_memory_reserved_capacity | Percent |
| pod_memory_rss | Bytes |
| pod_memory_swap | Bytes |
| pod_memory_usage | Bytes |
| pod_memory_utilization | Percent |
| pod_memory_utilization_over_pod_limit | Percent |
| pod_memory_working_set | Bytes |
| pod_network_rx_bytes | Bytes/Second |
| pod_network_rx_dropped | Count/Second |
| pod_network_rx_errors | Count/Second |
| pod_network_rx_packets | Count/Second |
| pod_network_total_bytes | Bytes/Second |
| pod_network_tx_bytes | Bytes/Second |
| pod_network_tx_dropped | Count/Second |
| pod_network_tx_errors | Count/Second |
| pod_network_tx_packets | Count/Second |
| pod_number_of_container_restarts | Count |
| pod_number_of_containers | Count |
| pod_number_of_running_containers | Count |
| Metric | Unit |
|---------------------------------------|--------------|
| pod_cpu_limit | Millicore |
| pod_cpu_request | Millicore |
| pod_cpu_reserved_capacity | Percent |
| pod_cpu_usage_system | Millicore |
| pod_cpu_usage_total | Millicore |
| pod_cpu_usage_user | Millicore |
| pod_cpu_utilization | Percent |
| pod_cpu_utilization_over_pod_limit | Percent |
| pod_memory_cache | Bytes |
| pod_memory_failcnt | Count |
| pod_memory_hierarchical_pgfault | Count/Second |
| pod_memory_hierarchical_pgmajfault | Count/Second |
| pod_memory_limit | Bytes |
| pod_memory_mapped_file | Bytes |
| pod_memory_max_usage | Bytes |
| pod_memory_pgfault | Count/Second |
| pod_memory_pgmajfault | Count/Second |
| pod_memory_request | Bytes |
| pod_memory_reserved_capacity | Percent |
| pod_memory_rss | Bytes |
| pod_memory_swap | Bytes |
| pod_memory_usage | Bytes |
| pod_memory_utilization | Percent |
| pod_memory_utilization_over_pod_limit | Percent |
| pod_memory_working_set | Bytes |
| pod_network_rx_bytes | Bytes/Second |
| pod_network_rx_dropped | Count/Second |
| pod_network_rx_errors | Count/Second |
| pod_network_rx_packets | Count/Second |
| pod_network_total_bytes | Bytes/Second |
| pod_network_tx_bytes | Bytes/Second |
| pod_network_tx_dropped | Count/Second |
| pod_network_tx_errors | Count/Second |
| pod_network_tx_packets | Count/Second |
| pod_number_of_container_restarts | Count |
| pod_number_of_containers | Count |
| pod_number_of_running_containers | Count |
| pod_status_ready | Count |
| pod_status_scheduled | Count |
| pod_status_unknown | Count |

| Resource Attribute |
|----------------------|
Expand Down
27 changes: 16 additions & 11 deletions receiver/awscontainerinsightreceiver/internal/stores/podstore.go
Expand Up @@ -53,14 +53,14 @@ var (
corev1.PodRunning: ci.MetricName(ci.TypePod, ci.StatusRunning),
corev1.PodSucceeded: ci.MetricName(ci.TypePod, ci.StatusSucceeded),
corev1.PodFailed: ci.MetricName(ci.TypePod, ci.StatusFailed),
corev1.PodUnknown: ci.MetricName(ci.TypePod, ci.StatusUnknown),
}

PodConditionMetricNames = map[corev1.PodConditionType]string{
corev1.PodReady: ci.MetricName(ci.TypePod, ci.StatusReady),
corev1.PodScheduled: ci.MetricName(ci.TypePod, ci.StatusScheduled),
corev1.PodInitialized: ci.MetricName(ci.TypePod, ci.StatusInitialized),
corev1.PodReady: ci.MetricName(ci.TypePod, ci.StatusReady),
corev1.PodScheduled: ci.MetricName(ci.TypePod, ci.StatusScheduled),
}

PodConditionUnknownMetric = ci.MetricName(ci.TypePod, ci.StatusUnknown)
)

type cachedEntry struct {
Expand Down Expand Up @@ -570,16 +570,21 @@ func (p *PodStore) addPodConditionMetrics(metric CIMetric, pod *corev1.Pod) {
metric.AddField(metricName, 0)
}

metric.AddField(PodConditionUnknownMetric, 0)

for _, condition := range pod.Status.Conditions {
if condition.Status != corev1.ConditionTrue {
continue
}

conditionKey := condition.Type
statusMetricName, conditionKeyValid := PodConditionMetricNames[conditionKey]
if conditionKeyValid {
metric.AddField(statusMetricName, 1)
switch condition.Status {
case corev1.ConditionTrue:
if statusMetricName, ok := PodConditionMetricNames[condition.Type]; ok {
metric.AddField(statusMetricName, 1)
}
case corev1.ConditionUnknown:
if _, ok := PodConditionMetricNames[condition.Type]; ok {
metric.AddField(PodConditionUnknownMetric, 1)
}
}

}
}

Expand Down
Expand Up @@ -339,14 +339,13 @@ func TestPodStore_addContainerCount(t *testing.T) {
}

const (
PodFailedMetricName = "pod_status_failed"
PodPendingMetricName = "pod_status_pending"
PodRunningMetricName = "pod_status_running"
PodSucceededMetricName = "pod_status_succeeded"
PodUnknownMetricName = "pod_status_unknown"
PodReadyMetricName = "pod_status_ready"
PodScheduledMetricName = "pod_status_scheduled"
PodInitializedMetricName = "pod_status_initialized"
PodFailedMetricName = "pod_status_failed"
PodPendingMetricName = "pod_status_pending"
PodRunningMetricName = "pod_status_running"
PodSucceededMetricName = "pod_status_succeeded"
PodUnknownMetricName = "pod_status_unknown"
PodReadyMetricName = "pod_status_ready"
PodScheduledMetricName = "pod_status_scheduled"
)

func TestPodStore_enhanced_metrics_disabled(t *testing.T) {
Expand All @@ -356,7 +355,6 @@ func TestPodStore_enhanced_metrics_disabled(t *testing.T) {
assert.False(t, decoratedResultMetric.HasField(PodPendingMetricName))
assert.False(t, decoratedResultMetric.HasField(PodRunningMetricName))
assert.False(t, decoratedResultMetric.HasField(PodSucceededMetricName))
assert.False(t, decoratedResultMetric.HasField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_pod_failed_metric(t *testing.T) {
Expand All @@ -366,7 +364,6 @@ func TestPodStore_addStatus_adds_pod_failed_metric(t *testing.T) {
assert.Equal(t, 0, decoratedResultMetric.GetField(PodPendingMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodRunningMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodSucceededMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_pod_pending_metric(t *testing.T) {
Expand All @@ -376,7 +373,6 @@ func TestPodStore_addStatus_adds_pod_pending_metric(t *testing.T) {
assert.Equal(t, 1, decoratedResultMetric.GetField(PodPendingMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodRunningMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodSucceededMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_pod_running_metric(t *testing.T) {
Expand All @@ -386,7 +382,6 @@ func TestPodStore_addStatus_adds_pod_running_metric(t *testing.T) {
assert.Equal(t, 0, decoratedResultMetric.GetField(PodPendingMetricName))
assert.Equal(t, 1, decoratedResultMetric.GetField(PodRunningMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodSucceededMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_pod_succeeded_metric(t *testing.T) {
Expand All @@ -396,41 +391,38 @@ func TestPodStore_addStatus_adds_pod_succeeded_metric(t *testing.T) {
assert.Equal(t, 0, decoratedResultMetric.GetField(PodPendingMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodRunningMetricName))
assert.Equal(t, 1, decoratedResultMetric.GetField(PodSucceededMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_pod_unknown_metric(t *testing.T) {
decoratedResultMetric := runAddStatusToGetDecoratedCIMetric("./test_resources/pod_in_phase_unknown.json", true)

assert.Equal(t, 0, decoratedResultMetric.GetField(PodFailedMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodPendingMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodRunningMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodSucceededMetricName))
assert.Equal(t, 1, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_enhanced_metrics_disabled(t *testing.T) {
decoratedResultMetric := runAddStatusToGetDecoratedCIMetric("./test_resources/all_pod_conditions_valid.json", false)

assert.False(t, decoratedResultMetric.HasField(PodInitializedMetricName))
assert.False(t, decoratedResultMetric.HasField(PodReadyMetricName))
assert.False(t, decoratedResultMetric.HasField(PodScheduledMetricName))
assert.False(t, decoratedResultMetric.HasField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_all_pod_conditions_as_metrics_when_true_false_unknown(t *testing.T) {
decoratedResultMetric := runAddStatusToGetDecoratedCIMetric("./test_resources/all_pod_conditions_valid.json", true)

assert.Equal(t, 1, decoratedResultMetric.GetField(PodInitializedMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodReadyMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodScheduledMetricName))
assert.Equal(t, 1, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_all_pod_conditions_as_metrics_when_Ready_Scheduled_Condition_Unknown(t *testing.T) {
decoratedResultMetric := runAddStatusToGetDecoratedCIMetric("./test_resources/pod_Ready_Scheduled_Condition_Unknown.json", true)

assert.Equal(t, 0, decoratedResultMetric.GetField(PodReadyMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodScheduledMetricName))
assert.Equal(t, 1, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_adds_all_pod_conditions_as_metrics_when_unexpected(t *testing.T) {
decoratedResultMetric := runAddStatusToGetDecoratedCIMetric("./test_resources/one_pod_condition_invalid.json", true)

assert.Equal(t, 0, decoratedResultMetric.GetField(PodInitializedMetricName))
assert.Equal(t, 1, decoratedResultMetric.GetField(PodReadyMetricName))
assert.Equal(t, 1, decoratedResultMetric.GetField(PodScheduledMetricName))
assert.Equal(t, 0, decoratedResultMetric.GetField(PodUnknownMetricName))
}

func TestPodStore_addStatus_enhanced_metrics(t *testing.T) {
Expand Down

0 comments on commit 10a8fba

Please sign in to comment.