Path: blob/main/pkg/operator/config/templates/component/logs/pod_logs.libsonnet
5379 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,
},
])
),
}