{{ define "alloy.config.logs.pod_logs_discovery" }}
// Pod Logs
discovery.kubernetes "pods" {
  role = "pod"
{{- if eq .Values.logs.pod_logs.gatherMethod "volumes" }}
  selectors {
    role = "pod"
    field = "spec.nodeName=" + env("HOSTNAME")
  }
{{- end }}
}

discovery.relabel "pod_logs" {
  targets = discovery.kubernetes.pods.targets
  rule {
    source_labels = ["__meta_kubernetes_namespace"]
    action = "replace"
    target_label = "namespace"
  }
{{ if .Values.logs.pod_logs.namespaces }}
  rule {
    source_labels = ["namespace"]
    regex = "{{ .Values.logs.pod_logs.namespaces | join "|" }}"
    action = "keep"
  }
{{- end }}
{{- if .Values.logs.pod_logs.excludeNamespaces }}
  rule {
    source_labels = ["namespace"]
    regex = "{{ .Values.logs.pod_logs.excludeNamespaces | join "|" }}"
    action = "drop"
  }
{{- end }}
  rule {
    source_labels = ["__meta_kubernetes_pod_name"]
    action = "replace"
    target_label = "pod"
  }
  rule {
    source_labels = ["__meta_kubernetes_pod_container_name"]
    action = "replace"
    target_label = "container"
  }
  rule {
    source_labels = ["__meta_kubernetes_namespace", "__meta_kubernetes_pod_container_name"]
    separator = "/"
    action = "replace"
    replacement = "$1"
    target_label = "job"
  }

{{- range $lokiLabel, $podLabel := .Values.logs.pod_logs.labels }}
  rule {
    source_labels = ["__meta_kubernetes_pod_label_{{ include "escape_label" $podLabel }}"]
    regex         = "(.+)"
    target_label  = {{ $lokiLabel | quote }}
  }
{{ end }}
{{- range $lokiLabel, $podAnnotation := .Values.logs.pod_logs.annotations }}
  rule {
    source_labels = ["__meta_kubernetes_pod_annotation_{{ include "escape_label" $podAnnotation }}"]
    regex         = "(.+)"
    target_label  = {{ $lokiLabel | quote }}
  }
{{ end }}

  {{- if eq .Values.logs.pod_logs.gatherMethod "volumes" }}
  rule {
    source_labels = ["__meta_kubernetes_pod_uid", "__meta_kubernetes_pod_container_name"]
    separator = "/"
    action = "replace"
    replacement = "/var/log/pods/*$1/*.log"
    target_label = "__path__"
  }
  {{- end }}

  // set the container runtime as a label
  rule {
    action = "replace"
    source_labels = ["__meta_kubernetes_pod_container_id"]
    regex = "^(\\S+):\\/\\/.+$"
    replacement = "$1"
    target_label = "tmp_container_runtime"
  }

{{- if .Values.logs.pod_logs.extraRelabelingRules }}
{{ .Values.logs.pod_logs.extraRelabelingRules | indent 2 }}
{{- end }}
}

discovery.relabel "filtered_pod_logs" {
  targets = discovery.relabel.pod_logs.output
  rule {  // Drop anything with a "falsy" annotation value
    source_labels = ["__meta_kubernetes_pod_annotation_{{ include "escape_label" .Values.logs.pod_logs.annotation }}"]
    regex = "(false|no|skip)"
    action = "drop"
  }
{{- if eq .Values.logs.pod_logs.discovery "annotation" }}
  rule {  // If discovering via annotation, then only keep pods with annotation values
    source_labels = ["__meta_kubernetes_pod_annotation_{{ include "escape_label" .Values.logs.pod_logs.annotation }}"]
    regex = ".+"
    action = "keep"
  }
{{- end }}
}
{{ if eq .Values.logs.pod_logs.gatherMethod "volumes" }}
local.file_match "pod_logs" {
  path_targets = discovery.relabel.filtered_pod_logs.output
}

loki.source.file "pod_logs" {
  targets    = local.file_match.pod_logs.targets
  forward_to = [loki.process.pod_logs.receiver]
}
{{ else if eq .Values.logs.pod_logs.gatherMethod "api" }}
loki.source.kubernetes "pod_logs" {
  targets = discovery.relabel.filtered_pod_logs.output
  forward_to = [loki.process.pod_logs.receiver]
{{- if (index .Values "alloy-logs").alloy.clustering.enabled }}
  clustering {
    enabled = true
  }
{{- end }}
}
{{- end }}
{{- end }}
