event-exporter/sinks/stackdriver/monitored_resource_factory.go (92 lines of code) (raw):
package stackdriver
import (
sd "google.golang.org/api/logging/v2"
corev1 "k8s.io/api/core/v1"
)
type resourceModelVersion string
const (
newTypes = resourceModelVersion("new")
oldTypes = resourceModelVersion("old")
)
const (
//sd.MonitoredResource Old types:
gkeCluster = "gke_cluster"
//sd.MonitoredResource New types:
k8sCluster = "k8s_cluster"
k8sNode = "k8s_node"
k8sPod = "k8s_pod"
//sd.MonitoredResource Labels:=
clusterName = "cluster_name"
location = "location"
projectID = "project_id"
podName = "pod_name"
nodeName = "node_name"
namespaceName = "namespace_name"
//corev1.Event InvolvedObject.Kind:
pod = "Pod"
node = "Node"
)
// Constructs monitored resources.
type monitoredResourceFactory struct {
defaultResource *sd.MonitoredResource
resourceModel resourceModelVersion
// Common labels shared by all monitored resources.
commonLabels map[string]string
}
func newMonitoredResourceFactory(config *monitoredResourceFactoryConfig) *monitoredResourceFactory {
labels := commonLabels(config)
resource := &sd.MonitoredResource{
Labels: labels,
}
if config.resourceModel == oldTypes {
resource.Type = gkeCluster
} else {
resource.Type = k8sCluster
}
factory := &monitoredResourceFactory{
defaultResource: resource,
resourceModel: config.resourceModel,
commonLabels: labels,
}
return factory
}
func (f *monitoredResourceFactory) resourceFromEvent(event *corev1.Event) *sd.MonitoredResource {
if f.resourceModel == oldTypes {
return f.defaultResource
}
var monitoredResource *sd.MonitoredResource
switch event.InvolvedObject.Kind {
case pod:
monitoredResource = f.buildPodMonitoredResource(event)
case node:
monitoredResource = f.buildNodeMonitoredResource(event)
default:
monitoredResource = f.defaultResource
}
return monitoredResource
}
func (f *monitoredResourceFactory) buildPodMonitoredResource(event *corev1.Event) *sd.MonitoredResource {
labels := copyMap(f.commonLabels)
labels[podName] = event.InvolvedObject.Name
labels[namespaceName] = event.InvolvedObject.Namespace
return &sd.MonitoredResource{
Type: k8sPod,
Labels: labels,
}
}
func (f *monitoredResourceFactory) buildNodeMonitoredResource(event *corev1.Event) *sd.MonitoredResource {
labels := copyMap(f.commonLabels)
labels[nodeName] = event.InvolvedObject.Name
return &sd.MonitoredResource{
Type: k8sNode,
Labels: labels,
}
}
// copyMap returns a copy of an input map.
func copyMap(in map[string]string) map[string]string {
out := make(map[string]string)
for key, value := range in {
out[key] = value
}
return out
}
func commonLabels(config *monitoredResourceFactoryConfig) map[string]string {
labels := make(map[string]string)
labels[clusterName] = config.clusterName
labels[location] = config.location
labels[projectID] = config.projectID
return labels
}