gke

package
v0.4.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 30, 2024 License: Apache-2.0 Imports: 14 Imported by: 0

README

GKE Module

Collects and exports costs associated with GKE instances. It's built on top of main of the same primitives as the GCP module. Specifically we share

  • PricingMap
  • MachineSpec
  • ListInstances

What differs between the two is that the module will filter out instances that are not GKE instances. This is done by checking the labels field of the instance and looking for the cluster name. If no cluster name is found, the instance is not considered a GKE instance and is filtered out.

The primary motivation for this module was to ensure we could support the following cases with ease:

  1. Collecting costs for GKE instances
  2. Collecting costs for Compute instances that may not be a GKE instance
  3. Collecting costs for Persistent Volumes that may be attached to a GKE instance

See the Design Doc for the rationale for a separate module. TL;DR; We do not want to emit metrics with a exporter_cluster label that is empty or make the setup process more complex needed.

Disk Pricing

Running the gke module also collects costs associated with Persistent Volumes. Persistent Volumes are attached to GKE instances and are billed as disks. The price is based off of a combination of the following attributes:

  • region
  • disk type
  • disk size

For simplicity, cloudcost-exporter has implemented the following disk types:

  • Standard(hard disk drives)
  • SSD(solid state drives)
  • Local SSD

According to the documentation, pricing for storage is for JEDEC Binary GB or IEC gibibytes(GiB). One of the more confusing bits is that the documentation for disk implies that the size is in GB, but doesn't specify if it's a decimal GB or Binary GB. cloudcost-exporter is assuming that the size is in binary GB which aligns with the pricing documentation.

Documentation

Index

Constants

View Source
const (
	BootDiskLabel = "goog-gke-node"
)

Variables

This section is empty.

Functions

func ListDisks

func ListDisks(project string, zone string, service *compute.Service) ([]*compute.Disk, error)

ListDisks will list all disks in a given zone and return a slice of compute.Disk

Types

type Collector

type Collector struct {
	Projects          []string
	ComputePricingMap *gcpCompute.StructuredPricingMap
	NextScrape        time.Time
	// contains filtered or unexported fields
}

func New

func New(config *Config, computeService *compute.Service, billingService *billingv1.CloudCatalogClient) *Collector

func (*Collector) CheckReadiness added in v0.3.0

func (c *Collector) CheckReadiness() bool

func (*Collector) Collect

func (c *Collector) Collect(ch chan<- prometheus.Metric) error

func (*Collector) CollectMetrics

func (c *Collector) CollectMetrics(ch chan<- prometheus.Metric) float64

func (*Collector) Describe

func (c *Collector) Describe(ch chan<- *prometheus.Desc) error

func (*Collector) Name

func (c *Collector) Name() string

func (*Collector) Register

func (c *Collector) Register(_ provider.Registry) error

type Config

type Config struct {
	Projects       string
	ScrapeInterval time.Duration
}

type Disk

type Disk struct {
	Cluster string

	Project string

	Size int64
	// contains filtered or unexported fields
}

func NewDisk

func NewDisk(disk *compute.Disk, project string) *Disk

func (Disk) DiskType

func (d Disk) DiskType() string

DiskType will search through the labels to determine the type of disk. If the disk has a label "goog-gke-node" it will return "boot_disk" Otherwise it returns persistent_volume

func (Disk) Name

func (d Disk) Name() string

Name will return the name of the disk. If the disk has a label "kubernetes.io/created-for/pv/name" it will return the value stored in that key. otherwise it will return the disk name that is directly associated with the disk.

func (Disk) Namespace

func (d Disk) Namespace() string

Namespace will search through the description fields for the namespace of the disk. If the namespace can't be determined An empty string is return.

func (Disk) Region

func (d Disk) Region() string

Region will return the region of the disk by search through the zone field and returning the region. If the region can't be determined It will return an empty string

func (Disk) StorageClass

func (d Disk) StorageClass() string

StorageClass will return the storage class of the disk by looking at the type. Type in GCP is represented as a URL and as such we're looking for the last part of the URL to determine the storage class

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL