88 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package kube_inventory
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	"github.com/ericchiang/k8s/apis/core/v1"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| )
 | |
| 
 | |
| func collectPods(ctx context.Context, acc telegraf.Accumulator, ki *KubernetesInventory) {
 | |
| 	list, err := ki.client.getPods(ctx)
 | |
| 	if err != nil {
 | |
| 		acc.AddError(err)
 | |
| 		return
 | |
| 	}
 | |
| 	for _, p := range list.Items {
 | |
| 		if err = ki.gatherPod(*p, acc); err != nil {
 | |
| 			acc.AddError(err)
 | |
| 			return
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (ki *KubernetesInventory) gatherPod(p v1.Pod, acc telegraf.Accumulator) error {
 | |
| 	if p.Metadata.CreationTimestamp.GetSeconds() == 0 && p.Metadata.CreationTimestamp.GetNanos() == 0 {
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	for i, cs := range p.Status.ContainerStatuses {
 | |
| 		c := p.Spec.Containers[i]
 | |
| 		gatherPodContainer(*p.Spec.NodeName, p, *cs, *c, acc)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func gatherPodContainer(nodeName string, p v1.Pod, cs v1.ContainerStatus, c v1.Container, acc telegraf.Accumulator) {
 | |
| 	stateCode := 3
 | |
| 	state := "unknown"
 | |
| 	switch {
 | |
| 	case cs.State.Running != nil:
 | |
| 		stateCode = 0
 | |
| 		state = "running"
 | |
| 	case cs.State.Terminated != nil:
 | |
| 		stateCode = 1
 | |
| 		state = "terminated"
 | |
| 	case cs.State.Waiting != nil:
 | |
| 		stateCode = 2
 | |
| 		state = "waiting"
 | |
| 	}
 | |
| 
 | |
| 	fields := map[string]interface{}{
 | |
| 		"restarts_total":    cs.GetRestartCount(),
 | |
| 		"state_code":        stateCode,
 | |
| 		"terminated_reason": cs.State.Terminated.GetReason(),
 | |
| 	}
 | |
| 	tags := map[string]string{
 | |
| 		"container_name": *c.Name,
 | |
| 		"namespace":      *p.Metadata.Namespace,
 | |
| 		"node_name":      *p.Spec.NodeName,
 | |
| 		"pod_name":       *p.Metadata.Name,
 | |
| 		"state":          state,
 | |
| 	}
 | |
| 
 | |
| 	req := c.Resources.Requests
 | |
| 	lim := c.Resources.Limits
 | |
| 
 | |
| 	for resourceName, val := range req {
 | |
| 		switch resourceName {
 | |
| 		case "cpu":
 | |
| 			fields["resource_requests_millicpu_units"] = convertQuantity(val.GetString_(), 1000)
 | |
| 		case "memory":
 | |
| 			fields["resource_requests_memory_bytes"] = convertQuantity(val.GetString_(), 1)
 | |
| 		}
 | |
| 	}
 | |
| 	for resourceName, val := range lim {
 | |
| 		switch resourceName {
 | |
| 		case "cpu":
 | |
| 			fields["resource_limits_millicpu_units"] = convertQuantity(val.GetString_(), 1000)
 | |
| 		case "memory":
 | |
| 			fields["resource_limits_memory_bytes"] = convertQuantity(val.GetString_(), 1)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	acc.AddFields(podContainerMeasurement, fields, tags)
 | |
| }
 |