{{ define "agent.config.cadvisor.allowList" }}
{{ if .Values.metrics.cadvisor.metricsTuning.useDefaultAllowList }}
{{ "default_allow_lists/cadvisor.yaml" | .Files.Get }}
{{ end }}
{{ if .Values.metrics.cadvisor.metricsTuning.includeMetrics }}
{{ .Values.metrics.cadvisor.metricsTuning.includeMetrics | toYaml }}
{{ end }}
{{ end }}

{{ define "agent.config.cadvisor" }}
// cAdvisor
discovery.relabel "cadvisor" {
  targets = discovery.kubernetes.nodes.targets
  rule {
    target_label = "__address__"
    replacement  = "{{ .Values.cluster.kubernetesAPIService }}"
  }
  rule {
    source_labels = ["__meta_kubernetes_node_name"]
    regex         = "(.+)"
    replacement   = "/api/v1/nodes/${1}/proxy/metrics/cadvisor"
    target_label  = "__metrics_path__"
  }
{{- if .Values.metrics.extraRelabelingRules }}
{{ .Values.metrics.extraRelabelingRules | indent 2 }}
{{- end }}
{{- if .Values.metrics.cadvisor.extraRelabelingRules }}
{{ .Values.metrics.cadvisor.extraRelabelingRules | indent 2 }}
{{- end }}
}

prometheus.scrape "cadvisor" {
  job_name   = "integrations/kubernetes/cadvisor"
  targets    = discovery.relabel.cadvisor.output
  scheme     = "https"
  scrape_interval = {{ .Values.metrics.cadvisor.scrapeInterval | default .Values.metrics.scrapeInterval | quote }}
  bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"
  tls_config {
    insecure_skip_verify = true
  }
{{- if (index .Values "grafana-agent").agent.clustering.enabled }}
  clustering {
    enabled = true
  }
{{- end }}
  forward_to = [prometheus.relabel.cadvisor.receiver]
}

prometheus.relabel "cadvisor" {
{{- if or .Values.metrics.cadvisor.metricsTuning.useDefaultAllowList .Values.metrics.cadvisor.metricsTuning.includeMetrics }}
  rule {
    source_labels = ["__name__"]
    regex = "up|{{ join "|" (include "agent.config.cadvisor.allowList" . | fromYamlArray) }}"
    action = "keep"
  }
{{- end }}
{{- if .Values.metrics.cadvisor.metricsTuning.excludeMetrics }}
  rule {
    source_labels = ["__name__"]
    regex = {{ join "|" .Values.metrics.cadvisor.metricsTuning.excludeMetrics | quote }}
    action = "drop"
  }
{{- end }}
{{- if .Values.metrics.cadvisor.metricsTuning.dropEmptyContainerLabels }}
  // Drop empty container labels, addressing https://github.com/google/cadvisor/issues/2688
  rule {
    source_labels = ["__name__","container"]
    separator = "@"
    regex = "(container_cpu_.*|container_fs_.*|container_memory_.*)@"
    action = "drop"
  }
{{- end }}
{{- if .Values.metrics.cadvisor.metricsTuning.dropEmptyImageLabels }}
  // Drop empty image labels, addressing https://github.com/google/cadvisor/issues/2688
  rule {
    source_labels = ["__name__","image"]
    separator = "@"
    regex = "(container_cpu_.*|container_fs_.*|container_memory_.*|container_network_.*)@"
    action = "drop"
  }
{{- end }}
{{- if .Values.metrics.cadvisor.metricsTuning.normalizeUnnecessaryLabels }}
  // Normalizing unimportant labels (not deleting to continue satisfying <label>!="" checks)
  {{- range $i := .Values.metrics.cadvisor.metricsTuning.normalizeUnnecessaryLabels }}
  {{- range $label := $i.labels }}
  rule {
    source_labels = ["__name__", {{ $label | quote }}]
    separator = "@"
    regex = "{{ $i.metric }}@.*"
    target_label = {{ $label | quote }}
    replacement = "NA"
  }
  {{- end }}
  {{- end }}
{{- end }}
{{- if .Values.metrics.cadvisor.metricsTuning.keepPhysicalFilesystemDevices }}
  // Filter out non-physical devices/interfaces
  rule {
    source_labels = ["__name__", "device"]
    separator = "@"
    regex = "container_fs_.*@(/dev/)?({{ join "|" .Values.metrics.cadvisor.metricsTuning.keepPhysicalFilesystemDevices }})"
    target_label = "__keepme"
    replacement = "1"
  }
  rule {
    source_labels = ["__name__", "__keepme"]
    separator = "@"
    regex = "container_fs_.*@"
    action = "drop"
  }
  rule {
    source_labels = ["__name__"]
    regex = "container_fs_.*"
    target_label = "__keepme"
    replacement = ""
  }
{{- end }}
{{- if .Values.metrics.cadvisor.metricsTuning.keepPhysicalNetworkDevices }}
  rule {
    source_labels = ["__name__", "interface"]
    separator = "@"
    regex = "container_network_.*@({{ join "|" .Values.metrics.cadvisor.metricsTuning.keepPhysicalNetworkDevices }})"
    target_label = "__keepme"
    replacement = "1"
  }
  rule {
    source_labels = ["__name__", "__keepme"]
    separator = "@"
    regex = "container_network_.*@"
    action = "drop"
  }
  rule {
    source_labels = ["__name__"]
    regex = "container_network_.*"
    target_label = "__keepme"
    replacement = ""
  }
{{- end }}
{{- if .Values.metrics.extraMetricRelabelingRules }}
{{ .Values.metrics.extraMetricRelabelingRules | indent 2 }}
{{- end }}
{{- if .Values.metrics.cadvisor.extraMetricRelabelingRules }}
{{ .Values.metrics.cadvisor.extraMetricRelabelingRules | indent 2 }}
{{- end }}
  forward_to = [prometheus.relabel.metrics_service.receiver]
}
{{ end }}
