# Centralized logging (Loki + Promtail + Grafana) We ship a lightweight logging stack into the cluster so API/UI logs are searchable. - **Loki** (single-binary) stores logs with 14d retention by default, on a PVC. - **Promtail** DaemonSet tails container logs and ships them to Loki with `namespace`, `pod`, and `app` labels. - **Grafana** provides the UI with a pre-wired Loki data source and TLS ingress. ## Install / upgrade Prereqs: - `kubectl`/`helm` access to the cluster (the script downloads Helm if missing). - Environment: `GRAFANA_ADMIN_PASSWORD` (required), optional `LOGS_HOST` (default `logs.lomavuokraus.fi`), `GRAFANA_CLUSTER_ISSUER` (default `letsencrypt-prod`), `LOGGING_NAMESPACE` (default `logging`). Run: ```bash LOGS_HOST=logs.lomavuokraus.fi \ GRAFANA_ADMIN_PASSWORD='change-me' \ GRAFANA_CLUSTER_ISSUER=letsencrypt-prod \ bash deploy/install-logging.sh ``` The script: 1. Ensures Helm is available. 2. Installs/updates Loki, Promtail, and Grafana in the logging namespace. 3. Creates a Grafana ingress with TLS via the chosen ClusterIssuer. ## Access - Grafana: `https://` (admin user `admin`, password from `GRAFANA_ADMIN_PASSWORD`). - Loki endpoint (internal): `http://loki.logging.svc.cluster.local:3100`. ## Querying Example LogQL in Grafana Explore: ``` {namespace="lomavuokraus-test", app="lomavuokraus-web"} ``` Filter by pod: ``` {namespace="lomavuokraus-test", app="lomavuokraus-web", pod=~".*"} |= "ERROR" ``` ## Tuning - Retention: `k8s/logging/loki-values.yaml` (`limits_config.retention_period`). - PVC sizes: adjust `persistence.size` in `k8s/logging/loki-values.yaml` and `k8s/logging/grafana-values.yaml`. - Ingress issuer/host: override via environment when running `deploy/install-logging.sh`.