Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/operator/config/templates/component/logs/pod_logs.libsonnet
4096 views
local optionals = import 'ext/optionals.libsonnet';
local secrets = import 'ext/secrets.libsonnet';
local k8s = import 'utils/k8s.libsonnet';

local new_relabel_config = import './relabel_config.libsonnet';
local new_safe_tls_config = import './safe_tls_config.libsonnet';
local new_pipeline_stage = import './stages.libsonnet';
local new_kube_sd_config = import 'component/metrics/kube_sd_config.libsonnet';

// Genrates a scrape_config from a PodLogs.
//
// @param {string} agentNamespace - Namespace the GrafanaAgent CR is in.
// @param {PodLogs} podLogs
// @param {APIServerConfig} apiServer
// @param {boolean} ignoreNamespaceSelectors
// @param {string} enforcedNamespaceLabel
function(
  agentNamespace,
  podLogs,
  apiServer,
  ignoreNamespaceSelectors,
  enforcedNamespaceLabel,
) {
  local meta = podLogs.ObjectMeta,

  job_name: 'podLogs/%s/%s' % [meta.Namespace, meta.Name],

  kubernetes_sd_configs: [
    new_kube_sd_config(
      namespace=agentNamespace,
      namespaces=k8s.namespacesFromSelector(
        podLogs.Spec.NamespaceSelector,
        meta.Namespace,
        ignoreNamespaceSelectors,
      ),
      apiServer=apiServer,
      role='pod',
    ),
  ],

  pipeline_stages: optionals.array(std.map(
    function(pipeline) new_pipeline_stage(pipeline),
    podLogs.Spec.PipelineStages,
  )),

  relabel_configs: (
    [{ source_labels: ['job'], target_label: '__tmp_prometheus_job_name' }] +

    // Match on service labels.
    std.map(
      function(k) {
        source_labels: ['__meta_kubernetes_pod_label_' + k8s.sanitize(k)],
        regex: podLogs.Spec.Selector.MatchLabels[k],
        action: 'keep',
      },
      // Keep the output consistent by sorting the keys first.
      std.sort(std.objectFields(
        if podLogs.Spec.Selector.MatchLabels != null
        then podLogs.Spec.Selector.MatchLabels
        else {}
      )),
    ) +

    // Set-based label matching. we have to map the valid relations
    // `In`, `NotIn`, `Exists`, and `DoesNotExist` into relabling rules.
    std.map(
      function(exp) (
        if exp.Operator == 'In' then {
          source_labels: ['__meta_kubernetes_pod_label_' + k8s.sanitize(exp.Key)],
          regex: std.join('|', exp.Values),
          action: 'keep',
        } else if exp.Operator == 'NotIn' then {
          source_labels: ['__meta_kubernetes_pod_label_' + k8s.sanitize(exp.Key)],
          regex: std.join('|', exp.Values),
          action: 'drop',
        } else if exp.Operator == 'Exists' then {
          source_labels: ['__meta_kubernetes_pod_labelpresent_' + k8s.sanitize(exp.Key)],
          regex: 'true',
          action: 'keep',
        } else if exp.Operator == 'DoesNotExist' then {
          source_labels: ['__meta_kubernetes_pod_labelpresent_' + k8s.sanitize(exp.Key)],
          regex: 'true',
          action: 'drop',
        }
      ),
      k8s.array(podLogs.Spec.Selector.MatchExpressions),
    ) +

    // Relabel namespace, pod, and service metalabels into proper labels.
    [{
      source_labels: ['__meta_kubernetes_namespace'],
      target_label: 'namespace',
    }, {
      source_labels: ['__meta_kubernetes_service_name'],
      target_label: 'service',
    }, {
      source_labels: ['__meta_kubernetes_pod_name'],
      target_label: 'pod',
    }, {
      source_labels: ['__meta_kubernetes_pod_container_name'],
      target_label: 'container',
    }] +

    // Relabel targetLabels from the service onto the target.
    std.map(
      function(l) {
        source_labels: ['__meta_kubernetes_pod_label_' + k8s.sanitize(l)],
        target_label: k8s.sanitize(l),
        regex: '(.+)',
        replacement: '$1',
      },
      k8s.array(podLogs.Spec.PodTargetLabels)
    ) +

    // By default, generate a safe job name from the service name.
    std.filter(function(e) e != null, [
      {
        target_label: 'job',
        replacement: '%s/%s' % [meta.Namespace, meta.Name],
      },
      if podLogs.Spec.JobLabel != '' then {
        source_labels: ['__meta_kubernetes_pod_label_' + k8s.sanitize(podLogs.Spec.JobLabel)],
        target_label: 'job',
        regex: '(.+)',
        replacement: '$1',
      },
    ]) +

    // Kubernetes puts logs under subdirectories keyed pod UID and container_name.
    [{
      source_labels: ['__meta_kubernetes_pod_uid', '__meta_kubernetes_pod_container_name'],
      target_label: '__path__',
      separator: '/',
      replacement: '/var/log/pods/*$1/*.log',
    }] +

    std.map(
      function(c) new_relabel_config(c),
      k8s.array(podLogs.Spec.RelabelConfigs),
    ) +

    // Because of security risks, whenever enforcedNamespaceLabel is set,
    // we want to append it to the relabel_configs as the last relabling to
    // ensure it overrides all other relabelings.
    std.filter(function(e) e != null, [
      if enforcedNamespaceLabel != '' then {
        target_label: enforcedNamespaceLabel,
        replacement: podLogs.ObjectMeta.Namespace,
      },
    ])
  ),
}