logging { level = "warn" } // ============================================ // LOKI WRITE TARGET // ============================================ loki.write "loki_srv" { endpoint { url = sys.env("LOKI_URL") } } // ============================================ // HOST JOURNALD SOURCE // ============================================ // Read journald logs from the host loki.source.journal "journal" { max_age = "24h" relabel_rules = discovery.relabel.host_journal.rules forward_to = [loki.process.host_journal.receiver] } // ============================================ // HOST JOURNALD RELABELING // ============================================ // Convert journald metadata into Loki labels discovery.relabel "host_journal" { targets = [] // Systemd unit name rule { source_labels = ["__journal__systemd_unit"] target_label = "systemd_unit" } // Transport type (stdout, syslog, kernel, audit, etc.) rule { source_labels = ["__journal__transport"] target_label = "journal_transport" } // Priority (info, warning, error) rule { source_labels = ["__journal_priority_keyword"] target_label = "level" } } // ============================================ // HOST JOURNALD PROCESSING // ============================================ // Add static labels and forward journald logs to Loki loki.process "host_journal" { stage.static_labels { values = { cluster = sys.env("CLUSTER_NAME"), host = sys.env("HOSTNAME"), zone = sys.env("ZONE"), job = "integrations/journald", } } forward_to = [loki.write.loki_srv.receiver] } // ============================================ // Discovery: Kubernetes - pods // ============================================ discovery.kubernetes "kube_pods" { role = "pod" selectors { role = "pod" field = "spec.nodeName=" + coalesce(env("HOSTNAME"), constants.hostname) } } loki.process "kube_pod_logs" { stage.static_labels { values = { cluster = sys.env("CLUSTER_NAME"), zone = sys.env("ZONE"), host = sys.env("HOSTNAME"), node_name = sys.env("HOSTNAME"), job = "integrations/kubernetes/pod-logs", } } forward_to = [loki.write.loki_srv.receiver] } // ============================================ // Loki.source kube_pod_logs // ============================================ loki.source.kubernetes "kube_pod_logs" { targets = discovery.relabel.kube_pod_logs.output forward_to = [loki.process.kube_pod_logs.receiver] } discovery.relabel "kube_pod_logs" { targets = discovery.kubernetes.kube_pods.targets rule { source_labels = ["__meta_kubernetes_namespace"] target_label = "namespace" } rule { source_labels = ["__meta_kubernetes_pod_name"] regex = "^(.+?)-[0-9a-zA-Z]{4,16}(?:-[0-9a-zA-Z]{4,16})?$" replacement = "$1" target_label = "pod" } rule { source_labels = ["__meta_kubernetes_pod_container_name"] target_label = "container" } rule { source_labels = [ "__meta_kubernetes_pod_controller_name", ] regex = "([0-9a-z-.]+?)(-[0-9a-f]{8,10})?" target_label = "controller" } rule { source_labels = [ "__meta_kubernetes_pod_label_app_kubernetes_io_name", "__meta_kubernetes_pod_label_app", "controller_name", "__meta_kubernetes_pod_name", ] regex = "^;*([^;]+)(;.*)?$" target_label = "app" } } // ============================================ // Metrics: Prometheus connection config // ============================================ prometheus.remote_write "prometheus_srv" { endpoint { url = sys.env("PROMETHEUS_URL") } // global labels external_labels = { cluster = sys.env("CLUSTER_NAME"), zone = sys.env("ZONE"), } } // ============================================ // Metrics: Prometheus Unix Exporter // ============================================ prometheus.exporter.unix "node_exporter" { rootfs_path = "/host" disable_collectors = ["ipvs", "btrfs", "infiniband", "xfs", "zfs"] enable_collectors = [ "cpu", "meminfo", "vmstat", "loadavg", "filesystem", "netdev", "uname", ] filesystem { mount_points_exclude = "(^/etc|^/dev|^/proc|^/sys|^/run|/kubelet/.+)($|/)" fs_types_exclude = "^(tmpfs|shm|autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs|erofs)$" mount_timeout = "5s" } netclass { ignored_devices = "^(veth.*|cali.*|[a-f0-9]{15})$" } netdev { device_exclude = "^(veth.*|cali.*|[a-f0-9]{15})$" } } prometheus.scrape "node_exporter" { targets = prometheus.exporter.unix.node_exporter.targets scrape_interval = "30s" forward_to = [prometheus.relabel.node_exporter.receiver] } prometheus.relabel "node_exporter" { forward_to = [prometheus.remote_write.prometheus_srv.receiver] rule { action = "replace" replacement = sys.env("HOSTNAME") target_label = "nodename" } rule { action = "replace" replacement = sys.env("HOSTNAME") target_label = "node" } } // ============================================ // Discovery: Kubernetes - Nodes // ============================================ discovery.kubernetes "kube_nodes" { role = "node" selectors { role = "node" field = "spec.nodeName=" + coalesce(env("HOSTNAME"), constants.hostname) } } discovery.relabel "kubelet" { targets = discovery.kubernetes.kube_nodes.targets rule { regex = ".*_uid$|.*_id$|^annotation_.*|^label_.*|^endpoint_.*|^pod_ip$" action = "drop" } rule { regex = "container_fs_.*|container_network_.*|container_hugetlb_.*|container_blkio_.*|container_tasks_state_.*" action = "drop" } // duplicate metrics from cAdviser rule { regex = "container_cpu_usage_seconds_total|container_memory_working_set_bytes|container_memory_rss|container_memory_cache" action = "drop" } rule { source_labels = ["__meta_kubernetes_node_address_InternalIP"] target_label = "__address__" replacement = "$1:10250" } rule { action = "replace" source_labels = ["__meta_kubernetes_node_name"] regex = "(.+)" target_label = "node" } rule { source_labels = ["node"] target_label = "host" } rule { target_label = "__metrics_path__" replacement = "/metrics" } rule { target_label = "cluster" replacement = sys.env("CLUSTER_NAME") } rule { target_label = "zone" replacement = sys.env("ZONE") } } prometheus.scrape "kubelet" { job_name = "integrations/kubernetes/kubelet" targets = discovery.relabel.kubelet.output scheme = "https" metrics_path = "/metrics" tls_config { server_name = "kubernetes" ca_file = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" insecure_skip_verify = true } bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token" forward_to = [prometheus.remote_write.prometheus_srv.receiver] } // =========================================================== // Discovery:relabel: kube_node_metrics (cAdviser) // Requirements: // - discovery.kubernetes.role.node: kube_nodes // =========================================================== discovery.relabel "kube_node_metrics" { targets = discovery.kubernetes.kube_nodes.targets rule { regex = ".*_uid$|.*_id$|^annotation_.*|^label_.*|^endpoint_.*|^pod_ip$" action = "drop" } rule { action = "replace" source_labels = ["__meta_kubernetes_node_name"] regex = "(.+)" target_label = "node" } rule { source_labels = ["node"] target_label = "host" } rule { replacement = "/metrics/cadvisor" target_label = "__metrics_path__" } rule { target_label = "cluster" replacement = sys.env("CLUSTER_NAME") } rule { target_label = "zone" replacement = sys.env("ZONE") } } // =============================================================================== // Scrape Kubernetes pods containers metrics / cAdvisor // Requirements: // - discovery.relabel - kube_node_metrics // =============================================================================== prometheus.scrape "cadvisor" { job_name = "integrations/kubernetes/cadvisor" targets = discovery.relabel.kube_node_metrics.output scheme = "https" tls_config { server_name = "kubernetes" ca_file = "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt" insecure_skip_verify = true } bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token" forward_to = [prometheus.remote_write.prometheus_srv.receiver] } // ============================================ // Discovery: Kubernetes - endpoints // used by: // - loki kubernetes kube state metrics // ============================================ discovery.kubernetes "kube_endpoints" { role = "endpoints" } // =============================================================================== // prometheus / Metrics - Scrape kube_state_metrics // Requirements: // - discovery.relabel - kube_state_metrics // =============================================================================== prometheus.scrape "kube_state_metrics" { job_name = "integrations/kubernetes/kube-state-metrics" targets = discovery.relabel.kube_state_metrics.output scheme = "http" forward_to = [prometheus.remote_write.prometheus_srv.receiver] } discovery.relabel "kube_state_metrics" { targets = discovery.kubernetes.kube_endpoints.targets rule { source_labels = ["__meta_kubernetes_endpoint_node_name"] regex = coalesce(env("HOSTNAME"), constants.hostname) action = "keep" } rule { source_labels = ["__meta_kubernetes_service_name"] regex = "kube-state-metrics" action = "keep" } rule { regex = ".*_uid$|.*_id$|^annotation_.*|^label_.*|^endpoint_.*|^pod_ip$" action = "drop" } rule { target_label = "cluster" replacement = sys.env("CLUSTER_NAME") } rule { target_label = "zone" replacement = sys.env("ZONE") } }