{{ define "agent.config.receivers" }}
// Receivers
{{- if (or .Values.receivers.grpc.enabled .Values.receivers.http.enabled) }}
otelcol.receiver.otlp "receiver" {
  debug_metrics {
    {{- if or .Values.receivers.grpc.disable_debug_metrics .Values.receivers.http.disable_debug_metrics }}
    disable_high_cardinality_metrics = true
    {{- else }}
    disable_high_cardinality_metrics = false
    {{- end }}
  }

{{- if or .Values.receivers.port .Values.receivers.grpc.enabled }}
{{$data := dict "port" (.Values.receivers.port | default .Values.receivers.grpc.port) "type" "OTLP gRPC" "agent" (index .Values "grafana-agent").agent }}
{{- include "checkforAgentPort" $data }}
  grpc {
    endpoint = "0.0.0.0:{{ $data.port | int }}"
  }
{{- end }}
{{- if .Values.receivers.http.enabled }}
{{$data := dict "port" .Values.receivers.http.port "type" "OTLP HTTP" "agent" (index .Values "grafana-agent").agent }}
{{- include "checkforAgentPort" $data }}
  http {
    endpoint = "0.0.0.0:{{ $data.port | int }}"
  }
{{- end }}
  output {
{{- if .Values.metrics.enabled }}
    metrics = [otelcol.processor.transform.add_metric_attributes.input]
{{- end }}
{{- if .Values.logs.enabled }}
    logs = [otelcol.processor.k8sattributes.default.input]
{{- end }}
{{- if .Values.traces.enabled }}
    traces = [otelcol.processor.k8sattributes.default.input]
{{- end }}
  }
}

{{- if or .Values.logs.enabled .Values.traces.enabled }}
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.logs.enabled }}
    logs    = [otelcol.processor.transform.add_attributes.input]
{{- end }}
{{- if .Values.traces.enabled }}
    traces  = [otelcol.processor.transform.add_attributes.input]
{{- end }}
  }
}
otelcol.processor.transform "add_attributes" {
  // Grafana Cloud Kubernetes monitoring expects Loki labels `cluster`, `pod`, and `namespace`
  error_mode = "ignore"
  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\")",
    ]
  }
  output {
{{- if .Values.logs.enabled }}
    logs = [otelcol.exporter.loki.otel_to_loki_converter.input]
{{- end }}
{{- if .Values.traces.enabled }}
    traces = [otelcol.processor.batch.trace_batch_processor.input]
{{- end }}
  }
}
{{- end }}

{{- if .Values.metrics.enabled }}
otelcol.processor.transform "add_metric_attributes" {
  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.exporter.prometheus.otel_to_prom_converter.input]
  }
}
{{- end }}
{{- end }}

{{- if and .Values.receivers.prometheus.enabled .Values.metrics.enabled }}
prometheus.receive_http "receiver" {
{{$data := dict "port" .Values.receivers.prometheus.port "type" "Prometheus" "agent" (index .Values "grafana-agent").agent }}
{{- include "checkforAgentPort" $data -}}

  http {
    listen_address = "0.0.0.0"
    listen_port = {{ .Values.receivers.prometheus.port }}
  }
  forward_to = [prometheus.relabel.metrics_service.receiver]
}
{{- end }}

{{- if and .Values.receivers.zipkin.enabled .Values.traces.enabled }}
otelcol.receiver.zipkin "receiver" {
  debug_metrics {
    disable_high_cardinality_metrics = {{ .Values.receivers.zipkin.disable_debug_metrics }}
  }

{{$data := dict "port" .Values.receivers.zipkin.port "type" "Zipkin" "agent" (index .Values "grafana-agent").agent }}
{{- include "checkforAgentPort" $data -}}
  endpoint = "0.0.0.0:{{ $data.port | int }}"
  output {
    traces = [otelcol.processor.batch.trace_batch_processor.input]
  }
}
{{- end }}
{{ end }}
