---
# yaml-language-server: $schema=https://kubernetes-schemas.pages.dev/helm.toolkit.fluxcd.io/helmrelease_v2.json
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: kube-prometheus-stack
spec:
  interval: 30m
  timeout: 15m
  chart:
    spec:
      chart: kube-prometheus-stack
      version: 62.7.0
      sourceRef:
        kind: HelmRepository
        name: prometheus-community
        namespace: flux-system
      interval: 30m
  install:
    crds: Skip
  upgrade:
    crds: Skip
  values:
    crds:
      enabled: false
    cleanPrometheusOperatorObjectNames: true

    ###
    ### Component values
    ###
    alertmanager:
      enabled: false

    kubeApiServer:
      enabled: true
      serviceMonitor:
        metricRelabelings:
          # Drop high cardinality labels
          - action: drop
            sourceLabels: ["__name__"]
            regex: (apiserver|etcd|rest_client)_request(|_sli|_slo)_duration_seconds_bucket
          - action: drop
            sourceLabels: ["__name__"]
            regex: (apiserver_response_sizes_bucket|apiserver_watch_events_sizes_bucket)

    kubeControllerManager:
      enabled: false

    kubeEtcd:
      enabled: false

    kubelet:
      enabled: true
      serviceMonitor:
        metricRelabelings:
          # Drop high cardinality labels
          - action: labeldrop
            regex: (uid)
          - action: labeldrop
            regex: (id|name)
          - action: drop
            sourceLabels: ["__name__"]
            regex: (rest_client_request_duration_seconds_bucket|rest_client_request_duration_seconds_sum|rest_client_request_duration_seconds_count)

    kubeProxy:
      enabled: false

    kubeScheduler:
      enabled: false

    kubeStateMetrics:
      enabled: false

    nodeExporter:
      enabled: false

    grafana:
      enabled: false
      forceDeployDashboards: true
      sidecar:
        dashboards:
          annotations:
            grafana_folder: Kubernetes

    ###
    ### Prometheus operator values
    ###
    prometheusOperator:
      resources:
        requests:
          cpu: 35m
          memory: 273M
        limits:
          memory: 326M

      prometheusConfigReloader:
        # resource config for prometheusConfigReloader
        resources:
          requests:
            cpu: 5m
            memory: 32M
          limits:
            memory: 32M

    ###
    ### Prometheus instance values
    ###
    prometheus:
      ingress:
        enabled: true
        ingressClassName: internal-nginx
        annotations:
          external-dns.alpha.kubernetes.io/target: internal.jahanson.tech
        hosts:
          - prometheus.jahanson.tech
        pathType: Prefix

      prometheusSpec:
        enableAdminAPI: true
        enableFeatures:
          - auto-gomaxprocs
          - memory-snapshot-on-shutdown
          - new-service-discovery-manager
        podMonitorSelectorNilUsesHelmValues: false
        probeSelectorNilUsesHelmValues: false
        replicas: 1
        replicaExternalLabelName: "__replica__" # must match with thanos value `.query.replicaLabel[0]`
        resources:
          requests:
            cpu: 100m
          limits:
            memory: 1500M
        retention: 14d
        retentionSize: 50GB
        ruleSelectorNilUsesHelmValues: false
        scrapeConfigSelectorNilUsesHelmValues: false
        scrapeInterval: 1m # Must match interval in Grafana Helm chart
        serviceMonitorSelectorNilUsesHelmValues: false
        storageSpec:
          volumeClaimTemplate:
            spec:
              storageClassName: ceph-block
              resources:
                requests:
                  storage: 55Gi
        walCompression: true