cw-infra-apps/grafana/charts/feature-annotation-autodiscovery/templates/_pods.alloy.tpl

194 lines
5.6 KiB
Smarty

{{- define "feature.annotationAutodiscovery.pods" }}
discovery.kubernetes "pods" {
role = "pod"
{{- if .Values.namespaces }}
namespaces {
names = {{ .Values.namespaces | toJson }}
}
{{- end }}
{{- $labelSelectors := list }}
{{- range $k, $v := .Values.labelSelectors }}
{{- if kindIs "slice" $v }}
{{- $labelSelectors = append $labelSelectors (printf "%s in (%s)" $k (join "," $v)) }}
{{- else }}
{{- $labelSelectors = append $labelSelectors (printf "%s=%s" $k $v) }}
{{- end }}
{{- end }}
{{- range $k, $v := .Values.pods.labelSelectors }}
{{- if kindIs "slice" $v }}
{{- $labelSelectors = append $labelSelectors (printf "%s in (%s)" $k (join "," $v)) }}
{{- else }}
{{- $labelSelectors = append $labelSelectors (printf "%s=%s" $k $v) }}
{{- end }}
{{- end }}
{{- if $labelSelectors }}
selectors {
role = "pod"
label = {{ $labelSelectors | join "," | quote }}
}
{{- end }}
}
discovery.relabel "annotation_autodiscovery_pods" {
targets = discovery.kubernetes.pods.targets
{{- if .Values.excludeNamespaces }}
rule {
source_labels = ["__meta_kubernetes_namespace"]
regex = "{{ join "|" .Values.excludeNamespaces }}"
action = "drop"
}
{{- end }}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.scrape }}"]
regex = "true"
action = "keep"
}
// Only keep pods that are running, ready, and not init containers.
rule {
source_labels = [
"__meta_kubernetes_pod_phase",
"__meta_kubernetes_pod_ready",
"__meta_kubernetes_pod_container_init",
]
regex = "Running;true;false"
action = "keep"
}
rule {
source_labels = ["__meta_kubernetes_pod_name"]
target_label = "pod"
}
rule {
source_labels = ["__meta_kubernetes_pod_container_name"]
target_label = "container"
}
rule {
source_labels = ["__meta_kubernetes_namespace"]
target_label = "namespace"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.job }}"]
target_label = "job"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.instance }}"]
target_label = "instance"
}
// Rules to choose the right container
rule {
source_labels = ["container"]
target_label = "__tmp_container"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsContainer }}"]
regex = "(.+)"
target_label = "__tmp_container"
}
rule {
source_labels = ["container"]
action = "keepequal"
target_label = "__tmp_container"
}
rule {
action = "labeldrop"
regex = "__tmp_container"
}
// Set metrics path
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsPath }}"]
regex = "(.+)"
target_label = "__metrics_path__"
}
// Set metrics scraping URL parameters
rule {
action = "labelmap"
regex = "{{ include "pod_annotation" .Values.annotations.metricsParam }}_(.+)"
replacement = "__param_$1"
}
// Choose the pod port
// The discovery generates a target for each declared container port of the pod.
// If the metricsPortName annotation has value, keep only the target where the port name matches the one of the annotation.
rule {
source_labels = ["__meta_kubernetes_pod_container_port_name"]
target_label = "__tmp_port"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsPortName }}"]
regex = "(.+)"
target_label = "__tmp_port"
}
rule {
source_labels = ["__meta_kubernetes_pod_container_port_name"]
action = "keepequal"
target_label = "__tmp_port"
}
rule {
action = "labeldrop"
regex = "__tmp_port"
}
// If the metrics port number annotation has a value, override the target address to use it, regardless whether it is
// one of the declared ports on that Pod.
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsPortNumber }}", "__meta_kubernetes_pod_ip"]
regex = "(\\d+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})"
replacement = "[$2]:$1" // IPv6
target_label = "__address__"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsPortNumber }}", "__meta_kubernetes_pod_ip"]
regex = "(\\d+);((([0-9]+?)(\\.|$)){4})" // IPv4, takes priority over IPv6 when both exists
replacement = "$2:$1"
target_label = "__address__"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsScheme }}"]
regex = "(.+)"
target_label = "__scheme__"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsScrapeInterval }}"]
regex = "(.+)"
target_label = "__scrape_interval__"
}
rule {
source_labels = ["__scrape_interval__"]
regex = ""
replacement = {{ .Values.scrapeInterval | default .Values.global.scrapeInterval | quote }}
target_label = "__scrape_interval__"
}
rule {
source_labels = ["{{ include "pod_annotation" .Values.annotations.metricsScrapeTimeout }}"]
regex = "(.+)"
target_label = "__scrape_timeout__"
}
rule {
source_labels = ["__scrape_timeout__"]
regex = ""
replacement = {{ .Values.scrapeTimeout | default .Values.global.scrapeTimeout | quote }}
target_label = "__scrape_timeout__"
}
{{- range $metricLabel, $k8sLabel := .Values.pods.labels }}
rule {
source_labels = ["{{ include "pod_label" $k8sLabel }}"]
target_label = "{{ $metricLabel }}"
}
{{- end }}
{{- if or .Values.pods.staticLabels .Values.pods.staticLabelsFrom }}
rule {
target_label = "temp_source"
replacement = "pod"
}
{{- end }}
{{- if .Values.extraDiscoveryRules }}
{{ .Values.extraDiscoveryRules | indent 4 }}
{{- end }}
}
{{- end -}}