{{ define "agent.config.processors" }}
// Processors
{{- if or .Values.receivers.grpc.enabled .Values.receivers.http.enabled .Values.receivers.zipkin.enabled }}
{{- if .Values.metrics.enabled }}
otelcol.processor.transform "add_metric_datapoint_attributes" {
  // Grafana Cloud Kubernetes monitoring expects Loki labels `cluster`, `pod`, and `namespace`
  error_mode = "ignore"
  metric_statements {
    context = "datapoint"
    statements = [
      "set(attributes[\"deployment.environment\"], resource.attributes[\"deployment.environment\"])",
      "set(attributes[\"service.version\"], resource.attributes[\"service.version\"])",
    ]
  }
  output {
    metrics = [otelcol.processor.k8sattributes.default.input]
  }
}
{{- end }}

otelcol.processor.k8sattributes "default" {
  extract {
    metadata = [
      "k8s.namespace.name",
      "k8s.pod.name",
      "k8s.deployment.name",
      "k8s.statefulset.name",
      "k8s.daemonset.name",
      "k8s.cronjob.name",
      "k8s.job.name",
      "k8s.node.name",
      "k8s.pod.uid",
      "k8s.pod.start_time",
    ]
  }
  pod_association {
    source {
      from = "connection"
    }
  }

  output {
{{- if .Values.metrics.enabled }}
    metrics = [otelcol.processor.transform.add_resource_attributes.input]
{{- end }}
{{- if .Values.logs.enabled }}
    logs    = [otelcol.processor.transform.add_resource_attributes.input]
{{- end }}
{{- if .Values.traces.enabled }}
    traces  = [otelcol.processor.transform.add_resource_attributes.input]
{{- end }}
  }
}

otelcol.processor.transform "add_resource_attributes" {
  // Grafana Cloud Kubernetes monitoring expects Loki labels `cluster`, `pod`, and `namespace`
  error_mode = "ignore"
{{- if .Values.metrics.enabled }}
  metric_statements {
    context = "resource"
    statements = [
      "set(attributes[\"k8s.cluster.name\"], \"{{ required ".Values.cluster.name is a required value. Please set it and try again." .Values.cluster.name }}\") where attributes[\"k8s.cluster.name\"] == nil",
    ]
  }
{{- end }}
{{- if .Values.logs.enabled }}
  log_statements {
    context = "resource"
    statements = [
      "set(attributes[\"pod\"], attributes[\"k8s.pod.name\"])",
      "set(attributes[\"namespace\"], attributes[\"k8s.namespace.name\"])",
      "set(attributes[\"loki.resource.labels\"], \"pod, namespace, cluster, job\")",
      "set(attributes[\"k8s.cluster.name\"], \"{{ required ".Values.cluster.name is a required value. Please set it and try again." .Values.cluster.name }}\") where attributes[\"k8s.cluster.name\"] == nil",
    ]
  }
{{- end }}
{{- if .Values.traces.enabled }}
  trace_statements {
    context = "resource"
    statements = [
      "set(attributes[\"k8s.cluster.name\"], \"{{ required ".Values.cluster.name is a required value. Please set it and try again." .Values.cluster.name }}\") where attributes[\"k8s.cluster.name\"] == nil",
    ]
  }
{{- end }}
  output {
{{- if .Values.metrics.enabled }}
    metrics = [otelcol.processor.filter.default.input]
{{- end }}
{{- if .Values.logs.enabled }}
    logs = [otelcol.processor.filter.default.input]
{{- end }}
{{- if .Values.traces.enabled }}
    traces = [otelcol.processor.filter.default.input]
{{- end }}
  }
}

otelcol.processor.filter "default" {
  error_mode = "ignore"

{{- if and .Values.metrics.enabled (or .Values.metrics.receiver.filters.metric .Values.metrics.receiver.filters.datapoint) }}
  metrics = {
{{- if .Values.metrics.receiver.filters.metric }}
    metric = [
{{- range $filter := .Values.metrics.receiver.filters.metric }}
  {{ $filter | indent 6 }}
{{- end }}
    ]
{{- end }}
{{- if .Values.metrics.receiver.filters.datapoint }}
    datapoint = [
{{- range $filter := .Values.metrics.receiver.filters.datapoint }}
  {{ $filter | indent 6 }}
{{- end }}
    ]
{{- end }}
  }
{{- end }}{{- if and .Values.logs.enabled .Values.logs.receiver.filters.log_record }}
  logs = {
    log_record = [
{{- range $filter := .Values.logs.receiver.filters.log_record }}
  {{ $filter | indent 6 }}
{{- end }}
    ]
{{- end }}
{{- if and .Values.traces.enabled (or .Values.traces.receiver.filters.span .Values.traces.receiver.filters.spanevent) }}
  traces = {
{{- if .Values.traces.receiver.filters.span }}
    span = [
{{- range $filter := .Values.traces.receiver.filters.span }}
  {{ $filter | indent 6 }}
{{- end }}
    ]
{{- end }}
{{- if .Values.traces.receiver.filters.spanevent }}
    spanevent = [
{{- range $filter := .Values.traces.receiver.filters.spanevent }}
  {{ $filter | indent 6 }}
{{- end }}
    ]
{{- end }}
  }
{{- end }}

  output {
{{- if .Values.metrics.enabled }}
    metrics = [otelcol.processor.batch.batch_processor.input]
{{- end }}
{{- if .Values.logs.enabled }}
    logs = [otelcol.processor.batch.batch_processor.input]
{{- end }}
{{- if .Values.traces.enabled }}
    traces = [otelcol.processor.batch.batch_processor.input]
{{- end }}
  }
}

otelcol.processor.batch "batch_processor" {
{{- with .Values.receivers.processors.batch }}
  send_batch_size = {{ .size | int }}
  send_batch_max_size = {{ .maxSize | int }}
  timeout = {{ .timeout | quote}}
{{- end }}
  output {
{{- if .Values.metrics.enabled }}
    metrics = [otelcol.exporter.prometheus.metrics_converter.input]
{{- end }}
{{- if .Values.logs.enabled }}
    logs = [otelcol.exporter.loki.logs_converter.input]
{{- end }}
{{- if .Values.traces.enabled }}
{{- if eq .Values.externalServices.tempo.protocol "otlp" }}
    traces = [otelcol.exporter.otlp.traces_service.input]
{{- else if eq .Values.externalServices.tempo.protocol "otlphttp" }}
    traces = [otelcol.exporter.otlphttp.traces_service.input]
{{- end }}
{{- end }}
  }
}

{{- if .Values.metrics.enabled }}
otelcol.exporter.prometheus "metrics_converter" {
  forward_to = [prometheus.relabel.metrics_service.receiver]
}
{{- end }}
{{- if .Values.logs.enabled }}
otelcol.exporter.loki "logs_converter" {
  forward_to = [loki.process.pod_logs.receiver]
}
{{- end }}
{{- end }}
{{- end }}
