plugins/processors/awsentity/internal/k8sattributescraper/k8sattributescraper.go (82 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT
package k8sattributescraper
import (
"go.opentelemetry.io/collector/pdata/pcommon"
semconv "go.opentelemetry.io/collector/semconv/v1.22.0"
"github.com/aws/amazon-cloudwatch-agent/internal/k8sCommon/k8sclient"
)
var (
namespaceAllowlist = []string{
semconv.AttributeK8SNamespaceName,
}
// these kubernetes resource attributes are set by the openTelemtry operator
// see the code referecnes from upstream:
// * https://github.com/open-telemetry/opentelemetry-operator/blame/main/pkg/instrumentation/sdk.go#L421
workloadAllowlist = []string{
semconv.AttributeK8SDeploymentName,
semconv.AttributeK8SReplicaSetName,
semconv.AttributeK8SStatefulSetName,
semconv.AttributeK8SDaemonSetName,
semconv.AttributeK8SCronJobName,
semconv.AttributeK8SJobName,
semconv.AttributeK8SPodName,
semconv.AttributeK8SContainerName,
}
nodeAllowlist = []string{
semconv.AttributeK8SNodeName,
}
)
type K8sAttributeScraper struct {
Cluster string
Namespace string
Workload string
Node string
}
func NewK8sAttributeScraper(clusterName string) *K8sAttributeScraper {
return &K8sAttributeScraper{
Cluster: clusterName,
}
}
func (e *K8sAttributeScraper) Scrape(rm pcommon.Resource, podMeta k8sclient.PodMetadata) {
resourceAttrs := rm.Attributes()
e.scrapeNamespace(resourceAttrs, podMeta.Namespace)
e.scrapeWorkload(resourceAttrs, podMeta.Workload)
e.scrapeNode(resourceAttrs, podMeta.Node)
}
func (e *K8sAttributeScraper) scrapeNamespace(p pcommon.Map, ns string) {
for _, namespace := range namespaceAllowlist {
if namespaceAttr, ok := p.Get(namespace); ok {
e.Namespace = namespaceAttr.Str()
return
}
}
if ns != "" {
e.Namespace = ns
return
}
}
func (e *K8sAttributeScraper) scrapeWorkload(p pcommon.Map, wl string) {
for _, workload := range workloadAllowlist {
if workloadAttr, ok := p.Get(workload); ok {
e.Workload = workloadAttr.Str()
return
}
}
if wl != "" {
e.Workload = wl
return
}
}
func (e *K8sAttributeScraper) scrapeNode(p pcommon.Map, nd string) {
for _, node := range nodeAllowlist {
if nodeAttr, ok := p.Get(node); ok {
e.Node = nodeAttr.Str()
return
}
}
if nd != "" {
e.Node = nd
return
}
}
func (e *K8sAttributeScraper) Reset() {
*e = K8sAttributeScraper{
Cluster: e.Cluster,
}
}