nameOverride: loki-ha
loki:
  image:
    registry: TMPL_IMAGE_REGISTRY
    repository: third-party/grafana/loki
    tag: "3.5.3"
  auth_enabled: false
  storage:
    type: azure
    bucketNames:
      chunks: TMPL_LOKI_BUCKET_NAME
    azure:
      account_name: TMPL_STORAGE_ACCOUNT_NAME
      use_federated_token: true
  storage_config:
    boltdb_shipper:
      active_index_directory: /var/loki/boltdb-shipper-active
      cache_location: /var/loki/boltdb-shipper-cache
      cache_ttl: 24h
    tsdb_shipper:
      active_index_directory: /var/loki/tsdb-shipper-active
      cache_location: /var/loki/tsdb-shipper-cache
      cache_ttl: 24h
    azure:
      account_name: TMPL_STORAGE_ACCOUNT_NAME
      container_name: TMPL_LOKI_BUCKET_NAME
      use_federated_token: true
  server:
    grpc_server_max_recv_msg_size: 104857600
    grpc_server_max_send_msg_size: 104857600
  limits_config:
    allow_structured_metadata: false
    ingestion_rate_mb: 60
    ingestion_burst_size_mb: 120
    per_stream_rate_limit: 20MB
    per_stream_rate_limit_burst: 40MB
    max_entries_limit_per_query: 1000
    max_global_streams_per_user: 0
    retention_period: 2160h # 90 days
    max_query_length: 7d1h
    max_line_size: 0
    max_label_names_per_series: 30
  commonConfig:
    replication_factor: 1
  schemaConfig:
    configs:
      - from: 2020-05-15
        store: boltdb-shipper
        object_store: azure
        schema: v11
        index:
          prefix: index_
          period: 24h
      - from: 2023-08-12
        store: boltdb-shipper
        object_store: azure
        schema: v12
        index:
          prefix: loki_index_
          period: 24h
      - from: 2025-05-22
        store: tsdb
        object_store: azure
        schema: v13
        index:
          prefix: loki_tsdb_index_
          period: 24h
  rulerConfig:
    external_labels:
      o11y_k8s_id: TMPL_CLUSTER_NAME
      cloudProvider: azure
      component: observability-regional-server
    storage:
      type: local
      local:
        directory: /rules
    rule_path: /tmp/scratch
    alertmanager_url: http://alertmanager-operated.self-monitoring:9093
    ring:
      kvstore:
        store: inmemory
    enable_api: true
  compactor:
    retention_enabled: true
    delete_request_store: azure
    working_directory: /var/loki/retention
    compaction_interval: 10m
    retention_delete_delay: 2h
    retention_delete_worker_count: 100
  index_gateway:
    mode: ring
serviceAccount:
  annotations:
    azure.workload.identity/client-id: TMPL_LOKI_ROLE_ARN
write:
  replicas: 2
  autoscaling:
    enabled: true
    minReplicas: 2
    maxReplicas: 3
    targetCPUUtilizationPercentage: 100
    targetMemoryUtilizationPercentage: 80
    behavior:
      scaleUp:
        policies:
          - type: Pods
            value: 1
            periodSeconds: 900
        stabilizationWindowSeconds: 300
      scaleDown:
        policies:
          - type: Pods
            value: 1
            periodSeconds: 1800
        stabilizationWindowSeconds: 3600
  resources:
    limits:
      cpu: 2000m
      memory: 4Gi
    requests:
      cpu: 250m
      memory: 1Gi
  nodeSelector:
    node_type: worker
  persistence:
    enableStatefulSetAutoDeletePVC: true
    size: 10Gi
    storageClass: prometheus.ssd
  podLabels:
    azure.workload.identity/use: "true"
read:
  replicas: 2
  autoscaling:
    enabled: true
    minReplicas: 2
    maxReplicas: 3
    targetCPUUtilizationPercentage: 1900
    targetMemoryUtilizationPercentage: 80
    behavior:
      scaleDown:
       stabilizationWindowSeconds: 300
       policies:
       - type: Pods
         value: 1
         periodSeconds: 180
  resources:
    limits:
      cpu: 2000m
      memory: 4Gi
    requests:
      cpu: 150m
      memory: 1Gi
  nodeSelector:
    node_type: worker
  persistence:
    size: 10Gi
    storageClass: prometheus.ssd
  podLabels:
    azure.workload.identity/use: "true"
backend:
  replicas: 2
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 2000m
      memory: 4Gi
    requests:
      cpu: 50m
      memory: 256Mi
  nodeSelector:
    node_type: worker
  persistence:
    size: 10Gi
    storageClass: prometheus.ssd
  podLabels:
    azure.workload.identity/use: "true"
sidecar:
  image:
    repository: TMPL_IMAGE_REGISTRY/third-party/kiwigrid/k8s-sidecar
    tag: 1.30.9
  rules:
    label: loki_rule
    labelValue: "true"
    folder: /rules/fake

test:
  enabled: false
lokiCanary:
  enabled: false
gateway:
  enabled: false
ruler:
  enabled: true # In order to enable rulerConfig
  replicas: 0
resultsCache:
  enabled: false
chunksCache:
  enabled: false
extraObjects:
  # placeholder for loki alerting rules, the log alerting rules are maintained in runbooks
  - |
    {{- if not (lookup "v1" "ConfigMap" "observability" "loki-ha-alerting-rules") -}}
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: loki-ha-alerting-rules
      namespace: observability
      labels:
        loki_rule: "true"
      annotations:
        "helm.sh/resource-policy": keep
    data:
      loki-ha-alerting-rules.yaml: |-
        groups:
          - name: placeholder
            rules:
            - alert: placeholder
              expr: sum(count_over_time({app="loki"} |~ "error")) > 0
              for: 5m
    {{- end -}}
  # 2. Ingress for Loki Write
  - |
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: loki
      namespace: {{ .Release.Namespace }}
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
        nginx.ingress.kubernetes.io/use-regex: "true"
    spec:
      ingressClassName: TMPL_NGINX_WRITE_INGRESS_CLASS
      rules:
      - http:
          paths:
          - path: /loki(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: loki-ha-write
                port:
                  number: 3100

  # 3. Ingress for Loki Read
  - |
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: loki-read
      namespace: {{ .Release.Namespace }}
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
        nginx.ingress.kubernetes.io/use-regex: "true"
    spec:
      ingressClassName: TMPL_NGINX_READ_INGRESS_CLASS
      rules:
      - http:
          paths:
          - path: /loki/self-monitoring(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: loki-ha-read
                port:
                  number: 3100
