From 6d5e4c8a4baad29f79f14f7d6f18f850f6a2c676 Mon Sep 17 00:00:00 2001 From: itscalvinwang Date: Tue, 8 Dec 2020 09:59:27 -0800 Subject: [PATCH] clean files --- assets/index.yaml | 18 - assets/kubecost/cost-analyzer-1.70.000.tgz | Bin 137539 -> 0 bytes charts/kubecost/Chart.yaml | 10 - charts/kubecost/app-readme.md | 23 - charts/kubecost/attached-disks.json | 425 -- charts/kubecost/charts/grafana/Chart.yaml | 15 - charts/kubecost/charts/grafana/README.md | 162 - .../charts/grafana/templates/NOTES.txt | 37 - .../charts/grafana/templates/_helpers.tpl | 43 - .../charts/grafana/templates/clusterrole.yaml | 25 - .../grafana/templates/clusterrolebinding.yaml | 25 - .../configmap-dashboard-provider.yaml | 28 - .../charts/grafana/templates/configmap.yaml | 76 - .../templates/dashboards-json-configmap.yaml | 24 - .../charts/grafana/templates/deployment.yaml | 272 - .../charts/grafana/templates/ingress.yaml | 44 - .../grafana/templates/podsecuritypolicy.yaml | 42 - .../charts/grafana/templates/pvc.yaml | 26 - .../charts/grafana/templates/role.yaml | 20 - .../charts/grafana/templates/rolebinding.yaml | 20 - .../charts/grafana/templates/secret.yaml | 22 - .../charts/grafana/templates/service.yaml | 51 - .../grafana/templates/serviceaccount.yaml | 13 - charts/kubecost/charts/grafana/values.yaml | 275 - charts/kubecost/charts/prometheus/.helmignore | 23 - charts/kubecost/charts/prometheus/Chart.yaml | 18 - charts/kubecost/charts/prometheus/README.md | 471 -- .../charts/kube-state-metrics/.helmignore | 21 - .../charts/kube-state-metrics/Chart.yaml | 20 - .../charts/kube-state-metrics/OWNERS | 8 - .../charts/kube-state-metrics/README.md | 73 - .../kube-state-metrics/templates/NOTES.txt | 10 - .../kube-state-metrics/templates/_helpers.tpl | 47 - .../templates/clusterrole.yaml | 180 - .../templates/clusterrolebinding.yaml | 19 - .../templates/deployment.yaml | 186 - .../templates/podsecuritypolicy.yaml | 39 - .../templates/psp-clusterrole.yaml | 17 - .../templates/psp-clusterrolebinding.yaml | 19 - .../kube-state-metrics/templates/service.yaml | 36 - .../templates/serviceaccount.yaml | 14 - .../templates/servicemonitor.yaml | 25 - .../templates/stsdiscovery-role.yaml | 27 - .../templates/stsdiscovery-rolebinding.yaml | 20 - .../charts/kube-state-metrics/values.yaml | 126 - .../charts/prometheus/requirements.yaml | 7 - .../charts/prometheus/templates/NOTES.txt | 112 - .../charts/prometheus/templates/_helpers.tpl | 276 - .../templates/alertmanager-clusterrole.yaml | 23 - .../alertmanager-clusterrolebinding.yaml | 18 - .../templates/alertmanager-configmap.yaml | 20 - .../templates/alertmanager-deployment.yaml | 141 - .../templates/alertmanager-ingress.yaml | 44 - .../templates/alertmanager-networkpolicy.yaml | 21 - .../templates/alertmanager-pdb.yaml | 15 - .../alertmanager-podsecuritypolicy.yaml | 50 - .../templates/alertmanager-pvc.yaml | 34 - .../alertmanager-service-headless.yaml | 32 - .../templates/alertmanager-service.yaml | 54 - .../alertmanager-serviceaccount.yaml | 10 - .../templates/alertmanager-statefulset.yaml | 154 - .../templates/node-exporter-daemonset.yaml | 125 - .../node-exporter-podsecuritypolicy.yaml | 57 - .../templates/node-exporter-role.yaml | 19 - .../templates/node-exporter-rolebinding.yaml | 21 - .../templates/node-exporter-service.yaml | 46 - .../node-exporter-serviceaccount.yaml | 10 - .../templates/pushgateway-clusterrole.yaml | 23 - .../pushgateway-clusterrolebinding.yaml | 18 - .../templates/pushgateway-deployment.yaml | 99 - .../templates/pushgateway-ingress.yaml | 41 - .../templates/pushgateway-networkpolicy.yaml | 21 - .../prometheus/templates/pushgateway-pdb.yaml | 15 - .../pushgateway-podsecuritypolicy.yaml | 46 - .../prometheus/templates/pushgateway-pvc.yaml | 32 - .../templates/pushgateway-service.yaml | 42 - .../templates/pushgateway-serviceaccount.yaml | 10 - .../templates/server-clusterrole.yaml | 49 - .../templates/server-clusterrolebinding.yaml | 18 - .../templates/server-configmap.yaml | 83 - .../templates/server-deployment.yaml | 216 - .../prometheus/templates/server-ingress.yaml | 46 - .../templates/server-networkpolicy.yaml | 19 - .../prometheus/templates/server-pdb.yaml | 15 - .../templates/server-podsecuritypolicy.yaml | 55 - .../prometheus/templates/server-pvc.yaml | 36 - .../templates/server-service-headless.yaml | 28 - .../prometheus/templates/server-service.yaml | 61 - .../templates/server-serviceaccount.yaml | 12 - .../templates/server-statefulset.yaml | 224 - .../prometheus/templates/server-vpa.yaml | 26 - charts/kubecost/charts/prometheus/values.yaml | 1387 ---- charts/kubecost/charts/thanos/.helmignore | 21 - charts/kubecost/charts/thanos/Chart.yaml | 18 - .../kubecost/charts/thanos/requirements.yaml | 0 .../charts/thanos/templates/NOTES.txt | 0 .../charts/thanos/templates/_helpers.tpl | 51 - .../thanos/templates/bucket-deployment.yaml | 87 - .../thanos/templates/bucket-ingress.yaml | 42 - .../templates/bucket-poddisruptionbudget.yaml | 27 - .../thanos/templates/bucket-service.yaml | 30 - .../thanos/templates/compact-deployment.yaml | 108 - .../charts/thanos/templates/compact-pvc.yaml | 27 - .../thanos/templates/compact-service.yaml | 30 - .../templates/compact-servicemonitor.yaml | 32 - .../thanos/templates/query-deployment.yaml | 148 - .../templates/query-frontend-deployment.yaml | 122 - ...uery-frontend-horizontalpodautoscaler.yaml | 37 - .../templates/query-frontend-ingress.yml | 45 - .../query-frontend-poddisruptionbudget.yaml | 27 - .../templates/query-frontend-service.yaml | 34 - .../query-frontend-servicemonitor.yaml | 32 - .../query-horizontalpodautoscaler.yaml | 37 - .../charts/thanos/templates/query-ingress.yml | 89 - .../templates/query-poddisruptionbudget.yaml | 27 - .../thanos/templates/query-service.yaml | 65 - .../templates/query-servicemonitor.yaml | 32 - .../thanos/templates/sidecar-service.yaml | 61 - .../templates/sidecar-servicemonitor.yaml | 32 - .../thanos/templates/store-deployment.yaml | 121 - .../thanos/templates/store-ingress.yaml | 85 - .../thanos/templates/store-service.yaml | 65 - .../templates/store-servicemonitor.yaml | 32 - charts/kubecost/charts/thanos/values.yaml | 739 --- charts/kubecost/cluster-metrics.json | 1663 ----- charts/kubecost/cluster-utilization.json | 3473 ---------- charts/kubecost/deployment-utilization.json | 1366 ---- charts/kubecost/label-cost-utilization.json | 1193 ---- charts/kubecost/logo.png | Bin 28017 -> 0 bytes charts/kubecost/namespace-utilization.json | 1156 ---- charts/kubecost/node-utilization.json | 1370 ---- charts/kubecost/pod-utilization.json | 798 --- charts/kubecost/prom-benchmark.json | 5670 ----------------- charts/kubecost/questions.yml | 160 - charts/kubecost/templates/NOTES.txt | 10 - charts/kubecost/templates/_helpers.tpl | 200 - .../templates/aws-service-key-secret.yaml | 17 - .../awsstore-deployment-template.yaml | 26 - .../awsstore-service-account-template.yaml | 12 - .../templates/azure-service-key-secret.yaml | 21 - .../cost-analyzer-alerts-configmap.yaml | 12 - .../cost-analyzer-checks-template.yaml | 63 - .../cost-analyzer-cluser-role-template.yaml | 105 - ...nalyzer-cluster-role-binding-template.yaml | 33 - .../cost-analyzer-config-map-template.yaml | 30 - .../cost-analyzer-db-pvc-template.yaml | 29 - .../cost-analyzer-deployment-template.yaml | 672 -- ...analyzer-frontend-config-map-template.yaml | 174 - .../cost-analyzer-ingress-template.yaml | 40 - ...zer-network-costs-config-map-template.yaml | 15 - ...zer-network-costs-podmonitor-template.yaml | 31 - .../cost-analyzer-network-costs-template.yaml | 93 - .../cost-analyzer-network-policy.yaml | 19 - .../cost-analyzer-pkey-configmap.yaml | 16 - .../cost-analyzer-postgres-deployment.yaml | 49 - .../templates/cost-analyzer-postgres-pv.yaml | 22 - .../templates/cost-analyzer-postgres-pvc.yaml | 20 - .../cost-analyzer-postgres-service.yaml | 22 - .../cost-analyzer-pricing-configmap.yaml | 121 - ...rometheus-postgres-adapter-deployment.yaml | 53 - ...r-prometheus-postgres-adapter-service.yaml | 20 - ...cost-analyzer-prometheusrule-template.yaml | 21 - .../cost-analyzer-psp-role.template.yaml | 18 - ...ost-analyzer-psp-rolebinding.template.yaml | 16 - .../templates/cost-analyzer-psp.template.yaml | 20 - .../templates/cost-analyzer-pvc-template.yaml | 25 - ...ost-analyzer-saml-config-map-template.yaml | 13 - .../cost-analyzer-server-configmap.yaml | 69 - ...ost-analyzer-service-account-template.yaml | 12 - .../cost-analyzer-service-template.yaml | 69 - ...cost-analyzer-servicemonitor-template.yaml | 27 - .../external-grafana-config-map-template.yaml | 10 - ...rafana-attached-disk-metrics-template.yaml | 25 - ...na-dashboard-cluster-metrics-template.yaml | 27 - ...ashboard-cluster-utilization-template.yaml | 25 - ...board-deployment-utilization-template.yaml | 25 - ...board-label-cost-utilization-template.yaml | 25 - ...hboard-namespace-utilization-template.yaml | 25 - ...a-dashboard-node-utilization-template.yaml | 25 - ...na-dashboard-pod-utilization-template.yaml | 25 - ...dashboard-prometheus-metrics-template.yaml | 25 - .../grafana-datasource-template.yaml | 72 - .../kubecost-cluster-controller-template.yaml | 282 - ...st-cluster-manager-configmap-template.yaml | 13 - .../kubecost-priority-class-template.yaml | 11 - .../templates/network-costs-psp.template.yaml | 24 - .../network-costs-role.template.yaml | 22 - .../network-costs-rolebinding.template.yaml | 20 - charts/kubecost/values-thanos.yaml | 117 - charts/kubecost/values.yaml | 561 -- index.yaml | 18 - 191 files changed, 29750 deletions(-) delete mode 100644 assets/index.yaml delete mode 100644 assets/kubecost/cost-analyzer-1.70.000.tgz delete mode 100644 charts/kubecost/Chart.yaml delete mode 100644 charts/kubecost/app-readme.md delete mode 100644 charts/kubecost/attached-disks.json delete mode 100644 charts/kubecost/charts/grafana/Chart.yaml delete mode 100644 charts/kubecost/charts/grafana/README.md delete mode 100644 charts/kubecost/charts/grafana/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/grafana/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/grafana/templates/clusterrole.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/configmap.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/deployment.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/ingress.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/pvc.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/role.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/rolebinding.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/secret.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/service.yaml delete mode 100644 charts/kubecost/charts/grafana/templates/serviceaccount.yaml delete mode 100644 charts/kubecost/charts/grafana/values.yaml delete mode 100644 charts/kubecost/charts/prometheus/.helmignore delete mode 100644 charts/kubecost/charts/prometheus/Chart.yaml delete mode 100644 charts/kubecost/charts/prometheus/README.md delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml delete mode 100644 charts/kubecost/charts/prometheus/requirements.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/prometheus/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-configmap.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-deployment.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-ingress.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-pdb.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-pvc.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-service-headless.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-service.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-statefulset.yaml delete mode 100644 charts/kubecost/charts/prometheus/templates/server-vpa.yaml delete mode 100644 charts/kubecost/charts/prometheus/values.yaml delete mode 100644 charts/kubecost/charts/thanos/.helmignore delete mode 100644 charts/kubecost/charts/thanos/Chart.yaml delete mode 100644 charts/kubecost/charts/thanos/requirements.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/NOTES.txt delete mode 100644 charts/kubecost/charts/thanos/templates/_helpers.tpl delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-ingress.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/bucket-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-pvc.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-ingress.yml delete mode 100644 charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/sidecar-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-deployment.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-ingress.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-service.yaml delete mode 100644 charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml delete mode 100644 charts/kubecost/charts/thanos/values.yaml delete mode 100644 charts/kubecost/cluster-metrics.json delete mode 100644 charts/kubecost/cluster-utilization.json delete mode 100644 charts/kubecost/deployment-utilization.json delete mode 100644 charts/kubecost/label-cost-utilization.json delete mode 100644 charts/kubecost/logo.png delete mode 100644 charts/kubecost/namespace-utilization.json delete mode 100644 charts/kubecost/node-utilization.json delete mode 100644 charts/kubecost/pod-utilization.json delete mode 100644 charts/kubecost/prom-benchmark.json delete mode 100644 charts/kubecost/questions.yml delete mode 100644 charts/kubecost/templates/NOTES.txt delete mode 100644 charts/kubecost/templates/_helpers.tpl delete mode 100644 charts/kubecost/templates/aws-service-key-secret.yaml delete mode 100644 charts/kubecost/templates/awsstore-deployment-template.yaml delete mode 100644 charts/kubecost/templates/awsstore-service-account-template.yaml delete mode 100644 charts/kubecost/templates/azure-service-key-secret.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-checks-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-deployment-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-ingress-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-costs-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-network-policy.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-pv.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-postgres-service.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-psp-role.template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-psp.template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-pvc-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-server-configmap.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-service-account-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-service-template.yaml delete mode 100644 charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml delete mode 100644 charts/kubecost/templates/external-grafana-config-map-template.yaml delete mode 100644 charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml delete mode 100644 charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml delete mode 100644 charts/kubecost/templates/grafana-datasource-template.yaml delete mode 100644 charts/kubecost/templates/kubecost-cluster-controller-template.yaml delete mode 100644 charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml delete mode 100644 charts/kubecost/templates/kubecost-priority-class-template.yaml delete mode 100644 charts/kubecost/templates/network-costs-psp.template.yaml delete mode 100644 charts/kubecost/templates/network-costs-role.template.yaml delete mode 100644 charts/kubecost/templates/network-costs-rolebinding.template.yaml delete mode 100644 charts/kubecost/values-thanos.yaml delete mode 100644 charts/kubecost/values.yaml delete mode 100644 index.yaml diff --git a/assets/index.yaml b/assets/index.yaml deleted file mode 100644 index 85db7b955..000000000 --- a/assets/index.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -entries: - cost-analyzer: - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/namespace: kubecost - catalog.cattle.io/release-name: kubecost - apiVersion: v1 - appVersion: 1.70.0 - created: "2020-12-08T09:55:59.539327144-08:00" - description: A Helm chart that sets up Kubecost, Prometheus, and Grafana to monitor - cloud costs. - digest: d54c4dee21a08a6fdb52ab88d4d692853008d0acf096e84d59230b5bbf248245 - name: cost-analyzer - urls: - - assets/kubecost/cost-analyzer-1.70.000.tgz - version: 1.70.000 -generated: "2020-12-08T09:55:59.523959491-08:00" diff --git a/assets/kubecost/cost-analyzer-1.70.000.tgz b/assets/kubecost/cost-analyzer-1.70.000.tgz deleted file mode 100644 index b26292b38255265474834c6377f9a2490af9b886..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137539 zcmV)iK%&1NiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PMY6dm}fJAnKm853@Wk^LQSylxM2Sqohb(tJv#3O-rn@#wtlo zN_O{py&NzTBw-~JX#h!ymg{``)6a)nCh|rmDVD12Ci-iahy(%wAP@)yA_6X9+<^h~ z=f5JlcRGQTH|B8af3d;TY&M(6hlldtX0w_7w|RKH|3&NIA|FA998umX3Pb!oq70Lu4Q8zx48!+560#3k`1eg=q z5uZdJ5EWRXrf^EFh}tZTMzdM_)HAl(lwSWc=tqccngJ|c|3@Na*Z=0oQ6J<5E|fo91w~;F(9cv$VPSqn#heP>fd3(#PDbi+Nx)&lcMNu zJTgfS-3fB<)U>}ciDO0O=Vtp`u!iSdS^xGAV?9t zA$KS!L})2SQ+Fv&H&@?vFF{Sx>sds_@B_vPg<}MW+#Pnsn0b-Q!5x|dihhYOMP3bv zeIg)P;*%3o(3hA{R4qq-6L;IM;RDzK zFaXf=C}K>^u$XaG3#1zXDDXmp1HLOr&BLP+qA1`%42HEBRNbo7VGZ#Pc=~iKBoXl6 z9mhcdM-&VNE&xV+BHHp$z%le0@bR7OJg-VkY5X@sO?KN?qY*>A4Gtz?2i!~$ATmP; z4KNJ-x%|WT?Fqw(3EoGjhp7DQPB5Awz~+HVNq~Qq(v@ILqN3)mVCWO~PEsynf||!l zI$6dVjSy4F7iC?KOd$>~^P-HSn&`lGJCn8z`9f&}=wpzAu=kxK;-D*t7>U__{- zY7I+>RR9jj3^io+kdlYF-8aP%MU8lp;x!;UN=d|#7+bjk8C3a%l4v{um@~N{VHd?q zMhs~{gy8BX!mXI)cwd0N5Nv}na7i%2OI1Vg}$5m&HrH;gac|tg2R={PR>o z&`o4{3)qo8GvllzEHFeqxd)IU5FoLWQUpB^1-{@3x<0_7TaxtRkq7a>+)_WrQ0~+d z!HC{8-!#FFW`xk+1rbA@oDUxdcSGpjF%5_L(7pQs4JU-$#jsd=Z%<^fhWso$t4EgY z-I(Lr-Z$}Ie=AAFIP?WjV2vICO8n@EtnL(IKORH}P~_qeqk#WKkDWj#{t7)0s|I=t z%Bi*tOu1)3?9V}bS^>kz8zW5(VvQzW{?p9)f5wgSd5GGk%1$D6n7mzqbVMl*#40uEi?PN76*h*In!mY*J=nMVx8QE&>zKK`~}_|Z&7%nuRr48You~RZy{@Szh_7V+#_`7&p{+f2E0^1 z6#?nKXS!HMWd>IbP$GM>GNruu>ct{7lNF*7Cf4Sfh59@gFQ;wm_e=H)unCELPi&s? zk;QCU@<-g%E+Bk@=sjkts1NN<8n!V*^qyjl*wdDUgf@i%9E(ovfPN%J4k0dDU%=bH zo?VJvfg%@)gI8*wQ_`V86^3D>Y)6VWUFeH_D4sq}fb2-T*V+x69cc5%sH9#aEp3Qn zBk?+xjtV?}Fy|~dZNMq~l?3pf$*qbKUyvH{kppQ^tA!N1I2fO@nb-kxBEQ%+C1n|@ zWQIL4@b%6Q{kqJfXe=qO9x(?&#+_Cj$Pc%@^EO}y?Y+G_*Kyg*;fV1)-QGaTN3h|t znGp8HmXAF_t4P$7^<6gWxGrMsG!cf|K-YIveFw@CjuK&OH3p}?pb9Bahg49ceZUb@ z7Ri3)I?62hzi#H*5yJSdh!WA&ohjnbgB%Vb~*tC*X5pl;|Q;^m^O7kmpSp zc^CyQlCxi4Yd9A&|)QLZjp~_E$PBEx;Ia>8}9*aUmJ&}|0I_ryc~LR{tMHWkGd zkM}*K(^Ke9P)uzirw?a17_;;T#Qpehr9t9^Lmvdubcm?nCLWxtji7sT5vwj0tBkPk zDHwfDC_2+z@(j*d8?^SDH2|jY;ja;*^HUNCi5dk0(IeSd#9gJn0u+T5G0EB>;CPCp zJ{|{PLL$K!0uM}a5OKtS5Np88e}5%5?RzBtc3w$nWCU(+PIm$34Edv7a6iHBM6wz* z!U6KccJ}YhX1m#J$nt%pBxL?85WDaYGRbL8>ypL$gxrBBRNI)kU%0(F)jBqH2Vu5) z6g2Mf9S)I)VS~`|p7^zQff*l=(SZLtFpUgE3j^6i4J2dG26ctq3hRCiN_@SL5^*r5 zh_OQHGjs8(bg?u*95F$px@yDqA!BV2jB)Uw+esJXK69We8K)pSflLVbgtfts^}YH} ziU=us!9YMjfRv!96lyF)t~@#TO0g-XFC-pw9B_}o1kR8+d&s7NheDssmAaXO2@E_R zF$o6;;~D@$0@59E(t1aAkyHbK3mNyvpX4+HCnc4pj}hEws*nYC$801;uxkPFP#^io z<%G&3LX8t2QFCVa@u!+>@(zjFxkK}MO~NCgC?l%WyT3%x|E>Fg8E5*d+{W6VF8|ee zXf#6NNLjxmeRqPq$Vb0jQ#3-<%D5!m2joT^y=*m(@nPeRxM3iC1g(wYX#E{GLhHTYJ%B_~ zD;N?_j0cC5D{iOx_NiK(b*Bz?WIhrEB+i^Z#M4AE;iP9yNT#kRk-9Xs)C$SXX|1Le zu%iD;mvXAqN$1z{bWC|0h?9r-4Cxs0YddQPh@~O3#EBOUk#Ek>FmtM|?Wh41~KVY$^7+)W=gF_-9vx?1T`M68eVQo-UE z-w_4s>7s=jHZYeW7lJ=nR~HH+gMUZe!nHwNoEC7RkkGZ&P)Po$bOZ%7DUzbg{iY&A zASG|}Erg8S6YA+B71+^d9xxT_CUqx{9yo=4m%ep(T(Acg?|YnLmkq=Y(gu6_XIxEP`-m-CXL$h|FmK?d zFF=$eZyf*}@c0Ngnub2)2-MRoT+_GM2A@}A%>99DOS*dL) zy|EVHDsLL3-bk=hl|zvn&TP>gpyo!|9;j*;xg0519-XRoP*%Xb@LmMm_Wj!iVp`IFQC9fN?=6qzd)#qo5 z2B$Ezq`qCbG~{I!lY0|&v5?FqQNn4(kmK=SFbym${LMgu)?L<8vSNiaY! zuWq_+1==Hs$qQB}cYJ+^m#UR-MUQ|1mmkUGE&zK@JY2H4W=}>?P4t`@xl;+AN6qFm z&M|W5QEUG_*12gJw`#q_8faY(f`rH+ca@@gnGsADVKR5A>k_a7y3n1(M56WfN;EYT zq-kq0b3WMDyg9Eq(2Tc3lcg?g0UA^IASNj}XSH&lm4=YTB3830i)5uwJ>n?|)XYM; z6dISvNTPB6`qF6TvO$9^*pkaeH9Lqx%;-MI>rh%?#2|M6h)u?jqkA|n6#%NXrdIP? zEQem54y?64SBmn!(%vdd3&$}MFCKx23Dyh)v3d<@*@6ygBqt6fF%0gF5VMmo@`(D0 zCNdmbw;#}hp%{oa`_0y#tXj9L0(HwWDA;JMGR1p^*zE>`pRz^cP2hz~0uFJ2=%De{ z0Q%;ZpZSU_v75&j*6@{wDaa+=h}`hBpliYZ)m1p#dZXb++Dw2Mlpt zq!Lg!j0P^D6^s8SzK1i{?x?I63)6b+5@_o8i~Im)HdpKGFA<86o~7I*P2s~pvw=Z~ z=zyWXQ~V&gMb$(^5%g?hgz7XTYU(?w$WKJ8wC+C9AD>>|+Twv-#S}yjA#DQ|O<#)5 z`(-l5Vge!t$7sNiO9GD#qz3CTDIwbUZ(rBzAAUTV{`BfqElY>46nFK)YRB-}qM@T{ zAs$b}p(+Z4fUsz~2oX3Nzr^cebA5GI-vy-uC64hg(_eQ5Man;7f-UQe5sd~#h)I-7 zXL$MAEa^)@S2o{^GMt{LJ4^A@lF3pm&Dzsy;p*#8kX+22q-nsT{O{ln2i|}Cx_$=H zlmvam&ESW`dj-DA427VDgb5}Emv)dTd@}$twX*V>NuI<_>09MCUSF@9PwpkylO+}J zC!Ua6N96hXZd9)ybA~kqX1DG&rn&^uXFBK0`~9@Z-`r@FQ-PB6C<=Y(qL(qUVptf5 zJYs`z0vURg|NXk&i-G_L<9fnR|J&En9K&IA#?iF?0sIfpj7MNM(H*|p1$D!X>${-- zWvi}o#6K?^|Ng38d0ePMLLgbri`U+`^UPSXXsLM%+}yTlS!BhVO=hQ6x(QLa`noSi ze51QhrQSYIM>W!_ujTu!Sh*=Ott7KQmeOkxty=vkB;~4|6X@k}d3v|(^UY__GaH>+ z%~t3Y-u@Kc$rO~+x8pf|dsd+;?=V<<);egMEW9n>0XGzmM%V=xWIUFZquBS&@!QvV zQg=#1a0EQWI1Y^YBB205ccM?e>QZHf=o}n0&82li9QnCwLpNdFxnC2iy{Z`EU`Y7H z7(}UwmfvCE$-71QLtcGirqnDAU~cXiitW~vJ(df7;6>7uDK#cwh(wQQB)vQYSbdWg zU(g&ho2^=*dM~G^Q}@b8h1bg32qig)itnc>gDPpps)yemSV57lA9(^%bMFh}<#KF0 z3N%0g;`~~f37npv^^^vMHI!mBZNDYQ8M+)mc?V<^videz1B4MLQ^@lTYMV=WznL0Q zr9rjvPn7WI0r;OJh$oZ*2z<<>vz+#-+N1J%6$O!9W=>;6S=6Hh}()14lYR zT4(eNLc$?*?<_gL-r7HDG#kxEt8NuMzn&d}3mn`5dFcf7r@DeiL!3bkX`_fEBQ|~UgpCGF4SQHqs&iFk-f#wa8 zKvT>k1_Wth*{!TB#V=(A!xC4zMl$Wj)c41q^22f}vE1Ou1SD{zc052FAZh5K?6w7h z3KQu`7D(gsm^$TX*_g)Q&oD(U2dC-fm9p=c!cZy7V{Q0hdIwwph0>S*7-cW=h{Kw>Bcx;hM$; zwMc)G9m}tbwfFYYc03+&*`7-R7lmB@k&MEg==3;nLgG0B@SX%#E4pULUotGaVko{~ zc&f3B>}|@Nk>KSR1c3Q9Q5(8>dM56%iTmY@W_2oi+#0By+U!cOw2U5eQr{HCf42l0vWSLk&vr| z+*eCEbq=F3P~X4^K^{@m7D6Zk%9mo#6%9x=zq(dc)^LrU3QE$rv^dm3!pha559NVnbIlpI~FSw7c0$>B^|md5a7gM=MR zxSgQbh(0me64FWz5}OPOq~1D!81|40H6yVgmEK}YV*xRTN(9k|9%W*n_o4)h6p^No z-XTwZ(hy|*wsEmeI-rqA1}1J%`u@nwx7bHY1wJCAF`xR%o@7p<*zQ!DJ_*#MSGabr zNB~PWsRcdMqjeTn=;k>ruyE25C{!&cV>(q~xZ(~k9wXqp!AMuRg zry9x^6oDbdfmBCGlXP+)#E}G`g4Zaplr)RH4eng&`6u>Kr7+Mp`M{MmwB=*XVA?6*brPzT=LyE!Qo@eY6PrdLX}K&VUb$98?*tKho|Z@Aa1DyC8`AMX*=EOPP=ai}f^q}@ zN-HDO$zQL|UBI*+Mz)WYbS;ib%2PmtVU1cwgdAfoHWIOe#AGW4$)Qh%ds8TC?M)+} zW5>icntEb&7>I3Y+a3EK83CuGZNANUDRFw$A`47O1akH18as(=9*p=zDUX!Hn-%>; zM=`QuqlojAv^L^)P@{&yLz~|okuMMuc$PMRsB`RI)5$>#R8$@Lx2L82*QXMqHR$! zt}A$I8~pu;9)~|19_xRbX-u^WsnhG*HrRjN z(3HnQ!e!QBUG|?!9k<>CMhAanvLTlmGw?kIDT``II^I~%>DhN7_u?|7xkKl zDodQHwWhPH99_i6minkp#Gq;KB*Apa z2!xQrDH6kFEKlzzC;%?>-N=X1CqV1k8>)?KqPAt@@Cn5c;z!`28S+Ue&QNiDDXG7h z;PJ$PGl+dS#6IS8@RP+_t`(MTs|t{xBgV<}T26R3>)I*RDpRRHu?55#M)$g+CKbm~ zv5usECyuhB=>#*xQnVr_^+Jg&J{}==?)oT||GiQIblv@aNTm2M4kKM-97cAAE^4L* z-ZLGv={q!6>%Vh)+U@th>;C=xELY+>Hi-u#c!!LIy!0toJ&A+OSpf;91SYNXJi#RB zJQS=ET*dJjv^H7#B4{@Z!}ewvnvMNCG*4XB4Qe5gB4tl&kYacL%=d31_YU#495P3+ zBWHw==dc53D8FQiUsE)~4?_H$$uD9ffY+4#j9h+xCQc^@&4YuJqu0m#Cnt4H;GG}( zK+7`cXO<4MBWr`x+aAEI0p7(EFULu7=Mc^X`%|@(CKcM+aau+#fcMN%-*jLzidf`x z=GYiHNz{V`R`C$YPiNXAudRQ(5p_qwK>Zj9Ims$~BZ$5Y>h@RJjOxj?=t-w{*#>o) z8(O2*+CMlvIzD;*rY;t2M@U(Bfe_swvqp{tawr`~N%m@2HDj}<;Th2%v-rYJaE(|V zlZNlw@r?wMMU36h4w5i-Lnn?$cB#)a@pc1(J8KnKo)ryn_?qA%@3d%dw)(C1w%8DCSBSv<|y6&}X8${H6C!j^H%@Ab#k4 z4~39&!B*q19tyess<~$TN&hy!c)<))5~M1lV5Yw&r|`7VxsGe0JuTu=b?LmN3YuXN z495)36o$!nD{8FxmcYvlk+B_Hgn=%ju}-vLiz~&&G9$I9QtVNp>u5S$SVxyhW=ks) z7gkD&*|WbKHH$9nxm{i{nRSbvmRCy(n-SrVqfz8Dw79xe&a`W+fEEvoDP?Ajcniyi z#FHiUSyx3Xsax`e=IMfXmEcD@AoCsq+CeM?=I5M0PPt>~YpVg(Kx4a@U#|;VN zwtuz@PCIA2pnKa>mo%r}zLnhj*N7s`s?1(++n3tXSP&>y}9eA#LG7PkoF6x!H{N(dc+|;yEX+ z(aJM00A^ZCgd!mmN$06gBM*6)DNTx^s}NBa1ssl1{6&Vs#9E_AreVZo#Q=>7 z$B-lMEDb^nt;u)IKuyS{7_fC}I`@Qlpp<$$pb%LN{g$P>D0Y29K}QU&>95r0sk5)X znHCa|2I}0Qx!%Loz!It^rmR2%Tp&0@VCci(F7YQ(YNvh%Qzh>geu_0zr?Cfkk=!6B zUX7R~I>ZNfc`g=RvS_1W6t9LxRCJ-3OmtbLdyHG1!XT2qu42F^kRmU>5HUWo@qVc_ zq^cMYM>wBAkL{)dU21lwZKeL#uF)RIm;(Q6*BqPw*RGDpj)Sog_r!Mg9h!?1vx>Yr zG#6cj+P=m{WoCSiC1X`Lp!JNP5>t~=Rj7l$hH!`Gu^^`d%Eluj-N1!hC(oRsnrBsO z{LGXCy{527b@?hf?>fWQ!T!iC# zX5zme9kp89`0vk=YBgu&RC|1Mz?YgANejC6*Kq)Bovp%M{}yX6WMo?B!-rZdlT083 zLut(uNu{y6HjINAH^2`QBsJJd5bq)A&37eJb7iyvX-z0vaYlsRL+U9@Lv8MtcwoC^ zI)#DuyORGgVWaKJz;TirxW~tWJ7MtQgCzj(E%3D#JqcnTYXL1aSlYwAc8MPNE(qWZ zkD&^=m;L$$ zdAwc!&ygM<_r3x%JZ-CMD(oXZ57F0CF)T8!)mM8TKGa01TK6Fo2Z8M6t$c)~QPbrd z9Vs9ee?YDWCn+PjLPI?`B=shSfrye<=9cR>AtD7XI6jbn;%Pq`jqrnvxMF~zz>|L~ zEKkkWZQ971Bfv0}_%~`lAO&5P=b{bK7r~WWD1>fCrs{4^AMRzZM;Q5@Qc0L07;Tr`cHX>9n*vLE_TMeqS95l8R8rvlUoG=|TE_f7=sreX> zt0_}jpwhtmEP?c;>_q$P>T_%18IOm8l48CIuBqIW5ez8~_z2Yhl{x>)>KSON-BqZq z?C%s6%AF`fe}RcMY&~;gYzXzETt^zP`ONA%EfD{*2R&A6Bci^#o~+|*|ILAt=KNhcxJj-L+hy=eWZMRjHR!a+QMqV+4NNzRN0N} zy3fF`>p$w1fK=I-#5tV=z(nL)Hs!LkGFet51w-{BSK>{e)O(MQpkyqPGkR@;{Aq(t z_9P`Os-sCwR?4?%E|J?g6+&@&#VtK&I8WEmnqplk`zGbWVPrZCYSn=>yJO=p55PD63htN-^_b6fh=tWgHRVrJ zK@7A@S03Hg;kx}z9IqO8uO+>$Fv^>4c5`E{xA9Q=y)0L**ztKQj`{!iy45&zn!Dh? zw;CtUOWJEUmxT8G7-KHPGVL&5aolq*_A8A2fgbx-^LYn<{r1$L6tuNq+}(&WJVW}W zCLKf`y3$4lKxtK@bw6=LzA)l4|7Bw)T~DQ7dBl@!`bycC8)bD(s?9isLXt%C0gU*y z4kk`-jhT9XimAt9?+|Ra1bCWanY6K z+b<*g$v}C@seN`J0;G$}#%O zJ2c+~U#e$T;_^zabikK96q$E8@UBLtlw%dZBY=L9#p+WS*5hw60BlTY1sr*^o-Kk$ z;N=9e@6g;dP}k#8f0Zg+0P|~I#k^3J18zt^)1U>Sumvi|s{Z&voIOUAO#cq2J}4+z zdfTKYIO0+|M+d z5S)NYJ}z=H&I0lR-cYkXfXO(-(tK8M1oJ>n%|~#g-LnNt6iZ9GSkwed!Bb_}5-|i^ z$fT>&qKiH`^m=;ZlaLtiN((5i7_TE`hFd}qs}Vs%&%cED3S?UN4RG=wOrC&;$A>6z zGe@;geJ!<3&y>pUe;3$Ct=z^^`;X&{{l|W5|7iRE|FfiweyP|&5abn6#RVHBHgJ{e z=R8T2hQJ8bZ7^%qgox1Aj&3y*U%y=g+HXr*%GtDAQ=W2HA^asmHTBe<@g%p3Nh_{4 z_{~w9mfqv)@SY8nSL5Ig%?H@4w?W-{@O_1j)OT&5YDHPF*8pscMg?#QyV4z{J^u^V zzqBoN5|bCld|j0bELs1p*1V*Ip7(q+tD3HjHvi zW3_a2%>~NWl+w2WeggpxJQQ$nC=g~La@C^NFF{Fg@?nmPRP;`%aL z(z;!}RBWnD;X^;7W0X7sFoh4df%g3K<9x+ydNzm}hzCStWQ`dp2rZgL4*=6MmGXB5 zNpZvY%(a856NkUc1tQjgSuDudtcU<9g0ciURaa| zXd;i(g>V(yvj6H1&f0JCBn%jCcP{p|X09XGf3|Id;>xAR}#ckh#*0GW+W z)#G1bKavAr;?GuZ$1MSQdAm{*##7M-4nW<6R9G33eW0}9ap~E(0yN_a86Ql=(X{db z^&f!melDqu|EFK%m8N|xd9iM_U0|8~cXW`||LvcgZ2AAQqzqfu?;{3;$5D2*ZEX2g zu(VEmWmd+?Rk`;tERrV$AWeB}Q&Oa9LeaJ6`!60J&8^5P!|~#G&Bdy%e|Li1JGQO@ zaLM{VJjnWg?(ZLO{lA_km561ha>9!&P}3z+x8e5M9zyO;jID@S=9C2gL54*VTLHCg zS}VA?A08S;WBnqo4sG2A^{@6?;4AgNdd<26FNb3)XF(OnP1zd1fnOrRbLhY#(L z63=;j1Yc^q@J<*O>N(T1k!vX*)LOQ)0{CPKGr&upH#Z5=aZaHd5HI@_U}I0ljdv*t z8b7BYB(aoha{p86k>YWS%Yxs4CWh8w7Ht&Fau}&cDX;oBgU)5=;_v^n+Z*(|z3;od zLHF|P`s)1hCZkl=(IZxQHoQ^nwJoOkje34%8A|W3&bk+67-bFd;ncU~nvabBVF5Np z1o;t~KFBp)M64?<(8{bhKV$vw<=No&`mA%)?GG-mekksJ!Aoo@KDjj8G zf0d`@#7MaSK zTMvoH_IxrH`^OB?Vf%=~#T4mvdx6-P6(6$eE}nl2oh^?JRbvs3(Xu|0e> zvqj4B%Z;G;l02jkXC-z-NuD&rjelA1j5+|#QYCdqlMK_SI5I&yTRv_hMmh0EO+L$r z9nu=zYF11X<0#-W;zv{D`VddcKU>(xvCtB%^%kpgEaI`rCq+OB36%_T;^k2`*s(9$ z;=wlW{-8}_2g9%wFDpvsV$2FUumsua2oCkfVlt&9_?ZloX5$~58Jvg{=0YC_<1!2+ zQxFGZKO~+hZzy&nNGPwJvi3vbd6>~i-cb!BZ@dZW02T?zpz)gFWst}flMi^IO|Biu zM2cH4;xwx@`l+|>jil=GA2$Nv5Cq6$O~&Wa z)WDd7gBRl^g zcZiDo|4B~Zi~0ZY;qhUX{~sJ3ZtXvxCCQ*L@;M&!kOvNU<;Ofewu|^Cy#@u6KlM!r5syxcoo)N2Pcp*;w>4bxBBh(2KOzKu?mIr=94D; z;;AU~z>~?PQP5$x^6~Db)j(#quTZ;XTY}1bt@=%U7!~B^Ox0{-aG%>uwAI`{`ki(v zV|$mfI4%l1v94+w0Buc?bjX-o%5jt$=lGLlJ(;$fTu=i5%+Zu(?JON-BPpvia#etQ z51vojhMlI1RCbnKsX`-p?d~ac8_An?HW)Lk$#ZquliTXJ%195D{h0r9r_ZHmluU>d zo2=Sz>D7v6q^wMV4e5e#j7$2FdfmBb7{_kte55ffZF}+9=@&Si8AkVrI>!ywz`9DqU|Z zrZsQ)xsh4+>SsMdD}b^|QZwWBd!RNO*StCh032W;mc^dfSw0(uA));8ZNG?=v>BK; zbV5X@%o*W_GKMYNnUMS7403p`{jIIu<$bgl*C-xD4P_Xy`H(y;;=D^7ol}h$`Z@1| zoJaUaUdc&gsqIX?W(|Im`>v-uDYf(cJW%WF57ihd$NRhphgCNM++OSGd#EFQ38FblZtf`AmOv)wd871%CC z(8B>@?3$7xO0R(l=i$5Tp~RdN_a+GXeDZ7dBcZ$va#0S%c7UOOhI}~hBbNjoYlDMk zs!WI|mhV5QudVdgk@8u;nNY+g#P`}@zuDX}zaqS=Fuyf)@0BZ+=-=0=zd-q2MGwDV zR`-&6RYz;xL0qheUaAPsc0w|?JXMxsN9bD0-Y08yK~>Fe(KM+-t8{Y>ohhiO&s{`E zg~gww$ps6vx!G?E^oEtSx(kMXuR`V3SIkDT7ib(yij;*Hs;+qi6||2Zn~RkV(aaIH{z1*FSVjbNF&ap7>aRiRn0Dqwq->wst{`HGm2T1@g^wj-08*D z?b+bEclG`GS+_UnT%QlV>;Ao{V{K6Hoc{{@^RvJG_4?i5{kON>`I`XsP8cWtFUNi} z`uT6upZ~+3-POU4d{*+^={2~f*u}vZbgs{(0V}460Vr=x3-Nh(b@lF|JLp_rU!0$I zZqBbR2dBO6S@-hhymQen#w$e{g_pHSl(NgW=kEsBottkffGPxW_RX^D-mtjl>BVjT zrrQ&P{r3E#`*fMi4pCNZx4EWdgk^xl`1Nru4as*_iZUvR zp?7}M9b9+%{U5G+XG=Rq(Ufo`4YV5}VSG#xQyWy6MA}|7riB2OFs2l$-OJ857u^y} ztH()8DE-}O39RF09#Y<>jZa`eSmT!n(Ycn!zJUz8orq78Euy6L_ostzI{ow0LFe}7 z+re$W+q>+%?^b7MYHz5(&DKJC0e>q*wYXQ;g)!|uv;Gt=fNJ||-Xm;1S~&aW)6hb7 z#Mh;VbkClH9yZdak4F;-QbeU=-*O>R3|_a>>-GjWSKoCnKi$|>LE0L*EoNWf@g(BRB*5talsw5ZVVs!0J^}DCN?u}LW^Y7SV zl%G*`l#0((G{6^E?*^w=7Z=@Ac?w-9{pUGUS%{}s*4ax}QFjC-SX}q6&Tdb2XziQx z)BgI1=+jy!fc~6gm#vITx7WMs4SL<{tKQA|<-7GUL6j2Oizi@JJihN-+;;n$KtvW{ zF(y?JDI=w9$4c<;cQ0>xe;=InOW1CG!g1)?wn_EUMj5!)cQA9z3$-bwx=|pXPv*7s6HzUaIWEkVQ%d=tBT9<#`OKF zQ(tEOxaul+-}&3%ueaUa-v_5xm#4SAUib2}^2s4RJX84aS8;4QC4n1JiUN0DfXz`U zDz`VMgR8f1``z+aHx{-ZarbI8Vu%;Cx{T}t#P12cJ0&dpz`(+y%ML4--J2h-dfyFB zulhIrf!JY7yO!=*s*#MFyYA9Kv)NkZSXPp~_f-a^^AWI5zW_795Z?uSg3{07fP3uw z07_#U5JJYl&9|M)tC))c$RzD$;Bx{{z#@tOpFpm_MvRlGYS!Fw0}kmJanXFlkk^ox zAn8N89{ddakq^hfBZ$f9E)zII00wgaM9bFfEbg`&&&$g@yU60$87dJTN| z;3!-jiK{cx4p)w-P!g#vZBc1=HFnpMwIyrY5~fXp)&kT48;gzy4zMI!+t52L_E3v_**+q3iTV4BW-P9fHTI829?aYUI)aw*Ia6|*>4^)T}bF)6c-Yf7j6`U;xK^Hwg zJ2j7blnR!{R-jl{nNiHGjOn_X@#P&_uRl+>nRyD1DoG7x37SOhz^Y!P-FxQZ8gN_Kx%-8;k#{*M9&RjsBc+850s~&NU)-WxAG* z8;6Gn8RQDPSlw#!UH3+cJN?1i-qri!b?OB+JF{GP;&6#(W~^e%{XI&e7^Tfg5qI}w zL22&S@b;=`^UA052@_ftS)vGI#{4}O(dy>$>v<8yNH29HTGs0)dstP0v{5IkKZILU z$+T>CPxz>N!E^5cN?d%x4p3=fRq@O#;)4piKOUVvll$I3mTiAkONY{H?98=z*>?49 z_u~CPUB;Kn;iVnMK1WpF($x(P8&xCyQH;~J*Bw^cUU&S%XqC6u9a#X|>yFQYFgJYN zv32L!y7O$^dA9C6arV}o#~!_{JI}`(vX6SP@^M|cf4A2*pwLG~PyU#~5e%SMI}dX( zf(!2U-t{_fJC~g@Y4M4@HjfOwyeLpWEP(c=@qFRuOr`Agl$Rh*)PfC8M%;y zSs1ZuZQpKHApvTsDX`pI2*unw5|k9k9|X*o^s8SLgG`#rwZg$F$w<9Y5)cpd^}{Sl zF*`RMtIm44B=vSn)%G~?5l!AgQKhWR&9(+dBOIjW#pJBn&PRLysoMKr@zHFphoBd~ z|JB+*Io{8{|G(eb-@gC#97)jFms&NZLcf1q{*F>yO0WSF+BW@qSZqb5Uk+2+w(AP- zhgEugI(139(dVU;7h&4qHwkk5D-H*YLylblNbu*H%-sP>{VP8M6u890!5EAPm6y{3 zE*VMfqjnbcSuC(hBL@q zibI}!kT2;f56is=XK4u=ru{)kPI{!Hka3FO6u=OJ$GEh*Ll6_5qTAB9j6Zy6ziBpG zYA8NrK+E8CPX>Mv1J7)~+KlUz1e_AzM{=uMRwlbw$H?lEZUU_c@nj2+ukUhATv~zc z^+GN0-^oEdc#nmVrAuBfOG|~>&gie;aY^k04QA5UoI=smD(lUkYnex(Q}9Yq@W>S6 zKxr+)GUdfs4ypob`s zu78f6PEeo12M3PP*9XmJy;AvzafhNA^sxsys{c7V1!cG47Rc@m9D};NaxSiylNnNQ-c1X9t=$W19bHwu=kx-sB*ib%xu zx7O=sF>ZmEDOp~aB3Qk!J%I|_?G)N^`s2C$|G@v=d&wgjc;r6#P4C06#N4J=Q^FNr zsMr*STRR=!C-=@3#bX@20586Jp>M`>OnW1;hDn?CZK=d8GLN(6+%T5H6oo4>p_1&> z4~p(7=15H6|J%+_;LFBWuf7C(U$(%IB6zoKjpQV^q6(kM+Wv&AcD+Tr&YCTKABG|^ z+2F8wxOCfHP~3bj;_ia5e`m~HqWqcB%BS9>eKN+u?`s+*%Ky;Q7;Dulo>tRSu8Y`< zcSD5aT=_{PsAsMi#NY&FzZBof&wnjdR`G%D44!goJ!MZiBi>3 z^QJghh+hV`>{UWF{XY)IR0yTjb^dl*tp9JePL2*U`u~IG{_$4-{~Rf+`B4)cEBEuC zVgio!|D(wFms}m#*N1Vvr`!*-HlWz)>LnWP7vL5OHWO9nMv? zf-8r|N2`l+6>a3+q2Sigpbmq8aQm*(%4o-ny5R260<4!j3z3_9(xxcrwC3yJq$QA_obHf)<^XtKk>xZx6th**r%y_k_)#{i1uxDqyDBXMaPNNz~b zTO8TY>NWH{ETlZ>D`-jeg$!vCgc4*@;voP60^$_AtgBr!b*~-mVk=~$v^(#F1ca(a z+O|6$4mhGS=(j;@YQ#I2!Vujky;U2un#Rdh`}R&%({bqunrgQpJ$dr>K5Z8`h1{LU zn|&i#Ig9LkS-$dxHM!CTWuXCN35_h3xt_y@?n=FAVWUQeLkl#lg>Hfj;8J41C4andRWlnk?L~$td(7M}1BqM`LZu z%jY3#gC6mH9E@*efse>t&lp&0;7rxmkj{8AN7F?)S1?YJ(90>0FW zJYPKJi;#b(++L8Psv||hCS1otI$sdOWl=1cWiX2F6w9K&lv_ikT1nz`STGlc z_$aBKg!yRZv@R;8f>SKQX`1r5UD;2{<^5j^!8PLe8CkV^2GKY~ z0MbA$zx35vE}C13&&dcQ-z#u5k@+fQhgcobi9yg@Nx#xjs7oU+gxw1=9#?!)qBsP~>Xcx`L0NCk&Hf-tIUyx(ni_Jk zbnL(@LF!>=t#TMSE(roop?gh;OHS0gD0eThJ7?fUOOFiBNLy^5M=(O0BqK-G?--*oe97$s6IW@k`mSdvG4?z zb%k2!B~>qNxd2SPD(7DApR|N`+W=zj{kq`HXRqFr8ow$eQF;AOk9MpOIoS&LUP)j*D#H;z>>^Q&|Rs&6$9cV^qJ- zL+Untw6xm!Ka^7GYPbK(?|)8OCzYUWsN4{8bB%tN*LI-qO%p*o~8IWhXz zy#5nBmftq5Jpa|!e|U%HdZ(VkaO3O$Aglk|KRn#(|DGk4I8EiB@UK+Ryw>;~ny*u* z?AoW&O|b@JMcdryCGpCAxkIt0NCujCd;}}jPFbi_xL;o9uDRm+*P-+s4~0INPf@^E zU;<0l|NhZI&i?P{_;9=apCdh%z6MdW`xm{oP_^75bCKnbP-GnwG}K<&!~Q)LPt`Vk$YHfSX|w*j0%?2BWP|;%jSVQp(G#?8;F_3{A)7GM&p-7`=Isio6Lt?v}RyOY`*H>yz6!QgTkn4Dph>k z1V(()2q9zlgyuX33fsKx=U#8O+Dpx=^|ds@HOT2CXOQmsc(`Xk{o?Nlaw=$3PpjEZ z!kMGmDJaUKp#q;nFr&M&`@95l_A$>>AL3lRDOY4(=D^A9-~WYwCat*thqG0M{|feB z%~m%4&wjJDJ^w#T`aSLc+Q=)jhO;My^k%k@EoApOwO9J0!IHf%+4o!+LN^uAi*Z7; zm(7J8%RMQ~@UOA*7)tl=_ryb~%atC2o&<9hxC;5a3Ro$C>wD9HOa7a?eE8jSt8LnJ zTABa5t8V~H^*={B{ZH#;8~^QD((j-DOBrs}O+X2AMSDOQzpu=fEpr=FOnd!iz%uzLEBNJw|6-nGooxOpzUX&`Xe~MikjMuyZTD<;S2SkJHqCsZ`xtH7BVSIrRtP26DQi_v2XLqcM!iEN03g;)$A2jJlr}M231mHUQS_94 zo?hP?Bu}qzD;u2zDv{TQ*brlJ|4d6XcFUVPAco-tHFIVe19bY(ndqd zoW@|D`>=K&@=biS-cU5gBq;1p!Kbx*RMgBz>yvZ~4G=HvRpH0A`&Hajg`O??Rbi7? z;=XM^Ze>;5)KehV9ey{W6b0`5lz0gyR$fKr zpFs}O9Gj(btF7|_SR26Wo5;OGJd2mgT@|kw)&}sprf7s8vUsW7Rq={pt&3Mk$+G;)va8Kw4%E|- zQbcNtmf8Fj&`JS&8eSQZ&dOT>pQm#M2}TgW5VFh&ncNldu>d^{qZ|27R0^FNWtv$T z7XxBlM5a(2D6Zig(N6DDqms_7giX3i2B8)38HZ77!!^GvAz@WscRUP;)NY%~TnUr1 zz4l2iInSD^-v5}3wB#xndNAaOR&WVea{qgs*7IMT zFf4d;teT~O23s7YXK|RGbs#<#J_k}3yeCyF8|6ReHV~Wd_paV|Z@%r`_6PlL@B40V z(7imnzB<3W$y(~e&*0f;Yll#V4Gz+g1Zy!W1wJB09wPa@<`>_rXYDak%lE*x_OL13 zq-y>mZ}yvMPn5j3$jYWGxj}P4-3iCegfRZKjdnfPPSKMy>H5nES!G`9pB>NBdiR31 z^6yW?O<8l|ld;3#H1rYsn$rl?OKNBbm8A$~-B~IaEr04g^N*CCF8?hz30!9XcYKhG z|9gD2jsN{D=@ZF+PcY?s9?>o%DXnYKXYD7pMW4*xq#57ZY1Q>lBOk3A0Ct)G*M2i= z|95z}zqS8;mXukz$wU{#Z%95i6sf<(KB``@A)o75SiBecMbS9Z1=bA?o&vH`fbg6M z{ILRqXF6Iv9{93~)xv-;f?F_?3DEr&y%Dz3+~<-i@_!aOl=!Hz)&pQm{XcT?e-2vB zt^e<{q$~p>USG!oO$RDoRHlp}%lGcY`HoQhs|-!qxO>eSm?TWOM+#YStZK@UVfHnw zrMP7t(<)$b3#-JTG!HXuOTRtk02tzTltdwGgCAcc?~A?osb>3vfgfLl#4~YLWe_lo zRG}H7Ls=kVC{-(d-oRNjAW!3}tF8Yb4m`2HuEqwIp8rmA@&C8+zn&?52J8PDMO1}8 zn+xb(&||FAG>dRSqq3aEbt*N&qT$cT<#M5?&a66yeU+Pu1yS$g;C}7$$4fr0)Kq!> zuebHfv~>S(wQ~O7hui)CS<=T`|K%s6f<3o566kfd;Hq3Ax!@`cWX{k94x$IkRXg%g z8}y=}!#crSm5IX8M^hAV=Z zw|~E=qW?L}#s6&`ZuP&=R!i{!$B+?1nn6mpA1kK+BwOKxYg_152I&7QKZ9AESvfGF0d$0#ljFq`J2la zM6FtJ6EO+WQA`NO7a{GY+8zw)!caatz-9Uf=-|KY**{rBfd87?3uxG_~1S0irKoQbM?VCO)>#7hU?9i5|R=N}>N?B*>1#i{H~zzH6n5>tC7l ztQi4*@%nEG4v>}qPENM#|5;KcvuTSX5W3Vhn!*tb;BD_>SxLFZ-@`Bza^n*sjleMc zI8jEb*_4-bW9`c8L>MUoL+%4a2fl4?Z)GVv_ou^M*Al-7GDmQlMmWh?AKw(zO`_|e z5K=xx0Z${H&0in&f)+N}0sY=U8v9h{`lx4NZxU}5%rGTEe&ll>*2ll7jZO9;R{ajp z14lG~e!44V-`DTaf)+Q~F&)I9q+7*b*Y8wmYa8tn2{2r$2rwdPeG`P-lx_Eke}PrhMl^V$WA~U( z%DR@Z3(c67n&XGD6)l4PhcIPdZT+uj1F~fO9~_-z{r?V{t*!m%vm|*r7L0N5a80PX zAxp29M&h>yev6;Vf75)^jOBu_Z~?2{X%ts}!v4xY;ar z+%(yy>XdlM&(=IBu6dBEIie)sDDY~D3x2@~;jJ#!;EDTJrNZf3qy)Xg!y@dGTn+jq z`lWbU>X*cmE4}`z6dzL|&_$DiCMRV~R9-w6m!LQ!Wor}~@F}(wf3|xq3MITR+ne9j z5Cqic&(jq<)6wd#*vl$bbHz5%lVV9laT{CQn2^9oW|l{T zj;23@ejBu=#{Sl&Fhny zkSuj#st`GCJt_3~4|N)U{#3^Qjjr3#8s+t^e=F$!a`u0R&DK``_bf?sJxi_|`(y}x zbCb{rDS4QK5flPtHgaPn>%0Y&wCOj&?AsDclFal-u{TR0Q5TG^4nBNn@9l~4D5>X> zDa3&Z!u$s@1} zsyRFghB9>{UWEICI&DyI)eBv^bmgSGnWC!4iJxw2PMG$)_|2&aF0Dcey+a(-3yRef zZRYE$-eTL!?aFBx|Bolw(Uz8L>;cQq|5^X9qy7D@|Npb3KOq0l66%)oe@f1unT=A` zUsUd?yuY^P{>#$p{6FH@*O7H9?g2~r|4~-{KW-gt&;QSo{=od-Ce-a7@Hy-O){HFO z2eM_i=YWrrs`LNE8D!NhU@8AU&c=T}K0es$f1V}%0r`Ikp>DT;Pq_sYPfF=7u%P&M zBiLlB&i^G%s0e$T=KqJsS^j_2+{*vYlKz1F-y+m4&;OJ>znEi`^85wGw>*l=2b{}XR@)-Tg? z`9J&q!_mRX{+9ngNBSf3|16ZwHvYrW z{=xSB$7e}@K>nX4)Ghn}lQU8sN9zMfAq8h|4&|EUeN?}Isec4e;%D2Z2do< zCH)ckKP6LVhyr&qh4gOA{(m3rKQ(Dv?*CkAIsfNSJtDOJ17J(||KWa4|G$6G+RFdW zl0Gv3H^ftM1Bi=1Z3oB`Z$;jppt~yb&(!=>+&>w>71)2iQaS(6PGQ`Z}dD{t>wc4AE9 zb=|aMrnkPz!q%0~;;e4Aixwg>szn};VpMYhAb$59P=!@Av*h?yLNQ5!Jk>VIC zA3iv0;GAC~MCXnuS2BYiKD4cw(!(ulHDs+&$KHB;tTxFu1Rdz7JVwh_rvJpLO#V-v zRM!3&$$KOlj{nj+6vBQc{=@!O|MNU4!*}#-pT?72z?*Vqmc9(RTAXM@dijP*9#>_2i!~$7!ltm_c$1v0HQtOBM>4w#f-`Ds*oZ;0)Gxvcx(^A zzypvmJPwctMuY-BK?0m^+j<@dj1c4zMGeu^9Nc5ym+vYM5rCeDJirNn!Q9kjU^q9D zUIWy2Qo~D!&~3noPY5;ImAluhfk_f*&FaDDGwL+*m8|RtaXS5?x)YxnbYEnC<{e{E zj7K!^$bG=v3GxKM@-KUgLmsIDGen0LlriG*-#%u^k9)}7N&HLAbNn+*eT+iS{^%he z$)AP2tJmW{(F_HgE$OBzRD^mpoC=Y6@uIA`#O)#(&wzN==!V2gei#V9M1(^-JM^(D zDKepaW)1Wda|(lT2J9Z1VOLc8EM}^Fkm6TRtuZpvl+~m7g>3bVzw1LhE&rT+i6j3N z5rO!r0}PfCG*~=Ng`GtY90iiOl~RUz%!Mr^7CrTGxlcWdFbqq(WIesJxKjmvU*69p z)3E7|4&$mt6iZ3)GZ`l6$3H&#{6w5E7y39Dmmx2=Hxh8@hr~1G4L?~G|3V}};$wGS z)_zDl4>KBtf;9~zZ@eyT+ie4j3gy%I#rr_6nCnBvN|*jREB|S`(2_=lfVIBJ@(m6= zK^UKpyNe^aW~Wqe*ktz3 zV)nU_S&QE*;1qH+o~zjt#c(jbm5j#F;uJpgBRWP#FDr9y12}`&7pD`GuarPN8$^}p zv};lfh%0Ew)}R28Cdwx@1ArMTpx+~fI6%}|s!t&dk?<6bQA**HKM2Y)xk}fO?_WzE zTcvtZ+6JVgr1yf%t>JPqAwMi7#T}ZnxEugeQS(|wJDx$hm->u?Ssv!~)!E>(^S)~V znF++-QZj8@nE;G1@;%KLa`~!FGw)KNTG~|qx^wyw+LLQH*XZTdS$A_C6x1g}^ECw`ayw{gO>GmLKx3| zNI!A4{vhPv=2{%1ZQZ30~zgJYQf?&Zsv6-7~nFxSG#9=H2O2`Iq0=Hlaa{8V|R)u7SdaMMt zyoPC(%sBMJ32d3We>G?drEKrjri+7d%@F>>X4EorUBB=UELKJka&%ZwqI8S4tBcvomlw)M^B3pU@v6w`p z$Z2I4Rn=$+n#=4D3JBxW9Pg4eB6JFQ8wmN!;n>|V1rEQ&$|SHcYi(Xfd{ca-v##w-TCvMgybJT=x|NtQwyhp!v(1o+vny8oNLBI%%xZ!CficqEY%Qz zjHJ>yODGEK|L9*`s%^HR=36}*Y&Cd^9(YWl6&nsj9n)ZD@bWE+(tUCAJ|p+RjVhOG z9o&YiHV&e&dfT_5Y`OR@@l#)={4P`F`@bm+;8^XSO8dDn|Ig-8KK}3FHvZ%Dq{k`` zQx{wUmb^b5-&?I?wwI+jmb0C6p7=n7u?#T{NYZVC-(>GH@Axe1;UD8g*rn?~q?l05 z=Z;i8u4M$gZ2ccMv+-XK4vx0|-_MdV%i7F#!HPGZ%5MA1En7{^Q$azEq>esZD8_JY z7h3K0*YulUF~!y_#X`0Z@{@f$Y^iCJ=Rjr1l(E%HNicPTEs(21o_4gzhJ&$`C&Mu@CuCt`ZS()7{$I`9`_KFP+xTzKlQN53Py4Bu^#UGX zf42F+qGBQO`pAvMYDv_(D^*y7b{XhVd$eN3OMxBS968MsrYfr5M5Ym#MIT)qB0q^oV0lO z>ctW(&EJ`9vrWrWHU3YDkJjG+mht~qF8hB?hEla+ zg|t&POxsQ3kCUqN|Dm$RSz{YmD*xx=KOY=#6^%FeeuP=eDTE>|NMpe_ltimF8a^<|GD%}Harbuo3?42wrQKTX`4Rp^e6St zKmXsK8j)?KkDB<>2m+1 z|NSre-+$Ks{)_$>=zssB|NTGeU(K}sqz@l|(k=f!+6! z&O_GT+e@6o$#m}(zzo1ZdKEj`<6Bgr0pf^BhX*hv0p^6_U`w_9K#3RJK~W2*+B?-LbiPDWH@2uz8G zd?r1WXV_DI7=Tk4unZ+m&+~$GfOG z;A|eiDRu#542coKuAnFjVH|KYrrKKa9`gz4{LtS8onIr06u5V%*Ib3iBQ{)kY31LH%OSX%-g-yv{%eY*?Z ziT_N|l+d}tCJFavEbkk6pq(H3;NK+TB;pPkl{L{j>jNAx4g--T!1oWpFmmq@*S)wy zbMTUcit=979MFXf`*VOEBxRf4d5}ZE2}nZ7tLl6Dfu}eYA$a+tk01>sZU6N0x_9-y zd-HAgw%?d~uLS(J6d{R;U=BbpP7gCq@lbLB@Ujy^cY^kTk6jcn^s4s%vv(cvQ50P~ zA}T}$M8(gB!xA6~DOYl70umCM5Qu@$l5lM9HkUPbyT|Tc3L)4)QA8;=5Tq%B3M$3k zMMc4aSWpxd0g)miVi&*P*4ug|xg?h`=TCCCJAK~F`@c7D-iz(o6BJ@oeK>{j{`QjP zWMxjt>>JCQpeA#)BSxKyO$I}GN8Pc>vX;jtgHfat1B1CPVidGl3hATb{|v)Uk~7(f z)0H&mye0y51m^!1b9%a(|J%}S(Eg`cK6SAGATrZ)BpcLm=8K3Mrx_$06bmZF@O zNSP0JGs6ia8<>;)PyOEVk!*k@ORE$lCnK_C{3ed@_oQUcD{!aIQ`|ukxulz<*fJ?s z85(a&0v5A530Q2lBw$XE7tP%P%?3!0%#yx0$Z=y7L(9`KwO%fr6vIk%%FFvKDvbr8 zo=uKmPMlG-7I6_6Gu(+}1H$Ka^G_($TQQa-S+sy;0~7ZUXOozP?+nJXD)x~rGbk?_4Fxwx^%hKb1%}$dZkBHJimEdr%_|lkmHi z{VmRcR5mw+QZ~emxiG@1tO>1hsrv!|A|OefHy*S`?9X;VJe(gB4LPK?61)mH8%WiwA>6pqoOt1ybfotUb99MaPxH=02mm6}>;2J?C` z=SZB;HkkKdMawoG`PRd($r>-$Jlf}pmms6PoVIgrrR`<43`W<9=&1jUK5;B7>%*c` z7Nz#+UxF|mZ#i9pBmvynzXVAwLFyA&NEt6?lJ6-j&2!#`*eY2tZ083;nS^r#RE4^S zpbm!Hs?3Vl6jsjd7)TBxJr>=g`3I4ypfI|EbURgp%ho!CB0aJ#M|wV{0xxH@FBopi zLh^9B5{$v8Vg6}kq;0BBPU$FxIkmJ-lN6&`sT`Tx#SIiEoOl)P^r3DC+MC)jA( z!M-3}gHRgN&;h^uXp-~WkLIzgKYpr73f5H4r&!CkQ$yXg+IdIaxJz&2<(`kks-#9M zxU(<>ZI&-89t2>FX^=5O#uyS~^wFpbGh~cLOc11kFj?&B%3+KA;cX$KZ3v@vVh-Gc zazc;UfG~uW>?80dWp0QGfjk)UV6|+TrO$$GkOe~)tjB`QAX&>iaW0UOy_~|ZMzUd{ zByPIHD5|Y6U7XYNL#_+CF66pxiR)@4Ujw#lg=`nHT|KrNA<4I`@JU`cWrqMVNT~m9 zGh8rMC>Ei)pcbN6&um~$=N~h*ZsB;Bs^mrjVNjQUo)H-XLwp((i3nyUh*Xc@e+MUA zp&X8*Za3%DNK2r89;BE%2CLy_E=RV11BrCmH*t15>UJY~R1hkk_8+jzSF_+fHHTy2 zs)eIZH3(-Er!#5d**m+n%4_9~kd%8G00!37Zp|k6jsje ztSV~-3UgsBl_RMVV<;&pLE=*quStk!za^x~3!y7(jvc!nsl zd2vT2$N7cK!cf{ph9}=V5u1N|M9e1H53Br#+2j9ilYKYKe^^cOH!|*Fk$pD{W*enq zA6WJ*Be$Tn$O}%F7c8&Ek|zJ*^ncHA%G)cpMKOHSNDj>)!X_m0W9%gcvj|W9lGRzOa2&Nn4yHHqyShl=fdzun)db5i$S^X#ZulSTi!z{-4s#<_u{6 z)f^va{}sUgOXl;RO`ppdNDHR1>_*C2X{!yn`8C^E(=pyQOldi0%QU51Oj%hL6LC&f-($9AyffQfLhW=$?b*xM&Bu*c%;lm zSTt65;Y@|Ej5AdiQAsMd>2Q|jsby}mEY*XuyH2XotQZNdQn0903YIjLN+DDuvy4EZ zwkU>pP^!{NR?F3m;+8IZB;7P%)Uv%ub{yb~1v(lX2g?`6;vS6jX~a4Qy9x%Oj!G9r z`Z%SBQcC9Di^x;wl~T|_dRnrw9BJtapu{dOi!~z&m@QdJAkCBnOevXJiY3<5nU;oH zQAC69L)90_w2l_pL&ZAFCkdv)T?;550Vp9jT5drR=nIAx6mho^Xi$dIm=lnMcx}X8 z%is85871bwAVR0eR8^9Y#OHC;7LCc1Q5ouUVM-eFpf%!%noV+A^5BH{!lV^J)$mXf z?S=S60aE0nR3%2yN_nb2_)4&52LrHT9~jF+~WdCR4rjgL=I< z;Tp@6zgh2j04ZGD)cJ@l3<|P4PJYEK8S-mWK7#hnG0syqi70>RKc7k+bc0TH%-GO>h2hP;m9bTW^L2_5T zSTUDPlK>LAOk8^QeFf>G+_iRgb5y3vu$n+3h&Lz4`DiQ;r#WZAsb-TY0rVBC=1Orj ztdtU>AqrDg{MG(~aZvZt5X7RfYib~5NrR9DLKX;F zA`4kqgyF5yVhg{+7T#ZrA7@AaN1eova%AvETaF&oNdP58-x7jtP^4@i4C+Y)acJn1*}ERu{24xH41Oe^}%Nw3t=4fy>}H2PqTT7103f)IfkF!##@UG=q7$)fqAx zvYL`Wrb!R3An&vVjwAVC>Y4v za16v_92>+qVqp;DK#UVM#u-zTFKB#7r`?Y^M4Jn{xcSM|b*Vtg6&y{pB_tuk428nD zK)}#e0fR0!D9p*{^deO>_f@*e2-&`rITW_9HoA_u>LUZf0YDx-2%fa$0eJzLLdb!F^ z8U!?_2cVG@91zts3e{vaR+*6nQHxj@L@f}tgpFFn1DlW(8gekAg)=1tNR^is5~OME z2PeAP4wfV6XgeTqIBkGK@S~Hl6*vtz)(+SuPIHc|!~o1RgAz`Z@?ZY)(O44TeMRDg zOAMGRzD{Cch-3#1p-4zjB5AI&JsSm@|+u zu(leK0zNND1SYO&0iCP!w!r;olpvE+omf?BFF85glu--E|ma-I@_@IHp0OIsIv99uyU!K*IOp=+7H^7?EH%&O(gc zm97Ve6yB*@D7c6Qdcx=;(Gy*y8E#31cO9x>4sOD_`y$+V1rE*SoR$h~B3xWk-+qCi zO&So|MDI#6PX;i=7Yy+QLgedme}+xL)YbMU225S|JO(m#;Spr&(kDv1)-?n7maWX_ zVBY$U<{~VuFI8mqQP<(KNS)m@b5PXM-zCv1oYmTt6 zihSFN4zOb2@eQJt2B4KD2LKSK$e*`roMPl|4<($<08Z3C>kPn&MK>A}1Si5H2u`FA zbh-weuC+C%YhfWfZUc%UT&L?j4Wc@T>e>vdb8xn9ss+=~yGJC=uyCxbR*LNaIQu9L zqv^(gV7FvBIFmabG|8=N3{hH^3Z*GjMtX)G=5&3SmKg}7cu^N7G)%Em&<={!#24h| zbQp#@Ijo_4!|w;OJ~&9X%I=pPRYR;rGqvtOD~?0yT3am63|#60IOg+7V-mR1RcLUxW)Py|2;(ZXvB^erKJ zf}sUPd`lWL)_hUoDN0mPe+kjNgpeC>+x6c9p&7OVZ2M(ed$ z!|;X}?KLPyZ^$R;L3Ohl`#vM(tVP!!bTpiyt9?X7#SyxW?}6w)M^`G!;Z;0Yl5nr$ zd3}us1*gfChsGmNXi3^??F|H8Xg~wGq0_*aqWpL+ybDL%LWEa42Qs8V62iL(ei=#- zjHxh{Aoa!RCQqrsf?N2OY<5<(v#)PUjypwfx#}qQWXg z7}VvTeMBZlAU=&76vTru6z-rAscr`Ic-<(26E3Mwh#RLF89m8+>f>BOsfd$(YUhMS zdR0O1+^09Z9al`~}Kh zlAJK6R*lLV&!J>DkIl8BZ=lYF+dV}G12sZLkcw8AD-7FUu8445>Be=XN4hSvB|yh4 z5wFc@T$wY%b!8aWl@aN>%xM8SmKN#StR~~y*msewEh|86S*qHk@3P|qWU3FNYWand zlwOf!wp1jUok1 z6jPePUdp}+chlrinHQtL&@#ZvK%ktYl-ej-2jw6EMSw_duj=j^b~xztDoYA+!W^Wa z{%pX637lMYR3-GwWH5=QfKzDFo5C?ZniKY%poqqRsObg0^yW>b3T~naGZ{{oDU8W7 zHSbi3#AY^HTINW>5rsI|RBOg;ykyMbtQd0(&4R^n8Z42T2fq~FWRqYCFbkHjroj?{ zdEoxC;$}TBDc~NzhgZKhS+Y7=0w$uvSh5;XWb@*VN=~aRWEL2r1ajrWhuCCR<7SiW zhgJSVem)?No399>Z#Bu^$i#OUMwD<`sn`eHgW0vyYFvxF;B(ou@*gtoy$sd) zv5s=or;(hh91-L_Q9Uw3I5v{paf`wom(0hVt{~TrE^-bVI%(20{%MsYP+Cl}^|3KA zF)?fr$tZ!kYo}pUs!&$4Omr!{Fm3)LXi4p|KpaRv)wq9NtptJ{4Zf{(& zG9T_{h7(A(IZ69ce(Z@PCxf9BT8 zBMS9aj1{$}0x0ATVAI6!3`X&)qHMFxmY!kDO1E0mY{J!O@ocgXHKfWOy#&;gHdu+42_7|q}wl4H_yI`rpJgW|3Q!<15#$yWCGpXZ zWOu@4N8BlDZYrH->(Flnl5NqM>}n+2lBV;#MjAxL<60!!q$CGb6W9^YOjkWrj;%yL zs#Lrh8S$W0rIV~C)SVO90-|{?5Bs5qK6rBGK!_evQctKNmWEn~suxg0PZXC&)i8Wd ztG6BQRZmM+mLn})Z)JvPf5;c(OiM$pC=zhU75kQt04~PaN;{Up_ z$pTs{l@K723t_<<(C}d@+*mmS;zR2STY}Qghs#ITg_ga43BvA~lC6i>D9%uU<$_*^ z*T?=YApl9W>aO+()Yo{fvktEhB+I_10<*~^j)bTsO-SI!BLNsKObHJdS#8MDO2)MM z0uNAfEAsnA>Z&b2i93nTX5PNVjHxj%L0ig zZzOu&9OlnJ0n(DEWdVNO023FLX9NB~8GRv{9Y z^-kv^C=+BtnZUR@C=)=LK;AYe6UaV6Wr9#+T-V71Pxqfuf}|wUv@<190;8u%_-oCL zNx8ToSdfnylUG7;4zt4wBd!?Y9&m^Q4l#ogPLy(T<19H#H@qh-yA*72L)@HVvKrI@ z#UlByW*3X(L2f{Nu3&bC5>8MsE?48e3kpk6SkfD#2nkC{OUXjaOJOudFf>2`fuR(r zCMlXpcAzu{P_LIFYj6)|w+P5`AY5PPEhaVge^3ll7Z<)5mf56Y7)yyz4l}F{%3)9r zleZ1ZVX{wPIjs5JxUf7(b7@aG4-nlp2f7_4fC9mx4%Gk4@^>TGv0&9f z5>62@OS<1;GYgefZXqS39>1eVp`wVD&y|?U{u9rg251bAWSmoW`G7OYNd#t-+69S! zg2RI75rf};Fl~^4W-u?iwKN86TTMwIQ{#L^hPbt_{D$>K8sBpMWDrb4Fx}!{n!;#y zsd1WN@!U)YU02a+R1HCOG=OTo$BhKlEMCr1qgIHQL#htqWr&yMZG(7O&?)m~8>G|j zN3mLS4cT?qR3POFj!z*rH3p!C!r(&m3DKuKX;Yw2J&akHlg}w^t7zT_Q5A~2HL;K& zd~6~3XmEqHd33UB`~op%NYz1%2{ER;Z4hG$7}F0eg=>?%j+D2%l?;4)^e;gK^V^^h zQ+fTejiJnt_Z?w~BiZv%yEUj$RuWcIQiBw?EKmugxRtvK)b*ebu{Ffj&4jHboh<~| z(Fm}!nn*tj?HK^X&Ja68>@0uVNPC8mbhL6vtOeC21V}YFt!h2@MKLSP7ir9=<{%i0DZa3kE0M4xXAH^$h7SokdFqwPK#b2iuk z2Ivbk-Yn!=b>R-+j1pvWsuQb9EvBnVoyBPKw9;a8a#m?v36kV@c)|J8fPP3KG!1g6 zB4JO%=`3zF%$QsB{Q(WSwRxey1)^Bs8Z#zOw7_A%LK#XwVN1zSww9Ek)FIZO3>8v! zP=LUnNw^Gz5;;s{x$u!bX3K*_F5kfHavs z!QfGOV9eOjg*ih9vp)-S@c>CN&Fz=PjaA zEO=iym}s~@X$Eyv>bHYtFs~PLj^s26y4O9RTn*)FC|9=zp%2Q{P_Axek|mU@n>5~i z+Z3!DBoT}E|8&F-DN95|;vh)PFCgnmz@f{>@*{DLd`yyV2KVX;40HubVNOE}SDK_4 zec^=z?RG)*#tAMkiVszZv6`bDKDmoRy%p+K)}S@GzO+^5b5wGmQ#%UWdk>G;+2PVV zcj6C44e|!G?-d0T)g-c?(t!P}MQg%3CJw>iKuXJPCPw|?Q;@DfD6KujmJ)DsUVs8P zQ7^!I|DZMEtXk?bUBMDr>+Eg7#a(Mi(Wo1D1(2q>*CVkivFEY+bq26C;!aP)p+G@d zl~d&krmRA%T;XnrjnMiOib@;NGd$)54Cx1LpbVukC(E`a+$DJ{(wg=7HGn3q1~9S; zAERr_K{P&E3m82y9Csqw8EO-l(DWQ$7F2SBpivA^m={C!nGOFc52rAPFfmmcC53|` z-ELjw47-AcVW<2UTMnbS?qM2HESo<)i9YwN{Q6hO6Ee6ia zj@J|g*g1@i@uVan-w{&g2koYMzXuK0;FbOYBoH%h}a(;etULF`WEZgJB zHb!rT)_hV5mQVwpgs=(5il7AU1~52aGRbU~WRyVN zwKPsAOGQ~yrLTMvq10=7SD}|T+!6{&*E;DfaAZm; zxs37z9aF=JuV-1gxyq=TCSS^uX_4BIa+2aVTUIh%OEZ|K1W5|xtU56)Q=kM;RvRzBl+PdB^C7OK zFaG|}Ud+LDfjg)Srw{eos#H%vvRQ6!-twa=8&t`bEcym4__4i?<0mOqh0&pgl%i#A zgb@7nh2VZm-oc~t1d8kl^7*@PQG;zDq=b+%B18@f#)-UF7-a~tAjE1D zL+!ub6TKo-z=J~(THp#8NQ z_0pJu6UQKy#yZo2R3q6IJr8^Vu9jyi9_wB$H>r%85id$`ZUuv0Tj8gGMIQOOrkLW8 zQDk*nb4w6OcLCwfX;$z#HLKmN2XYtS#$7}XJ(l;#Z+IP{g`5g-yZM+v`r;t&`Jvl^ z)7|ZWZt#7bTlXz_6;WtSbDT6t!x6G<-I60?aF0hbGLg{hup@(W7h(Ow!VUr-hl<7= zB;gb z=#BCVy?z@RBbsd!*Iz^4M%qMg11|ZNyX*^PC)smj*~yX-Tz0ay8dqyj`&CU#ZY3;?d62yhe* z!JGVbD*$gnVogfvq8zS-56)Ukf3@rjL@_>VJI+|R2(a8Ch&%!;>G7fzPLl*6%Q;&F zQE$U}<>gcqEO#+-j?hTAENZ3;K!Y6dT5SQhkdOltnN4X80!4neEb1ef7IeL$cM#Ro zu2)zBDh#6di`Zqwp5+bCMPQ-`|5}3b`s3EYn z*z7xaKpjJaj}#hzC8u6v8{M{VkvE4i7iXAHp$rB>v03to4#!iOkuLuqc4f?{6lc8ni{M)K4G9H0t%basGY)2U&T&bd``)u)$;#vcI`t ziSZr`rF|6U1Y{LP0XIrBAl(E!IN@WohLO#z#x`;<9w|L`mc|mI^{TP;hN>CW*v;+) zO>hPkS&?%A-fHc z-8NPso?>Y`?ADT2AtzKrbqL%UTbgcLSko7n?gA?^8gpw>78)|Bc1f;4@{&$FfqJln z5`vGWDLqg`)Z}AqmJobsObYY5Q3n<;51`5B3e)i--HrGhN6aCdhNuE8z1yL&<)xJw6j_u$$I?(XgmjW^cx z<4WE8>Q%k3^Ks7Cu6=f`J?EHf4a~sP%2Z;}@pf^H&lDlW)F*Vfx`d7nay7&3R2R9B z_VH6DtT&5YQWm$$36|Ti2OId;$$zXK+7%@$r``@f>6W?zAdu;O$13IJ0@TmWO8;I& zYd+;PU^gS~4sWejeKFMgL8dlr3_KCC`-#EW>zZB$I=b|{G1{RJG|To)oJ>eRKjwdy zV_Fr_W6-g_!!^iq_xhJ08c87}@6m?JuF{gJl%hJmvzx9qZ%Q2|##;C=NrP8rITbg+ zXlUT-Hd>j4nJ<7aP$3Z%CFM4XmMoY?O|ODN#7c3y|Fxivgw=!D=zdf?wel{T-cV)L zHUc*~wT zCsOjsJU^7fY#UYxvau`eUSXI}KN}RC2m96-^X6|6e z_t8h(DwnVEB}eD9l~eZVT9F?cWXB+v5Lh6o~%GQkZTx-TcCUiaU_s39O zsp1=F4yn!&;)O|!%mq6c3EA>l#m+c17p2GKZzUArd~qyDYMoXW~#wokLL~6 zGi2nx<>0ssl=pzKOSz*s(G&{UShzN63>rWGakKBQzG{k;!*xa%*eMA3x6oE-+bty1 zO*=O)BvYQJL4d>iK{HI;N%o5t2OD9mRGcFau<>89?wr~W&E)vjtG(gQ4OZv zFcrVgTT@;|gVLxYbqFH~hc?65wxI?j3kUW;0I7&LhDv7`hQCK2V{GGB3pxGcP4f}! zS*P_4g`nTFGXA`uV1KU8(GA9e2Ne$|Jf?7FjkG9wWW_aO7KJ}2&h~c7%vz={YGQ0c zj`$CFKoIq&1n&oSNzIaKmkBVE40H~w~Z`n?u|A?!E~8#T2eTkgrN0k^7`Ob<#-JG}puUMI~!SvO56W@g{6 zWZ-bWdbSORMj_KK5fyEOD%*V?Z*KX?CHj62#|J?!8DkzjY+&Z*3&3d;#q4*4lN{ZP zr0QDRo_5SL4U2s@)~B}ZP*r5L0Q#^`0{Ly)hg<7@Md?`Ywxcl+MKrZ&a`BQs(}pnA z-_#koXa{W?^o{ve*j6SZlu*p_@i>(8mtFqSzr$0fzxWv47^wPLGl5J}JuuwVo+#W^ z4L%&au~43m)EM0X$9S;a0Zj%V@@XdJq#_koa$9`Fn%-iy`4oyKRBmO2D0G8x$tsQ< zwfQ;XCe*p&P?`7FZJ14Sb{lt#vjk??-p24XSYD`6e3=e*YxUM(57b>Ht0g?Tkv7WvZWzMk%8)Kk5tNCBg1M9ACU!=l}Zsg*&OP0TzqF6lQNsAD(kIj5L2Nu z{EA!)u{C_Lr=H>TbLEfh-T1J2(~`={t|aCh+i=_LA@U0m{CMe6M(JmFVv z)^dism0}-RN{&CyT@waBc=*1N@(WM`$jEAdl(rY7b`D4KehirAq zBT&hh{jZl)%8Q)J>tj6SR^hMh?!T|i`V&L9@7Ucj5stLS^`Zsaq^t&ap}s9Mxk@*B zTejh(PS-@A$xo$VvkvtMRG2#h%42+C3`rMe#BK@Qe_@T^W0$yp%u6W19;?6ucUdFX z4W80~J4W!_dGR%fGEOx}&Eei7>;^y3!kjb*3A%TecAXC<=sb|~mS%kVM`i z?jb3+PD5(L66k&X;1-;3neV%iNdrfJxJ{tTj4-ColgP!_Zi~fSm9|m4?1VHTH_msB z!zm@q#DOVB z5u^`pdpt!Zc>a@gGDbwpx={m}=I_0#4{K%Q@lh*KOKtqKa(q*h4b?5X`dp=E!I* z9aJblW0Z-UB=PSXRyJyviYy|GKZ#U=f>KIA0&GRb=o6gD^{=`7ksErWQOJGSPz6M56TypJmZ4ZlsFg zAz^WJuzQz?ATH#r4|fhRwI`UPM9VbTnQ!kN<6L(>bJ>SI8T7oMPaYN+gL)Cvv}i&s zl*iNG5fc@fZqXgoOU>elhKBp>kWS`ApVCqk@-5@OBvEmqc8mSI!nV|EKt3U?i>M;R z#}p9$#g!&4SY{%N{6}adnNC;mGunvw7aj!PcPvnjF&bM0SWd!RX?$LYW5CTCsp8Q% z;5aMt$DSf%;TXHYF86nHLN%QeQ(Wmnp`W?;^HA$oG5I#6MiO-+TlCq*+}axBHOd3a z>xB7fl#ywXhRl7knelU;YW?6JVMEMis46$x+T{QC9}^6p$jiUkJ@KSK8{1xfxQUj~2UQxB#80jSE` z#Yo;BmtW=*Okgji`No-*@_oQs3D)|lq3rK8O!6KG;~3q2ooHYhRkhzuXfw1p)>2kx zCntY50iTa^a)m2Azz;a}VT2wfn~L#M>{Xf>-VaV9^jGFzhypNStf-H+*{(leqwl^c zBODgNC<+MTPFiM45-WSwWx)=9OCvdB z+4e^D8`tJ*U(A2IVv?n-+$kYa1)HcN6&%}FxHk5%EU&tVMd}4})`r#{1D1-ddfc;* z>!G3u42O^Dmc}$#(eiYWa9&?s#X1!zl;m!3DK;afDd#m#3gs#O=~Qpuz6NZD7bJhC z0ZB`EyPEGKGbp6d)Q3<}*U3u3Mk!PsuTQthyRbbT;SD4;{u$eSBAs4l`phtjx}|t+~7SiXh*rhu?uHZf%!Ff(v$iB zz>XktF%yM3{a|6h)GV^MWPLHz@|C`hS3o0)7BK9kaJ zos3TvP)oxpI0*12#%P241y4E-*!zq<2M27<{ZW$rl_(simNNW_b>Nhj=S0%sMjeqA z%Q1Ferl7^qdNkvl%w3mUrMKkdwf>bMy}rDi%S-I@%-l&!rbf$A+02-+6ame3B5`Qc z7_Og|qWQaW+}|LSE4}JAYa%%t3ygdZF6`k%(ca>_xy820xlhsxNHe4lJlVeE%PAPC zB(Mz|frcwGZ&K|YXZN)t!!5eh+zd~Mh1kTra%vK0ZMh6_gf+KQ8k@#*WiY?ufOi<`xH{qwCGNo=5<^(cT2%y%_Q zvm*8xB5jnm8%*G7=8p0Og`~LLFgfNomV^8WjZfHLSeVG)f_NX2SL8pK|M&n8i-jy9 zg-F?j-bV3Dpi7LZk}6J6zL(KJkRSiFoV~?0o*lk?N0JO*;D_6UYa*W9Qn==z-3Lzh zkI_7ju;!61u~d{s$S`b?blv#{zW-3KVf#N~v4@2c?(Xf;>ZSzCww2@NbJUUeRzWd3H#uQ#Kxhjvw5JN%bB^ND3f>cV| z<%ojBp2gkwVf>J$irk3pbMZYaYIys1S3%{r>RUxjb|h4K93dk<48qw!Uwyv~j!@eb zEHr*Hqn65T_e@l_ssym(kLf=OG3j%Z2ES~H3lFfG9cF?$2q(}?658i(@bL(^TP3YA zD7gvAo5`$m7v-&;e~y!Kc?^$Bi!nJA6Du?CwOR<$nW$grPZll@Z)_up^^atqg!=oc=_ z7(ydGnkFh_*a1IeX^En5ktGf3j`~=?B#2UR7?m%%`(RS}KcO3Knyc=SlY&}nD=UMR@!L3@O`Hg~A=A33{LRZ3J4KT45& zj;_&nGB16juVgBk(H93q#zX$k{El|(QE^9o$1qm0}h0^>~-Qzp0YJj~+$Y(&c{K z{4gu|wUd8$Kg=)vJUMr02snqcitCC{G=n@I@v*SwIioV^+Om?b&^=Y*iCU~OI=2RIWlnG{$|08wgRDvkv2#n?x4l2@oWHbx-kGJ*j$>mwTAota z=QQjg)oH+$J>*ebwz<8O1a6}tGVA)(S5r}|6Z>38Bz{HB|8tylN(gJ2CQ|u*Q-a2t z*g0*zVf3EflS(edId3~gyRY|2J~{J9q^zaBsNRGG*Rk~?6D^ZS^Q!^I7 z;trMtKI$tqLc(7k?Hwvv{LoLj$FSHalz0I9Ooo1co>budy_N{fwHeH^Xq@I;G2V)L zbL)+-5?O<~gi+?upG$b-sJC?cpInM63-i-q7xUGj1{X~q|Kaf_s*=lM5BD-GwxUXw z{xiA#L_J)d7B7iF?2&HGd8HZC{!~oB5Zt7HZSjXPq`w&lrvK++7-%LPK*}>4nF2{( z4dar{!lIV~(1m`)?e)C2YIIn>v?O%X8YL`1A&RcjjstLhVzz9;)_-R-co|fAB(jGA zPv4#EWeTig)r+xGNIrNuRX-BIoJt}@GuR#3(WxWPeisyYm_j9dHe^Md-kM#XHuWIK zraGsP{jfz!@K=}gt`)DvMW4o*FGJ#U9ni}nwmaJMMMMNO|33^yR7Y_hAm@Kw+tEy8 z`{H(UvDE%ORe>n+k6Zfx3u)(bamd`GG-*x4dE}P4*dbdn%p~02-|?hn&}`3N?BhX4 zWEI%yuW~KJ^lEjQE_|3qD9Cw-VvDs8%K1h2r(8ji=(iRY81Xqf+W zOBqreY$HnZ0{joo1sZL;G7h9)x@IC$*evv!Cj5;3{pt)1=<3paGs-l0Nh5H*jdmQf zQmB0!Uq=TmC0<0X|Jo+EOBj=9|7ffhAA=-kS)|`L=blV_boW?y-Y$_xlA9w!4@3O9 zQ&ChvUZ+5HP3eMXJ48u(_;#>|{4oh~Kug(F1bdsm*N+V9wfYujZU3~eClkI9$5B2e z4vGvp!$QQoHYJoO{zN>!XJwb;8jf@K$*XgKSxLTYS163)GgE2O;JV2AjBpO_nqg%i z)9>V?a+i4d(*5_SPbCK(pqW~x2_(**RAm33Mlef+^mQeEnVLuB(2=!k4l!XJ>XRU# z%XyZ0kQm@Yo^jg8K(KO~w(=xP4$9*@Ko^M88ILYwQ})Y>$O%_mH6H>oZZ zB^~PMK$CTi5k{Y|_1?%8*?*exPuN-G$Wm<4pLL!v8;779bT7{7(E7}M7fY!G*@unu z{gJk>=Wxu_W41K5tT&-^2MA*h*O)jj(xozE{~H8SH49JGu;h)?fVEtdgD9t6uYHAX zs8amwytZRlqx!3~^eXUKO!b5bZfPWXNjrF(+>n9vB}Mwab+l<*x9X{ri>K7I`Cz%&>8+e6x)JzG)yV-!`#(g5pilXCvOLv*O9?U z#D+R{Dy2LkK7Vz7q3eHzE%AYx?ic%(9H~-c8n6f>BktBeu%FA=JNN>TFDX$VHot{55ZU508Y#6QGP-`ykyR3OdJ{+ltB^%A7=V;gn=Y!i>!d!b%6xhtV9Q)R z*Eb}m$M5xUQRE^|e#2v8I2~^p_lyyou;ePSa^;h#EW+)7&rinYG=~8)bJMF?z8G}C z7KCl5mzHs}qBj?!`$!iBpq}*GB83Np??~S$gjTpN!LrMmOxfwSNh~-D{teePgLf_B zfg5*kxzH`U{;?a=P5(THG97ap4v=3j`?i4_+7gM&Fde-!lEz=XE(83*ys z#6!rhZiiOz|Hn|V1SDEvQX3eezx&bUbuRRyQVPpjt+IPaeQ?`~7tWn{<*e z+w9`@_f9hba;ke7gkxUXJ&h{xixb?JR#)QwEITGo!tf#lD3rAr1>-S{pUIICEjfM= zv5kZBAppMD?#&Ijg*;C&NbXvO*1sYuOW~Nxp?oIaO{1JG67WDthPOo77vIx*rc0$f zuM5NZ3_}x&<{%9_G>cYgF+N|$?dmuOs|ynGj9ssm7nBij)q7j1m*S+T*+ug z^m>Lr>@R9?Whua1)H3c*rE}RZipY^w(!C27zRBPJ8U*@0e{k>~h0(|GEg-+UuVSX! zKcs9GBJ!1{YDJN9MsBCtk0;%~M6rf{b2ZdYDSEZ zX@#27r2~4>i?zh%$9DGb>-q+HhmoL}}QbZ@g^NckMHZa?QUqW;}t;8Z(o~MIV*43SvGR z^hiqB&UojCD*&j}oy1dD*yPh8X zwX$dVKMv_4WrV)=c-_9t>8)b;YtMZ^&||?ukih$(Awk4I8973#nwm15S+8G>k~Jt% zZ&wiEyL7=b$0sA();Hb9V^g_Y6`FIpQekz{s0)m(AxYW5Q9oui22scJ>i6%k=oHxWlv z2m~CRA{IuT$0F31|Maltut|*;X0mZo53^PwE8}FD`)IKd_sW)j$EIM`O^NR4DvBX~ z{M-bydmw`)DaA;IlNp?xw$vpFC#fUT%Xw2u$ih}tC~GU%_&$GOtp=@xmlCU8VZv6e zQ(|9*d;HV2C$a9-XeYjsMT0ZxdtIq4V>0sw*|3JfzPGXPy?xsGF7A?dqA7M>(hSZ{6 zBU<#g1!k|M$fWKc3hIko!sSo7`i1P!Xt;qDyx|BMJv_r!p`Uy*jOsQ0lp5!7ckA__ z=uQ46K19OM->2F`-LZ~A7_)n{C{~mKRwZwEJ4@AKKT@@o&75O5=3*=Hx4yJ=k`54Q zk95agd776G`3kK7l4_=+{4}Dk;WO3rlZO{obZ}v80U;!IyR<~}*pZ%3;2VPyP{(zR zMjby&{a9>TEPRI=EG#P>%w;Imw*Bsn1M%e(V^$9YuOe#?-=Od~?M$ERH zFLrnCVIYe(LveO9B90Fmeuq8vnt!Gy`V$yOF&RdY3keNr%j(TS8c$MA3^M% zHQKR9j<1{-o#}*|S9MF8yW0;0`jL=9wRK1UIofeP{Yv5-;bT&XEMf zyf$IySmmli(4w2~DJvmUltuODqH?_W;>V#xAcau9CWjGzBk%I4az`~+35fSKp2$?B zJ;csjO40lgjZ3kG|FTY;Mz~BcB^583m0Lf@Q301xs!5lw3R_l;{jz*tHSfKgVOW)w ztq3HMaO5H@TA_I{OM`NZk@Ae@@G^<;8yxHmPjD?1ycaYqG6n4TFW&<=I=ut9YGqAa zJG#F4vA#)~hYX`FacAE=L_2AqZSf=vYe>V#rIc46;9(mfdw;q^wD-c@-BUHd20y+= z?+A{x<=0gvdm5zwr)+6gfhp|rKQw-pXA+}HFaCA@=^Z~#&Li|b508((jt)a%qgjSF^pwZz*Fa<;lVO}7?|||)SKk2@1k9=R z6u{LrHMh8w5L)N5D7UkT&HVf*9OJXzJt4hSxw)-CAj=-3BX=`j%4^w7DJFkh<>_2ePh8TB*!I&F^LYU-)j z0>F5o0ymYh4oXV~Uv|7)a-&X)dG|r4f_r+s)wb@JYJodHp@X2d`o6al&RctH!>K}R zwB;M0aR=%*hHPIs<=mi&#u&Pvh25<_?SW^hS)H+M{EfbskpWyo;}?dhVqJUqja6&t zMnPTHKZUL5eln9Ytv>J6KzhcHHJa=D(rY=#7uk+TDb_);tV>=euR9TAq`&46Y8_<6SE+U{$=W0-8Z>6SDDEQpRKr#JtRG z1=X}N2OIOaxkRM0Zt9OAft;zIF;&sXyYgJH>D$~jimXzNbTYfY=U6`dB!7b6@jqxyz@Zm7`=65cfl&|gi2j}Z zO}f_4U&2c)J*WR@yARP`Y?oS0AGX~8II5ZuU-z%(T6zqoImn1tL2|LbYF{S8=MVK06m5)p%;C@A}*Rs z{4QTw`vJ{cGn{)hhQaYCJ`elrE+N4+!KYPqou-hR-b=#Zl?IQYDPbeQM&I#tkDRT* zXKUdvlY&0p`VD+%{g(q;XD#HJUTd3KhsLr&;x|<>xoe&Fibnq6TT(B<5otm(;7*;z z6qNsRB6fDl#~7>~_-feLiIMp{mCM;le_5L?`WTb5zknI?t!PQ4-EyGNVr#DMwT;nw zs!}&^V-~$8!2gKtHmSIhE$t#X-t+N%a&}3GmK4h1w%V71xb>&#Y*`$Pej5Cm**!Ej z4rc2<8c;L6>((=U+!-J{T=#H1c8I|NJhV;o(tC%#B)|b2eQVDuR<>xpCd+&14s%`D z1oZue`3@~1f02TH57b)~Y&=Iil{0QGTKAMfF7R&+!QT9;FE7`aI@vFZWtfv!>GW#> zcVq#}ogq5onLm!u+G@cL7v2MCIj&$q@w^~JTk%^0?qfV3t<00z%BTzRE#J*y556A0 zZpw%5rHZmi@_@N@#zo^C>uhcQtKM-8pADYFwcx2{(~!A^&6IH!aTefyN#omv>und? ziVGU)idBEQs+PyISHqCku|Sif$xGYq7FpX)Xgo7gI#|F*?BHBmU`+IQy36G-r+uM| z{baAR=hHk{V0Sa9C)cN1{)J|c@9sGM$w70A6x{bG$(JCLb zr~8n(4q%|e!VRVmnt;n_G1R#2Iu551GHJLe6_Pz&1I|J!{f0aFiGPTX_UVYkq$LHd<`NAyb>uI!e;P6~s zWAd_psFIbt{5nv%M<<1bRY;A~1Vy_dw$0Yk?;KQGQXVRcFyu$kPeH1K1VP2>Ax%5w?=nJ?#_0 zp7eB~K0+^k>ASxTh+r&zK*;o4UwYckO^CnrBn^DKG8DfQ&+f7SN1wV4En*P8P3$`; zo{wEHo8~-jd2l~xpDbIAinx3)ir8BR?ddpmHteo3)~&Q;?s308dOp33iL*Zr24MOl z2~ljk8Yl1z-vAaXc zRk~Qz!gtXVvhH%oiVQw47VBc@0|b{azc?JGQ$&CQkwsr7yj#hE7n`>}h6y4bC-+F} zU=@X}lg-BgeG;VUqg*1nItcemKN#uRheWV!ESvc-aP^{PpD>xdoBgQgk5k?zKabtY z+>wfB!r9v+?AAn{j`;zhMS{qE$?e>Y+DMUBdWUJS(<+4i#q@1?o&FXS0DVRp5*29o z?Y}I`TR9dxr}8oNv3#ECsvIpU@&Xw_$r+m%=f}J*b zy&5bwz_LL)Y=Q3M&pC7CWY_;Pn~h7S$`I@Sj!@vVLcKRN@K#f@oW7WyY)hyq@wPaqULu<04 zp0eDHExRphr1+ktBc!FCszWkT$@|kr|JmXF0n^gQ!!4hSg(@hiv7<46kKxT_f58jE zWdO9gvD;;G_{n*KLU0I>wJ37mI|Y67pGxrZ2=1nKzM?(Ipin&qL#`_PhO}yi2qBHO z8-w(tTc+ObivAleRgEodE4j__52S4_FEaxG%cKxB@w+MAkj=z>*5GJ=$Ul9DDb^nE zmq<7;S6Rnvh9R)U{sI@+69gt+!lLEY>MS)e4cvdqtOJ*t^Sk7OabMUsf#*GWAk!Og zCsgct^G_p)S?vLj!gmEi*9`Cn1Nwqo$U!Z2LEh5n4}BJD;=wDAaeJ4h{1z5Z0Wth0 zT}+%o5bCp-T!D_m$>z(ETEZxCQzGN0n}$&}-N5JF`?WgI!;{iL1+H`X#D@P_jR&St z539wXI4)H1I{57siM>k1V1*yj8>tBsJe2Evkpa|k9V=gXWo#2{S{%Le#rTQsIci{ zS7xBc-)YIqtw~SM)jQ=El`n5qTkeiNWeU1toPYJT zt`Yo?I}u!R1@GcJL%MG^FTXTiR)v@sfmZvJfY3MRfRI}?zs@bu_sYTkD*2o^<_x;p zam;%rNb%NO4Fvz(Qu1CT7v=;f12p4b!G}AY(EIc2@$O$j-+EZ;Fj} zdj^ZV^tX-vsS^sdZ2#l;5j(m5g%6$Lqdg7awt~Cuw5@Y7{YR4fi?WYmAjp0ryQ#nX z{o%ZBe9kIlsu4;a;4<}-J;>wqerxOX`m$M<^~LKh#4jWcavMW&;smBpt`R!|cuWSj zZIu-9o4&5L!tpytR;&aDk2j5(PX=7J92B9Z=MV+lW@75nw}^Y~v{~8UUxhB)~ER?hI+%v4Qyo?CabSSo&QgxDdP zOz+Hc`>Pzg9a^|BeOeFh|HHlN-$+2wM3B1ZBzR*f?qhynjM*i4H|evbV(8?5mlTF6 z@>r~b&&=*;c_h$~IzYBU+Icuhn(?~DY)TiTz5P^kjCwoJvUb_C9p(HpH}mc~ogL}zSUhmn4s7L1_;TazGtO4G- zCM<+G&iZ=RbUh!tY~>c(h38Cz_BYOezI(Y2+hg4rkb z0l;U8yd^I5y?E4^>OZI50Lpmz>@Z49cNpj#RNJJoJ&b~?j&9~O=E zKN0!T>23D7tao)r#69oFl4m?vWK25mTbwL;$}iVnZZ-fXMB9i0vYw^`4@k#yGL%;F z#WfqB3&i=Hd_s78F7uEkJ0W?qu|r})pk>&tyApQ7yY}5-pGI=Vt*1NSk@L!-@b!9r z4hdk><7Dl)j~BejIS&CzuLLbkmXq{&Ui1be0c@6wmLebM~bsAe2 zQ=Ak~C;fWXApZ7st7=GTDxLz^27MD_k9++#kljUf{KbJj9SAWPiR@jNe$SmJ zll{P*Cn<(yU}N`bpMeV?fs3Hq&6uz`{~?$JaN9q%$S{ZZtt9Hc(>O1eD7i8Jr8l7mvYk%mCm!gxp?_eJ zCwe2HGt;u4FjORtDGA;wX$gL3vlI3l!00Xo^cW)E7lUxE2emy9fFtJ~$D2~Jbhs9T z99;+I*QcnAEx5CCLwnTCI&vKypMTXPVvo;V2o2oO6UbRWRt}*}?Utvlw^NDBV!w^Q z%FAhIccaN~q1mwg)gBUVbHf{wNh?CKEjKSv3_%&1ko$fL{Amd_-q$d-dEkq*)&n=&Af!M9AjbkehK;1w9xa`ZC9A>@j9fkqb<0 zx0_f!-N(#TJb&y%-)p#|h8&5nL!RhO-|XdA_rCq@SK7+eoet7ikAP#MgJiXOed(=6 zZ-?^%=v+J>-G(^p$E{}zLbLBw?t;Wit9_r+eF$D}&b1v5dwgEwnN5f}z3#ggr*gp? z{?`_6rrAuZ*Fn3GC=kY(-@7J`|71!v_0}f2?tO?&wrdLX1{qfbD3Yeot6VxeECpTc z6aYNiAP=f8w5H0zT%OaVW&lWVq50L5_Ls>ZU-8+#?ki9byKgXakazF+4q^Wb0b1aF zdeHdkY__3;SV>Elujx%+>)LZ0m_=3OdTtlYc7E0cnO>}VVfpRhHv0+_QTp1cnH|UD z@DfmZmzlXnZKe90*pr~^bJFE;R~_wV7@}yAOYYN@=P?yNpWhjcO8z?htf~NPn{iq1 zp{|=++(Q~Oc^d-{_Y?Z71lZmP5AUCQJ=_Bx-kcp)t_P;rbHsx-(8mUSnwz)Whjw6o z+HAGzo$jbPVuoBkuC_Nm1aes(|D!iOckRoqE^F-ppRxnGT`%%0ar5G`9s{p4>Cf1L zf<2wrlh@cjS^7c$O;XzffnA_Ig^v$gXPLZDjZ2rG{GYa!OtJwlefZD|Q=h|{h`h{~ zE1>R>S8(8KvfTiX4C+ubUnk}WwCCEK$Vgw>X;hU4bysdA+kljgQK$ikzlT zhQI^zdXwpZtLnPB7kr4Y?@LtDkkX-z7|%-txWh#l9{^q-!wli;Uc#(G?H;q&5m~5k zILGhA@gCgOChX3>BlDO`T7m`^2d-88WOvg0`Y3mN2SC0>V6(_$ zOjt_X010~)IR!8ErBAh()`M%Ry+RgM$XsWt#q%Ztg8vS&qrG@;E!9r=q>B7e85Ke? zYrG6DaWyD|nGy&0=aMan_^N?d&4Q}L{3snJD|@cVw7_4B(jF#4lsm77^eRdK?(O6v z^PR`dq0m`fCsiWvG48{l2aw4Wnf1$K8L&1Bx|d63gMMMR`2*$kW@-Hg+0e%8OY+@a zo1ip%05q56)V=gFp!#({xRdl$@R)HQ#9UFv-?QN~+wB8{u947hB`!NEM?5ZdP6|Ih zIY~z!n%phE3BobCSIR9TL8T_Muijqs051J<@xaSd=w`>!QjOs7tuAXcWM6*D3redj zQvZC?_zM`|v}v61EG$Ha=_};z(7OLGBEi{1)EDB%z14j;oj)F4cFKh4^!B}9Sf`p) zg!yC~y+N0B?ao=WxqFFKSa-v1X@BifRbk!M{9#kzp{DK3+5hgIr*f@6^oN#E0>sk% zZH|zp$IDy?bbWTq7I?iXIL6Mf@jIk19;EZY^cW1`vcBmc-W%wCQlIhzH;em78r*Mx zv7S1ATgGf8KMUN@YGFt0mNM!dZF07LrtQyk2EVxtrT%X9&M|yENnH8DCaXGVU*&Jx8vQ+*4j013n18^&WoY4-^TszKmBx#Gk6z04``xTOd7l zfH5`gZdKo z2ojT6?4SrHP-d#6SU*cEz@$4^6g|Ep6-yH}hm5i&Tv9-0G5LjV6E<8E8kfFsj|X_a z`6_0%{v;z8gWhLR_@1PpQ>cZUr1du#yP7|Pk=8D<1p>mXjOrp5=Rw9iCto4!QB#h= zF9|8v)R=cK7biiO2;~#y4-SclneM++}-Md6h zyF(87&xOa)%_S}%HCPh z-_m?n+h*f|slD;GkUZZ;`yXLtb_Vy8$ zTr#{K-NucBZsQY#e3%TjKV8pF^7a#k3&zkbrw4UgtqKd)CA=Qwm|9O>K5QQAzGbu? zlqIEX6@);KB4WlUqC##@y*@hRirnudnI3hY=e!om*W;W1k$zjsm)svO19XY*0y~8; zOpLd@++Q&<#~-bI{}uU|E z(l!Ji_Dhrew$7kvt#z_!>4t61VhJ}NANlXwSVrDGz#IrjxQ+WLmwQS}KYz4#IQqtp zs49D$_7xG&RXx1+?!oT&+=)WAt_d%fgvjpOmx}%_rQgq}ZXI}Z1jUN!3|e=ohVPR| zY$51L5xN5b z`Tg-KiBa_2U=`Ro&*g0i4YT@D)fyT^nT2=3>M}Q-F$#_S)$~T;zNRQ?P=2n>x%K5% zJ+gH$)Rzh8Gg(k_CkiiCP(RX%b59hYsSg-CZ=-yUs^LQ==wy;+MQWIwD^#wb4Pd^rUk1yKM zx=5nIS1VcXOozZk`8J6j-H0ZA=HZop>&iARez%@D1L^(MSc%RiV!2VT=w+SNae=e0 z+E{g8X|0OD%*Xl3757<9uUK}t0QfJZg2Mq;rH*o5aCamQrC?v#`(Ng7&p)R#vh2Y_QKff^k(;dYpZRJxW zJApT=xp5V~w)9^h*W8@7jiWD&iO+_v#@nvhz)6>#F3gfGi{#;hTBkSYl)ge%Io#h5 zaRM%GZRP{tuo{6jXZ?YgHn!6Az1Q;u<w|g-TzXEy`;2m%i?i2;=a(_0ulxa_7}FW@B`s`w?fR=FdN4D$H#eqf zeP0ax68QcMhKGk&r^%6oXfLH4_@6zY-oNrrslQ={bWJ_2o27ImEnmD*joUwA4C`6G ze1-~EKuy=t?xIY-6QywY7}pG_k5;U7?K^-SYm#7IN_9+&b`UHPm|QM{EcbsunH(tn z>;+}PH%R=(*>oHEqV4Ve=?iLr`pvD+w)ps zN%IqdmCC;OfyixaCb7qM(pUsQ3@-6#hwSDjV%O;t`e(WB(O@z`G6}ZR*In}#MGOi% z<0~Ie&yzxTLDJt(MaVZuhJwSc(Rt+d9Xq6GHDgY%5=>1tess4QQHgJo~LXA-nXq6G9a3^DzMy6y4x zfiXW4ET>}mX3oemqw0Tl70wrF-^!VP?(toonI``ry6Xk+379si}5Y-Zi8^-Qm<&pTts{7Z;kLUDrM9#K} zw8uwlVbU#th-C9(QO21TW)fG$ahJu)?NaIIAD6fk(sikTEk|4R5UxIt@};^Vwe5z3 zo%;BhXaNQFLNYFuEZ6cZ3V}4(!*zYz2m&QYk6GhvB){!(|2?eDlfSSC5Aq8+2DdCGQkY=R2QMbhIThMRO z;zw(|=l3XH0=*G{W2%#DL!n=yH+l~U6~cv_BvUy-~D!V=`5cb4<0O3KkZ?kl6}D-?O6lt zEN8fjg%oCZewyTIjsE&w9aC*p7!Mi-@K5l#!A$&p`;oM)H7X|_xVxwnCa;OvxKv7M zS_gm&5EOz~deJF0D8J%fNQ z=_myEmNO8KeCit^5yPeAxQfuQ@`2jz?-Io{{m4lthB3Zjh}3D}vOld7p)S@bAxemU zgadI|{BvTH2FrBpvu=Qu5GXFS{SR;a23x|3FNh!1YVZ5cz@ulwxryfGjl;p3v zn$xUby%8S;Uj~PPv)&P5>{DVQAg6H89#{HSiASo;U`Rec$gSX0pxZ<^o?qMn`M!`T zuDa%LbTpBUxuM}CHFmZ1i!+(`eSetaQEe2^bOZ!C;)(!cScJyqs3pkn8TBfAn-%cc zrTM5czB%{&=3{oa8K;l5No=YusibC-sY0)Hk_dK=4EqTA64{TK@UrPwP zK_3_pVqWq|3!BwQyLmm!W{r7=*X_~RqJbqpE290QK9&=euy#}5zI$EA@?hE*lbn~p zM7XK(>wnJjnjvXIO=)JO*oKt)xGr?R0Atbe0$Vvey>8bm?Y)vLXdie=)#B6eQ-segW7BE6C=)p%HF*~do1t^Q?~Yb)#?!aCA!AERb#m`Prfo$muQ~}pBMp}b`pw9C5BJ8-l){ZZ*cX@}GyJZ4PT*uAOk1zp zUCk52=ZjBNn=x&j|J?*Z*dFq^2w#S3MRg?lQHQ7JFN0g{$y9)|sydzM&RlSTuEp>D zxv?P8%3*Q&l;*odoh)B_R%59$&8O&}UHiGbsk|RUJf%s#h?y)lSe;DQEY+L9UnUhm zjWjRgeKdNJIMjTeo}Ll1E$r?+tZZy5*4AYsBO{#p`ua@t^!<;RT+DTFEPIhQPC4kf znu!SsopBT z8pSXl1?tsMfC9DL8)ly3xZZEyewCY?8{{zo3!;c6A@};7)DMl<8vmiwr8X@i-f?W* z@Ou8U_F>A>(wAui>dm#ts~^%V#d>sT6$uWVOGIw7{^r2w3Uf8t%5bdVoC-FfYF^P$ z&PdcMOw9cf$25!owwnc}?Q>E7q@xpI zpoRyleg3&F(sZy?s=M=i-l?#Yc_#M+rrS!4Ei{=5EKi=b4V4xtAd2E0DN@}EotE(aE4rrjd}d=ATyUUuV-d4#-4 zgH4`iy6sv^4cyD$iVINn`}b(I@t?(jr_)vRfaT43!){N9Cb- zN|id3uJOM=kW`$UYP*y|1Jl#evUu$mGbeKR$+J(>Q&UM6FGJ#ZAZ)CxTmu6GL$LKa z)1K*b(|y6NblPC}QXT&~oKn~;6A1-7b9PoE22+{}3GJOGbiKpV-u<|;+(5wlXtq?s zWbiq@*06Ol+kPLcPi;G%0xQ(6(t)OGs&b0>-F!hp#)MqNuYGd3!cg9&%`ShGAZ(o)11p_cBT~;#xzxG$8?M}tqqWw$wX!`p z&3_rDK@XSb9n)b_VOo&Oq5=QiCU+Tyz{mewz@)$zL8Z}&QA%F*@+_u63>(0SA&IA1 zEC_>NCr7t5dvZ)xkvzMqgqGLWDhPR|C=aKo$}0p+rr!fbSqZ!7B4XHg7h5MY<(`7L zm5>x%3zTvRpj;8O=FNc7h(K%Jo4!NrMs0~o2p$vkC1dYAgsGr#;Nwxb_1SuR{?pr4 zMo*IoYrZf8#C#-~5t^oJ;wpmY+?m= z;PJk`Z@ZaQ;s|-?in&IEZW{DZ>ihO`hwn#}iBn?#KNT2F{j_*4&k6~z2tq9ALc8uZ z8&S231TOq}oz?~5`YbFgkj@Ab%O7ZB=Hyem&Oz5XkVwbbJzjmBMI5@R|H{j&JG#pw z!)^_Sh_fdLM*b8lSp`gnQiM4I)BMYt6{9Oy_RU}N4;5veI?JOgm@LY2#iArc)D=zX zAC%-ZwpXNnaT7)`C$;bCdvHUQ@q`?mlQ~xbBFwB;`;~%@O+F*FY2d~PE|Z`CrwT`9 zY6VVZs(HulB8SL*fJC-oyf@np(%@&gcnaIkofmx-Z{Oy^%_OR6*bG}7Dv4iR`p4`k z1-#&k6Uv!idNE14{@uwO@XA&reEdaU?=2fG2GGag`1Wr!YnT6A-|DagN3 zM=d-*T-ONh;bQh*_-qsY`0H`LDH2P|QS@`j>vDI%8aA1yAcAolc42qP{zVNeXHL>H z1QZ`e+-(IrhkxiNA$H^SxiEtZ{{3@ctq58FsxZ;Pqy(W6)vA+dTCbKWWT{fBN~gJc z=QOkiN0pJFpd)8XNc$xs?v$f&@93WyT^jF8h&3D6&}Q7QDGvR zEK=Afjg_?UX7crTtJGI3J!gPPLf)_TlRL0+l1VXouxv#OVpb7Pp4FO6O_XjQTYOAYF0CbMHv_I! z;NC*xHhfn_sPra*h=mAX1NW2$nht|TrLj{3Kq=^)198r1*lBwBUEEl#<8KqjuipKS z*Q>^n>@^(1rb)@ss5Q{sHh0Cu|7GNYO^>d|uSSQU3z z<-lbbWtGv;ru2=RZqa3(bQ0q>b<9U^y4NSO>_P^pcUw38#vVaSSqYX?kzzOWvaw%? zjXjd8U`2xX)#}Bv`XE*?kx9M?dAYQh;Lt~6BQsQLCd;r8nvgJ`6ttR;Sx8hF?vsK; zU%X*syu+7CPeAPF?NFTRX|w%DNCvGAcqqfjEjn$S^87xB&#^(W-={{y7D()d%B+%| z3LFUm;5C?b2l%p<+s3IJ5~{Jku>d8TRM67nq>sgN*n2-@cWH2Vzo9T{aKf+%x{ia` zeFdYLii>}#PKm6ciqWzE{QG?wIr_f;tqq^OshUPl!r(DXr0&;Vp|R)r8e?*#wwS{h zNmS?Sap!K^0hyw-J-qj!G(Y++R-{6+<-v4!C-fbEYH6|=C!eo!{VQ;e9Q zSA9Jtw&k$iHWP3?!T+geg8*whSCHHM9DUzsv(uNT7hOm{ihFmq>>svs?F@ zK(n@yubKZCPL2%&%&zLYxi2YJ%Q?Y0q4`cklNK)fAS3(z0I}(O6+>fPg4o}nd^Z0c zs3HV4T;28~?gck1V1;-J2}A-$)iT$pA)ZqD39ta`OPD_2=C);cy&3`Cq(71qnrp4> z@HSSFW$`Oq8n!w$v+h2#DxA9S^=5KfMx?!?28|S<-^B56qAD8*=$5PIRgdzK+oMix zcKO#BRs7mV(U6!G9YB_dO@y1iUS<5Zq)NUt!SIP!)sj1H;@D7gX`HAZOsO+u zd1|9G9K(+k4*f)VoEr z2VO-|O;PO^8UOKe`lBap-y8B#XBd0jGKtz`e96c?F74z*=+}^Q!m~yHSwfw=d&Yvh4GWa%NW2p@4Xr}pG0Q}MW4I@P&1aV^Of1LRsr2{OSn zS&ouU&LJGD0EVIdyGoQ;AB-inWGq8r1o-UGM2r)!zpyXnlETA@O&~Y@&x1eAmbE=4 zQs!uDz&JpTPMIL&vetFCn1inCHJpS`0A#v7Yab3;U9e>|i4WJ-l;{)tD0d8h;#X_- zPne8)(Z8skGOZ;bZOWs!F!r*`#ygCxm(OWse^bJK0XXrF-i{D2R|VtIUBR9v_DMGK z8*9&b&c93E@_WWwTTx?8xTMJhl-{}`#s!6bgxt;YjnGS(Z>bc-7Dp%$GAtz4pYYO- zN0s`Kh8_1w_(J6Z$xKLQ^EER87;ZA2q>`aQMDy-e2}z#;F~p*qVRLF?8{Ic;q9ZWB z+Z7uT)BkSGqLMaU`ms2#>wP${B@s#;5nng_;59!+eu<#KY=Cr;x$b#I)ODLM)e>GQl7Mihl-M=CO;xECh%N@+ z2%}sNaGzR_U+4Ru)puq(t?lVY-XOK-_%z-d|2pQ3`qYaaqVfF1Lmo0vx@YV68iRga zqt)oE|0MZ)LK;i|%FBY3%&;e@eE;6*hVMD!Xke(P+~WQF3Aq8J{j#srzM=;25O_rk zN~=>BDGqf5!}Tfpo5m4NdbX)cAU7~n5j&?~$ad^?)zS?!Nlq3dRXs_b>8~N;YmUoq zGFaFB_*=qUkbNpGPDcpHPEez8$mBe5&S+z~d#fN2HBADNAQ6Fb%WY%_dychLj6!TCi{h& z{?artRQQtuQrBtw%9CU>FLxrTZzuljib_n&CQwoOeqSF0ev6{$YYp-mAk@{P5~&L` z33@p2^Hsa;mWsq~M%O+$9|^eX++qBOB=`MG)Kc>Gr(Q*5&vVNh!romjTK(YHe}>dC zfrqpLCD$|mB)a`cEph3ZYG_mY>=_3iQdx%PpiETsXx$0GTJF+t)dK7+CM6POaN)Gi zu-48Vr!deJxND6;uW&>ecuL`NU|cWi77m3Py7D=^<&Sf1v=sNOBM zbMVd}q2z*jj?W2OnqAC_M9kAr@pJi;LZgc@;oH?v%!`~wq%F(e1dxTUdHsyIZT+cEO(fo{`% zW~#U9@#Za)YC);rLW;bU=Kl(f8#rbO;hA4rLrF*POg=y=;Cm9|_{JdqYdG)lYk#Ts zbXq@N6{@GODHlAMQEz{Gds5EsFT8Ykj4nTy4Tj+H4heUfy}#VUzcmuP458TZr4!s3 z^V!)7yxYisA()Aiyq_N%HtyTQZMnqky5EgSmuy>G24)nzJ;QXkn%$pnPuC{)62#83 z+@+K6tulUuhz7xik4rQJOI=qT_ z^X0DQXJ$S|y|K_Y;Lg-bnrAZHqsagZq$9P=hejxRYnw&8B1}rY!Yg+*d8I7j^&+M- z5)1ca2cY4k>yG8>0WkEDbmNc)Q8dXs7O!aiQ6eziWe**DtpjMAn0 zOVucd&mP5`{|kcUJb51c=D!6b@D*{=_)zawM}y}hWRcd%?5C2tDkV;H?gTvujFCa7 z6$>Mw#WN=h`=~~A8XZES@RBGGl3INi5E?PqIp|s&*_lj#q`RTi?=pF6-Sf0@4pyM` zwRp}|)(lA_yUF3`6NJF`FNcktPn4XuG0u@Xz!`ksPYo7f_X!Vr-lH~rG;*@!+ZP%x&X|9HE#6CY zaHU1EpZ1j+ZQm(k=!CfEJ{->dP%ic|!ktj%xYnZMX}4T5?HF$YPc`$UO<8|@!+H1a z?JWs&qU7B>Zm@#1gw|;uS|-85!X0SrgqyvntsxqtitZ;mEBZey-m_?hb^O+UOZ%Lh z&Wls*=NYHb&dDGq*BCNhb<6bu!i--bbQP$hW&hC$k8(X>ZhHrX^Lpu?)%-rIrSkKe z^v%yYTRrPS^ekw<3BlIiPOqXfKS|~wBpTac2xLp)_Mong9A`>ReBZ?hLs3pKUyBsm zm5#2|Ih+a}xie!TU!!E<`PKl7SJA3Xc9SK$mK9YdYpab8vg>elZRqxEX_?ZvWy4C` z?dw6QL8INZ4t&S|=ES-?=v!PROMUC^UW6lb%Iz8X0n@-+a9_9pZthiiOtju4m2PNg zIFS(iY-zJGMCqNICE#kYdi(h3=MJxF%_d~iDXGEveA2oV1YLKZ;w>#L?NuS=n9Ahr z2R~o*Pg(|Dgi>cxiTDY$+BBL&$Frb6P^chOqYp-YN2S(vUAGNRce)`{D*PMYvU74? zv~3HDwc%8E$cF>MN=lyO>Xw_Pv z?_8M*G^6Lav~hEERIwki-sSHN6K!|;A103XyuCQvaHcS+a1BxUp9DMfoOeHspR6># zS$6eUEE#(vg3g7{I~$K?2ZEe$?k0wq?-+xe?H8--iNwB7)0}s#;5s()RfJZbXgB~c zI_?J}IiRnCSY-;R$rFQEtlTzKdbVq+ElvkzHP8+ie`^hSy?=E3A>_E_;P$aWrVSZj zzlg#C&Eu^p8*nvIKmByHI*`lN&=*Ut$0W8}(bc$SvV**6kxALtEU?VtS(zr z1BWzALRweOL^`srhqSV~d4==8St&yJ9G1=6W$IG*Z-_wnK5iSF5wL7B$uv+r68fGc|^fFScjv z?a;G7=X^JDV>CTd5ty7$=RG}zx%ndg9bPH{U3k_1Xc6e_LLtp3dmK>ck*BH~BSn9J zqeJsbkMoVnXL$%R;>f8M%({A=R#3ZYay&SwHqMPfHbKsoty1NZsN7|+U}Zc`C^w(E z5mvF^&&TI<4c3FhPx+HyyZ&JG{^l#)SjWV10|!=axJ%@CR~7ZdF~k9aX@Egw6XDW;MROp#-(Hpws3h zp)Mz%+DWmu=cbqI=KoM|B`q4Ia75;FT?a`WbI#iKu&*bD&zm^PgL>J*hFn`Wyp)W) zq`J5K&%2;;{F{(Ptir-PBxFp8lbYQDbRtJYZR!yLuaViEDWUWc(Bv4U&+Y(i(O$ef z-SJ0KxJAJ(*+HPY#e=cX5&+vW(g-^-VXwi}3=t@IP-@f4NBpyJ(dvAv!Z>>$s{6}r z`xID@S5mcBq+ZuV$^lo!Zf%_-}g$wtP0QUi0oq!%Fv`)XcF#?MT0A(cfEkL3ffhI~2yqD`6`6p`ulDDwu`Wl$7Kckzq^GsmM8YuIqc06LwGdCAAgAsJ>qd_w4Y-q!|96`L z(ZK4p6axier=FMFuOPdVk$wi28bmGV1z8-0 zGt8T|u`*4yLLGycKxd8F7NcP*z}S=_Mtbmti4}A#QhJNTga~Ib)L8*LFUK;gEBu>8 z`k%e@_4h=PW|u%F>OsO{>E;`1t&!T^4?8FVbB=W+oXFBAe;-(G+&Qt+);2 z4UdDS#NIl6ACJnpne;2IE+}VZe6qg?mgGU)KX2Alz{TAmAtFHMb{5n{yUXl#?mxZP zhi$4k4Ce|@+L?Q|ARI(~2^Eg*L$4({rr_7^Jl@~4v1t@#lDwUw`*tE6=KmsqIMcl^ zqvILawaV+{caz6D?r=6wRkhVisS=!sRJlI6*Y%Cr@@t(Hcgp7vG-Ec31zJMM(3h91 zOHvugupzC2-^0~GeHDyJ;lo{)P5x0hz=Ha4Ssg7MDKoPw_-Sp6OjjT(^0BoWQPYyV z8T91n4$Jdy;UGRHrWzD`dzk8i%7k~Kwo4d=2+EuWI;jJGnf3&k2w&%I4f?9(2`xM| znv1_|%lJDCiiAqg%$2Ed`+!rvpmKjJ=tb?1#F=9C=0-PV)LTJlMKbHD3yO)dqnzr~ zg%z!eH*wXQs%?B*Tnrq9`251pX7!+V@R5pQww*Frle=cj8@f3ulD)ncR#Ekt#6MqP zxwIIl*CFkCcq?1TO3P^pI|~YnJpoI}`n0sl;8q*0x?hbj=g=pBxiaWFEz`^nkayzv zHxDtDPMhXbp?|hsoD4tiqa-oUGZa#Zo;T7AI6sd`?BNC%|PmL93_r{i%pY&KV_Nl%x*QaqmZtnvd69U;@TJA&@{YhDp=0h zMp13!u9<)?w&X6_jmO{f?V~2lKRT(Ymga71V@+Xlc#j8QQIA;G{dJZ*kE1R6Zyw+M z4L$?LdLG)ZIOUVO4vS(sb7PDq70`4(ACjtdzavG;Nzz1|ItTx8)Ren4n=vaeBgAvH zMVh?|m!Jbm=vH)zh&axbtMMm*ucAuR)}*|F)omlU_Di+AF~p$T*UjL!K%~pjg|=28 z-#2N-=qp!cG#!dmuB~z@{OXM1xg=a0^F=i zg4uyRfr*ws*UIbqE)(~`>C|ez--)WETcXl7_b2+2$No>`RvyJ7u0Pj#-Ilp{-F9Ae zlQ-dpqSp+_W6SMiyM`OJ3g;_$?3-@BV+=>U?3a`^70v;BfwPwmOG3f-VozC1$rUJUFjVtl?F5dcxp+Gp{|M9qUnuGI zN#m4(+9y`&?;?kDX+8~!?ti6_S9TA^5Fdzi;(M@)Ja@v0{Tgsyg_djxy2E!zJeqsH zE_v&Pgrgo}ftE%N1-3ufw#_p`UEf=OI{LfTAj#QDt?i4~Q>Ld{+$ zl2Hzl!KvOfuo4C9VMrIlp`@ORk9t{3EY1&uHBjf>kp{Fx4L;v9Q!-;K**p85ppghO zPO=!i z=tIJWuN)8cC$hMQ3{*54h&(+#^GP^E{xIBf(-Ba1DfdTfYimQlLyOh*(s z8+pyE%Vnjg3ROCCZ$?nRUPMkt(wNgf_Dr)YQ>3Br05CLKim@mK`)v6_^=2kZ>JH3| zpP{rRwLjRp{O@j8du?VT98m2p4s$Lwh?f2g41WuPnIjRVnlWw|u8qMV0C*rSfef}; zjErrgv@|;ix2Ck0D^^UGKAI{-=5wO6k5V^nNHJ3Q_k%eB-lkd_-xq0(A1*dVmZRC^ zCYRilU`hqMISmvh(*#=E#aCaWNa1T;`n7Wkra zt=)c;gtT39H!HdPBpEeZzN^-6%$*QNg4vrs8R+CQjmm_MS%uLU)8`uvN!Q@yd}gYw zbX)BY4YzAks>a9cz8?T(hhht{V8xR=we^zT%CIL_8hLrNan$rS0Ew>X#&1eNfg=52J6>$h3Qui)`oZ$E#gQ(Y$}oUuSwqBoC=&o7MM<}Kza!h!_V3;6nS z{Kh@Y8Q-9p20_PnZGf0oeK*ewRnWVGAC<39_*yI}`sBr}#?JRfI1{xPQ+qFx@iqU|qUzh^3m97G^i88nMa?qu|G-|f zFE}=9Pn}jO8QBslle4&=7G+vQX3kJqZe7m>gS{nD>bq5BSyv~qKr3&#sSct^@BlsP zNV7sUDM^2=;r~i>`qbAC9R}l)9?-I&4EQmMo$-E+6D6N-89gM2M|jCtKZSTMn@48N zsfmfqK?gPqP(HciN|HE2v++K5Iun;VFS#bBT~7*wc#JHoKn3u&_~7fDEfU$|70mN# z#tfrm&&*XFYd-jJ|0ALj-#7&JJLjd-OazNPE%n2I(6lpDw=k12vv~E&D?^FC7%xFZV*Ju>F`?%qkvyg=gT1mXue>G)zHK2bKJhRBM=P`_xZweo8D|-P_!&4Yf3%V>efUG#d7%OK?6n zqX2q&8oK2XhKbAe<_9#utiFANP(NpXEt4zk?qdIGhKs!)L7o1TxT-^tU*Lb%KCf-N zmqWI1wW~7oK&o0&IpGDP>rhmG&>L`xGooa8OgHg_l>0xoK>QN z`u~mQ`0_sVI zKkFp7RJaH~B#S+asNoH?1a$cE>@AwZpFl@)r3hcJ(ePKl;m{c5D#gun+_7jfyT65h zYJKuaya^szCYx(z$|48;#C-E>>>Ur-I_)B3ZR76sD$`-}HI7+oCUX&ovoGY>uwl#! zs)Magt<(V+l-bev%!5wY&cko_Lt>bIil6%z)GDS4oiM3dttZG5%-X@03M%1}J|6;U zsOHVn33~gAy(a}>B$8YTWHErBhwZm(V-rIxV@1LI?@%Z2TUu@?;&3pkv<(7 zzJASx?ND3$h&%l`<%3Bt0BJ5%g@({5S)e5Qe%8Qu!A5(%?a$9GApM4a*Fecp2OV|w z9b8kxt>xQN(WruK7W4~fFq`4^yQSnX*6h;^pdJ9?|R`L6khHI^cmj-1>h>y7THQI5ThzsOj?>t|bn*-QJ-G2kvs72`LmS-=`lk%SDv%gj{gh=_( zh-Hzq3xO|&Za~~mXL!yGW-(zE@?NG_>VCu6pv6)y3(ln(*V7e*|3WzGqtk*v?@155G$o}? zuJZ)?fMq|qR)>*B5Zn9K!K0tbGhO!vWe5+}RbNSP zXo#bgM7}75$h7abB?;t*sp4-ExOm%2s#E9F9LLbf;eapx%Lo|f9&@QkY+lpXtBkySNxYkpq`sWta}H`>3pEi$syEiXqvFfH zU+6oou9S&Xvz4zSfyR+cdbzJ|q+MQn9{#iL1mI5j*sVY7V>WJ#apmcpatt3(S3aJK zldAi?W{yjl^|~32ec84l`dQSeyzQV~>O#5LLN&D^SZsy;7a*cbAR0VD>#xtrwD)60Aa1xB9nQ&eIh2qQL?Xl+U4TLOrB*)wG;|R-UKovi* z#Lzzd&+$3~n9@Uu()Lfz)kqocBT09L#y~ybD)<11xKB-7R(eO_nD7pr8pYK24U_Xf3`mRu3Z%3C--q} zwaqLcguLjS%^Z&}+yEhPZ{HiA92A{F?kDYY7TLdJ`OBbO9?4E>+$o#k2^C4`Fa|o= zW(vL4><-vB7;A3&SL*9*vi0@mqmI;>W-21}xf&_#nUb?&{e*6Ap20SUks(UX*(&PJ zrOsq68V4|Cg{jdd2T&Yo938xn=9+P5x+b^QOgPO9z+*=pJLMvq@a!)U2@7mfmt&-o zi(@EZ-@GS1l_z0|ca<7S5sw<;O^dC`4FIwq|8UtoA`$WPkS(Nr1WsXXQZIqMUwy^J zea-OcV!5b>eMG07(7CBbzx!F`a7&B*TKI^IdJRaz5isuy8@?bAlnwJMeoRH-E3|Xl z=0fx3>`1LN`#Z=xOVG)Z5>Q4TFVKfh-GdQCt^O~+yC^S9F$u^DUG@6Z@)Wn*iqawh z%IV4LWjtK}h?u9*2eN~Q5^t5i+>EKdFuWz%$H7;ui)G`k&IoJ$icpEDl&-LiksL05 zNoLy)WpY|Jbmu!do)5!?z`a+!TMYZhPM0Ce!wEeJ@RXsq%Bw_CMO2McT)IvL0N4;o zT>)<+$x%Lg7_f#^nA=h^0_JMvY^!w4;!{pFYDALZ?b4DAb@H3@k{>jsN}Tx#!dP)9 z{fF4?ubN2g-f7oOK;?Y(HoN$*YJ471D!Iyp!$z!O_?f?ap5ydRqyP}pxNR<{ip3Ag z;5jhB9Kk%BrI6!C=(z3o|Ow0H1yH!+6@h)(=Q8@9yfzJ1f=q<1BZ5 z*2`4$?CxW@R-YkW4V;9bnv;x}Dzg4lcEy_k1K9LBDdn@lII6K4rkOm99GnKfN=Pa>-ah9T<)SWb+m_;+pjqL2Z$xp zR!6VeF+%%E%5xNxJb^*acbxyR+gP->;N$&(v9jvt1@LvoX8Bn3{&(w|cfD5jxfW&g z!qnriKwyb$hz^fD(kxQNH4Uxh1ViF;*ijmnqxb9+F-Py!4?1t#N}uLUqPj)lD#P)| zRKbrgfzMM(lJOVf1ND_L+2fkmZ`?rIVQFI6JPU-jvZci{m%f5KKJL# zA%DPMUgq4YP30x-5x!z*QR;p1=)j&h$wwRof0BDiEs~A&noFP!WFVH5JD0ZBVXTD` zo5$O?CFlWUO@RzN-qBHhOs5iS>rF2K z{lkQgq%`Il-`Kv+;&3PLz4d8{hZIjR#e6>msEN@;9d+E&={3dRYIas?mQT>= zgt28dPFt;?_?jh8=QZIPFktTVeA?^kxSkZwTi92G)OH-RP8Ij>kDAlZ2EM)prCj<|)} zu$)#eh#5bbPGQ5dZunb+8IwS_jO^@68T`jKMVDHZpp$%fB4y9*zUUTkBd0O`5C>KS#nV`dzc1RO`oYQY z>8S$bf(iV3zgK8N+sPh#vjc^4NwRjT>`f^44VOzAMl+nw=X@%}>~soic1Q>G78zZ2 z<_F&DgNPY- zEh;iI1>?F(#5Sj-#t(P~MT@eCd}sB#_f}w%24$rua*x#EF#W%4_-H*Qm1gx=Uc4FY zkxQgcy-_+^Z&572r~{|>RBbENa;INV+AVUDOhz@mYVc$+rC)l(9xh65&R62>jaJ2| zREt`<$&%ku@qi`RbIow)5Egd5OY&$1WJktYJ`u+E&)o2r#^+tDKW(lRK_h}m-_x_& zdR=Vy<}a?mDMTnO<7W4ieP68w7LzYQS z=RU6JfoQ5iCjXrKDa(_$P>4*FOKl>1&ZRi4H$S@Y;x$p8sq;89CILvSIY$A?uMSWW z_%?f15x66QTE!)ACWRTu$+RG9+s0ry$dC+Y=tS$4R2#Eaw&n5F3zDpEd2G-hilcZh zk#R|s6(iYEW3)N$+rR(bk=x0RIoCz9B#M?_byRZfXX}x`$a(67R8l9yW;_Zu1<8XM zL({{o63EwcXJL2e!$UCzPp474O02Tv!>a7NOAlZ?CK-+<7?6vDNM5E!{72KIsE6Nx zs!(WrYP&7!ya{%`Arcg-4Z>=PPV#Tc>86=twIi^-xHn2i^Ok73w*-(2hTPbvy1oEg z_B+hKkq4U#hN>UPI5L+B)7P|%q}WRWz_n8M{09*heH|GX>fE06yFVed=eP0q_?|frrDnEp}S{yC!0l%1Q5BxjR?+fRBy2E!;{@r(M+Bo}(SjX8X?QzY0pC1X&UA^B=Z_6yXe?kyKMc=Pb@nq@k;Z*m#m(1;^!Ur)qLmUy&rq# zzx&DoKYQQkNiXl0{M)y7nD^$ZH!u3E_D7?exxZX~#=5QN-Eh=Sul?oBC#6@a-~P^= zGx-BAO5eWq`A65b-tyAgcTV{1&}+{4-gQTwee>oG*S6mFkA3dEWZtGVSAFX{zu)Pk zE1GZlW8bN-uf6LJ_r3q|-$y=r_@rIMP3u0~`at5aRU_)J^~@!^Z-4oz>o&jf{;JNy zmYn!hZ0YUtrk&J}Ha{-xEbXGaANcx{gZF>ue=?11-?e+s`O`hSpRrl^;;EAlm~+s- zKl#GarJ(Emt{n7AMTUX6JP1tnUvfo~{^0v!=xP?9Kg4cGx|CHbV=kITHJ@)OJPx)v; z-D~^xT=-VyoA2p~Nq$xF1i#bMpZV*3_sN;~vI{o8`FLl4dbd-5`Njj0-@o+1wOzYC z@b&6l559Att3kQtl@s2c*S_Ve!J7s{ul8*0TQu+F8#Xpv^V}N^v*h&ePP%Zv@Y1Vq z+~x6s(4Stq{qcrX{>Og%qaQsraN6eO|NY^Iy;@?6hjvF}yyEC*=iasWqs^=4#-lYi zEV=rVgJ<8h_Ys@^x9XxdcK&w7KY9-Qe*L-6E?RoeF^2`N+<)<7D|^23_?8O?uiXB> zFMYaFy7zZyg*$e9?k>_e}gbJR1-w|scrqn(HR=j|iTy>!bw?tsVFEu8nuulL*< zdwI(f5+^d_g!%Qx4!eo-~9G#udn@kSIhssbN<8g{6CRyK5o~o zReN9VpY_j&4sZPN^{wCE^ublirb`m%oqF${*UV~o==!a{`=Gk!wKE^vz+Hc1m60pu zw!M%PjlT2bSr*l`FzDgKUvgq@ZkB4`?iZ)h9A9SC*|bs_wGFMo)rV!zYab9i1rKqxZ=h;uh{tc zFCuTg_sz{ef9N!B`z!9f?7C;Zw`%LbpYGQGaeD6!C!V&vOXI=o^LJ9eb@GRApH|=a z*(_WH4Ff3@|6rduCtKJCg|kDs&8L66;cNacZh?e>qK_WyV75nK1_ zSTTI;mbw4Fam|OHkFNZ6W^Laa$@)Xp2kt$g@2n+}xot3J2dZn->28SvMzA`=8eI&1Mb_Ut>u>PpKtOXdg4*b>h5XU|CaanJMUKyo_=@Z z`TJbI-{T)2Fb7C~=&SAJ7JTc+`}*!1Jb&&-e|lxZSI&55e(zs)YTfYhum7^{upiF* z=WE|s@@?U-4@Osga`D}dHhq8i7w7-KTSi~FQdV9)Y11P3^|$+awM0riyS`q#!&{pG zpg>>09_)HGJg26!_fq-cP5m$3^Pd0iOV2uW&sW}j`_DJVzIb!b&ih~f*1&I><92-Y z)5~879<=h&ix2A=Jz&3uZyxaSTQ_{!-}#FlHytm`VNd_f-yiJJn{M6>N!N`xy?ERg z{%ig``{||6y}M!G`YRuOKlaJ7KVSORq1Rn`bgOXgjjJxMyX@NU-1Y0^r5Ek{!jGPK z;e^p&T~@KUN{F5YK$<1VEtF|*{#-d(Gn*f{&3gYJCt(ak%& zzwY1bcT4=J=I%e7x%rbXfB(h%FL+OB`uMo_einwiexq|B5!!3+hey#wFZ+J)(CaIX zI`OO}JEh!8FWBLcB|qA5z;3r)EIoVh`g2}5V80JGKL5~mf4_O@7YjZKUezF6 zo;av$?dunS&_~mg=UV3=PP4}(*{n^KU{CLB+9^LXz!|KcK+o@xx zr-Off@U8o9z2cWQ_386xcK68_Zr}03&2PPV$G6VAXKlw9yI%9xtIz!W$MEX(hc|6} z;gX9}*Cf_nct#>~&cDS|KiPH1kKYhKI&Z^ubN_wbCB2((IQgZEH{5#RK6ehEyk+gC z|Jn7A?ZO4$p8x8quYL6#`QVK`((qkR&pzO`qobFKuf4To=j#Bp9~M5{Pa`etrwj#?`u0RJcx;(^V3Hw z`735!^50L^|N7{PS)V3iU*389Rl)RG&;I(UAJ*S;|2O9C{ICD3uDN}ePgc!ty=)G5 z#*PdBbl2CC@Qr3YpU*Y^D|cA<$Q7Tx{9404r+&%4SI_(N@`JiA{bu{Sx9{?Ut=H_mbbiaORkr)B`~2qI%lE(jjh-i;X}x^WOm^8@C1)I2Ui_(=Pw^#y6fZTJ`&t}b@J4I z9@GEO==voGq+;K_XVqQLc2~Z0a@&^vO)o$FP+xsR*Uj%=_os)iee7@kFESq-{EwLQ z@Q$YpZ$0Lv{(tQuU%Fsm^D$p!*q=W7lSSW;K78A3AI0?9G=v^8Pco z{a|(M*(JO6?4WG_^?&vHm9K~wzHt4GFCBDp`1^zZ>Nxi4UwpRelK(sPqLGt-^4Pxc zfvv4K%|5d0{)fK&R`uT=UhucB_n#5oJM5Y*YhLYd|K3`|fIhm@{QLfJ%g3vZIIrQV zTh@1eDlXqr`Bs1M;Cr5{IOvY`?^XThvlkC||ESZ4whpe@?X6GG@PGE*@7}azx5fP4 z`ZPGLQAp3Xz$tXM=S5X@x0J0JOBOHKRv(m#s_}Z zaosQOyX5oc%I_~+zPWGon6q^&`xDfMtK!FAyy3^cYWw%*zwi0ttygbpI_%#Uoqf@h zBg0qz>x#AS@a(324`E(@`{7q!?2%u3_~X0R?$Ev0jkgc<9l76U%U`(j{%;@h;}`xq z!d~#VM~=8`>ltU=wd>-0R$aXBk;(NB-(}=!zI@;9_CKm=&35Nr_1SB+m#k_ZoU^)O z&gZ{n_IT-qP4~9>DmT8>{+0Xddd|7~i5u^3-~In~-RVJa#5r3B&V6^?tslR*n*ZeY zU(Ee$&9&!9J4gJfi)P=b_P%+04gUM<$Yzw-7=I!^mq+q;eDeX@MN zBl)kteRIW*r#$;QO+R|*Ye*q&KYGsfZ``oytXHr7_y?E&`^zWP&As9LEw}yVu;5=e z$$Ovi*3dmG-|0N)mme{UUhy5@-LdfMTmBWf?thz(`0e4l>@)k|O^>haeE67!?QhL_ z@6=!a>al%~`|%ZvxZ^IbKKrKHkq`d4U(7oE&*p7X$(v+jQKiNkl^ z`P2(%J$cM+H~sn13%_^cGiN-y@jEwF?Xl~hU%GJZqp3?*#y9@tj$40b$~ODPPV?_O z{Pz{F?SI{;1G_KZ?V7LMdH>yW7v9kBmuK(u!H*-?R-AspOO;nt{o#?P|9a@E<*)y( z>(w9fdoR7S?Zq!{JNSYX3tro`u2Q}3!`F>GhT%C^?y%*5N0jfMTYJE!D*_dJ-Wopr ziR0TAv|oAKL6<#X1!=bd?z zsh4k`a^h}3`{=%=*N*w---a&U=v#I839G(c@$tZk=WbD;_`fgxv}=zYBQGw|^Fe=Y zyZw*)UdyHbJ-NQ~kDpb%|E;Y*+#_(+F{^HS<=vCutG~T!kMq{ue8rZ}KR)wmJ*)MP zE3VvO;lAgb9Q7Z6!b$UQfBd2+&v>i-2UjgqfBDe0?*zAh^V}QO4%~g|FIsQ<%7=dm z9(v5X^M1UuZf?$)z1{vt?R#7AoE4{^bjL#+pH>(AZroIs8L z)h&n4TKS}U?G>jR*|c}}ZGZUBeb>&rZC@h~cX#bh^Y2^mgPWfE#*s!Q?pE~jRUd4; zqs_?Aea2U|+yAJ=f4XqJ-}Lf)^zsE)JTYjb2tV{maODnL5_k73Z#Q1{Aw#w4kKcIi z>jq2ae`|*e*6q=?>do(&UcL&w+`Yc_`Kt_uEJh5u`i;XE?P_{?cl7e%%M%A0*~qU< z%lIp-z-08+;M@L0(woLN+1D+6d2;wg!u+jz=#}>AsHrM1VLi8n@wl=A;+th z0s7-2R699;b7Or&4gM`NsYIV72`ZoRH-}IW&-t61@Elp5Po2G_*qFvCq-JM@n{yknb_Yl7^g&;rQJsCX9nY#AebV! zSvwD1ZsH39KswS z4IoMAo6g4A22S*rzXB2<4zgyyT zmas_PyCgJby~A3u-T)c{nh%lMx++jtOa2!MHfb|LdtMi+0^x>86+rbu!KMaNg$g!Y z$A%jS-zo73*I|bwClST`M<0Fk(Sfe6Kzlnl?6Br!vRP5|j&hLYllWTXh*pHyLC0<` z(uLgbHy5vv1#?k~QB^1-W~3x8il?;pNKMF4Nk{@`CO}Qd7)xWwJ`6hF6;Z^?YLZE%cro6GX%x;%>Xr#0bqdNXzDhp_rMFEY zBdakc0w;KmgQA_lN&+ePT;%OlC7FrCZIjAWl-njilnd3xeUi!u+cdS?r;yr6O|P(A z*6*M@1&>)tU(p{6_lH7bK_oENSX;xEfV7Jz0BRJkse4+w#!Kw+qrsBVzGI4L?=xHk zm6796b--~roI;+al1_s8GNVE;pOr+F;YBD%*;G23R+u=9Dv*^#PKl~WA&uxUkwt6# zbM+r<{G+SGq2$`iO3M@k3Q!6(I5dY=H$v$SAy`y(=@Kf<|i{D=AMgGLmuAfVD|Ms`@Awr$uO> zk^VVsiV}=5G|)ss3S$WkOl%;amiC(j0#Hp~p>cp^+N9VvagOL1{$v99?v-s|nK{a^ zP0>09WrbH%D5`@X=1A$yBvOaR1TrUp z#_{~2tr0p0La0rS+XTqA;oKoax6 zR|(>>lukuuKAup)e0w8#`lqcSMP+z=8Y-$1r42ZM^9eR5qp(p`t`SK^W1Q}zFXU?u(eiLdw(b=`lS3plDTxCdKge^CLqF971lTv0VgOae zJ~2R!Abun;iV6}^TGpHZ9)aj^A=p1sYk+^#vS5>m3JBkaLmI%xQlU47{1mg`(NLFa zEle`QwgO(X79f~!S%k)ZzO@eajTGl9pTLW#*zgWe!4S`3CS`X^kjQmQyr|Mx5Bg2% zM?)A)+%l{DDO6i#I6kfTo9j$vR_@DCO_Vab~^Ps?+CQfjTw@AD=-wKcq^ko3#uKq zR>5k@Twrw14U$gnw@qS{vCy6o__$5I;-aN+Q0s?}Hc$puP=mfTZf3DB!7Bi7wE<}O z3P|t>E%7WPSVMOTU_`(SLhR!*tSl)CU<3hA1i*_xMGfgHAqYBEAc;Z-Ff1#jMO6VY zNe0w*2^qk_lptjwhu^1Nb?hxdWwMNPfN9Xg^o9)6Ya^zMHLf?TaX8{?jl+$m77`G_ zT^+)a@LMhYTUiE&ET+(Au8|zHD1Brc76~cHkRzbEIGIv2&f;UBEREIbW8mIv2d`Ap zEhRh$R}qVDRu))o={+@-w(C*A{BXh+E6jx^B88&~RuV+;-KN3} zaW1FFR;qhF;ZOmF+~)YOskB+w=@d#*hO6Kttn_aNo5)YjSJnd%}8 zrf00n%2>-xEXK3Q+%h5uq_hg8n9cH5VN(r|^1;s_vCu=jn&3sit3}w_@C4XelaC&$ z_2u!=>nFtYn&y*kd2Oe;rpiM%YaP!)FRz%ttA{Q^6&dQN3|Ytz(uL0Ay!6TQ(Z}qd z9~1!mgt_HaZo~|LoaDr7j!9mfA@mF!jCAl+!l7k^kf3w97prgu8?7m2%n^w)U&z?T zKu$Za3;-E2oPt5lkj$%)L=O;{DR-P>jw$2^I*lIC@qkWAflf?`k{LEbO!7eiqA^N= za$-sp>#Z3=%D}-`4NoP!!MfkWHXgPq7TeIABQlI3fi%`J{R*3aNoFOK6_T~29v7+^ zfn;5g2XHNwiBt0Xb-?1cM?R@aQT+5{Dom!3Jc;qF`Db*qY&*~tsR@Sab;@c-nn9 zZ$@OTY|3QhV5R5cB$bt(Cpi1{*;7*v-7${@zfm;`{(8cuHB#@;h7^!oR z1s4`T79&}RnIU@3oyWUKcl_8@-&hT*NEL!8&H@6!ujh+TiM`dBX zAP$H9&HieWleA`ye|~VmA(ivdUzOE)8EV~;tuk@UJ>^I`2*2^bIZ{;Us7M5a5P_DZ z71)R0w;iY$83RLOyr4qa*$4MYWSc)7^yLDjo8b}?>&PI8y%d5_W5gvBrJ+E$j)<;b zl}L%-R6WJB15lFuUOOL*d&|jnf6{d5=U#I;M*8i#r>1CQ1 z7Sa9)y7BmMQZiGw17_or+0&V%S4Lxl88v#FH1uTIeuvb z9$DsWqp?KU@A+iJREeulQf? z{IB)laHPSO|Fu3+ANKOUPQ|}%DF18rgsl{(WJ}mu?@ZX*5UH(eY>d=2G!~e!m0=S& zsfm=fgzfN&@m7W%h|5x1+5%Mq82;J-Z`cfSZ7<4< z7|;4*#5c z)a3&|agz@zb(nh$UP#Wu?Wq_QX=AjHT=r$S}G|S~W4ZgxN=tgp+sw&at zI^)Qx>)owWo_Fg^4pX+lY?ix`$*y+oq{K5jPtZM(w2t18vi^ zo`?&(^3%EtCOs`OAs6rDPalnF?P-zhckxU-wLLA8?e3joY3&vzD za$}61Up0F?b#C%3+0LjR^4Bl2W6S zH6mD`W#zZrxiY^p`waqgyO5(x~K~mab`{lHEaa zsWZBc>ux$d$E(Cann9+dcgfZHa;I+%Q$^|BCFf;uouUh6rv7BDcX^y+9n`xt4u5eR zH_;epzQ%NMTrg~ig?AUt^td>#9E`f^&}W>nQ^}y z&c$$>Nz;rZGl~yPmC%-Z*UC+fF)!$9InSJzkvX3kSIe2>psp@^-Gmr>@5YsF85fN2 z#+6)G%ay`eAG5(P&s*fC1?jvCOMv;R81iHk|97nqfKgQ48YKb#mAsN>1b#gP z87VCTWJ_fcs!#!F7Ab&HwV((P5Tpv?kDB5k`snnVXFyY^zJ`=o?w$c5T!_>xs3m_I z_s@WEU41AV3N=Q;;ih{0l=|9W^;-N>yMTsrPvf1D+Eiz&nX!m87)t?~<<#_mA|*f$ zGHAu4^slvAU7HlRAR=1N$b1U4)Ti``9{4efT*BWB>P##g@;8G>t*KyGqZ$33LBBP& z>TNp{qgn)x(7UNo|7|5JE;90?8Xaj1Y;-j@NtS%P;Z`X zICO*GbBt0;mzs^qG(#5fw`tC`mDi>`S%AP%`$KEvgap}=W;tuQ=2f*+)3d7@Wos?H zFlWvJSyE@2tLyPk5V1TUIadKiuBHciA}wIcVPkFB?62D?f>W$oN*Y7iN2DnwJ?E-j zWZwXeSNgOcYy4Hn-9}|3MI>-$92;FdHyXu9i`Q0a*&_8?I31Zy-^X-rY6%%l5B1eS zTciR%vMvYOm`GRsfWI~WBq)?xY$|Oc)r1iV06o7Z7(dBqWXI`a6+lZTp2|aI>(ZUH-xLVYY7Be?F)HospzyZME4$v+wH#KM^|Fl!ingG;FJbmKQ zETASy(jz^VeMVr!2o8{KMz#jcTa7?CWGRPk)e8&qn3P?Osn8Ns!>6Ed@CzUw9uJpvyDJxwH#s|z`+`089+YxQU-ksoL@Nl@!&Fa~bf4gN0 z*LD$EO`o3o+|+TC>9g!FGF2(S0J=S!APYD$VjDRa9R>3-Ic-DHHgf^TZZ1=s@u@G(*!4t#{I@HQ6q;AcLR@}Wa3yK*NhSBbo zLgtlTS7O#m`erh-*|F{@b0}=Ot;|tQv~|R;bE6u-G4C+536&0lw2fx8nC>;Ru2<3x zXLf6mq`FtN2B5TsM7wQqHAcFTSiRQKMY;QCl-}9Lp zov|3Yr=@FJV`xjkSV45X2ckU?y$ynBOUwv3Lu^BmJiv?br~=hOVr=6?(;k>E6EJN} zf>BC5JuXfb!7pG!+K?*?tc{arcvyQ%v9^}3)+{w1*!I9S$g(=;0NdH~e554KdPWu@ zYhC}07h8uX1zX$W)8WV%uyx%eVQbsGH=wo4reP0Rd&s&7WNlkf8&`ZfS3;7kpxS|{ zEiq^FO`E1}ls!P!Qk$5nOfeD;fSf#XO?|SBF-cFN;>Lg}1;Cc%D%wL2^iDYFB`2QE zA~AuGHyf7pFz-ykyn2Ednj5Apk*p(1JSHgH;6Ygr%6d@NJvq%bhL22XZcMex1IN0i z!P&<6VJn_QXT49(uL*a;BhHA8po17Gtzv&lCj0mP|~d;8QL z3kSlD4OuyWo{gOYz3us^Z>=##!rMEXqss*l-rCyK5#Dw>-55emXzV0!=M^@Xjp*p1 zl(xDEVj4=#Z*iwp9 zp8c zE_pHTxwhC78<0@@5T(iMVj zI$xnJ|DP-+1N~5B6G=uMn4t83x%2L6?h2bF%Mz7?(vCG;RIo&5IG(r)q5S-|FXcAoVRzWk2?DZu$;yPC zphOmoez>mPj`0l7Sk_tHBjI`1K3)B^{EMGqb7|hiPkb%DF-vl+dkX0|FBf?IvFoBKT^UD_rQ@Q!7?Vbhllm8}F+HcqB6;pha-x|5lb0G1-*o# zv9th)q60mc)E>O>;KdAv7v;37)98>g63I6*c;#Hx=@jEoQLRD4F)r*F{b@_2i9PdI zggY7<+rs8aL>>ZF0x4vo@H(l#qAt`}UmG#k>tcohYcv$9i?r5-?G1b0 z6A(c~+{;qn!bnbBXjW@hL#dy$GmS@(SVo8{WdFXl`_b*~F&w}vCFVQ~G8}LtK|u$| zoD)*DDwOTNrT(wUkcWbbLP0X4!ujrzCZa+#EX2{|L}La-t0T#^#az!+@b>B4c*)R&V}(jQUV(rH zB~<4fw$lVN^^y^2c!{g_08_~Tlb4ph{NPfl<5Q+eebx$1Ep4@pEgp2UjlW>%7Meup z<~Z0^Uj%e3`8IS9x)lxG+!d^T=Y4e-GaOt{ZNolPE_3L=vWbQfZB~9UFsiP{3g~F; zi*n&3Db`?8JR18`o%%Y$$whj1Q3vyQ(kf@_Y0g2f=T+EODlZ}(nI6J=${ zsM9vG)<$|iW*CMCAC*$$4X9-?js;U+hDm8~+ETxV^nQ}4-#T4juouakWFRbM%hv9} zU=If8jAUvWimpJjA(wj%Jdj*^knB7pTT~pg&V$JwOrD6)BdndfZ@Ze%AT>=8v;c%dq0pGAlH=aaF_8A$0756V@7bi$iZP=j7R$!l}$tyem%q> zc3OfrcT#xR&D+UP;%?3q_}0Pj0_1?P!+9O6m6`Ly<+l?AJ=`{faN7_gL}N-uoX{m!Pz}cVF$|cd-HL7p z8Vp#-N23Wg%QrS?Htmn^JKo@4cF< zT9yJlMGnYH9M7-t7W^lto1RlK(N2Y_(uheFb1*3dWvM@{s2F#p(C34^MD=o&Q<0CF z`{ubS*728xtK!&iP@Jz)@>H>&uQJ1Y6;_hvG}bWFHr9+#QJXQ0Y3w#=LH`)T3uzfn zTaJ)$H|U_lC==vf3`a~iu0};kjmD(3Sj1kMQZoea4knfbER$5wfrc?9Y-yVmwy*{) z!;@tkIs8h@83SNW?R06MBn75I5yu|bv?|47GeMQn5rH;5qN(N5;>npk3CIp$OhfXI z&VXrzF@QcS&_;(fwcP5MY;JK-fHRO=?Q~dE%dI749qPl|2D)XbUw}z(-vG$&f_nP~ zybxdchWH#J=>_9TAB=PC_iS|ZqJXnMB|n+%#o}gAEY9rFPE%B8R;1+-gDWL~Gf~5X zZytQ};G1_Oo7D4AS%JGbi$P^IHKj&n-ihp)3CkvI8{fD=RQj%jQiawEJ@LRNA>C$>HG(EE%GB;jQ~34Mhl0KQ`teY(yib4F zx1xA)MKH;j){84nFIZb@!0N$L>-ft8mfBZ)YwLfUc zB(sD@ZBcsfDi;qzdJq!W#$Of?(!MlZ6ojlP`Ss`?gq+b35=ZLrdd`&KM}aO84Xr`44p)Qu(}lQKp0r6|CLa1WtW)`}PJ4a#` zHcT;9bgVQn(o)|3aTnGRo(nvw`>!W`O~l)PZ7%oD6*@%KTT&_gl8SxzO;O%Z$@g!2 z-q18&PsxH@iareIyk%>`vTzwHm~8CGx|lJO&=?)GCH0sG$vjB5%|f!0$9W?jtjPmw z96Lpd!ZmrakRlmsQTizT9U?YH*puKnxHy?oGvkCrG9OQO)0<%!ZJMGCh=8Mkv#f zq$-o_mxL(R028=sKJnX(ds@1{3MKmz=~ThdQo^cU%q)P_g#vob+Y3CDHKi!a3+8z+ z%Y#{yu|`=O%nExj%Y#|v46`U0=@%q+KpEc}D3D}ONc-i7;o5m+V4DYVt%yY)c+*GW zfj1Al>9yTA$92(DMle##S@*InPeIYV&CMYcQ;GY^3$#tDEB(Djuk5WoOu{?)~)vxo$Mf_A8|GM`eB zWyuY?whdG@p4*Db1C@B_shm&H*Ecu>jO@8GEMd+Q^u16XmjYXq zIiTo;q6$_JO6R?#&jS;#GF)~>+5;0Fm?*CUgT=u4_eG{Xi-kfKn>0t9Ec?~&fe!<24ZC<#fx!o^`~5sm4oB;MF6XCsN@&CdB|!C zkd=ijlXGPUNdc>Yn5ckzGtSF_BU!HO$o;Ki@9c0UxSCo#r@c`2m<}5U2s*W)dw_0y zfUfi)$pdp9nklPAry|iz$*&;u(9BFiGYU3zN)!&W5OVq%sHngvd36F4X-*~1SWL%4 zZ^Qyi(OAa6V>%B7DdD(uO5j;Wg;6w6MP-tyX-dX+Z6u&i8%Y)-woNnB%t3h?6HbbOK9o~}paiN6q!^HO80TR& zFxi;R!)s-S*UT&N7P~X`3-L{1hiH+Tn2aPT#zMS1BeS7TkPm@^F`!UT2oePap;2HJ z$}Ff9DPa&^!u8-jHb)sAFAE;I|WNi}dm zwZH}00v7=Xx{yb*_A(dH1^R4gtaq{a&VIUrUXT;`f~?>dWCg$=tH}U4fH24khMiP# z1H~XKFb3}67~}`YAU8+`1psA`11y8=fEnZj%^)9e2D!j9$O@oA9uN((0cl`Ux*!*z z7A2LB@hlBBD^M){beSW#2?|5gASa>*`B61+L)IfBi~wad$%srG%C?OGU_wwe$bqbZ zJGurY@BqvJ0^~s2AP3q8xezzVg}Q+Sc`q}`0qBLIT5SV^Zh#x)2i+hC@CNSS8x#V- zfkO|u199LE#z8JX4sw8UkQJDN+?v)2(49kY0(Iavmvfh83sFl1pY3H61D_i__zXPwJT2if zRwBjk4#<*pY62m;BiIc*h(0|b`eGz%pa=c%aC+I}bjSI5;K6hcrh72mgXvQM)5G90loCI;n8)OS=bYf#LMve0 zKJEeNvIo#!*xSR<+CvXRdl=eQSc2Utx z&OzsHD01eD)%A)cL(F+#M1h=PnH0nFYGyj~ri&S#biTCC7*7Tqi5TxWF`g4+Jo22F zDRg3dw$HgwQ&YC4e3z}1(|t4g)@WOrn>ro7=Du&{u)e--&;?P=yht@o_Hu-3+`25-~ zrzAaKIMab45Nrn>J#^@y!^!EUhYme-xGh}1QXD+2_u%0+01qesV(7_2haOBg0B5$gO1T$keE6 zLr)46AgekFf*-1I7=Nf5s%$ljF)oF?Js`ZUdM#*+l(zFSWVN}UnARG(>;lK zv)o)l&uQ?ShN*QLECt1T4fS5&e>!;$o_{da{sA7#Gy|sSYsxmdSYZaFRyufSbmGt` z2U$MJ;Gl9Si!eKm^?67&dq1ZRsg~E`MWaLTFe(X$av!716+-J&p^k*Z^`V+@ZEa(u zHWaC`)$2y>cG{Lorpk`?GK0JrR|>YJTKydM)LQ|uR`8q|t-So58K+`sa`Yp=FB1+m zdCtr%OD#px-dk$%mRh`}7S}FrYYwdE zop|0!$(LG+a!*XG^4yd1cTXnT5iu>bd5(y;rsJ*Ym>zg*I;Drb-kMIK-7GmI_R(h1 z1V*#a+=5?W6EMjbW-?Mwiq#C6O&lW+VCwi)CT`3{zY3Enfl+zU0CawV08~w4EIk)i zQd?mYOarlu-AZBYm2jkP*R7KA+!ZVqoDLp6<3-+a%$NWr=wg_%u$z8Pk z$+V#IF4gH|_8aEK{Ba4Nd{%7vZ~e!op^Shh`6DVrB`v7)(=7y93KD9y?dNU&HrdFNmQ)S{ zGNX~BW0G$Za9iV_A6#%qWl@qH&L!CvuH=(zYvnOYHU2NM?xRF)^O#3eVaEva@{7_? zAX2LV5x*+YLcis`6weM|2Z+8+DXB;5&1k_N4w-OQjrm77Y5ZMh`a5j?Q4=yhF+rq= z>F+Q{rpj8a-v~XM1TF7Z%njF@8#aH%APo9pTo2`M;LQEi`eGs3dI|d@{4mA5z8v zMr4G{dMH=pbMHtTgPEi-Vc!UaLZSNFTKwNoC}jI@IMPtt@TG7~Lw!v{O+%=z;Y*=# zZGBz%OCU61J;?Ddt*DIrrO>#)Wgpx$`KNQd*;fIUKoQD}0D7T{kh0d`43Vkkw0bK#E0OL(mZcdes?3XVAHYc)co}lKqe3AEvPV7u z;>5wuIYJt(}_85IJ?rO7sd;gh)G6rngE0V{xzl|g`hNfICsS?p#p{yPz0(3WSEo&A&>;lHd%CW zGlVT%hmp|ajxoPxX(NijU9)5tUxW3=M{SzL_%;|MO|nR{xUoLF4%JkO+t9~Gyj)5t zr{c*^RJ$rNNl|f%s1d25v3G-nr`rTZQ3~&l{Us}#P46O!c44adt5txH0Z~$c0#&Tn z=#VU5@!JOLw@?Gu0Chl$zhh}{#wy%Yg<=b4rodudx8|^R7GZZ0cQh`TOsN^HvK0&o zloVw77!Ns<`d-5umJgF(MPs&O8RyNs>BQnP+LJ@V=Q}%SwDp2gYeHZ2in)G0b0_ z3Y%digV}22;lo7Qj@)F{Er_8CBE$yRsc0TdR+Y@Jhkkb(L%C>aC991pZYWNJV%796 z<4NWjPjM#3)ua?m0_!k}n>-GCl$#clYGlS@3N7;(>9n+xSi-1qh{14|`_1Fej}h%6Es zGhKKwE<+`IWTTTjcg$}D)R0^aO)HPZW%wNi6pbQ$!AB8dw2inz^eNq<^49hXD zd~q>ts0m3?mDQoOHnI)#sUR=88Joi-MHQJO1gZowQra3u)FMx0FP@1p3HlZ;aws&N z&RXNy*Ilgff3m?Qpe7hmQi2&~Vio~%$Nxk1bs>BFzpk#f-i!ZF#Xl0TLDEc^-i*bE zPFN~Xz6#JG$)FEc0G&i6l`7C82+|NZjE^TE5?hgMGGH?xCQC^y$AK=1g96eRDzeT= zCZh=}P=_EhfaW$*ZHknHnyf2Tpg*l*ybN>U;oHfW8E;(1<%-&j-AM zRFZ&{sVdRV0Z9}xL9lo@g{D7My0X4O4^_m?A&Y}XDo7#%y0}9?X2dvDf?zpW18xQ~ zGgJlYl2ss_00GdhsSlYMBAxBU8!C+bf6bsS>GK)p2aSnDWhftqRhem#!Aj`;YlBhDg2xZ$4sD#p5^mBZYiR;gJshZBL!B8+<7u0s0GA6DB zfVF`D2m}Nv9u(jp6c%x?KOHwc!E{bBYGP3}!adcdMoW(L6&9FACIXa|Vio2J?w1buVv^ zE^FyptjjDOZ-*=;n@yXq@X3@O7&DjA(r!jgG$X1qNGyV)A^#~!Ru%jAC|d$ZNc6^7 zP0qU|S;c2TLJ`}0aXH22svox1rwhcnUeRQd=zuO9NVIpCil{|R0FXp=$-uGPrmVqZ z(`bp3%Jn{?nxQb#{iN9Mx3!dAYdO0^I*lLu4Eu^-bu+Z61d*2|u3RW}lheIJh1(0N?p3)3xCG83XL(GUtMSftgj(CFDhS4{i z<3Iv0rPXFoLp+@d(8Ub%$#fEk>102Yk?ue(@K8bi6N{`Thqz3qqL2ao8EPj*iGyT9 zB~3I@n?YmNrpeAmeHKen!p51GQ&8~N%XMH@FG^ZsF+t_QV9Z$g1B+qcC)Sp?L9OzlY%(hI5IQ|2w2=R zUIhIa6#=Iftc8J+j>Y(4F#m|wD$vzh1(vi{VyxK@HNX}mjni)+B*m|X%^)0%)GcXs zeAy5qD5_XOwJj>>`$20fooJNJAf&g_mw*5cr+7JI7z+gb91RR2gTkw5_9n+HW?>>` zW})b%hE`jXY3CJI8iaDjr{frR$smU|Y|k`NMMA@{_NO|>kk%yVPV1yS?13W~#t3j6 zZW-0-xak0D!>&rH!p4_CEa44EZU%o!LP`r9!GI*%K`Ef&cF0-k>z}C580uWjG{aTQ z{*0!vdvjpOQoC_Q|Fio4Y=V(hr8+J%F-Byn+tAPPhXL~V|DpPZ8k_%LU*FK+`TtY# zk4f?LFikTU4EvZ=O8;4poCcpIT7^`b02vPX?W!aRSg&EzgGv~Y1B1MhW(0mcu7R&s zA|@U^qkuo?OGs!AA>gSrS8LK16rt+lS@aq0iOdWIS^g$jQ4mJiufsikWESKiu z1prJkywD8RGh#yFVdBs@`i(yA1JqD!kBrK)kY)#XcqohXuBEQ5l1DxbLgQZhbZs9n zh=GUeHb&o|*5`0A+z^aRjLyk9|4BG-+zKGi{@?m=eb_et8^SfU-u$16e{w&=BHK(B z&UCw;Qc{a8rrx?Y#N`bv**>2PQv%O2N;3%id}KRf62WOzW>gr@G=m;VKu~x^ieprW z>LYCe6{TC2`Z0t+GhvB_MpDF=Vp4o{0y2V1{O1(*9BV?Mkk2RZgK!-01AxySF+w{O zm`pD@vC|Cd(G%*z=!G??FvjpgT84ev0bzWQ*hfM>cyTc$DZGj?ntcKTpfd4hfDiT~ z8sl660*~Cc&e$?Z?UtbeMHOSZ3L58N1R+BgaWa4r0VB&y1|d`Y#qP8q5LluF$y@Xn zNTwAP;ol@9rg0mDUHT?!#4dbhoxUf-n4xzE^o^oHUaICKR;gAQWk9LcaaABCaRJ?v zuSP=&;2s51GC#>6gOO2Ov0ayaz*y=tE|uwm7h((* z7C-*(BBV<^3cA&P{!)qIv=uS!?aCl(U6SehfLBQaL%f>MTpI0t zx@W($+jtrDLK2AAJCjL4Y|1fqmSiK^2Y3~KOP3>eF+z4c5Kr?Qtfp-$)xL@fO}#Yh z3wL^NeA;wvM6=IMJi5|FDM=UMP%92M#`z|aKx-GZMLfLb+YH1wFAlp_R0So#u*j7A zwY7ayKXkQ&w2`E{ZvlYKYXA;2$&>(t__!|`FnSH2Xs^JbV3V6+c_E+*3Y|7avlUwO zz^!ecDX=p#>Z<@GM2pXQAWtln#_m;;{M1~_aHO$|M@5GBnZG*XJ>Dfr=s?abNE}|B ziHm3&_zKW6Ch-s@4hBdRhnK`^Uxg2qkg$v->occM5@@QDV!z2sA`4Thq1V=o>9De1tVKv0WgIU{#C8UR}Y^&){w`qRI!f64Wv6Z$qn)Rd(GU zXCYlq&$7!v8QTOl{Cw)Wlc{X_oa;oaux!g9a!wb@@l&Fzx+D&otV9oFxK%Q*!sQ}M z8zBK4EjHks-W9eOZUwMxzi9UP7%s_+#Gc?kNkKQGC_|FW;cYOI7*EmPn4~MnArVGU zp)4{g1PYsgTv~u~6@bBb5ctvH2K>Q7*iLLJ{wN}t9H6?`WM=W%Wi}c=4)U^uWl!IqfY-<9k)wVH(2#&6suC~|8WLN@2gN~SYEhVg&<3N$QK;2W zP`NQA15VJz910Cc08`P77{_T#r_kI@@-be~)^ySejHQWh$)wc;P^AGVDpdfgEb3r~ zEF}q2p!-oOKnut51T9(YCpLt*+c+?ftZzGv;iDpq@dkN@Z6d9%1dG8@IC4bZqe~c? zR@WCH@I$=JrfG8fiUI8aeQLG^bYKCOMi7WzE(#fay}kkeGvxz`|y1!q5#K7Q$<@CAMBNnd=lPBogMwD1%hLH@w zp<~cY2x=h!NsjCDfhxh2EDiF=@8!jKb%nJdpXsM&;Y>x?aizw~9Onp=BJ<0nL|=;2 zqk<71HL!F)l(D=-%hR%;55;&Iput3{*MiC*tGz(f8*XYiqZRT>yLHcDHZoFV3ounU zD36<*8dSzgr2?!&$Yq@__0@xnTrKeZdPKl@q52@L4^c$4g9$t6({8PM23P14z2kY9 zqt~;sW*#N!JdJdc9Pi}x*Fa1XIHb_$&9ib2O&6_%;}xV7+o1qSSc}k{KGiY>(#fQK zCZ(T}rT-|#%RwQ{s^w#*Dgi!;KrRMR%lj5LgFcDuQPdm5^B1#)5fq79Rl`sKC+Qs) zNRtXyN>)1j45iKl$fABFa~9eX;cZoVQh~DO6D#mWf?^f+ikZ|U}pxugx=8}kevqD zuo!QdD5OmfoVf&Y+G1FL#-$?)a=&y-h^4*?@6_Z)&@ZWppdlTo3wS3hMe)r#Z&U{T zjaLncE1-8Kc$|VLwt+kbpr>V3^zh#0%dFfndSmC4Wa?{inF$sHlalbgN>IkK;AvM350BF_V3tOPLVzfSX@2+CcDcSNGr4NYu5K~J$a^#$;XPy%9R z+enPsMslFZ3@-u(Yv*;SascsZT@d+_me1>c-8#}5?hZ*LfftI9-?C0;^g62xgjaNR z6t97L(qo?{Iro(x?uO*MLR9pUhyU zP<-g8PjMt|5vZ@Jrv+&RMioWSnx)PFnmkceP{1OSGYx>E2vKE#Peliz%*Qger~SOh zML7|DJk4{9_E)N;^djWND^(o3D4CJuIQoN?l6FJT+tueX7i{8PRgi2eNp)hx8a3oY z|2KgGiJHqVkOMHIfOUv)>o90or^N-bNhTU6-H}1vZ&niUrX(t(F+QF|_<&GIKc|5M zX!sLYMu|w%v}YW~vA8G+c#*o&GDL6Vt&9ZzDg+?mjn)caR3Jb`QT5T(A-W7n@&Nt{ z%ZT$->UJaZ9fugq;9jK|nMpzw%8CoXtTKC0xG58=H0?K`+hGUzA>>bT)dP+ChS}y& zFdPim)@rr7vxVL*dt;DTTLPK((4-NY424K2(;mwtZ`3(ns6+Kl?uy;O8vC~@D5EfE z-8gE(i+GbLBM;E&U_POtnSQ-CZJaPt-=-pQ<3k=$yBxF znZ@lbesCtv7cx4n`t;o?Gc*6?T>sZ#j#7=Zes546R*U&Yp8Y?ywRIuu`hO%;)8L)| znUa6uAXoxba`J56$Os6M#E(HeHV#Hd=ONP|1I^$e5G=+@$LpH;y0*FIZGqHhy z5fMhM_CREUU~rjUIy#CT=s?=9A%Iv~5O8Kr5JYtX5iY>Lok?$0CYt%h|5Puk)LDr zf7+Mzl7NAEMHSPLhVcn;3K(QC8-;M(aAX8IOj@^WM=HT6UdimpvMOAquiio#tms)f zU#Uduy4g1}5}=1R><#0UMcORTFdFJ0DnqY9kt2TsC@7HDTtXL$HA1iGS&Bdga+6h) zyr4P?vL?wSBXWvmH9<*0L1?DKr4UUai9Na{S@ko z8ckb{oI^up^v9@Q>jRsRG>*=tJ!zh+Q%q;6h5qJk1-W@ZJcCXZZ@pHT0SFingF_(6 zi)j@q`W|S@MupC9ZEu)gfblFCHaw>`XE>&!T?@*#ZeUR0#Lx zS-97`xMyW&n+pRA{_0p&-n-#SJ zz@6E)`KFy(vJoUDafJ%B0Q^iUwWt8fRIySrC5cc}7n#O|b@1q@KkL-6oQTpVgVx)E zI*EoFh)MDgBXeM`HfFMe%%T(ZKYcYpuvCikq7gdN?I$)EiV9O8tZ$}47M8^3vKV0> zZk^^Z&?=bL+RYZBVxs@i76AaOT6&gsE?d%U>>*$w^1A7o3O8rY96WDvoJEinNK7IQ zYvc5M0N7g8|C#Lva(H+Jkj#FJsvqER|7UJ-B1diFXQ^@8Wc@1;|C@uHWBx`S{2!?c z)!XoYI8yKJ|DTe7BO}!dz#yM&#(7aG`>mRF$93;$tV>XHGgJLn36cOpz=C^iqkR z&;CDH34q`x$%>N_UnCX@TwHATUR>OTA}_El9NLUM$`R2{3i6{GQCX(2K&>IC5`+Bl zh@n4xR)1DCJk>~WCHrw~%((^+!H0JHBiI7% zHtm2<`UlIx_A#T+3JLJx zqa3AdyoBE3+dh=7@o7%~$8-^d7Y*1z75(4c-LvTb?*7jHhW@YPxhMMn6JI2Yv4MrC zp;(rGUM_-D7MMsxrsOknW{9y2x01ni3GAxVN=usWwp5e0=sbwnRC$SDQ7#7*D=Jw+ z8}_i^Q9+X+~Uf@QfWOtW#}o8elrp0H-gF@Nto@H2kOLN+T|4GEW-ep5b<+5zt~4D49Rp zVMf1^%r7Eg_O_At*Yz}||BD2Jsj~mt&&mIT{Z0I*^*nXye*=sgYH;=u+}(j^>K84l3OMZ>tO3ytf?37l4wY1q zz2GAv`KYMMuPrQ|n&IcVpvf=od}cb?&yMAq%bAwunX3hB8ma8C_@a5G?4|* zXq(Ioysop)?g*(LwROb-xw_Ws?^ogZX9(Kj)549&Ycy3Df|^mlfr>2&jkv9CL% zXZ88`fV;b%^tz^B^(N(evt9MpY2y|pxOfEa?lgT#$J*)* z&mE5%oI4)5&K-}c4<3(PCl97#$*Eg;dA&PwY#OmoF`*WF_iB(ti~vYykyOIsM<++26PAe|P#j{SEzJ$Fqq32gWh(DLS16I{lWlK=*QE z8>5McPAg(2Ye#GOk^{#w?j=9CK{A=W(gv-;uvHEQmZ6$knIb^LD<9K2Bk=wdgs7}! z+lcH!%p>VgtZjL=8uzVoY*#Z-)HM;8ZVxA98v?0OT^@ z$^!cezUf`PeNm@}iOeuHqep_aek)_uXxko6hV8Bqq*;S+M{m|fqo8i#7*&X#Ot%&K z#7@x$w3{w@B<)yH5=3ntph6#nf>_esERZy~yBpT1K;Q)%L#s7C&_xX>Sx9Pq(E{m6 zI|Luvm>JUfGgvcIdobItL)LDR@Q3Ls;&aFx{EvU5J6+h5U~#Xg{^7> zt~=0)@8$^S9i?+&KFtal#pNapgqn}>BvKE2N0#<%?&Lg&%cxG^ae*5ah%hQDbt2=oevKEfVLD~fnRVX9w zgB^1qstJ%jV|J1#{#e_ovL~Ox?`cGkZDmlf>YQfM3oW}WbnUmW@Un4PV&xUaRqSaE ze8F|6aHw2)b-QAdLX%`_9$f~yj%DJP3ncym;)h=U=PcLle#Cx^xCtFBNr ze%+Z|{S5;XpS!uwFBd=NY z;v^!`BnpP$-SZP?dwQ(z!uCY+w>ppuMdn|A9-X~>{{Hm%-T#h`Uc5ejGkSmKmUQhb z?)>4g^8SHtbNSr)(?o@CKbPoMWVPv}*rEr;_@5k|o&D?W>5B)~2bF|J|6XR3>Fn+C zo3nREuU?H#UcLY2_{~}UUQVRMaE~3;gU{BAe_B^cXD3~wE;$2 z&r265#r7VT@Z z=lJDDuLQaiIV)*r{v>Y{C_cs8*+cVy%o1ggO7se)`h?u=ke;V5YsAQ2S8_Sz7_qWXt6Hbz{4nUM3>ny|E}TY+hpKUUl$T=bb-q9=#3|XZjD_;N8>Qr5&&8&Z zz8W?4&=w^S8wm~tk^u{PX%p-YXId(kMvk7xmiEgYPxCBfi(T#*lp1uECz2xo%J>^TsJR2WTFX+ZTSKGQyg^0nYw5yN@bY2RPcVf3RPcU^*O2 z3)a?hcOzBD_u7-t;9OjOCUy}7dwXZU?L8)z-fNb`i5AsfFy zSsnj#aA4bi4|X>GpX+%RwEwol(5r}$l*GId!b2Hp&T0sC&q)&FPSJu(8S%S}Nww z39{nKtRM@JCxL)V_~1LNQS6eG_-k3$jXGv>16Gs?+Bp?_js;e+haw{!5l^iQa|0=k zyKO(ioJSSXS{g*z3l&?z*dZ3<8pFvY3O!pq6g%xr!OC|ORVrI!^OlUmL*{^g?x!aI zk0VdoYsSnppot_<#s7Euhj#q8y`4?`pS3*8#D9x%{L<|qz}JYyZcifbOspYpUh<{< z1xzcOPWDDdPp->xYw&G@9|}e?iRQ5~f9}E{p22RGOTX(!J(kiGc_&FU^#ewk@en-r zqRAyndPdY97{@S~M@a^c4tXtbNg5J=j!by9&=WN@ctfxRdTwwz^rW49ocLFMfG+fu zb*zUc^219!fjoa?RwCi)5WN>k6hDVC9Q%P!e567m9ld(hvecCw@K~L(AImrLw5ndj zN%R{_!KdDE*+BjDqU-P)Cf?D>aaPHt6QN%z_kV-Pb(CCYxYL)%C(q3nC&w?e-lgFY zevgrG5TR1X5IjDmZ;!&;$IOG|l^>=z#oyC74$vHh1O_7TYf;fD=Hd8?zRPRl(wg;1|K^Dw#8XB8`;PoSoBR*!c~(IG?fbSS3_#|I z_~!Y5mKvc>Is=(Np=ss>Eek|p4v0lEKy1Y5Z}h22|G7$Y!4p6g{omOg*!CZT!6yFG zTAroie{<`rZ&^LV!ymnk;qNI@arQE|nu2WIpTYQG4}}v`k72P;R{TWf1n0UP!`CGb zT$L_vAhU6F083!#9R=|WzDeg`uU`g6cgD4nju%?IDg)EJfh@mAscvw?Th{#4rvKa; z>ptxNcKbWF{6E+^*yR6Q%d;f?=boM4FayX1JmdSI%&5*PQ{SjgR$R4F9Se|-e$TZ- znHy+}9Bs!Z?QQUc-EKPz%Ao0-BdSVyz9uV8WD#CZ{dD^JT7^G-(vp5sj^M|SFo})%&I#95&BaH{>YXvg+$jt%*d6wpF?)EZ|>p7LXT)qiRE)dbY#5sw4 z0z@(j2D0n_P$ty0NF0SI zBp5)9qlpg*^0HCkgG6EQX0Se1-4^Q__v%l1l!sR9GdO_>oFjq~;C?=X7YI)hpJfdz zC}WrB9@|Zy&#lj$s;9cda^g$_yK1K0C;(MGHsCxT zXaC%Uo@HoI!TrmzF{1R>$BbcPL~gMVc_qF99*hMeLj3TeYKe2&3(Dp;0_%L{Z0(g6dCQ<0&_7EKOpMti??UudW zrEjOu57Gp^n=$6u zRvrZHA=o?Ip(Dc0{Q2)Y=Q3c}*nw!zZRjk9JOMQ`=n6P=XX?Xa3;elHu!+qwGo{Cab5g%I zk%#1}nMMhSBae#r{zb_6danFZ*k~c%+%xq~6{v&Lk~1Zv*%ivyM=}7OlC>(ZS!Qe; zeoiL6d5@76IVW!F0tO^^=mFiqUKgkLR z*DNqEJ}xe~ryP-|%~i~TXaNXtItHH44zFb9TG$esc6$l=Mo%*4;!{Tfy9gvGOI60z zI&PTD%@hi+%IbawFKGN}q(2{u~HJ2y*}Iya<-M$i6`FTd2H%BN;Huf|4HQK9|u%CT`z)@P6< zz@wAp&)NB}80M<5$%31n>(I5BrwN*(gi&lVgGBBgtOY(@78@<)jeFgQRr(l%IPvE& zxh)l)m&C?l>}j%%cQc`Hrvyo3^kRQ&eJjEzEXG3`|?dEmr)7shsXMCuv zwb^PN3u#$ho0TqqpUP|GDV4SbJe8h=e&aVfnan2VE{?n|ct^3%ieE!AnTdNreQrcm zxpru$ral#_F^E#azC|Gta|rpN9zfdm)DL;n#e1g9=717#qXL;l7zr#G5->sFI`IiX zAzcp;h?GWbwXzcr^1%33rFjF-XWUp($ek9bc@+BeNbNBIv;db3kY~^ddgf-U-xIsR z>w+VYph+~JqtN4=z-Nu5m<>bL5Iyf?z@E|(fgwncmrhuRpBdYgVo$I1dl z=P6AR6q4YUc~Hbj6r&`#1#>@1SU<9j*=@bNfpY__05xQn!A`>(C73u&urY(y5#Wui zr$(x5Q6NjfI|Kve>T>x5&T6s@ZbR_7(*oc_x7+=wZpO`Bk>$B8-4?RgSG+B3a(Pet z0z@Ie1STYnyWl+*lnokE?^I&d9KD$@;qtHyZwS{;qTKsPrbetl+y{eThffp}rSt488-)Rew z4kKIF-+i|whk+spt~g$;@4nNK9JE-$z{iBr1Dydf7Ad&kSdk$<$r;x-L<#sQiLNmvCA{nJkGHJ`IiMkjA=~pq@^?D?!1ub~+7AMidw@iI zTEIZM$l(}G*bZZr)tnia{~e@Bz+R1v4LM6H@z7J+Vv0pW z%E_;=9+hm&I?R2susoeWv%LJI>Wrf(_&eaVyXX0st*SA^{sh33%vdq@^C%^=TuWI& zh6!!YtnuE3pH@qyU@~f**dyV@k`Z@JBm^@AJ(OTpiGF;ZeX}6VVR9+>0b2w57I+PB zm;?~B<#xd;`dHXKDL8W&{~b(y6nKJMur)Pi^!ExeVTMG2vRcLtFp+`+eZ@!_gG7J5 z;FRn;N$l7@QDmw;=nmTQD+w^02SAb(Sug)Zdwld9B}DtIjXJ|6VsQl|(J?Vc;Uu}G zOry)HGLsYZ|FaMz0hW!lyWMVEdmZ>FBqg8zfo}CLR~aET=7t3UWy^_CL*)6yppc3R zzdz=P(h_t*$k3FG9ertw%=JD_``-!iQm!j{WHWUC_dL4=s&*`T#f;h(*MD3f9GJ|rvHb# zI~)4HjwcyI78;h{5)1jS72BcuX%V5OQNj|lZ9PeYfa_@Su(g%tFl8S*aT)|2u9j^x zMbQhU6al8c6u*vU%A?Gcp(`B*m@KE>KgM912Ei@(J%s@~YO&hg*49?bgvyivI`!mA z0i&Zp=1XgFFWi@c##I#6XlF%9e%W1GsAc20wFQo+e2||S9pLgdJ!g)Q^j<+8tD#R1 zpF*H){dw#BFnx+R7Tn)WH}fBYFb#qhZ{KJ&Q>w93nrM#Cv%#H8>#_wQE3+RmKCm6|W8HTpLsfk(*&W?Aewn0NH3arz3x37YyhfF77;{$wUK+X9r(%}KRi7re)4ng&W! zNsr_7kH?*BG*%Asoiqs^%M4po62n1y!JEYqKb_G^S1|D-Dy)UP8pVgJA2Feei5-VY zBvmMo-51@m0#ZRF4!RR2!?6aQyp8$jY_oBsoqK=!N*lkIH(6_<&$O4a5p#m6aLB9Y zR3Sh1f84Dyfk# zmaE3uuC^PD>q>b^sas=ZvU4`+a@$Dz5?c7kTK7DEa()Q3RNU+8eb%Jaant;QDb?9n z7$#VBOPWMsYYQ;foH-%Ib)~f9n^sg}|Jibqfae6G8Dr=m^ngDyD=OV&KfEa@ zN&?)06WaC1v{R2Ou*ygnzfUo`M@i8ue$682WHF@7yMPhFNH7kTuTEB!K3Kxa%me;Z z)%UR+P8|iF-Y=to0CdbL^&)z*7e{efB751h#TLo663CP5F>B6*-JdW`;uT76S*zyS z6Ss~&1}W#+*E1A?>nOSOrAc8nlZ?@MQuM{$Y%ot)K0lqH^K^c_?-lk&>b@o+6(fS&Z=$#>(u5HWJRi+z}i4Qd$J3 zXqu_ItW;Rh1otLUI6*OCe`GVzjS6xjhG_3;kHq4h*FG_&PD2bh$*K!JRTAqC3Qa0{A)CMj#cFdfxW)}t+8SojYql6KCs z3Qo&K7q|{sbti2qf{zR(RzC&&EyUPG`fM$qIH-A4(Qa5%m6*_yoNTC(U}w6YSTN zOPT;yL&IHdgf2mh1-pbdkA_`)y>!j#%Vu3z+B{{>MUpW|exw-G7)_%DNhcO5zm20b z^aLx`+?S*jTf2AcoCT67BD!qDcdT{G|tLGToW zQLZ^=ZvlMOBf!naCbKA#Mp84q~08cLB9T0`!=wD~F7clf-;(<)e0pOQ^ynISO zgZ~0=V-%hdIJw-`XJX4hXGjO6(VU3X2Y~Ke*Oc&uDoW8pL-60ZcYj}OAaihQP4fja{Q@IfP`W zS;1QlPquJ^H8y?ZI+$&NcPI!n`Bhq$LTL~*VKZQNUBG4#{16iaJzgfrmjhEusN7Cm z`7yeUQeiEbS*wbGKUkik3*ks`<_&F}L}ObYL=c=Gi2>y&LVGN=`(h@GzjhC+d7Pw6 zhK<`TOF777HhCQZxZ;;dkxcTF*OE5jZzyVujKx&AmJw4r;+=+P{!+w!RyX<(n@$&5 zfmI;4B{S@<7_7(xylSYoctQdNRQ|C{QsnO+H-q9zHtbAYOd&3uzBr$~Sd-Gh8G(du z)iXrs3K!v|p7Xmfggm*8F4$5|0GYuM48RkN5E!E%y55#+Qm-n`0yqPnm#_s@5=Agm zL}r9X3sa^X>iJ%$ueyrb&3w#_tr((s0vUPXF|j!1PLM=8jw+R7apb*Lt;ma=w~2=m zIw3#e4CLe+4pOEG7}E$gMBJQCHUu-Z+TH(!@mtXH=_|kL_!OXD1Xt{g`8^ zf_~_`?#gmOFPJe84}8&Tcxa&;F(s&@f^PJ(C9AU7Da|HtBh&3n;&ccG{Y-l|XJI*p zV0Y)WFJ797MXPJIr2dNYk%@?hRhRi&akOOeYngT%9PID!?qx6EMB!-^5$&wPUW>#} zS>dVqs--5Xn7L?6lm65Kt7|gXDwpa?7i#G;rE-KYZ9hJtlae4zMHb`g)Ks`-(V&!4 z#EEqIa+O-y-j=#x^X4<9+cc4T;QiB=f5U8?8o&BzBPivzyf@AvznB&LU! zBc-Bx6NS8kb|C)N))sip&GE2yUo#ONRdg$#yghq|xx>l((^svMdHv0w&wcL}M`2H0 z5OoqnJJ#CTYN>ap>=n<-FIU1auaGf(xda^DSx2*LkWN0;dYck}nsR~t$1g~8J*fdn znk^_$n(2aRyihh|ytFiA*cEmR<(3Tg^>Yc5x;27%PopdnYQPhk5qX;OQ63yWoW1Z9 zu?OmaRafLDsOPerb)T)@XyHZRciv?BK1w%`(SYm~#cueA%;N(I+k1>aO7 zXY8R@AO-18D-)iP+$W?x0mg!!`=E zjRNf(RiIgWd=cwj5s;OeJu6cXS(7_YpSf(Ob#v*wd1%q5uVpG+2!|0TNM@R)se=aWO?D1zX$U3FUdn6t7m^QmR#lViy1v-2sr z-^+^$B^P{Ums_QPhPJNmYc(t~d#S{35fAyll>FUzLRX+7-swBEz5D%Y9kEME+^?-9 zE}nQ>OPt}asfzohYF>FpHEv(=B!QF%wJDuyJC+u0;-v_O4>5qb+Yvbgbyk+thIWK3 z?uQrhU2jVQ?#NQM7Mf`&>#K7u%KAn1xs2;E4eXBtp@3b9idR9)DQzl z)qV1?4WY6On2a%t_(Y1;vNg4YH&_{3wU0CwgXZTM;bLCnJQL?|SV;EUxMbCF$=cci zui@=j*oQE|MmOk}YcccOayV(_R*Exvva%Q50{m}d z0NyPkDZ-@N%C4v92!@zdVw34}+ZlHRXXZL0{j)TTnAt3*ba~>eDR!-rQ(wG% z{dV-r>C2bzj^F$uzGbr3uP6wjECz`Nu$^m@JMWaVDVuzM_VV=2(d(D8HP+bANi-j- z_64+mpj%2mv)7Vr%x`h#Do)+et>U zwQtOpxC3J!OasVVl}Hi=SS~>k@lOvYc7?#N@7|q&qmyH?WYy-Hrs0GyG?oP*oy-7K zYCjfPi^=9$9E!|UL)ay<_-bM&b(Jvf!dK@STgvLMORzWYhEXSoCYQ{w$?VooF97|b zY#l+Tux42U*D&Z%K`G()fV>eT(yizpL`bgd#3!f&DU$|4bOE0H>*&?C8v_fpB=+>M z$*u?;u3J&)AjH`g|M^V$T4^d`{z4DeAv~^lwo!F&@oRJqrc7dE0TY>J36*+8MrN!{ zm_A~>(1?-KD;NyHV6H=C(Y@1<_yMKJ9H0;j+4^8{{~Yi{mM|(T;$jRD-Efc~kfed7 zxaVK|D6~=A+A0Ww!h{&@MxA-<5$kwp{@O~=JR)esracp%={sirEd16y_+`s7H-;_xSRC@!A3FYHw; zh(HamV)wjD^PeXhB_Av`K7jTCf+y`7jfOSc@*cH{-)iE>vy-AS8;8) zbzF;uWcgs6ifean5zpePROq0Fk`+W5d7gF#*;q8w}U6f{B5^Fyww^FZKVA@+mCRghO0z(WDN zRWbDW%~XwT$PZZAX^L(`b;F{)m#uabG98gus>ATmO|V3P6Z-y`qxXVhHw3%=T!DA; zw#@PEXXpoMg5J#%glAFU4Z&`%%vs8g8(Nt`3#dUV!om1%qF{V-V_+0`j$}?6ON*}dxwwm`C_h0ynW4m>!I4zrp?OH23T0yvJYq~9FgE>fLr z2}^Mygi>6ko=fdKMzVaQ2ELPh5)31!oqSx=1koXuePukIb8zI(+qJ`uZQFJ>8{6F2 zwvCN#+cr0LvT-)HZ6_ON=AG~Fsd}sKnm=Z$rh01nQ{8>~T<0dfSWXXm%X_)@^5wa^ z#Qr+OGaei{pKu*mFqSHs+4Fj!=t?-N@?WjVtn}|=@6Y?O8bg=2! zSk&LQ{d2Q4SC@F%;zbcz4FSabKPsprJ)(k-!3HtB+1nQX&Lgp{!4UV1WGB+vposW3 z-nQy8G1vzc?Jf0jz1;Y|UL4dhl|+~$|MD@(ZO;D3WXKgLoYjZi_2rZA=W{t_!Qu2m zX&KbgIzkb0ca=9Rzb+`E@3Vn+A=zumh*v%3RdJ`GH)ekS;e?aQ;*W77Y7>{S@?QIM zTPG*xYu3;HI{SA6HKNC0ZiXJ`<@WX#_iC3tH|;&7vqg(jwTJoUnHCSs~S zng`CigTIkZISYDRLcG+N#7_ExJLhvBW|O16h`)platKDi7koU)hY)f!7G60)@giE& z09I4_ywVM>uhNO&NJOIJ#zKXp6wV}xGNc0$0f|1mKWn%k*Lz!JloC?oawnt>*m~x_ z+SS^M(bP|GBp(~Z8G-DF-&cVXStYRWa4}o$t>&e!U+XB!%qaFR9?ZGKVUVRBZQ#6t zDN|^%Un<#9Vs~1!Y3Q6HfHbG$Q_O5zhLJfBGw}QGkW@EK;Tte>#wx~Q;smb&?JDnD zKxrD*C&{0zi1qS|E0nTP@Izin;@13K;e96*bh{SB2_LRy@~5!a#kqyJBE{<4c}-}u z4BL6bGyPHEj^>i!YsSH5(W(eu;?3tz!!c;CA6FA_8jfq22&-~}lv-U7<554b-=v-8 zE}XUg8Y8T&|7~t&DZW(xQ0!F9MHImgv78m&ePxeBXM0`$LDqnOduC@?6sj*WB3e`@ zs2$v7FeT=d{L0pE==FJy;q|A;Q$2qf7~$^VcvkAxuon`@@AD6E ztd@-2Bqe`wq2@i>=aw(AuGzSvf{o+6$zCb`I6 zchVXzTS}8%h8BUDOdCBR5-yd%A6epf^;%q(*B7q9IcCMQ_0<`2-ELEVqY*nC1=S*5l;}(k$Dl0 zk)=yT1S(o*yVr}er%@%M!IyI^UEgo8uw=(zscFF}yTr-sAxZR{gATPdZy6cKLQ7du zYlK6hMU~{J5)DE3`iVL+;Xx32W=Of6eq)i{_ZA~S1_D0p)qi}Gd+hr9=q7s+_AFSD_`lgl{0Wd zNrq48fo}9vz-)5DaI18FgJFhMVze;`fEJ(@k7}g*+jjX#(WHTxxV3`7FJv+}F4kJg zbru*+qSpC0tH>6oCkhq=Mji^mcK!`PTf8hLbi0aL+ySDvRqwx`G`2&Y=te90QxA{R~1g^MZ8LM;l%;$JiT4k>&G+qcHS*$-yTA5cw z!E!4aPcbvCNk+dFMQkplX}24{vHQoCFDLE|lK)nT=;mL0C02|&`VuIA-Z(IXz&+Na zTyeN)x2gsT7Cv9WQM#etkZpZvl{@kmPNy4AsAP9M6R}|Cxxc8flCI)=(m6jjlF%aF zOFvfaBfy6G7rI0}1@N^CTkq%7(_?Ew8>okSd-WmN`yFv*j^836dT1TL&MqRt=*Nrb zPfRey*cpab^OaobeUqaYz%Eb>On&lFc(4pc{sT8k8i z`c}|_{z-05dBq@!n>7ELPFjnF7DOO*5Gx=mgHGiw-Ha<^6nQFGMNcz0;^YzqOYAL! zIW}GsuB$HM7WJ}ugGiJ#ftfJQ7zGQL$aC=Qm^+q; zGY>iKymVs|nmGeCQYzvedQnF%vbjY7iCksn3XAu=szf*yeDG+xDVmgl^@sBj(@rzr zWZrp%29|-?k?^6a1c3i79u8`KP|1tmI)W5@7+pCuvcc|WODgR_C|o&O*ht`sV=f0& zAIxd}UjM1sU3#=)@%k06K!`ZLD2M&GG{4y@BQJw*$;2455mzT};Y-F^?%{cBl|ARq zgLz@QW*&pmmw2w?qgL_k5e zZ^M@bfz7MLJlsRDcT{gx)39sA7(>*lv}sALzs7x9{h_%vB@!*=Zg4iz#v^uP>%JdX zE9n^+zdRL}P_$c11{7SYAIfLk9N=a|cQBKm4{1j|DG^zQTp)|XY4<=%jKRf!L;wl= zKQEtCfOyEj>o50@0Kju7K$CG?2p^H;x^|DB@*{nH7}XTFYzS0C&;7wRhu%~Ki@VB-2B!KirE{VIbQTR zIfK}8UysrYV#$4iX_+ZTvlATqv@l(y@BwrjtOt_Nc(`@`^@)L4v!s$YF8{G4VEv;rh=s8iP0pmlpXkOP&~c&KRa+zHE~xVZ)pvB%WT2z;+;n} z=naCg0`e->5|C}l2gmaMkt@yldEym_uGKj(KuHd>HX9v9H#RKy~AQjtn5C|(f9GP`dU&Oa8hYUNJ}*YNQ;3rGL@ z5MNvyK!1#1D-Ln`?b&VUpeAZY>X4x%6jP<~&Miq!`Vo`6QyKr%GZt)?Pg`{JpULP> z^}@u@J8po!D{WgRx%eY(>8*qWim{N$4z2vDX;(uiFljY4>Oz6fd9syJrvur2|Ic#NYme~aYF?(nh)p&w1e&H{! z=ptmIh&Yckr4k~O$GWOW7dY0`zvhBjBMu}13SDJr*B6q5zg1YdZU!U=j|em4f~%wl zkBWz~t;0{e6Sb#iiy7Ks~MD<3z>JxsmJC0h2bKy`!G`giQ@<&dTb(Z*{$5nBb zl%mp|ePRww9P@U8v(J96I(?0f%1vtW>ls4cR|nT!dJ6E(AHUg;uEWP0L!6G9fWrJ1 zh=Wm5Lt;G~90dJKY8t-DX&&`msd{sogzz3XB1Ix({)ijVsUMJcY)1Tk-gg(cK8>#} z^S#^39{kK((g1HtFmI%e?cuLI-L4`ms|>Dp^xB}r#;IsRK7HAm+lPQ6gqV$5B z%9B16#)iux2=mi*tJ(R+6mH?jz$0w0X1~04u3P`hfSX~M1SaHH7h%Gg&)&CP8#-uO zvS$gb4==1Y;ycxHe6pbiSPn5$0i?@x#PXwvz15v0kbl*hqdBDF={REs=`fX~s*^ah zyQ&eW_?>+e-mRDpr$XRn=cpvx#~uE){Y5kDWE5A|alr=epE33_6@uBgUaiE*B#%!M zBeet%j$8c4HqiXB_99C>)6EDrWK&3aA!pi16jACoW7tMc`>jE~`vj8pmSq3#Ey>k& z6Y%4!?;p?zL}A^sglrFkYI_&}*f)It5i+>HZzv2j@Uau1qh@`R3pj7Pn)yXFTcJd> zrxcVHpmfDE*V%2`>ndr|s%pkTmP0on_^UYxj(K;vIF$8tZZ3J!u;;sJU(=SHlGiwE z1g5htryYpPb9oPH8{LzTW1li2a2wp#&nPao#5W^{{|aoN)<5qZ*1OQbbn(YEV-)_y z>t8-DK{u!uR=E|J?~*(vb^3K)L*qp-0Hu=qgVebG8}yvEFprbxD*7Nl?Zy*LU8Jbe z7oJhH-z82F>)+Y`#91T18h*eyqA`8o^eO98W32R8CPaP_>0afVn)Owb$VXh{^#*gc zm{iKt3l*p7&iS1@Tl{Rmp^ z#E0@Td!Q9oaoF^vBJ;t|D>iU&lviFS1UQIJA_0o>i*PhS7B3^Vq?p}>_?xX#=Y?39- ziNdBM`fLP}sVSC;zX#Mvj8+n^^BQ|rC7J`Rq@zaunn=nZ!V-1-ZxXUf_W@Iy&6K4+ z2>df=uloK&=W+8=ODbKs5=N9MJzYta|3kt8vWkrHQhAk>;qq^t{Lhsj?u^ubuPMjD z%{6%vSid$nw<9vIvR7c}sc=}L92KRR3(_1VC7JW*|3!|ET<;cy>M2MOz>c?i+~Q;; zxHI+_dhydH_PQy)x5P?bL@d%~#r(LKLzBLz>v(8V3TN_^pKUnE?gD(>T7^USsGcSB zTCGUFecjI77y;+HfZOLJ&pa>vmtKOuE`FiZf4(Jp(}0Y8DhKy=iV^1QVq$l{60Q?= zUg|P<*yQ9H7j$H3klHM|m{jU1h7x~NiqS9(Kp1-zv}7~lcca(r6ZWPd;}?L-EI2_R zd#o1#J{j{AzX;}T%m&WtubsdYyOu#|gIuhVTNFt=5j0(*P*ow4K@_e8#E0%wzq9m0j^PoNO_aR>V(Hqkv z%aLeyZ&o+VnV<0}5zpF@Dt80fwG`(_g+&4kt+IXgTL&&A8vrp3Pu35Dg^_S3RKZDs z6Y*NAkW6$IexFjhH~C@o4DM}Pduo3DMilqtL{8zQ@s2r!2{60&!bx8FEk0gQokAvy zU9R#on}BKsZ&EL>717eWW<)Hzraj)6>n8$N_!4b@`aYvWlNW6q-zBc3{!uMkw9kDj zqKR?Hh-qd@@vS%PNSs&PJO}Lf3lMN0mM22sLc#5L@*u;28$lAnY-Ii+RGlS+`#7 zM0~sI!rYU|LkW7HS=JClt2mxdXqpgllLJ!0G7cDsvnI?4s`!{q9#TuHx#r6Ec9rR_L z$7TI1>X&@xTbI%Ljf2M;wmVNivbwcgs#eoF9dme1Yn9Fh_g~o+Nxu47aXC5;3KyD( zDArtEEU$!e3+jzd`svsJ9h?fWUZ(~Ix29(srbRXJg-~5FtHE@z*k4sS1(I;%2Zd=3 zWOaJq2DQX-|28N;@Mn*?9k&5}=f0X29Ybzhafh2oUjImS$gOr&Zhei=pktWc2@`Ci zVw$Au0RDrDkZT8LcwPeJIAIPmxqosE{2Tiz8Cip?s&2nBcVuP%f5+}ebANa2z&@tLsTGyyU-XK%}PE*2D0ASXT$h*7E1Mp(Er62U7$ z%vOVg4OA#a3kg;AP%YU-wOzJiU%XT%SLs~0jgVYJ3)g!EUzNNcq?n0SbE$k+5E-7J zS3yjZ&(sxadMZr|(ZBz5PO~yXqY$BLI}{t@0{VC^C{_L^K&$VG5-UXS9_pN?D(qAW zQq|VSO}l6R3Nup~TPc1R*J+}YF0|vIDrt}fI}gjCe_Xx2g z@cTEQTu!$=@nw}Guu2Y_Xdf#{9QU0!eTi znU*_a1XzyoqC&Mi8&G}{o~z%tA`%~3N~46$@d(EE9SFhSb(Bb`#3z_h=6ybl)uva# zWN~Z8yW7Ak)G>p~SIdX)U*!MLSiHiLo9I(b%$6*u?;j4ydp}Cw$iYFVJNXg5f@Q#D zf8UeN4*%bR<8$B|ihxiLtubWUQ$WCKF%TvKhTsF(%5RAB1&nHFff@hi#0Nl9@LF3! z-is{2dtei5>y(u)bkcTzP>9%_!;9ct;Sh~E90QXe#Qj$aOIJOw%!;4LW@!X zExb*xxSDdn<);A4v2xH>D{uQhy4Mxu2?)n@5B1m7<&t?EXVw;X>e5cOtIhW3+xMsw zORHqk=H5J0I?ZTH={uA}btk*Eya03wD8z!Gde!7RScnAX`D?YiNK1^uU82ML7825F zXS5bkTeg4}1h>cRH>dXQUEs&=w(hIY7qV? z-#3efzmI{)Q{WRS%lzMuSmL?;4iNYe76Sf~7iWY2`~y-hFK^dCLw76zYEQY6JPE~0 zi+t8I4wf+HRUAr~wGO~WB&jRD8djpCBt9JCD$pXcpHq!VxpF3FY1kB5eWx||B6i|8 zKNvBAQBgVg-hDFnU1o5aDzPv|*FY73Z^K{OqXQ=fX2Up=Xr-nZ|C7*LN+*-XnIFQ! zrvM(22^W5rB(Mv5p0!NLXnF-*?ji!w!d&R>C&6(|*GNrjYlNs$&wfmc8+hcO{3y4V z6QkHwu{q{gNGo;6c9+9!AutwSEoP#{KMCjsTY@O0qZS1&1+wqQ5Qk?ulOEM|If~G1 z6IN0coRoI@aES^!j20j#=ib3O6k6s+ z*Am==Cvc3?l(gDN(1K{=`Agh0Gp)O5i;0{?Zxumi`b#qQ^Lw1$;!boLMj>HGmzroX zOzneiMgyh&@J3UanRDc_*KXlSW&62qQMh}yi%2h>Sz>|xk{$tm-cRFp^BILjE|*k2 zBhANk2ycx>>|BPT*!oy9$y+7EPMvPa!+QDUMVXXBC&WBfPWj*MjM3QwZ_yhdi3{(c zv2gtbN@NxVZ4^WzN?L5=k=?UIt|6q+vW=?0!)IF;G@U}tULqG(vD*d-=Y zMv-k=vE02q?$(3JgXX`!X6_DEkNjfNU;|@TA1SGfqpSB9RYn^bh%!`q$`E{a0$F%2 zQfygdhxD-*wXw$(OOWU|zpss{&yLOr@ej!Zx%l2xQ&gqLWO=U-qk;hRu-m0^HwmZ7@AR=TdV<-dKJ&YQ=Rt?)Obu2jjp>evI_| zoY3vjM_S6W@Utm1I_ z@Pr*cssFZynn9|koW8EU;hpZS#uc0Q;=Pp|*v_Lk&>?%I4KKocMX+jwm)O5j6c)@x zid=UEC=y-b;4TnCOutVnB9FO;2YerC&hg zy4Bj0$VfmoCC~$PEJ(@VEi=$VsfGRuOebWY_aBD5m-mR_x`;O0a%TNik#t?rEy9d; z8C&Et*^kv{*N~JbS@N2%3Z*ATCgoQ||CrB2GFv*YQIIYwI=iA_^E+56N|FB|yVS0N zpv;^S&;zB?N)f3?NLkqrDQ(o?*M8P)qm~8z){mD`C<Hc$Q@G z%PnO~+YgZKjhP;r6^zbAGlL=%nph1OIPybw+=-x%(wO+$Vfu5rYbf7=s%J3lStN~T zruah$hoUMJ|L1vt2a5g2Zb(QRaMve)+=QOfh>jX+)3c!F;Q#KJu<1q*$&Fi9* zq$;bEE4RdN$fDe@+*wSy{HOl`(k-ZmEORLEEp?bQvR>&ZBEt&;@*6WlQsJ%|NSunH zjCLo=NEJ&k=(W+#a00=`+iC*oj=7$A7d1<_H8`K}Cr#pL-u;r9+b)**kBQTYYpnwP zuh>sZ&WrZx`b$0b*v90@RO@GR86e(x8V5ukx8BPQQ+yIr41y=8x}=R&JYB1JePlL8 zYWipHU6w7Vxe<~h=Ol2qN?lExLF*4iY43&?JlfVXQh7_Qu z2g>y;OE>6GF0c3wbUfHDxs=E0=ArL_yj>coJTU2+3wio85{}qZJm31Is!3TkC%bJ! zoW6@O%Lw3mu))1N`N&oGh-7W05nVH4wM43Wzb+Hs{ zE7{P>`@A}1#C)@PuI`ooF^&N>O@N)<8HYgMj~^fZJvNpSF99_c=O*4vVm z(#xmI7GWPovvv6UBv9DVj*rw_+y>)0`dqg8I_CQ4T)+It(}SLipV{YvFyl??s$vRX zFc6J+C%z5&X$s(b>nCnWsgtM&3C>2YCP>4Sv|CeGyz#&4*!Pb zf3;2?OT6?ehZy~&05f|7fTXr-!jp%9D~Fi?TW{iIfF|WkDyVJGec|x;>>0_J8c7lt zt8v~3gO&u)w8on*i|1ZZL9;UvT#4@Jcpt}gpQXrAP5_k-0qBJ}(@>;R$`s1+RHXi3 zIO?n;_>vn38(d7UXwFik@12T_N~{awKg*Dp>R$pnZ>mjm*gvpTv-r`_2~b2{n8DrM zH{@x@(w%%4$oq#rol(tn1u!_~t~FzDp-9FU7Oof;kAo5GONREvc7Uj2yKn#DN0Z~! zlPCXIHYIko35M zkYNQtdnmCKxzAj)jq|Tl&)hh^Fc#XGsDC1B&!Pt$i+&g8{6@3FO;2)FCN!n%zn9=gbNRulz=~dwpva@fxjG^&*ZTZBK zn4FPmqfER8y?&`oX~Pi(9r(oPjbSJ3xK_RU;|{-Iowd|hr=!it)t!YaE5#dTqG~fX zN)$2`D>FmQ{cN?LWJjGts~~|S$%a;qA5Byd0*4@cf6i37uSE=<1=PMIbB$HZKoyMCcHtEXB3MUfkW+4C)1(m^jx|qy}OHmgOQp2>SvpME* z-7j~Yf0r?(0V&^Ryg~wICD*LRY_1t!)@B>3rgztXgWL@iie$c*SHwv%<19u0;b2*tFr- zh`iByAf&O%_#EW4Vvi4OLYLltO}NRj!Ui@`$5JI~X@8DE>*&w}O02b05x~#ID?DJw zM>D>Be*ZZc74o*Fr1)lT5&Tr;jX3JF(kZ$&JtpY(Op5byr{sR!>HVjr^iz`o%q;Bl zG#c2^(vk#RdDuF9+l>cWVfLNACe%20RyuY7meJ?lKZF$TuOQIfkQ~jua=WctqW= zIYl&FXvYF99Uk171L@Cz`vy0k{Yu(HpzOST?N7j%#D{G}!1#)i$|sEa!M=*0Wh3+t zy99*OVDsr z--yXMRuLm=BY06h8I~yVn`2ESUk2i?aIFX~+v?s|zFpgL-cYN^Do2c=*q;u$FgVIg zK45>F3Q3+pMI684zWsZRC`G!#RCN+9j@muiM4I_n$e;N*fOxXS%Ki_s0AZtGltV?? zy7y5Too?u;FD;0CveMI1Kp7_0iq0S001Mpw7GyXyuz+aA@hrp)v zQ@|5&6iuoYM_);NP(Zc=A}0^#9Bwp{xL(#;=Gm&MTJ5(O#g{Y>0V6McCnF*jygaJ8 z|FOifI!Q}1(X~;XZ?9*9Vtm*Ff@eS&?r$-N*s}gxzOU*E!m?_KOM4rLilXsBjGxxwx8-c2x& zV9ecEb3GHQHK?SH)@iO5U;j_hcvCv zkNvR^fx)oql7M}scz$s7P{C#yUBPwmA6m~J9hN1|Y*d0gurz!CMUNe9@H(hl6(-F*et z9&7sn0}%F!R>i(ghWyYGFR`{8dtWB`X(e^)J{+t`-xfY(V|hL?X{!$zVDy`vl3og(R{i`ng zONtqAy0ddL3Up7{qN1hU(|&@)gmq&tDa}X}aYbvZ9q*gt@}3<`?Q&K(zlL)>EnD90df||8>B8^Q)q2{eGcf(ZwUEi$oaJT)fn^v|2m@U>($gppEasU_u@bd0G+9m zZ&!H0Dhq)hzCS!Zceg`^LE7w8O9x=L_>1Uk$b&dVx4TgGdHO}$|X^1&%^`a*_Y!F(@|?3FPB>1)RDqH=2n^4M{VCgQvg@7v1j z!|Yzm&)9%(l=r8W=WZ9ffzSQJ9_0{1bLETB^dgUug#lE8D)~O2%V*hr4B{dU75ggn zUM%0-q6;ls3rNq@IcIH_ZMVh62m3$>MP~ zAc`!<0~#enf$tT1v=(PnOgm|{!Z zL>Ce*%L6;_`y+GfG|&Gq*|N<&s+%*j|4}c_XeI?!5wK|%)M_^{I!OMQh_Ji}oN|jz zMnwyiS|f1QF!m~S2g7oYAdTn$2eK|=F3TzISzRm^_cCNYC39Xm+nQ`m;TMe|JtCLz z1Z~TRV&<|1!^uj5OqctjcUlV2^-hz=(FbI8I|Y3U`X#2)7A3qbE)H7T``dYUWho^4 z$a~chNk)x(!&c&NH_|zH?xb&(NS?vWiSc=lnaNlY7!CsdQOaAD_q-3Ur)aUJJP=fa z;BWPYT+}I6#8PDNQII6Rd^DDAET&l}eRv-z-fi_*8Tfm2CMMY+buYwDr3Aip)Tuq) zyj)|&mqg?9Mwf)f4uQgsWcn!LPkJb$gO5_StYzWFH|BEn z8G!kH$#PaLx!Z3YQuh+cO)L#8R-FNTR*m1?&+xQ@_gc-7+4BXV8!K(C{U0vtq_gl@Z?f>I_nsCL!_)&8} za4V-#iXiK+&4*pifZiTfxd2`8pUeurJ8m{4G2|8F5DB~Uo{_v_JMzI?WrzmoZnhY< z+Dp5$fq^-7?(M9Q`cG{IA>{(dLYh~gY&I3Qb(xesJOsv-%l|LC0@gq~?2Y*K?)yW0~G!0&(Fp%u6&d-(x3OQ$7;n=x`1U04XPwp5(xN+)| zr|mU)FPJ$RXOBJOo&4Q6>MXyQW?)7AyLG=x!WeHIzf|_itveZ$-S(B|KyvXh{G35u zDrPzck4jr`B3>CjI#Y=QSr9!Rr(TwT@V+`83PQt^f^zSv-gk@#Ey~EkM0lI}IA*`? zE-2r_TCYhX#;X!x4i1(biDwx4BO8%vR*HpeKMIB8YSXLrk}UX!-j98P z{jlxk_9d#X^n9K&yVRnW2%WA~7BgymWVV9Co<4$`fkLPUU9|YrsyC0#&5SBTUlOr6 zhGdBfNn<=Yq?7W;Ks4ab&1xVKkSk_=xIso*Y9L{lESfR2TF$2Ro2|cbBH z=Yv~frC5S77IdpxtJH&^Ft8R29e%i_sV# zTT&Jzovzrj7l+kboR)Ef3skCan1NcTDH7?XCxAbcNvcr$4D}5K(oLKI& zVk^H*iyj}{obhXk^-Wj$7gC?Ld6-t3*fO_imY^&4%xgPcgFf~>dUY1>W$!3`^s`_4 zg6H|?NWj^P>%9<)2hV)~=p01@^t250g@xPOdh+Jtw*u|OZ14?q@phvh>i+S(VR0)B zE@lFFu}ItfBfcp8qlruppyTOsf17gqi?y|Td8wLoSR!SyM1gn;MYe3 zPXbZZPO5=nnJ0r1fVu&JXnk)@$s0q1M?eoHDXOpm*)e?RrwiBLCG1Y5>GrJtZH5*^ zc1)HWPLE5w-?VW=Br6TKxy!jg9$C<6=>h$&Mq|LO_1*RDyZ=`8HDG_ywxTzM?G&Zv z(oQfA)k}`hjlU_vPqR3NE931@=P=2ge=Z}-RejZ*&Ri;WS!DIF8wV5n*}{4v1|38D zm5OjLg^u!lbrozt93I;|ykG<6S=7=CfMtN?tRN8OndiN~mEX1zSc&mb;a|)Pquh## zbJU;KxMI|*+!A3vacHx|a6S$p8dwZ2i$BLc+#4mj#E+zyIwsBndwm-_fuJph>U%$-gdyvtrOZDTv3A>|H#Z!8CU=jDm)|<| zY3nVuipSvJSTbi@N`1C}=0DT&OdV)z`xb?3rgyif5WJ+fwfu>1ql;noFg$7;9&Z7g z;xWfvZ?*A}f0)FnpqaHVVEaywBg0?yogQ&oRE*;cxJI%h;noE1qTwE!{9YBKS^%#G z(HROTmY|3>5m)s7E$utqimuOb=0WJ4Hyu*Cp*D{uS&vVEHmthI3obc{W^ZlW?4`pt zl$u417hkh7^>Ce8<0xNtPf@VD5}Yn)|M5?@H%Ce^W)jGy25heQPaU;1+5{5c*nj>v zG1~!BvtW!iX517nNgtkAt3>8#y8V3&I|~(WfK{)1*$3ba;hd1KIy?@NJe>~O8sextyh#B$pWa;~evoGk~63@Vyl`WofByY!wo2F)d|GyGI9xV9I z{Qe~_;Yf`A>#gG~XW%Su+K)SEUbBwS{U%hw=;;GKwvYB@=T9-H>X{(yOjJVr7%x8J zxeOPHmO5ZMC$}3p{F-@EM$pq;{lWBQ?wst=p}+ z1f{VkNNEKvh~6~Djc$7caMQEwL)p6xxP`5Z?oKW@lDD6sHy0AD*b{0o}2NvBrS7goGytK>LG$+H>uYuT?DBNTHxX6WFD!n4Sl`5{rBmw&_eEf~5AwxMNkOJA5WrdM~1B z1WcIuYr?QUZO>Ya7CQL8iKNbHpe7SMsWn|QUh(Eh>R<&y5#_8%uvYzfiko{JuL5zA zXB9^yKBgOaVtYz{NBo+68`H~+*~otK2~VPtuZYqIvvONOgB41>w>kEKx4z7%(7N)N z26Q3S#lUS4l@5@=rLx-RuD%A=y()zahYZI7Z*}sSoFL#tWFo<%zzVFK1jNX2EBptB zN|MczorlJ_ z8^rJz3*&dXPQiOkxMnt@-=Q_*qLU?+goFJ=b=Td-u`J<0r>bm)&X)q&(t-m7g&^|_ z_B39GXat^Fr23bMfJskl{SPBo#Ztf|p?meUDX_TxBlft#B@|SLU%Ml#&X*rIxCU)~ zx5?gH?*QQL1_UrPilhveu-_|6H&qA_PF=eEPXNldM-TmL#isXbH7BFO(lF&rs}-nZ zNZjl7)%@cn-KxY7NJ30}b-VG=-+vF(o^63vTrz9dA!#NdDVT-JlJ){=61 zj1-@P_!{I7k(>^%+qAI<#dsH?0I$5Qx1t3y0AcX!veFGl|b#b?Mv)0yl z;iZ&0D#O^2t{IVL-pn*2lz>Ws8g=`;n8vzGO@t{<)Oe3@DL76G@6F#=>1Hwo3&fnl z%_8xa805DNc`lBz+)QQ*{LT@q8~a*QkMP#vUx}{?Jss2@r(}22taP zp-vQhGvShLAGsb~%RV?&Y$c9w%B-}08=2_&aCLir{+nnlGZE$?yT%5?qznd}M7LHk z^L~mr&?NG;*SLI@m~eFoF0Xz7iRfgP*5<$S(3n>+hudQ`x}&%DfoQtm^6E>YEQo98>fbvAAp{Jn~A2N6wJBZwgA>hfw-# zDv|9zR2Vs}ItP1j{#Vc7PyDhaRs?7<(Mr0}B#gv?H+c zXWVh+q%y;a#gPB1KP$yOiLgjn0>-(?4_QD{;x}?v5$pNh8(E;SxCN~WRfDB}AZJ$u zUDV!ot|XkW6Z>Mi$11fvM40R2k_Yk$UAY({E4dry3|$KEZJUmi-M8cD&D-aKi^Z&k zUhDcLW}JTWI4k&OE>Ue_Q+(<8ZWy>!4EeDEP&-=sZNbD>x2N^|d0|8=jIq%4(i(3; zsiLtAwH1ZQE^`DEHGwk6wctaFY14WOsBo6)$Usm8)KxIYpVP096?XkQcOJ+^NpyQ5 zyD0mPzZOx&*-kqX*1Z8lM5D9UJx|_Ot$4I$jL2Ux(zxUjjCqwXhiZ_3( zGW5M93i{Y>yfq#RR!~MX49JBZ5DpC-ZhGKDi@04! z;0$Zn&OzTUOU|}dMG||FwdHJlQ-PfWMOAT_z>mUy_A?{G_#%tQ0m=@*8juW$o1`UwQQWQg((-VoxP=LYVkAd?6t4ewk4CF=LMgqy5i|wd)wWqmEnt(<>xN~HtK?Ry5uJ~3dLB~d<>QH&!giUKccJi~fL-UyFwB$-H7A1hN84IkylIe?! z$_UbH44kJcxJLN@veWL-^eP%RYyxG17&2r(;Xp(aHWF33c}-MmkDQnP(B$n(opFtQ$-1)JKWVAbaBhelPBe*_42Qgzxk+PA8&M# zcxj_kZCyy-Xo)$8XYV@D{vQB=Kz_e)hQ|!zP1oypy{;Wjaf7ZA94jhvwK1^gqc=%* zkrGPc%!HlaGGRd90=s1|5RK+zgfk}3`V;kVB=!vMZ$knG--Idd9!ZGurV$cX%1_q)T6i76NL7_QTRYxQtc)jK#H!~Q`TiVvTx&{P+?I;gxHcbf-zzy4;z zv-*xQn99P_U=|x-B5E)ZC?#k#k0P$`3Msn&@IiB21&2dvaBL>v)2C~pvCT4mPG%=k zxT*#c*eoSC>^Pz7zAC5$b;6J^C}R?n6!bW3^hyK8DfuByro7+e+<-PEBZP&+p%ew+ z;I7CStQ?(TpNQEb#+0+UQ)9G8;rPjeG%t+uA%0srVvX3r5ZcQnwkW~kY_5Squh~Wb zMmH{Okp-L_!q|W(>I0EE%?G@DJ(Kk@IljbJ^sN3GBi4FEWSh?gbk3!rE8z511z3?H zN-Rsl)Ex#bi_((ky&71tR`akUH6S53dnGXT6{ekiacguz<}&C&Q5oLy{OnvwKxQO{ z!RDuS4I{&3s+WJJWHgWX2}pio6Y*DnPP1f+u+Wddq4M-!SLpQB_c`{nB+k+#ibz_> zrp01%X*j0dILs#VA(KDwEp>4;bVZ9?Kd*fNn$839;h-3+gFS(NzrJ&_n!$Se>dKhW zkN&~3R532 z$+0VMe%04q+oFOBJdq!`oP0#r2dro#CK~=(o_Q5Wz)kxjy6*ooY=*0NHn)X;B}_@& z9r`1>p2w7wOasDo8lnwL~ZGYceEP^I;ICz)?Yi)dp#nh{3YY1TBggG(^`w zFeyKUT+VncJ4#O*P&)r;H6Mu|0u_6C7~yT5%&_%!M^z znn%8?+(8;*<%vD66hg16Q9q>tNlC!?ouX13qn$D%!D}=tjmN>(2S52kvNzop%^FjX${=82w7iZD_{(v^S&`}L$( zCDDMj9ny@krt=GQcK+g$%GA?RkZXasx^ZM%r|0qR^P;Go2f;2mU6b1=(#B~3<+4oyE&endq02Wan|>*m0ef>Xo3_(V~sPw~v< zQ4JN%A{!KiqTFF(NW{*|)g|I6(s1*cVXna?C2_MzJz$%%y9S9(;r)9!orb}J=4Pwq za0^9vBho?{eh9koC1PK;f?uy4Zxeme&dJ@hM zWFv-u1z?ahe^QLa7q*7ezI7eJJko>8Jin{BC8L$$56;hZjp$z26xv5cBPidDp& zL@Ge(%ccop{i@O7Yh!K#ZaL(pqhFmOo0a8>NL=YpLFYqPcwkcLU}`B=c=PI#9(Ph! zd{Bjf!%wDg-$CAt%2GlOrkKgD2ja#+8Oy%11*ooxbxmUBTNNbYTr#D zwi#Om(44Q*Z=nSOF>&i57tFu+%C?6zUj3xi$D)F@S0O0#^)fg;-cl{#JcN?L zTgyP}xps+MJImIa z2Hj-KE1|I&^E8M{DV{B@r~+En46Y7qqjtVV;Op7>Oz`)pEN?)ibdp39j(GndSriGi zb9wH_iyIb?1r6^8jlp_*Y>HE3&QxnoHBj0Pt%E4<%{UI^?pzqv%d^s=KQ+T4ij7w4 zHp3W(vjSQx6{k+Ss^hG4GOfgB*MAyJ)v5p$`YI}}ge$YVP;r!}Di2aF zwba2?iYZ&FT3L#fYRR%tseCo++ayXmtV&1NCg4Jvtb;0L$)48*QL+p~mn7?8)yt7u z$5)7vcIagxQlqlQrA~#{!lTXx*5Ir*h&F#Z8>rm(%?70G`etq9N}g{jzQ2Uyo2_ev z-}VzL3-KArAYHdHZfP()L~HoIro`oZK*n-=ezV6P|L ztI$hMd}?!>efTs&+qm#4MluysYiB-d4>dURRp4CNt*;)pKL3}*-N3z@J^Pl!SLfqb zi&t~;TMlQ9vtKPr>Fc)~Hr?y59)aQXw;UqV{jYGyt3_&c|62~T;Rx6gag8HjIVeM0 zZ$J&B?d+>D)9RD2&Y_iquess1P)lpvuH6w;#bP?)*udG(pqc<#?Sf+iXdFLn^wb|d zZ9q4CU~EEhU*|;|UgNlE>#zK<*!`}w2UeUFZD6WTiYmZ$U0~87_C=Qc>VxLx_orw2 zxl)`A&G03v&8@t)RSURs4$)!7<(q5r@?Pnf$v+fzZHLP`IMqkYypjoA94?!o$|Gjq z>z#nHn%a{Twu4rG$fRbbJ_Zzl$$+i4a*Pfc*8y&diHpqz${(%}?3G2@sslYvLxEBR z0p=RCcQTY3L;quPi$=gJ<1AVzcgJM_w&5bb700B-X%$eB5lq62l6Z{faTZ1hOOS#k zL-H^RVU!reE-ir+0p7wSZlG00f)ino3<7yv3Xs&U#SJ|E3f;1IXhd)}Pl>U^0T)79 zieoy%DMv*K-%%;Jj!`dX{u(AG7aE8lphkNI8IhW~*GE14XtlLF-g)DXBxCW5wRc%fd?Gl0!C`R1-EF&@C7k7Hs=>p|u zaJeJy(YTkNrJD?J)t#;ESKGQCZ9!L~Om6Ia2?s*Y8QrhqX!1i`9rAM5x{U!aE_7SK zx4p`35sa&@J=bBe-sIj8Y(vT10;+c5GoSB@Iin1t)|bzqvN|h~GW8Kgzg(Q6WcWMr zv(gDp@|r^IM~_Jeu|kz3RVYb?9-B<#>`4)N5f76adEbg32h4TykTdit1)D2sNYM|ejF~~s44s`kYgb1F%CP8q(G*|4g zj(Q`CqQ^X^P{4!_6CSq+3Gw4vR=EcJ-7@+{4pGM#=#qE9b&zdue_I<^n7pbs`Agz}_kgf*NEED9th$wtDA4P>nLz?548@b$;niuC!wjdueQvDy zuG_01qG7551+q*o5S1ydm`H`3a>?Z*YnM{O1Gb_p#iLQ^bJd^PrCEX!nUhOMS~B{p z_>)@o3N?g?dW?{Nfx2A6&5{y9K!DN2Fd#lobrS(jQ_SUyIGoK$CRAGxdRJ6X**J)3 zHtASnL+cu0MIW5{K4_ke(3+LTS=M}O_yo)W8H$EV4Ea?t5hAk@ZkB+Qo21G@{qR8z zysW{O=^xQ2TVqR?`RW^N7GI*#B}}%4H^Ogjd!3C_RE1vOPQe=Ln`mr&&8-tqZ4Ik{)!Zflv)mk# zdKpQlVGIK5KU3_J3zCL#R8QidLOi@k0;E(!V^$B%pdv$l*wv0GB1Hy+^_X9*#nHYB z78F2vIbglLITYBgFhaeszL*&UR;MQ-|czHL$ke6zZY^6`sg@P`2|U( z^5FVP@~LarWx~~avUmJL^zYNxuefs(Bs`$d0inn^q@+FoNd+_mO3ndsJjrvR z@I*;QiaNNXzuES?BQ=u_Z<&%!@83M<39w_;s{X4|>9@zqAN!7y^C3?#HJwLU$krO9 z>w!eHBG*?)SubRvKaX%4Ef}KQwp-+<;_PKeq9h(eXCwtkv3cZbRiQPobQ832PiyZU zq}y@!B$S>DxcEnf&p_4>pn@m-kj4352)X?00O1%^*W$GazP}v!ek<@WW}BP^>`zO7 zD6h44h^(G_+~ZQuz;T%{Hjd)}v0uXIqF(niHEwvGB~uJ~yNDm;rNbo84PuI^*ZKH+ zkh^h;<2h8NB%9ATNo*d;yn!-RRKbx{Z_?+2e}R*UU|{NbQ4vt&VKz^kC(8^Mihqi_ z#s{b*8h!YnBq;mzDVMw$(^E)ktjA?5nfEYH8Zb+Vn_D4`Hh9)`4jG9gAi3DDzjei; zN|T7dpbNUR4?{k>;yWyIwkCg-Ns{PqkMo}g`=BuaU1#_w5t-m_W0AG4@YaFl;b`Wd zkZP%MCuuStPsIMIM8T`wH>F@>Y>@kcD*+dO3~9sS1y2q|K`F-*&y-{EUGL{J8BBao zPIRN5WChKVz|&H4Rn}ysJ0<;CGsZhK|s=@O^H9jaY&~I-zd_Dy?u4{1dYO!W`a9Ox(ULNcjE6V-DrlxwAkOd zmiRHD`@nu~Lpl-Z5HsRukRLZLoGw@&=ovopC?R@+S=L%V%iT3Zoh(vQu(^DgT=v#= z8HvwlIGY?~$w3xTkG(*y%Y-fU^?S15ocuiYqj~Og%HTiZ2}Yi9htwhyt+Ykv&R|a@ z_3Dg2pk?PKnZ7NNQ-&Kou9Z!QbC5x?adR+iM-+Zkd~;-zaB0^(Q4{{jQzb$iEeW%Q z>zge4T13&vWw&sY7Y>X3&k9O#uq*a$WkJY+8O_HbPr2xXOrYfs>_*~f{WQkpmnYI)7F8YP7?b2V z-Oon`fMV_%L_RWZMTn$&a3hu`AZj^TV$QmvMWW^0n_TP?VdgpalKD$W4xgSJK0SQeJ%0Kh-F~lk z`1C(e_a53?dge64>3?+B#$`6{3wZ)?F($DevSXGDJa1qLu;(Db-Uf;lit(s{=fTKM_=l*)cR+F#tJx^)_?!_sI>l%ySw$jjYnVq z4wFl2Sb(yKJ8Tty%hR{6%NY<88o0W6P%_rZ&Dhy3+CD@98`u zG#O=ZXp_~TNblKq-J%u~^GWpI>70x`GS5p+*$bzV)e8MDBX#*+G6b#K@n3!YE6Rw5 zIo7cLPo5t4%=Q2DaJT<&<=K-NxK$Hed9*#Jm=jkbv?eHoAe6ztI34^k#|tk^4*Vn~ ziEZ*Y2xWN8I1ca_go@Y+1EdB*a2(KI$<*qg#)50Dpy%Lz_cm^XDZ-i$vPe!2t_RLu zuJF?BDRhF<0NhB^gi`dM^3ttzcKa{xx?UJ*hx0JX+%R_b08$WAKY^Q?;uin%JZ?`= zL;@G6VO(u5w*}&u@l}$Bps|heU;(0a>{m)qoPbp;jKXYz#&ewFI3t954udVBvN6kb zdtgj)9NEqR>N$=uh_G@z-~O}iv#x_sF=Mg><-W==Z-&@^e~Z%qtS>kVISFjA7i_}h zexHmB3g^ZFVlZ`A;sNR~xl(bY9-t4O9EYnx`RyA1Mu}uyG-8PT0nphd@QH)OSE=CC zZAl!^Rc@=koe*$u$DqtA${{*Q=24*NP@f=ibV7_E4&1=SK&xr2*^Dy4a#tTuHYZLp zSPN{tMWaG0)0-lBfxNi4UCh+n6-e5c|E7+^TBSo1)>_cHp;1ds_NfIZiEG6dE-d?*H(iU!H1d?W;E*pBwPhy|U*j@~f z4_I&I7Zt=iXK&9b-LkT*>+({Pig5c4Ectm8H16Tq45!m1-6&8>e8yrn3v)sJEK*hd zdr08PFQRxjnoY2$qYzr`i!>RD6z+6@9)0_085qKrtiTwcM?vDhC#n1<;mHmy01ipk z3SK&ovv5iZfQ;K|H*B=YBY0Fgk5B2(l%xZ6a(sMvPflV^>c{l(+iTLPL%8%&#A~Y1(Z)9C(Pp!?w7cl`nr+ClirD_BZ$1zwr`6ah} zs^;m2lvimI|DFts7Xc>IB&I~ER$SjK-pM?w#hXczhJUjCDw-t$&M(as1%%y|6mK-d za0@SmJ52ez={y6+gj+J4B*}Yi8qk7$=NnW}Q?(U^L@k>HO0nXiHop%JckQb`D_@cz z$U{R6AvA>cvG}972~v8;>K1nc)z4h|`eUACxOh$F-Y(lBeV2+7#f1{}CFm7>Ha(TH zH#iD|HoYq^LYl*xe}}HYS%&?Im?TmpKyUJFC4Bv<7C|w6nV6J|o27M73@yxkQHRa` zJwq;G%T`AF5&i}FwUokAy|?G&f5_5Mz2f}0`uV?bR(kW(+m}~fc9&J)XgL4(4iC-q z|4Hwpw>$rD&PhY%#=}m(@fi71` z01Y|4DW@mR_*G>_?2m8XUKIJY4`fmCm3Iz!BP40&Ip?wP-NBSRK_5Qk2QSpIY>)DI z)|b-NqEn zA|`^6JGi?&OOq@a&PRybidYjxn@_<>1a7XA)GOcxutRe}WC(sJbUrN*47EsBVMa+b zVu*%|Jp7~ZLIdAFu1bgq_pE~Nj0UU%@!_&+K04mcSk&^_1pj|GArX@#yliGw1vl{j z{?q0N@D6p{ z0vL${_{~W@lP*;f2ji~`^v4`W;V2{lJ48bxJm+78Lx=Ji!@(Lv(UACfP6?vPRNLyH z>7$TD0pBG+te0o5kfO&!?i2sw%@r#PuH`f0?|aVq2+0ct07NLiWKv45y(@xj$h+Ve zh!@nh>E&WCk)0Ec@{W}s^UjrJDhssg{fHKjzJZnup0^)hh0eTFI20`qWrsP;OC3IqRb^ zX41tlWReQs=UQ_yA$;+M8XaFce<}UpHkPtmq|pN zDamkvGdysR&<=C+44%yljWu_LXmjx4XC7{+A<@*M6Fy6!wz}6q;AHtmG(*-b6Tt6d z1nzLb0m&sNEOONqWh_*^nxG(e_*m`)=)eWRn+E+SqpVmQt}FGqZSHa z3*w;wQ^qdptc$zQHCwQgyNtwaN>Tyncz*jvtsy!^U| ztMvF5I^@?d9@|K&g0wD$xgnu(oQgXzHOo2&w=P}FE~8B>A;oIaa-t|T)ZWKHQ~CTZjxnE8L_n()+JxDEwt;pqQcs!b@P-3f2*l$fLWU=h@suGFId@i5!%gf zEh(^9-ZV+8QnNlG77L?=7Ve&5Up+Pu8z8H7mn6a3=oIVe%Db`xV?*Q^hTE3?VXwSC zNvg59H7RPPbxDw3aP4r5((5A?fm_;Q<;B-VtC-krTU^B)RI9B|f@;vW5Fu|8)$Oc0 zkabCFa3HoIz+^_ymM6}we0asQ7CK0(LBM5*dSYgdTI0%(huq$GwbMBin za9jaYznZWrT+Q8nNk5mbjX7`O*#!SDw1W2AfDQJa!~SvCwErAG-Npad%A+!PCfgs} z^h`stdTUHx#%GIBaE0QMU10#uzZRj>^R@fwleQgfpNVW^3+lAngF20SNyoC8RMk?q zu8w{0>X?J8-l^jp7G=r5@ielR_=v(dAaRC{RCdg^iy47icT`@}02-%EzJ8_j_J;bq zxTvW3Im(x)>x74H>=G;einkDRzi%=YaFRju=Na1{f5JHUmVy#{PyTyF=o(uQ7xqtaU54rO5! zufb86y4wM5ni{rg(ZWz&15ve3w*y>ngswqVZ(DAMTrnZnU{dVHEx{V*;X2rc3AiN! zu=Lh}1@mq@U=>!}8t4_K+ttu5g{d_XoAtF0kImHD8dVeMwxCpNX$?fxAi5M_)9%@f z!!&lbMW@*`Ytd+i%y!_Vy|MrjgOB6pG=SSA@1I)f1<1t#}bf3w`=DD1FZG zIM)ENXO^UDTyeKJGF_-aoA?ujHzX#MUZly8s3(a@md*Z2GW~EdgHy%9gy1Nf{HcE` z!$v5K!z{$n3lialNCz}P$4Y@LoRVaoS-zzN2jS9`-3v*kK`c+jq8_LVi*s2^QPjv4 z6uoY}K17BVQ8Xbk*oXx|Ub?NiMGc=)pwNPya;rf#CDtw==8(k=fNX6;Q_ zdcID7fyQycrUJcLd0qpd(XKN~!<#T7V>POrj2R@{t{#bWIF6xlm&Mu3^NTb6#l`uH z;zgmT=3&L>5gDLIuje$oWMAGS@nw<#0!m(m@%&CJ2W3v<1$>{+L>dqr2?sJONFG#8 zL}e1&)gJmGNrzzo0Ru(Ⱦ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 5.0.0`) | `5.3.1` | -| `image.pullPolicy` | Image pull policy | `IfNotPresent` | -| `service.type` | Kubernetes service type | `ClusterIP` | -| `service.port` | Kubernetes port where service is exposed | `80` | -| `service.annotations` | Service annotations | `{}` | -| `service.labels` | Custom labels | `{}` | -| `ingress.enabled` | Enables Ingress | `false` | -| `ingress.annotations` | Ingress annotations | `{}` | -| `ingress.labels` | Custom labels | `{}` | -| `ingress.hosts` | Ingress accepted hostnames | `[]` | -| `ingress.tls` | Ingress TLS configuration | `[]` | -| `resources` | CPU/Memory resource requests/limits | `{}` | -| `nodeSelector` | Node labels for pod assignment | `{}` | -| `tolerations` | Toleration labels for pod assignment | `[]` | -| `affinity` | Affinity settings for pod assignment | `{}` | -| `persistence.enabled` | Use persistent volume to store data | `false` | -| `persistence.size` | Size of persistent volume claim | `10Gi` | -| `persistence.existingClaim` | Use an existing PVC to persist data | `nil` | -| `persistence.storageClassName` | Type of persistent volume claim | `nil` | -| `persistence.accessModes` | Persistence access modes | `[]` | -| `persistence.subPath` | Mount a sub dir of the persistent volume | `""` | -| `schedulerName` | Alternate scheduler name | `nil` | -| `env` | Extra environment variables passed to pods | `{}` | -| `envFromSecret` | Name of a Kubenretes secret (must be manually created in the same namespace) containing values to be added to the environment | `""` | -| `extraSecretMounts` | Additional grafana server secret mounts | `[]` | -| `plugins` | Plugins to be loaded along with Grafana | `[]` | -| `datasources` | Configure grafana datasources | `{}` | -| `dashboardProviders` | Configure grafana dashboard providers | `{}` | -| `dashboards` | Dashboards to import | `{}` | -| `dashboardsConfigMaps` | ConfigMaps reference that contains dashboards | `{}` | -| `grafana.ini` | Grafana's primary configuration | `{}` | -| `ldap.existingSecret` | The name of an existing secret containing the `ldap.toml` file, this must have the key `ldap-toml`. | `""` | -| `ldap.config ` | Grafana's LDAP configuration | `""` | -| `annotations` | Deployment annotations | `{}` | -| `podAnnotations` | Pod annotations | `{}` | -| `sidecar.dashboards.enabled` | Enabled the cluster wide search for dashboards and adds/updates/deletes them in grafana | `false` | -| `sidecar.dashboards.label` | Label that config maps with dashboards should have to be added | `false` | -| `sidecar.datasources.enabled` | Enabled the cluster wide search for datasources and adds/updates/deletes them in grafana |`false` | -| `sidecar.datasources.label` | Label that config maps with datasources should have to be added | `false` | -| `smtp.existingSecret` | The name of an existing secret containing the SMTP credentials, this must have the keys `user` and `password`. | `""` | - -## Sidecar for dashboards - -If the parameter `sidecar.dashboards.enabled` is set, a sidecar container is deployed in the grafana pod. This container watches all config maps in the cluster and filters out the ones with a label as defined in `sidecar.dashboards.label`. The files defined in those configmaps are written to a folder and accessed by grafana. Changes to the configmaps are monitored and the imported dashboards are deleted/updated. A recommendation is to use one configmap per dashboard, as an reduction of multiple dashboards inside one configmap is currently not properly mirrored in grafana. -Example dashboard config: -``` -apiVersion: v1 -kind: ConfigMap -metadata: - name: sample-grafana-dashboard - labels: - grafana_dashboard: 1 -data: - k8s-dashboard.json: |- - [...] -``` - -## Sidecar for datasources - -If the parameter `sidecar.datasource.enabled` is set, a sidecar container is deployed in the grafana pod. This container watches all config maps in the cluster and filters out the ones with a label as defined in `sidecar.datasources.label`. The files defined in those configmaps are written to a folder and accessed by grafana on startup. Using these yaml files, the data sources in grafana can be modified. - -Example datasource config adapted from [Grafana](http://docs.grafana.org/administration/provisioning/#example-datasource-config-file): -``` -apiVersion: v1 -kind: ConfigMap -metadata: - name: sample-grafana-datasource - labels: - grafana_datasource: 1 -data: - datasource.yaml: |- - # config file version - apiVersion: 1 - - # list of datasources that should be deleted from the database - deleteDatasources: - - name: Graphite - orgId: 1 - - # list of datasources to insert/update depending - # whats available in the database - datasources: - # name of the datasource. Required - - name: Graphite - # datasource type. Required - type: graphite - # access mode. proxy or direct (Server or Browser in the UI). Required - access: proxy - # org id. will default to orgId 1 if not specified - orgId: 1 - # url - url: http://localhost:8080 - # database password, if used - password: - # database user, if used - user: - # database name, if used - database: - # enable/disable basic auth - basicAuth: - # basic auth username - basicAuthUser: - # basic auth password - basicAuthPassword: - # enable/disable with credentials headers - withCredentials: - # mark as default datasource. Max one per org - isDefault: - # fields that will be converted to json and stored in json_data - jsonData: - graphiteVersion: "1.1" - tlsAuth: true - tlsAuthWithCACert: true - # json object of data that will be encrypted. - secureJsonData: - tlsCACert: "..." - tlsClientCert: "..." - tlsClientKey: "..." - version: 1 - # allow users to edit datasources from the UI. - editable: false - -``` diff --git a/charts/kubecost/charts/grafana/templates/NOTES.txt b/charts/kubecost/charts/grafana/templates/NOTES.txt deleted file mode 100644 index 57e84cd69..000000000 --- a/charts/kubecost/charts/grafana/templates/NOTES.txt +++ /dev/null @@ -1,37 +0,0 @@ -1. Get your '{{ .Values.adminUser }}' user password by running: - - kubectl get secret --namespace {{ .Release.Namespace }} {{ template "grafana.fullname" . }} -o jsonpath="{.data.admin-password}" | base64 --decode ; echo - -2. The Grafana server can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster: - - {{ template "grafana.fullname" . }}.{{ .Release.Namespace }}.svc -{{ if .Values.ingress.enabled }} - From outside the cluster, the server URL(s) are: -{{- range .Values.ingress.hosts }} - http://{{ . }} -{{- end }} -{{ else }} - Get the Grafana URL to visit by running these commands in the same shell: -{{ if contains "NodePort" .Values.service.type -}} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "grafana.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{ else if contains "LoadBalancer" .Values.service.type -}} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "grafana.fullname" . }}' - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "grafana.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - http://$SERVICE_IP:{{ .Values.service.port -}} -{{ else if contains "ClusterIP" .Values.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "grafana.fullname" . }},component={{ .Values.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 3000 -{{- end }} -{{- end }} - -3. Login with the password from step 1 and the username: {{ .Values.adminUser }} - -{{- if not .Values.persistence.enabled }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the Grafana pod is terminated. ##### -################################################################################# -{{- end }} diff --git a/charts/kubecost/charts/grafana/templates/_helpers.tpl b/charts/kubecost/charts/grafana/templates/_helpers.tpl deleted file mode 100644 index 3a3ebd3ec..000000000 --- a/charts/kubecost/charts/grafana/templates/_helpers.tpl +++ /dev/null @@ -1,43 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "grafana.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "grafana.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "grafana.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the name of the service account -*/}} -{{- define "grafana.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "grafana.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/charts/grafana/templates/clusterrole.yaml b/charts/kubecost/charts/grafana/templates/clusterrole.yaml deleted file mode 100644 index d49193651..000000000 --- a/charts/kubecost/charts/grafana/templates/clusterrole.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create }} -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} - name: {{ template "grafana.fullname" . }}-clusterrole -{{- if or .Values.sidecar.dashboards.enabled .Values.sidecar.datasources.enabled }} -rules: -- apiGroups: [""] # "" indicates the core API group - resources: ["configmaps"] - verbs: ["get", "watch", "list"] -{{- else }} -rules: [] -{{- end}} -{{- end}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml b/charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml deleted file mode 100644 index 99dada9f4..000000000 --- a/charts/kubecost/charts/grafana/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create }} -kind: ClusterRoleBinding -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - name: {{ template "grafana.fullname" . }}-clusterrolebinding - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -subjects: - - kind: ServiceAccount - name: {{ template "grafana.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -roleRef: - kind: ClusterRole - name: {{ template "grafana.fullname" . }}-clusterrole - apiGroup: rbac.authorization.k8s.io -{{- end}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml b/charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml deleted file mode 100644 index 1765e9aff..000000000 --- a/charts/kubecost/charts/grafana/templates/configmap-dashboard-provider.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.sidecar.dashboards.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} - name: {{ template "grafana.fullname" . }}-config-dashboards -data: - provider.yaml: |- - apiVersion: 1 - providers: - - name: 'default' - orgId: 1 - folder: '' - type: file - disableDeletion: false - options: - path: {{ .Values.sidecar.dashboards.folder }} -{{- end}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/configmap.yaml b/charts/kubecost/charts/grafana/templates/configmap.yaml deleted file mode 100644 index d283d04c0..000000000 --- a/charts/kubecost/charts/grafana/templates/configmap.yaml +++ /dev/null @@ -1,76 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -data: -{{- if .Values.plugins }} - plugins: {{ join "," .Values.plugins }} -{{- end }} - grafana.ini: | -{{- range $key, $value := index .Values "grafana.ini" }} - [{{ $key }}] - {{- range $elem, $elemVal := $value }} - {{ $elem }} = {{ $elemVal }} - {{- end }} -{{- end }} - -{{- if .Values.datasources }} - {{- range $key, $value := .Values.datasources }} - {{ $key }}: | -{{ toYaml $value | trim | indent 4 }} - {{- end -}} -{{- end -}} -{{- if .Values.global.prometheus.enabled }} - - access: proxy - isDefault: true - name: Prometheus - type: prometheus - url: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }}.svc -{{ else }} - - access: proxy - isDefault: true - name: Prometheus - type: prometheus - url: {{ .Values.global.prometheus.fqdn }} -{{- end -}} - -{{- if .Values.dashboardProviders }} - {{- range $key, $value := .Values.dashboardProviders }} - {{ $key }}: | -{{ toYaml $value | indent 4 }} - {{- end -}} -{{- end -}} - -{{- if .Values.dashboards }} - download_dashboards.sh: | - #!/usr/bin/env sh - set -euf - {{- if .Values.dashboardProviders }} - {{- range $key, $value := .Values.dashboardProviders }} - {{- range $value.providers }} - mkdir -p {{ .options.path }} - {{- end }} - {{- end }} - {{- end }} - - {{- range $provider, $dashboards := .Values.dashboards }} - {{- range $key, $value := $dashboards }} - {{- if (or (hasKey $value "gnetId") (hasKey $value "url")) }} - curl -sk \ - --connect-timeout 60 \ - --max-time 60 \ - -H "Accept: application/json" \ - -H "Content-Type: application/json;charset=UTF-8" \ - {{- if $value.url -}}{{ $value.url }}{{- else -}} https://grafana.com/api/dashboards/{{ $value.gnetId }}/revisions/{{- if $value.revision -}}{{ $value.revision }}{{- else -}}1{{- end -}}/download{{- end -}}{{ if $value.datasource }}| sed 's|\"datasource\":[^,]*|\"datasource\": \"{{ $value.datasource }}\"|g'{{ end }} \ - > /var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json - {{- end }} - {{- end }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml b/charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml deleted file mode 100644 index c1ab8c4ba..000000000 --- a/charts/kubecost/charts/grafana/templates/dashboards-json-configmap.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.dashboards }} - {{- range $provider, $dashboards := .Values.dashboards }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "grafana.fullname" $ }}-dashboards-{{ $provider }} - labels: - app: {{ template "grafana.name" $ }} - chart: {{ template "grafana.chart" $ }} - release: {{ $.Release.Name }} - heritage: {{ $.Release.Service }} - dashboard-provider: {{ $provider }} -data: - {{- range $key, $value := $dashboards }} - {{- if hasKey $value "json" }} - {{ $key }}.json: | -{{ $value.json | indent 4 }} - {{- end }} - {{- end }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/deployment.yaml b/charts/kubecost/charts/grafana/templates/deployment.yaml deleted file mode 100644 index ea8e814f3..000000000 --- a/charts/kubecost/charts/grafana/templates/deployment.yaml +++ /dev/null @@ -1,272 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- with .Values.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -spec: - replicas: {{ .Values.replicas }} - selector: - matchLabels: - app: {{ template "grafana.name" . }} - release: {{ .Release.Name }} - strategy: - type: {{ .Values.deploymentStrategy }} - {{- if ne .Values.deploymentStrategy "RollingUpdate" }} - rollingUpdate: null - {{- end }} - template: - metadata: - labels: - app: {{ template "grafana.name" . }} - release: {{ .Release.Name }} -{{- with .Values.podAnnotations }} - annotations: -{{ toYaml . | indent 8 }} -{{- end }} - spec: - serviceAccountName: {{ template "grafana.serviceAccountName" . }} -{{- if .Values.schedulerName }} - schedulerName: "{{ .Values.schedulerName }}" -{{- end }} -{{- if .Values.securityContext }} - securityContext: -{{ toYaml .Values.securityContext | indent 8 }} -{{- end }} -{{- if .Values.dashboards }} - initContainers: - - name: download-dashboards - image: "{{ .Values.downloadDashboardsImage.repository }}:{{ .Values.downloadDashboardsImage.tag }}" - imagePullPolicy: {{ .Values.downloadDashboardsImage.pullPolicy }} - command: ["sh", "/etc/grafana/download_dashboards.sh"] - volumeMounts: - - name: config - mountPath: "/etc/grafana/download_dashboards.sh" - subPath: download_dashboards.sh - - name: storage - mountPath: "/var/lib/grafana" - subPath: {{ .Values.persistence.subPath }} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} -{{- end }} - {{- if .Values.image.pullSecrets }} - imagePullSecrets: - {{- range .Values.image.pullSecrets }} - - name: {{ . }} - {{- end}} - {{- end }} - containers: -{{- if .Values.sidecar.dashboards.enabled }} - - name: {{ template "grafana.name" . }}-sc-dashboard - image: "{{ .Values.sidecar.image }}" - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - - name: LABEL - value: "{{ .Values.sidecar.dashboards.label }}" - - name: FOLDER - value: "{{ .Values.sidecar.dashboards.folder }}" - resources: -{{ toYaml .Values.sidecar.resources | indent 12 }} - volumeMounts: - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} -{{- end}} -{{- if .Values.sidecar.datasources.enabled }} - - name: {{ template "grafana.name" . }}-sc-datasources - image: "{{ .Values.sidecar.image }}" - imagePullPolicy: {{ .Values.sidecar.imagePullPolicy }} - env: - - name: LABEL - value: "{{ .Values.sidecar.datasources.label }}" - - name: FOLDER - value: "/etc/grafana/provisioning/datasources" - resources: -{{ toYaml .Values.sidecar.resources | indent 12 }} - volumeMounts: - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end}} - - name: {{ .Chart.Name }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - volumeMounts: - - name: config - mountPath: "/etc/grafana/grafana.ini" - subPath: grafana.ini - - name: ldap - mountPath: "/etc/grafana/ldap.toml" - subPath: ldap.toml -{{- if .Values.dashboards }} - {{- range $provider, $dashboards := .Values.dashboards }} - {{- range $key, $value := $dashboards }} - {{- if hasKey $value "json" }} - - name: dashboards-{{ $provider }} - mountPath: "/var/lib/grafana/dashboards/{{ $provider }}/{{ $key }}.json" - subPath: "{{ $key }}.json" - {{- end }} - {{- end }} - {{- end }} -{{- end -}} -{{- if .Values.dashboardsConfigMaps }} - {{- range keys .Values.dashboardsConfigMaps }} - - name: dashboards-{{ . }} - mountPath: "/var/lib/grafana/dashboards/{{ . }}" - {{- end }} -{{- end }} -{{- if .Values.datasources }} - - name: config - mountPath: "/etc/grafana/provisioning/datasources/datasources.yaml" - subPath: datasources.yaml -{{- end }} -{{- if .Values.dashboardProviders }} - - name: config - mountPath: "/etc/grafana/provisioning/dashboards/dashboardproviders.yaml" - subPath: dashboardproviders.yaml -{{- end }} -{{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - mountPath: {{ .Values.sidecar.dashboards.folder | quote }} - - name: sc-dashboard-provider - mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" - subPath: provider.yaml -{{- end}} -{{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - mountPath: "/etc/grafana/provisioning/datasources" -{{- end}} - - name: storage - mountPath: "/var/lib/grafana" - subPath: {{ .Values.persistence.subPath }} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} - ports: - - name: service - containerPort: {{ .Values.service.port }} - protocol: TCP - - name: grafana - containerPort: 3000 - protocol: TCP - env: - - name: GF_SECURITY_ADMIN_USER - valueFrom: - secretKeyRef: - name: {{ template "grafana.fullname" . }} - key: admin-user - - name: GF_SECURITY_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: {{ template "grafana.fullname" . }} - key: admin-password - {{- if .Values.plugins }} - - name: GF_INSTALL_PLUGINS - valueFrom: - configMapKeyRef: - name: {{ template "grafana.fullname" . }} - key: plugins - {{- end }} - {{- if .Values.smtp.existingSecret }} - - name: GF_SMTP_USER - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: user - - name: GF_SMTP_PASSWORD - valueFrom: - secretKeyRef: - name: {{ .Values.smtp.existingSecret }} - key: password - {{- end }} -{{- range $key, $value := .Values.env }} - - name: "{{ $key }}" - value: "{{ $value }}" -{{- end }} - {{- if .Values.envFromSecret }} - envFrom: - - secretRef: - name: {{ .Values.envFromSecret }} - {{- end }} - livenessProbe: -{{ toYaml .Values.livenessProbe | indent 12 }} - readinessProbe: -{{ toYaml .Values.readinessProbe | indent 12 }} - resources: -{{ toYaml .Values.resources | indent 12 }} - {{- with .Values.nodeSelector }} - nodeSelector: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: -{{ toYaml . | indent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: -{{ toYaml . | indent 8 }} - {{- end }} - volumes: - - name: config - configMap: - name: {{ template "grafana.fullname" . }} - {{- if .Values.dashboards }} - {{- range keys .Values.dashboards }} - - name: dashboards-{{ . }} - configMap: - name: {{ template "grafana.fullname" $ }}-dashboards-{{ . }} - {{- end }} - {{- end }} - {{- if .Values.dashboardsConfigMaps }} - {{- range $provider, $name := .Values.dashboardsConfigMaps }} - - name: dashboards-{{ $provider }} - configMap: - name: {{ $name }} - {{- end }} - {{- end }} - - name: ldap - secret: - {{- if .Values.ldap.existingSecret }} - secretName: {{ .Values.ldap.existingSecret }} - {{- else }} - secretName: {{ template "grafana.fullname" . }} - {{- end }} - items: - - key: ldap-toml - path: ldap.toml - - name: storage - {{- if .Values.persistence.enabled }} - persistentVolumeClaim: - claimName: {{ .Values.persistence.existingClaim | default (include "grafana.fullname" .) }} - {{- else }} - emptyDir: {} - {{- end -}} - {{- if .Values.sidecar.dashboards.enabled }} - - name: sc-dashboard-volume - emptyDir: {} - - name: sc-dashboard-provider - configMap: - name: {{ template "grafana.fullname" . }}-config-dashboards - {{- end }} - {{- if .Values.sidecar.datasources.enabled }} - - name: sc-datasources-volume - emptyDir: {} - {{- end -}} - {{- range .Values.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - defaultMode: {{ .defaultMode }} - {{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/ingress.yaml b/charts/kubecost/charts/grafana/templates/ingress.yaml deleted file mode 100644 index 556f0fab0..000000000 --- a/charts/kubecost/charts/grafana/templates/ingress.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "grafana.fullname" . -}} -{{- $servicePort := .Values.service.port -}} -{{- $ingressPath := .Values.ingress.path -}} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.ingress.labels }} -{{ toYaml .Values.ingress.labels | indent 4 }} -{{- end }} -{{- with .Values.ingress.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -spec: -{{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} -{{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $ingressPath }} - backend: - serviceName: {{ $fullName }} - servicePort: {{ $servicePort }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml b/charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml deleted file mode 100644 index e2b47f42b..000000000 --- a/charts/kubecost/charts/grafana/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.pspEnabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - annotations: - seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default' - apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default' - seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'configMap' - - 'emptyDir' - - 'projected' - - 'secret' - - 'downwardAPI' - - 'persistentVolumeClaim' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'RunAsAny' - fsGroup: - rule: 'RunAsAny' - readOnlyRootFilesystem: false -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/pvc.yaml b/charts/kubecost/charts/grafana/templates/pvc.yaml deleted file mode 100644 index e13c78378..000000000 --- a/charts/kubecost/charts/grafana/templates/pvc.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} - {{- with .Values.persistence.annotations }} - annotations: -{{ toYaml . | indent 4 }} - {{- end }} -spec: - accessModes: - {{- range .Values.persistence.accessModes }} - - {{ . | quote }} - {{- end }} - resources: - requests: - storage: {{ .Values.persistence.size | quote }} - storageClassName: {{ .Values.persistence.storageClassName }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/role.yaml b/charts/kubecost/charts/grafana/templates/role.yaml deleted file mode 100644 index 6c9195769..000000000 --- a/charts/kubecost/charts/grafana/templates/role.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create }} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: Role -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} -{{- if .Values.rbac.pspEnabled }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: [{{ template "grafana.fullname" . }}] -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/rolebinding.yaml b/charts/kubecost/charts/grafana/templates/rolebinding.yaml deleted file mode 100644 index e777ddabc..000000000 --- a/charts/kubecost/charts/grafana/templates/rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: RoleBinding -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "grafana.fullname" . }} -subjects: -- kind: ServiceAccount - name: {{ template "grafana.serviceAccountName" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/secret.yaml b/charts/kubecost/charts/grafana/templates/secret.yaml deleted file mode 100644 index cd16c2fc7..000000000 --- a/charts/kubecost/charts/grafana/templates/secret.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: v1 -kind: Secret -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -type: Opaque -data: - admin-user: {{ .Values.adminUser | b64enc | quote }} - {{- if .Values.adminPassword }} - admin-password: {{ .Values.adminPassword | b64enc | quote }} - {{- else }} - admin-password: {{ randAlphaNum 40 | b64enc | quote }} - {{- end }} - {{- if not .Values.ldap.existingSecret }} - ldap-toml: {{ .Values.ldap.config | b64enc | quote }} - {{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/service.yaml b/charts/kubecost/charts/grafana/templates/service.yaml deleted file mode 100644 index 307d0abf1..000000000 --- a/charts/kubecost/charts/grafana/templates/service.yaml +++ /dev/null @@ -1,51 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ template "grafana.fullname" . }} - labels: - app: {{ template "grafana.name" . }} - chart: {{ template "grafana.chart" . }} - release: {{ .Release.Name }} - heritage: {{ .Release.Service }} -{{- if .Values.service.labels }} -{{ toYaml .Values.service.labels | indent 4 }} -{{- end }} -{{- with .Values.service.annotations }} - annotations: -{{ toYaml . | indent 4 }} -{{- end }} -spec: -{{- if (or (eq .Values.service.type "ClusterIP") (empty .Values.service.type)) }} - type: ClusterIP - {{- if .Values.service.clusterIP }} - clusterIP: {{ .Values.service.clusterIP }} - {{end}} -{{- else if eq .Values.service.type "LoadBalancer" }} - type: {{ .Values.service.type }} - {{- if .Values.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.service.loadBalancerIP }} - {{- end }} - {{- if .Values.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: -{{ toYaml .Values.service.loadBalancerSourceRanges | indent 4 }} - {{- end -}} -{{- else }} - type: {{ .Values.service.type }} -{{- end }} -{{- if .Values.service.externalIPs }} - externalIPs: -{{ toYaml .Values.service.externalIPs | indent 4 }} -{{- end }} - ports: - - name: service - port: {{ .Values.service.port }} - protocol: TCP - targetPort: 3000 -{{ if (and (eq .Values.service.type "NodePort") (not (empty .Values.service.nodePort))) }} - nodePort: {{.Values.service.nodePort}} -{{ end }} - selector: - app: {{ template "grafana.name" . }} - release: {{ .Release.Name }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/templates/serviceaccount.yaml b/charts/kubecost/charts/grafana/templates/serviceaccount.yaml deleted file mode 100644 index bbcb5055e..000000000 --- a/charts/kubecost/charts/grafana/templates/serviceaccount.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{ if .Values.global.grafana.enabled }} -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app: {{ template "grafana.name" . }} - chart: {{ .Chart.Name }}-{{ .Chart.Version }} - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - name: {{ template "grafana.serviceAccountName" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/grafana/values.yaml b/charts/kubecost/charts/grafana/values.yaml deleted file mode 100644 index 504a3e86a..000000000 --- a/charts/kubecost/charts/grafana/values.yaml +++ /dev/null @@ -1,275 +0,0 @@ -rbac: - create: true - pspEnabled: true -serviceAccount: - create: true - name: - -replicas: 1 - -deploymentStrategy: RollingUpdate - -readinessProbe: - httpGet: - path: /api/health - port: 3000 - -livenessProbe: - httpGet: - path: /api/health - port: 3000 - initialDelaySeconds: 60 - timeoutSeconds: 30 - failureThreshold: 10 - -image: - repository: grafana/grafana - tag: 7.1.1 - pullPolicy: IfNotPresent - - ## Optionally specify an array of imagePullSecrets. - ## Secrets must be manually created in the namespace. - ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - ## - # pullSecrets: - # - myRegistrKeySecretName - -securityContext: - runAsUser: 472 - fsGroup: 472 - -downloadDashboardsImage: - repository: appropriate/curl - tag: latest - pullPolicy: IfNotPresent - -## Pod Annotations -# podAnnotations: {} - -## Deployment annotations -# annotations: {} - -## Expose the grafana service to be accessed from outside the cluster (LoadBalancer service). -## or access it from within the cluster (ClusterIP service). Set the service type and the port to serve it. -## ref: http://kubernetes.io/docs/user-guide/services/ -## -service: - type: ClusterIP - port: 80 - annotations: {} - labels: {} - -ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: / - hosts: - - chart-example.local - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -resources: {} -# limits: -# cpu: 100m -# memory: 128Mi -# requests: -# cpu: 100m -# memory: 128Mi - -## Node labels for pod assignment -## ref: https://kubernetes.io/docs/user-guide/node-selection/ -# -nodeSelector: {} - -## Tolerations for pod assignment -## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -## -tolerations: [] - -## Affinity for pod assignment -## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity -## -affinity: {} - -## Enable persistence using Persistent Volume Claims -## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ -## -persistence: - enabled: false - # storageClassName: default - # accessModes: - # - ReadWriteOnce - # size: 10Gi - # annotations: {} - # subPath: "" - # existingClaim: - -adminUser: admin -adminPassword: strongpassword - -## Use an alternate scheduler, e.g. "stork". -## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ -## -# schedulerName: - -## Extra environment variables that will be pass onto deployment pods -env: {} - -## The name of a secret in the same kubernetes namespace which contain values to be added to the environment -## This can be useful for auth tokens, etc -envFromSecret: "" - -## Additional grafana server secret mounts -# Defines additional mounts with secrets. Secrets must be manually created in the namespace. -extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # secretName: grafana-secret-files - # readOnly: true - -## Pass the plugins you want installed as a list. -## -plugins: [] - # - digrich-bubblechart-panel - # - grafana-clock-panel - -## Configure grafana datasources -## ref: http://docs.grafana.org/administration/provisioning/#datasources -## -datasources: {} -# datasources.yaml: -# apiVersion: 1 -# datasources: -# - name: Prometheus2 -# type: prometheus -# url: http://prometheus-server.default.svc -# access: proxy -# isDefault: false - -## Configure grafana dashboard providers -## ref: http://docs.grafana.org/administration/provisioning/#dashboards -## -## `path` must be /var/lib/grafana/dashboards/ -## -dashboardProviders: {} -# dashboardproviders.yaml: -# apiVersion: 1 -# providers: -# - name: 'default' -# orgId: 1 -# folder: '' -# type: file -# disableDeletion: false -# editable: true -# options: -# path: /var/lib/grafana/dashboards/default - -## Configure grafana dashboard to import -## NOTE: To use dashboards you must also enable/configure dashboardProviders -## ref: https://grafana.com/dashboards -## -## dashboards per provider, use provider name as key. -## -dashboards: {} -# default: -# prometheus-stats: -# gnetId: 3662 -# revision: 2 -# datasource: Prometheus - -## Reference to external ConfigMap per provider. Use provider name as key and ConfiMap name as value. -## A provider dashboards must be defined either by external ConfigMaps or in values.yaml, not in both. -## ConfigMap data example: -## -## data: -## example-dashboard.json: | -## RAW_JSON -## -dashboardsConfigMaps: {} -# default: "" - -## Grafana's primary configuration -## NOTE: values in map will be converted to ini format -## ref: http://docs.grafana.org/installation/configuration/ -## -grafana.ini: - paths: - data: /var/lib/grafana/data - logs: /var/log/grafana - plugins: /var/lib/grafana/plugins - provisioning: /etc/grafana/provisioning - analytics: - check_for_updates: true - log: - mode: console - grafana_net: - url: https://grafana.net - auth.anonymous: - enabled: true - org_role: Admin - org_name: Main Org. - -## LDAP Authentication can be enabled with the following values on grafana.ini -## NOTE: Grafana will fail to start if the value for ldap.toml is invalid - # auth.ldap: - # enabled: true - # allow_sign_up: true - # config_file: /etc/grafana/ldap.toml - -## Grafana's LDAP configuration -## Templated by the template in _helpers.tpl -## NOTE: To enable the grafana.ini must be configured with auth.ldap.enabled -## ref: http://docs.grafana.org/installation/configuration/#auth-ldap -## ref: http://docs.grafana.org/installation/ldap/#configuration -ldap: - # `existingSecret` is a reference to an existing secret containing the ldap configuration - # for Grafana in a key `ldap-toml`. - existingSecret: "" - # `config` is the content of `ldap.toml` that will be stored in the created secret - config: "" - # config: |- - # verbose_logging = true - - # [[servers]] - # host = "my-ldap-server" - # port = 636 - # use_ssl = true - # start_tls = false - # ssl_skip_verify = false - # bind_dn = "uid=%s,ou=users,dc=myorg,dc=com" - -## Grafana's SMTP configuration -## NOTE: To enable, grafana.ini must be configured with smtp.enabled -## ref: http://docs.grafana.org/installation/configuration/#smtp -smtp: - # `existingSecret` is a reference to an existing secret containing the smtp configuration - # for Grafana in keys `user` and `password`. - existingSecret: "" - -## Sidecars that collect the configmaps with specified label and stores the included files them into the respective folders -## Requires at least Grafana 5 to work and can't be used together with parameters dashboardProviders, datasources and dashboards -sidecar: - image: kiwigrid/k8s-sidecar:0.1.144 - imagePullPolicy: IfNotPresent - resources: -# limits: -# cpu: 100m -# memory: 100Mi -# requests: -# cpu: 50m -# memory: 50Mi - dashboards: - enabled: false - # label that the configmaps with dashboards are marked with - label: grafana_dashboard - # folder in the pod that should hold the collected dashboards - folder: /tmp/dashboards - datasources: - enabled: false - # label that the configmaps with datasources are marked with - label: grafana_datasource diff --git a/charts/kubecost/charts/prometheus/.helmignore b/charts/kubecost/charts/prometheus/.helmignore deleted file mode 100644 index 825c00779..000000000 --- a/charts/kubecost/charts/prometheus/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj - -OWNERS diff --git a/charts/kubecost/charts/prometheus/Chart.yaml b/charts/kubecost/charts/prometheus/Chart.yaml deleted file mode 100644 index dd81a9c69..000000000 --- a/charts/kubecost/charts/prometheus/Chart.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -appVersion: 2.17.2 -description: Prometheus is a monitoring system and time series database. -home: https://prometheus.io/ -icon: https://raw.githubusercontent.com/prometheus/prometheus.github.io/master/assets/prometheus_logo-cb55bb5c346.png -maintainers: -- email: gianrubio@gmail.com - name: gianrubio -- email: zanhsieh@gmail.com - name: zanhsieh -name: prometheus -sources: -- https://github.com/prometheus/alertmanager -- https://github.com/prometheus/prometheus -- https://github.com/prometheus/pushgateway -- https://github.com/prometheus/node_exporter -- https://github.com/kubernetes/kube-state-metrics -version: 11.0.2 diff --git a/charts/kubecost/charts/prometheus/README.md b/charts/kubecost/charts/prometheus/README.md deleted file mode 100644 index dc32dcd15..000000000 --- a/charts/kubecost/charts/prometheus/README.md +++ /dev/null @@ -1,471 +0,0 @@ -# Prometheus - -[Prometheus](https://prometheus.io/), a [Cloud Native Computing Foundation](https://cncf.io/) project, is a systems and service monitoring system. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts if some condition is observed to be true. - -## TL;DR; - -```console -$ helm install stable/prometheus -``` - -## Introduction - -This chart bootstraps a [Prometheus](https://prometheus.io/) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. - -## Prerequisites - -- Kubernetes 1.3+ with Beta APIs enabled - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```console -$ helm install --name my-release stable/prometheus -``` - -The command deploys Prometheus on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation. - -> **Tip**: List all releases using `helm list` - -## Uninstalling the Chart - -To uninstall/delete the `my-release` deployment: - -```console -$ helm delete my-release -``` - -The command removes all the Kubernetes components associated with the chart and deletes the release. - -## Prometheus 2.x - -Prometheus version 2.x has made changes to alertmanager, storage and recording rules. Check out the migration guide [here](https://prometheus.io/docs/prometheus/2.0/migration/) - -Users of this chart will need to update their alerting rules to the new format before they can upgrade. - -## Upgrading from previous chart versions. - -Version 9.0 adds a new option to enable or disable the Prometheus Server. -This supports the use case of running a Prometheus server in one k8s cluster and scraping exporters in another cluster while using the same chart for each deployment. -To install the server `server.enabled` must be set to `true`. - -As of version 5.0, this chart uses Prometheus 2.x. This version of prometheus introduces a new data format and is not compatible with prometheus 1.x. It is recommended to install this as a new release, as updating existing releases will not work. See the [prometheus docs](https://prometheus.io/docs/prometheus/latest/migration/#storage) for instructions on retaining your old data. - -### Example migration - -Assuming you have an existing release of the prometheus chart, named `prometheus-old`. In order to update to prometheus 2.x while keeping your old data do the following: - -1. Update the `prometheus-old` release. Disable scraping on every component besides the prometheus server, similar to the configuration below: - - ``` - alertmanager: - enabled: false - alertmanagerFiles: - alertmanager.yml: "" - kubeStateMetrics: - enabled: false - nodeExporter: - enabled: false - pushgateway: - enabled: false - server: - extraArgs: - storage.local.retention: 720h - serverFiles: - alerts: "" - prometheus.yml: "" - rules: "" - ``` - -1. Deploy a new release of the chart with version 5.0+ using prometheus 2.x. In the values.yaml set the scrape config as usual, and also add the `prometheus-old` instance as a remote-read target. - - ``` - prometheus.yml: - ... - remote_read: - - url: http://prometheus-old/api/v1/read - ... - ``` - - Old data will be available when you query the new prometheus instance. - -## Scraping Pod Metrics via Annotations - -This chart uses a default configuration that causes prometheus -to scrape a variety of kubernetes resource types, provided they have the correct annotations. -In this section we describe how to configure pods to be scraped; -for information on how other resource types can be scraped you can -do a `helm template` to get the kubernetes resource definitions, -and then reference the prometheus configuration in the ConfigMap against the prometheus documentation -for [relabel_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config) -and [kubernetes_sd_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config). - -In order to get prometheus to scrape pods, you must add annotations to the the pods as below: - -``` -metadata: - annotations: - prometheus.io/scrape: "true" - prometheus.io/path: /metrics - prometheus.io/port: "8080" -spec: -... -``` - -You should adjust `prometheus.io/path` based on the URL that your pod serves metrics from. -`prometheus.io/port` should be set to the port that your pod serves metrics from. -Note that the values for `prometheus.io/scrape` and `prometheus.io/port` must be -enclosed in double quotes. - -## Configuration - -The following table lists the configurable parameters of the Prometheus chart and their default values. - -Parameter | Description | Default ---------- | ----------- | ------- -`alertmanager.enabled` | If true, create alertmanager | `true` -`alertmanager.name` | alertmanager container name | `alertmanager` -`alertmanager.image.repository` | alertmanager container image repository | `prom/alertmanager` -`alertmanager.image.tag` | alertmanager container image tag | `v0.20.0` -`alertmanager.image.pullPolicy` | alertmanager container image pull policy | `IfNotPresent` -`alertmanager.prefixURL` | The prefix slug at which the server can be accessed | `` -`alertmanager.baseURL` | The external url at which the server can be accessed | `"http://localhost:9093"` -`alertmanager.extraArgs` | Additional alertmanager container arguments | `{}` -`alertmanager.extraSecretMounts` | Additional alertmanager Secret mounts | `[]` -`alertmanager.configMapOverrideName` | Prometheus alertmanager ConfigMap override where full-name is `{{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}}` and setting this value will prevent the default alertmanager ConfigMap from being generated | `""` -`alertmanager.configFromSecret` | The name of a secret in the same kubernetes namespace which contains the Alertmanager config, setting this value will prevent the default alertmanager ConfigMap from being generated | `""` -`alertmanager.configFileName` | The configuration file name to be loaded to alertmanager. Must match the key within configuration loaded from ConfigMap/Secret. | `alertmanager.yml` -`alertmanager.ingress.enabled` | If true, alertmanager Ingress will be created | `false` -`alertmanager.ingress.annotations` | alertmanager Ingress annotations | `{}` -`alertmanager.ingress.extraLabels` | alertmanager Ingress additional labels | `{}` -`alertmanager.ingress.hosts` | alertmanager Ingress hostnames | `[]` -`alertmanager.ingress.extraPaths` | Ingress extra paths to prepend to every alertmanager host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions) | `[]` -`alertmanager.ingress.tls` | alertmanager Ingress TLS configuration (YAML) | `[]` -`alertmanager.nodeSelector` | node labels for alertmanager pod assignment | `{}` -`alertmanager.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`alertmanager.affinity` | pod affinity | `{}` -`alertmanager.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`alertmanager.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`alertmanager.schedulerName` | alertmanager alternate scheduler name | `nil` -`alertmanager.persistentVolume.enabled` | If true, alertmanager will create a Persistent Volume Claim | `true` -`alertmanager.persistentVolume.accessModes` | alertmanager data Persistent Volume access modes | `[ReadWriteOnce]` -`alertmanager.persistentVolume.annotations` | Annotations for alertmanager Persistent Volume Claim | `{}` -`alertmanager.persistentVolume.existingClaim` | alertmanager data Persistent Volume existing claim name | `""` -`alertmanager.persistentVolume.mountPath` | alertmanager data Persistent Volume mount root path | `/data` -`alertmanager.persistentVolume.size` | alertmanager data Persistent Volume size | `2Gi` -`alertmanager.persistentVolume.storageClass` | alertmanager data Persistent Volume Storage Class | `unset` -`alertmanager.persistentVolume.volumeBindingMode` | alertmanager data Persistent Volume Binding Mode | `unset` -`alertmanager.persistentVolume.subPath` | Subdirectory of alertmanager data Persistent Volume to mount | `""` -`alertmanager.podAnnotations` | annotations to be added to alertmanager pods | `{}` -`alertmanager.podLabels` | labels to be added to Prometheus AlertManager pods | `{}` -`alertmanager.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`alertmanager.replicaCount` | desired number of alertmanager pods | `1` -`alertmanager.statefulSet.enabled` | If true, use a statefulset instead of a deployment for pod management | `false` -`alertmanager.statefulSet.podManagementPolicy` | podManagementPolicy of alertmanager pods | `OrderedReady` -`alertmanager.statefulSet.headless.annotations` | annotations for alertmanager headless service | `{}` -`alertmanager.statefulSet.headless.labels` | labels for alertmanager headless service | `{}` -`alertmanager.statefulSet.headless.enableMeshPeer` | If true, enable the mesh peer endpoint for the headless service | `{}` -`alertmanager.statefulSet.headless.servicePort` | alertmanager headless service port | `80` -`alertmanager.priorityClassName` | alertmanager priorityClassName | `nil` -`alertmanager.resources` | alertmanager pod resource requests & limits | `{}` -`alertmanager.securityContext` | Custom [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for Alert Manager containers | `{}` -`alertmanager.service.annotations` | annotations for alertmanager service | `{}` -`alertmanager.service.clusterIP` | internal alertmanager cluster service IP | `""` -`alertmanager.service.externalIPs` | alertmanager service external IP addresses | `[]` -`alertmanager.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`alertmanager.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`alertmanager.service.servicePort` | alertmanager service port | `80` -`alertmanager.service.sessionAffinity` | Session Affinity for alertmanager service, can be `None` or `ClientIP` | `None` -`alertmanager.service.type` | type of alertmanager service to create | `ClusterIP` -`alertmanager.strategy` | Deployment strategy | `{ "type": "RollingUpdate" }` -`alertmanagerFiles.alertmanager.yml` | Prometheus alertmanager configuration | example configuration -`configmapReload.prometheus.enabled` | If false, the configmap-reload container for Prometheus will not be deployed | `true` -`configmapReload.prometheus.name` | configmap-reload container name | `configmap-reload` -`configmapReload.prometheus.image.repository` | configmap-reload container image repository | `jimmidyson/configmap-reload` -`configmapReload.prometheus.image.tag` | configmap-reload container image tag | `v0.3.0` -`configmapReload.prometheus.image.pullPolicy` | configmap-reload container image pull policy | `IfNotPresent` -`configmapReload.prometheus.extraArgs` | Additional configmap-reload container arguments | `{}` -`configmapReload.prometheus.extraVolumeDirs` | Additional configmap-reload volume directories | `{}` -`configmapReload.prometheus.extraConfigmapMounts` | Additional configmap-reload configMap mounts | `[]` -`configmapReload.prometheus.resources` | configmap-reload pod resource requests & limits | `{}` -`configmapReload.alertmanager.enabled` | If false, the configmap-reload container for AlertManager will not be deployed | `true` -`configmapReload.alertmanager.name` | configmap-reload container name | `configmap-reload` -`configmapReload.alertmanager.image.repository` | configmap-reload container image repository | `jimmidyson/configmap-reload` -`configmapReload.alertmanager.image.tag` | configmap-reload container image tag | `v0.3.0` -`configmapReload.alertmanager.image.pullPolicy` | configmap-reload container image pull policy | `IfNotPresent` -`configmapReload.alertmanager.extraArgs` | Additional configmap-reload container arguments | `{}` -`configmapReload.alertmanager.extraVolumeDirs` | Additional configmap-reload volume directories | `{}` -`configmapReload.alertmanager.extraConfigmapMounts` | Additional configmap-reload configMap mounts | `[]` -`configmapReload.alertmanager.resources` | configmap-reload pod resource requests & limits | `{}` -`initChownData.enabled` | If false, don't reset data ownership at startup | true -`initChownData.name` | init-chown-data container name | `init-chown-data` -`initChownData.image.repository` | init-chown-data container image repository | `busybox` -`initChownData.image.tag` | init-chown-data container image tag | `latest` -`initChownData.image.pullPolicy` | init-chown-data container image pull policy | `IfNotPresent` -`initChownData.resources` | init-chown-data pod resource requests & limits | `{}` -`kubeStateMetrics.enabled` | If true, create kube-state-metrics sub-chart, see the [kube-state-metrics chart for configuration options](https://github.com/helm/charts/tree/master/stable/kube-state-metrics) | `true` -`nodeExporter.enabled` | If true, create node-exporter | `true` -`nodeExporter.name` | node-exporter container name | `node-exporter` -`nodeExporter.image.repository` | node-exporter container image repository| `prom/node-exporter` -`nodeExporter.image.tag` | node-exporter container image tag | `v0.18.1` -`nodeExporter.image.pullPolicy` | node-exporter container image pull policy | `IfNotPresent` -`nodeExporter.extraArgs` | Additional node-exporter container arguments | `{}` -`nodeExporter.extraHostPathMounts` | Additional node-exporter hostPath mounts | `[]` -`nodeExporter.extraConfigmapMounts` | Additional node-exporter configMap mounts | `[]` -`nodeExporter.hostNetwork` | If true, node-exporter pods share the host network namespace | `true` -`nodeExporter.hostPID` | If true, node-exporter pods share the host PID namespace | `true` -`nodeExporter.nodeSelector` | node labels for node-exporter pod assignment | `{}` -`nodeExporter.podAnnotations` | annotations to be added to node-exporter pods | `{}` -`nodeExporter.pod.labels` | labels to be added to node-exporter pods | `{}` -`nodeExporter.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`nodeExporter.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`nodeExporter.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`nodeExporter.podSecurityPolicy.enabled` | Specify if a Pod Security Policy for node-exporter must be created | `false` -`nodeExporter.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`nodeExporter.priorityClassName` | node-exporter priorityClassName | `nil` -`nodeExporter.resources` | node-exporter resource requests and limits (YAML) | `{}` -`nodeExporter.securityContext` | securityContext for containers in pod | `{}` -`nodeExporter.service.annotations` | annotations for node-exporter service | `{prometheus.io/scrape: "true"}` -`nodeExporter.service.clusterIP` | internal node-exporter cluster service IP | `None` -`nodeExporter.service.externalIPs` | node-exporter service external IP addresses | `[]` -`nodeExporter.service.hostPort` | node-exporter service host port | `9100` -`nodeExporter.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`nodeExporter.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`nodeExporter.service.servicePort` | node-exporter service port | `9100` -`nodeExporter.service.type` | type of node-exporter service to create | `ClusterIP` -`podSecurityPolicy.enabled` | If true, create & use pod security policies resources | `false` -`pushgateway.enabled` | If true, create pushgateway | `true` -`pushgateway.name` | pushgateway container name | `pushgateway` -`pushgateway.image.repository` | pushgateway container image repository | `prom/pushgateway` -`pushgateway.image.tag` | pushgateway container image tag | `v1.0.1` -`pushgateway.image.pullPolicy` | pushgateway container image pull policy | `IfNotPresent` -`pushgateway.extraArgs` | Additional pushgateway container arguments | `{}` -`pushgateway.ingress.enabled` | If true, pushgateway Ingress will be created | `false` -`pushgateway.ingress.annotations` | pushgateway Ingress annotations | `{}` -`pushgateway.ingress.hosts` | pushgateway Ingress hostnames | `[]` -`pushgateway.ingress.extraPaths` | Ingress extra paths to prepend to every pushgateway host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions) | `[]` -`pushgateway.ingress.tls` | pushgateway Ingress TLS configuration (YAML) | `[]` -`pushgateway.nodeSelector` | node labels for pushgateway pod assignment | `{}` -`pushgateway.podAnnotations` | annotations to be added to pushgateway pods | `{}` -`pushgateway.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`pushgateway.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`pushgateway.replicaCount` | desired number of pushgateway pods | `1` -`pushgateway.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`pushgateway.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`pushgateway.schedulerName` | pushgateway alternate scheduler name | `nil` -`pushgateway.persistentVolume.enabled` | If true, Prometheus pushgateway will create a Persistent Volume Claim | `false` -`pushgateway.persistentVolume.accessModes` | Prometheus pushgateway data Persistent Volume access modes | `[ReadWriteOnce]` -`pushgateway.persistentVolume.annotations` | Prometheus pushgateway data Persistent Volume annotations | `{}` -`pushgateway.persistentVolume.existingClaim` | Prometheus pushgateway data Persistent Volume existing claim name | `""` -`pushgateway.persistentVolume.mountPath` | Prometheus pushgateway data Persistent Volume mount root path | `/data` -`pushgateway.persistentVolume.size` | Prometheus pushgateway data Persistent Volume size | `2Gi` -`pushgateway.persistentVolume.storageClass` | Prometheus pushgateway data Persistent Volume Storage Class | `unset` -`pushgateway.persistentVolume.volumeBindingMode` | Prometheus pushgateway data Persistent Volume Binding Mode | `unset` -`pushgateway.persistentVolume.subPath` | Subdirectory of Prometheus server data Persistent Volume to mount | `""` -`pushgateway.priorityClassName` | pushgateway priorityClassName | `nil` -`pushgateway.resources` | pushgateway pod resource requests & limits | `{}` -`pushgateway.service.annotations` | annotations for pushgateway service | `{}` -`pushgateway.service.clusterIP` | internal pushgateway cluster service IP | `""` -`pushgateway.service.externalIPs` | pushgateway service external IP addresses | `[]` -`pushgateway.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`pushgateway.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`pushgateway.service.servicePort` | pushgateway service port | `9091` -`pushgateway.service.type` | type of pushgateway service to create | `ClusterIP` -`pushgateway.strategy` | Deployment strategy | `{ "type": "RollingUpdate" }` -`rbac.create` | If true, create & use RBAC resources | `true` -`server.enabled` | If false, Prometheus server will not be created | `true` -`server.name` | Prometheus server container name | `server` -`server.image.repository` | Prometheus server container image repository | `prom/prometheus` -`server.image.tag` | Prometheus server container image tag | `v2.16.0` -`server.image.pullPolicy` | Prometheus server container image pull policy | `IfNotPresent` -`server.configPath` | Path to a prometheus server config file on the container FS | `/etc/config/prometheus.yml` -`server.global.scrape_interval` | How frequently to scrape targets by default | `1m` -`server.global.scrape_timeout` | How long until a scrape request times out | `10s` -`server.global.evaluation_interval` | How frequently to evaluate rules | `1m` -`server.remoteWrite` | The remote write feature of Prometheus allow transparently sending samples. | `{}` -`server.remoteRead` | The remote read feature of Prometheus allow transparently receiving samples. | `{}` -`server.extraArgs` | Additional Prometheus server container arguments | `{}` -`server.extraFlags` | Additional Prometheus server container flags | `["web.enable-lifecycle"]` -`server.extraInitContainers` | Init containers to launch alongside the server | `[]` -`server.prefixURL` | The prefix slug at which the server can be accessed | `` -`server.baseURL` | The external url at which the server can be accessed | `` -`server.env` | Prometheus server environment variables | `[]` -`server.extraHostPathMounts` | Additional Prometheus server hostPath mounts | `[]` -`server.extraConfigmapMounts` | Additional Prometheus server configMap mounts | `[]` -`server.extraSecretMounts` | Additional Prometheus server Secret mounts | `[]` -`server.extraVolumeMounts` | Additional Prometheus server Volume mounts | `[]` -`server.extraVolumes` | Additional Prometheus server Volumes | `[]` -`server.configMapOverrideName` | Prometheus server ConfigMap override where full-name is `{{.Release.Name}}-{{.Values.server.configMapOverrideName}}` and setting this value will prevent the default server ConfigMap from being generated | `""` -`server.ingress.enabled` | If true, Prometheus server Ingress will be created | `false` -`server.ingress.annotations` | Prometheus server Ingress annotations | `[]` -`server.ingress.extraLabels` | Prometheus server Ingress additional labels | `{}` -`server.ingress.hosts` | Prometheus server Ingress hostnames | `[]` -`server.ingress.extraPaths` | Ingress extra paths to prepend to every Prometheus server host configuration. Useful when configuring [custom actions with AWS ALB Ingress Controller](https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/ingress/annotation/#actions) | `[]` -`server.ingress.tls` | Prometheus server Ingress TLS configuration (YAML) | `[]` -`server.nodeSelector` | node labels for Prometheus server pod assignment | `{}` -`server.tolerations` | node taints to tolerate (requires Kubernetes >=1.6) | `[]` -`server.affinity` | pod affinity | `{}` -`server.podDisruptionBudget.enabled` | If true, create a PodDisruptionBudget | `false` -`server.podDisruptionBudget.maxUnavailable` | Maximum unavailable instances in PDB | `1` -`server.priorityClassName` | Prometheus server priorityClassName | `nil` -`server.schedulerName` | Prometheus server alternate scheduler name | `nil` -`server.persistentVolume.enabled` | If true, Prometheus server will create a Persistent Volume Claim | `true` -`server.persistentVolume.accessModes` | Prometheus server data Persistent Volume access modes | `[ReadWriteOnce]` -`server.persistentVolume.annotations` | Prometheus server data Persistent Volume annotations | `{}` -`server.persistentVolume.existingClaim` | Prometheus server data Persistent Volume existing claim name | `""` -`server.persistentVolume.mountPath` | Prometheus server data Persistent Volume mount root path | `/data` -`server.persistentVolume.size` | Prometheus server data Persistent Volume size | `8Gi` -`server.persistentVolume.storageClass` | Prometheus server data Persistent Volume Storage Class | `unset` -`server.persistentVolume.volumeBindingMode` | Prometheus server data Persistent Volume Binding Mode | `unset` -`server.persistentVolume.subPath` | Subdirectory of Prometheus server data Persistent Volume to mount | `""` -`server.emptyDir.sizeLimit` | emptyDir sizeLimit if a Persistent Volume is not used | `""` -`server.podAnnotations` | annotations to be added to Prometheus server pods | `{}` -`server.podLabels` | labels to be added to Prometheus server pods | `{}` -`server.alertmanagers` | Prometheus AlertManager configuration for the Prometheus server | `{}` -`server.deploymentAnnotations` | annotations to be added to Prometheus server deployment | `{}` -`server.podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | `{}` | -`server.replicaCount` | desired number of Prometheus server pods | `1` -`server.statefulSet.enabled` | If true, use a statefulset instead of a deployment for pod management | `false` -`server.statefulSet.annotations` | annotations to be added to Prometheus server stateful set | `{}` -`server.statefulSet.labels` | labels to be added to Prometheus server stateful set | `{}` -`server.statefulSet.podManagementPolicy` | podManagementPolicy of server pods | `OrderedReady` -`server.statefulSet.headless.annotations` | annotations for Prometheus server headless service | `{}` -`server.statefulSet.headless.labels` | labels for Prometheus server headless service | `{}` -`server.statefulSet.headless.servicePort` | Prometheus server headless service port | `80` -`server.resources` | Prometheus server resource requests and limits | `{}` -`server.verticalAutoscaler.enabled` | If true a VPA object will be created for the controller (either StatefulSet or Deployemnt, based on above configs) | `false` -`server.securityContext` | Custom [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for server containers | `{}` -`server.service.annotations` | annotations for Prometheus server service | `{}` -`server.service.clusterIP` | internal Prometheus server cluster service IP | `""` -`server.service.externalIPs` | Prometheus server service external IP addresses | `[]` -`server.service.loadBalancerIP` | IP address to assign to load balancer (if supported) | `""` -`server.service.loadBalancerSourceRanges` | list of IP CIDRs allowed access to load balancer (if supported) | `[]` -`server.service.nodePort` | Port to be used as the service NodePort (ignored if `server.service.type` is not `NodePort`) | `0` -`server.service.servicePort` | Prometheus server service port | `80` -`server.service.sessionAffinity` | Session Affinity for server service, can be `None` or `ClientIP` | `None` -`server.service.type` | type of Prometheus server service to create | `ClusterIP` -`server.service.gRPC.enabled` | If true, open a second port on the service for gRPC | `false` -`server.service.gRPC.servicePort` | Prometheus service gRPC port, (ignored if `server.service.gRPC.enabled` is not `true`) | `10901` -`server.service.gRPC.nodePort` | Port to be used as gRPC nodePort in the prometheus service | `0` -`server.service.statefulsetReplica.enabled` | If true, send the traffic from the service to only one replica of the replicaset | `false` -`server.service.statefulsetReplica.replica` | Which replica to send the traffice to | `0` -`server.sidecarContainers` | array of snippets with your sidecar containers for prometheus server | `""` -`server.strategy` | Deployment strategy | `{ "type": "RollingUpdate" }` -`serviceAccounts.alertmanager.create` | If true, create the alertmanager service account | `true` -`serviceAccounts.alertmanager.name` | name of the alertmanager service account to use or create | `{{ prometheus.alertmanager.fullname }}` -`serviceAccounts.kubeStateMetrics.create` | If true, create the kubeStateMetrics service account | `true` -`serviceAccounts.kubeStateMetrics.name` | name of the kubeStateMetrics service account to use or create | `{{ prometheus.kubeStateMetrics.fullname }}` -`serviceAccounts.nodeExporter.create` | If true, create the nodeExporter service account | `true` -`serviceAccounts.nodeExporter.name` | name of the nodeExporter service account to use or create | `{{ prometheus.nodeExporter.fullname }}` -`serviceAccounts.pushgateway.create` | If true, create the pushgateway service account | `true` -`serviceAccounts.pushgateway.name` | name of the pushgateway service account to use or create | `{{ prometheus.pushgateway.fullname }}` -`serviceAccounts.server.create` | If true, create the server service account | `true` -`serviceAccounts.server.name` | name of the server service account to use or create | `{{ prometheus.server.fullname }}` -`server.terminationGracePeriodSeconds` | Prometheus server Pod termination grace period | `300` -`server.retention` | (optional) Prometheus data retention | `"15d"` -`serverFiles.alerts` | (Deprecated) Prometheus server alerts configuration | `{}` -`serverFiles.rules` | (Deprecated) Prometheus server rules configuration | `{}` -`serverFiles.alerting_rules.yml` | Prometheus server alerts configuration | `{}` -`serverFiles.recording_rules.yml` | Prometheus server rules configuration | `{}` -`serverFiles.prometheus.yml` | Prometheus server scrape configuration | example configuration -`extraScrapeConfigs` | Prometheus server additional scrape configuration | "" -`alertRelabelConfigs` | Prometheus server [alert relabeling configs](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#alert_relabel_configs) for H/A prometheus | "" -`networkPolicy.enabled` | Enable NetworkPolicy | `false` | - -Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, - -```console -$ helm install stable/prometheus --name my-release \ - --set server.terminationGracePeriodSeconds=360 -``` - -Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, - -```console -$ helm install stable/prometheus --name my-release -f values.yaml -``` - -> **Tip**: You can use the default [values.yaml](values.yaml) - -Note that you have multiple yaml files. This is particularly useful when you have alerts belonging to multiple services in the cluster. For example, - -```yaml -# values.yaml -# ... - -# service1-alert.yaml -serverFiles: - alerts: - service1: - - alert: anAlert - # ... - -# service2-alert.yaml -serverFiles: - alerts: - service2: - - alert: anAlert - # ... -``` - -```console -$ helm install stable/prometheus --name my-release -f values.yaml -f service1-alert.yaml -f service2-alert.yaml -``` - -### RBAC Configuration -Roles and RoleBindings resources will be created automatically for `server` and `kubeStateMetrics` services. - -To manually setup RBAC you need to set the parameter `rbac.create=false` and specify the service account to be used for each service by setting the parameters: `serviceAccounts.{{ component }}.create` to `false` and `serviceAccounts.{{ component }}.name` to the name of a pre-existing service account. - -> **Tip**: You can refer to the default `*-clusterrole.yaml` and `*-clusterrolebinding.yaml` files in [templates](templates/) to customize your own. - -### ConfigMap Files -AlertManager is configured through [alertmanager.yml](https://prometheus.io/docs/alerting/configuration/). This file (and any others listed in `alertmanagerFiles`) will be mounted into the `alertmanager` pod. - -Prometheus is configured through [prometheus.yml](https://prometheus.io/docs/operating/configuration/). This file (and any others listed in `serverFiles`) will be mounted into the `server` pod. - -### Ingress TLS -If your cluster allows automatic creation/retrieval of TLS certificates (e.g. [kube-lego](https://github.com/jetstack/kube-lego)), please refer to the documentation for that mechanism. - -To manually configure TLS, first create/retrieve a key & certificate pair for the address(es) you wish to protect. Then create a TLS secret in the namespace: - -```console -kubectl create secret tls prometheus-server-tls --cert=path/to/tls.cert --key=path/to/tls.key -``` - -Include the secret's name, along with the desired hostnames, in the alertmanager/server Ingress TLS section of your custom `values.yaml` file: - -```yaml -server: - ingress: - ## If true, Prometheus server Ingress will be created - ## - enabled: true - - ## Prometheus server Ingress hostnames - ## Must be provided if Ingress is enabled - ## - hosts: - - prometheus.domain.com - - ## Prometheus server Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: - - secretName: prometheus-server-tls - hosts: - - prometheus.domain.com -``` - -### NetworkPolicy - -Enabling Network Policy for Prometheus will secure connections to Alert Manager -and Kube State Metrics by only accepting connections from Prometheus Server. -All inbound connections to Prometheus Server are still allowed. - -To enable network policy for Prometheus, install a networking plugin that -implements the Kubernetes NetworkPolicy spec, and set `networkPolicy.enabled` to true. - -If NetworkPolicy is enabled for Prometheus' scrape targets, you may also need -to manually create a networkpolicy which allows it. diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore deleted file mode 100644 index f0c131944..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml deleted file mode 100644 index 7752ccb44..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/Chart.yaml +++ /dev/null @@ -1,20 +0,0 @@ -apiVersion: v1 -appVersion: 1.9.5 -description: Install kube-state-metrics to generate and expose cluster-level metrics -home: https://github.com/kubernetes/kube-state-metrics/ -keywords: -- metric -- monitoring -- prometheus -- kubernetes -maintainers: -- email: jose@armesto.net - name: fiunchinho -- email: tariq.ibrahim@mulesoft.com - name: tariq1890 -- email: manuel@rueg.eu - name: mrueg -name: kube-state-metrics -sources: -- https://github.com/kubernetes/kube-state-metrics/ -version: 2.7.2 diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS deleted file mode 100644 index 6ffd97d74..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/OWNERS +++ /dev/null @@ -1,8 +0,0 @@ -approvers: -- fiunchinho -- tariq1890 -- mrueg -reviewers: -- fiunchinho -- tariq1890 -- mrueg diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md deleted file mode 100644 index 5c6456983..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# kube-state-metrics Helm Chart - -* Installs the [kube-state-metrics agent](https://github.com/kubernetes/kube-state-metrics). - -## Installing the Chart - -To install the chart with the release name `my-release`: - -```bash -$ helm install stable/kube-state-metrics -``` - -## Configuration - -| Parameter | Description | Default | -|:---------------------------------------------|:--------------------------------------------------------------------------------------|:-------------------------------------------| -| `image.repository` | The image repository to pull from | quay.io/coreos/kube-state-metrics | -| `image.tag` | The image tag to pull from | `v1.9.5` | -| `image.pullPolicy` | Image pull policy | `IfNotPresent` | -| `replicas` | Number of replicas | `1` | -| `autosharding.enabled` | Set to `true` to automatically shard data across `replicas` pods. EXPERIMENTAL | `false` | -| `service.port` | The port of the container | `8080` | -| `service.annotations` | Annotations to be added to the service | `{}` | -| `customLabels` | Custom labels to apply to service, deployment and pods | `{}` | -| `hostNetwork` | Whether or not to use the host network | `false` | -| `prometheusScrape` | Whether or not enable prom scrape | `true` | -| `rbac.create` | If true, create & use RBAC resources | `true` | -| `serviceAccount.create` | If true, create & use serviceAccount | `true` | -| `serviceAccount.name` | If not set & create is true, use template fullname | | -| `serviceAccount.imagePullSecrets` | Specify image pull secrets field | `[]` | -| `podSecurityPolicy.enabled` | If true, create & use PodSecurityPolicy resources | `false` | -| `podSecurityPolicy.annotations` | Specify pod annotations in the pod security policy | {} | -| `securityContext.enabled` | Enable security context | `true` | -| `securityContext.fsGroup` | Group ID for the container | `65534` | -| `securityContext.runAsUser` | User ID for the container | `65534` | -| `priorityClassName` | Name of Priority Class to assign pods | `nil` | -| `nodeSelector` | Node labels for pod assignment | {} | -| `affinity` | Affinity settings for pod assignment | {} | -| `tolerations` | Tolerations for pod assignment | [] | -| `podAnnotations` | Annotations to be added to the pod | {} | -| `resources` | kube-state-metrics resource requests and limits | {} | -| `collectors.certificatesigningrequests` | Enable the certificatesigningrequests collector. | `true` | -| `collectors.configmaps` | Enable the configmaps collector. | `true` | -| `collectors.cronjobs` | Enable the cronjobs collector. | `true` | -| `collectors.daemonsets` | Enable the daemonsets collector. | `true` | -| `collectors.deployments` | Enable the deployments collector. | `true` | -| `collectors.endpoints` | Enable the endpoints collector. | `true` | -| `collectors.horizontalpodautoscalers` | Enable the horizontalpodautoscalers collector. | `true` | -| `collectors.ingresses` | Enable the ingresses collector. | `true` | -| `collectors.jobs` | Enable the jobs collector. | `true` | -| `collectors.limitranges` | Enable the limitranges collector. | `true` | -| `collectors.mutatingwebhookconfigurations` | Enable the mutatingwebhookconfigurations collector. | `false` | -| `collectors.namespaces` | Enable the namespaces collector. | `true` | -| `collectors.nodes` | Enable the nodes collector. | `true` | -| `collectors.persistentvolumeclaims` | Enable the persistentvolumeclaims collector. | `true` | -| `collectors.persistentvolumes` | Enable the persistentvolumes collector. | `true` | -| `collectors.poddisruptionbudgets` | Enable the poddisruptionbudgets collector. | `true` | -| `collectors.pods` | Enable the pods collector. | `true` | -| `collectors.replicasets` | Enable the replicasets collector. | `true` | -| `collectors.replicationcontrollers` | Enable the replicationcontrollers collector. | `true` | -| `collectors.resourcequotas` | Enable the resourcequotas collector. | `true` | -| `collectors.secrets` | Enable the secrets collector. | `true` | -| `collectors.services` | Enable the services collector. | `true` | -| `collectors.statefulsets` | Enable the statefulsets collector. | `true` | -| `collectors.storageclasses` | Enable the storageclasses collector. | `true` | -| `collectors.validatingwebhookconfigurations` | Enable the validatingwebhookconfigurations collector. | `false` | -| `collectors.verticalpodautoscalers` | Enable the verticalpodautoscalers collector. | `false` | -| `collectors.volumeattachments` | Enable the volumeattachments collector. | `false` | -| `prometheus.monitor.enabled` | Set this to `true` to create ServiceMonitor for Prometheus operator | `false` | -| `prometheus.monitor.additionalLabels` | Additional labels that can be used so ServiceMonitor will be discovered by Prometheus | `{}` | -| `prometheus.monitor.namespace` | Namespace where servicemonitor resource should be created | `the same namespace as kube-state-metrics` | -| `prometheus.monitor.honorLabels` | Honor metric labels | `false` | -| `namespaceOverride` | Override the deployment namespace | `""` (`Release.Namespace`) | diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt deleted file mode 100644 index 5a646e0cc..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/NOTES.txt +++ /dev/null @@ -1,10 +0,0 @@ -kube-state-metrics is a simple service that listens to the Kubernetes API server and generates metrics about the state of the objects. -The exposed metrics can be found here: -https://github.com/kubernetes/kube-state-metrics/blob/master/docs/README.md#exposed-metrics - -The metrics are exported on the HTTP endpoint /metrics on the listening port. -In your case, {{ template "kube-state-metrics.fullname" . }}.{{ template "kube-state-metrics.namespace" . }}.svc.cluster.local:{{ .Values.service.port }}/metrics - -They are served either as plaintext or protobuf depending on the Accept header. -They are designed to be consumed either by Prometheus itself or by a scraper that is compatible with scraping a Prometheus client endpoint. - diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl deleted file mode 100644 index 6ae0e647f..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/_helpers.tpl +++ /dev/null @@ -1,47 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "kube-state-metrics.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "kube-state-metrics.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use -*/}} -{{- define "kube-state-metrics.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "kube-state-metrics.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Allow the release namespace to be overridden for multi-namespace deployments in combined charts -*/}} -{{- define "kube-state-metrics.namespace" -}} - {{- if .Values.namespaceOverride -}} - {{- .Values.namespaceOverride -}} - {{- else -}} - {{- .Release.Namespace -}} - {{- end -}} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml deleted file mode 100644 index 319aec16c..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrole.yaml +++ /dev/null @@ -1,180 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: {{ template "kube-state-metrics.fullname" . }} -rules: -{{ if .Values.collectors.certificatesigningrequests }} -- apiGroups: ["certificates.k8s.io"] - resources: - - certificatesigningrequests - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.configmaps }} -- apiGroups: [""] - resources: - - configmaps - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.cronjobs }} -- apiGroups: ["batch"] - resources: - - cronjobs - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.daemonsets }} -- apiGroups: ["extensions", "apps"] - resources: - - daemonsets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.deployments }} -- apiGroups: ["extensions", "apps"] - resources: - - deployments - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.endpoints }} -- apiGroups: [""] - resources: - - endpoints - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.horizontalpodautoscalers }} -- apiGroups: ["autoscaling"] - resources: - - horizontalpodautoscalers - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.ingresses }} -- apiGroups: ["extensions", "networking.k8s.io"] - resources: - - ingresses - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.jobs }} -- apiGroups: ["batch"] - resources: - - jobs - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.limitranges }} -- apiGroups: [""] - resources: - - limitranges - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.mutatingwebhookconfigurations }} -- apiGroups: ["admissionregistration.k8s.io"] - resources: - - mutatingwebhookconfigurations - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.namespaces }} -- apiGroups: [""] - resources: - - namespaces - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.networkpolicies }} -- apiGroups: ["networking.k8s.io"] - resources: - - networkpolicies - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.nodes }} -- apiGroups: [""] - resources: - - nodes - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.persistentvolumeclaims }} -- apiGroups: [""] - resources: - - persistentvolumeclaims - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.persistentvolumes }} -- apiGroups: [""] - resources: - - persistentvolumes - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.poddisruptionbudgets }} -- apiGroups: ["policy"] - resources: - - poddisruptionbudgets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.pods }} -- apiGroups: [""] - resources: - - pods - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.replicasets }} -- apiGroups: ["extensions", "apps"] - resources: - - replicasets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.replicationcontrollers }} -- apiGroups: [""] - resources: - - replicationcontrollers - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.resourcequotas }} -- apiGroups: [""] - resources: - - resourcequotas - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.secrets }} -- apiGroups: [""] - resources: - - secrets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.services }} -- apiGroups: [""] - resources: - - services - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.statefulsets }} -- apiGroups: ["apps"] - resources: - - statefulsets - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.storageclasses }} -- apiGroups: ["storage.k8s.io"] - resources: - - storageclasses - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.validatingwebhookconfigurations }} -- apiGroups: ["admissionregistration.k8s.io"] - resources: - - validatingwebhookconfigurations - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.volumeattachments }} -- apiGroups: ["storage.k8s.io"] - resources: - - volumeattachments - verbs: ["list", "watch"] -{{ end -}} -{{ if .Values.collectors.verticalpodautoscalers }} -- apiGroups: ["autoscaling.k8s.io"] - resources: - - verticalpodautoscalers - verbs: ["list", "watch"] -{{ end -}} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml deleted file mode 100644 index 4635985aa..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: {{ template "kube-state-metrics.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kube-state-metrics.fullname" . }} -subjects: -- kind: ServiceAccount - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml deleted file mode 100644 index b6affcc20..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/deployment.yaml +++ /dev/null @@ -1,186 +0,0 @@ -apiVersion: apps/v1 -{{- if .Values.autosharding.enabled }} -kind: StatefulSet -{{- else }} -kind: Deployment -{{- end }} -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - app.kubernetes.io/instance: "{{ .Release.Name }}" - app.kubernetes.io/managed-by: "{{ .Release.Service }}" -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels | indent 4 }} -{{- end }} -spec: - selector: - matchLabels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - replicas: {{ .Values.replicas }} -{{- if .Values.autosharding.enabled }} - serviceName: {{ template "kube-state-metrics.fullname" . }} - volumeClaimTemplates: [] -{{- end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - app.kubernetes.io/instance: "{{ .Release.Name }}" -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels | indent 8 }} -{{- end }} -{{- if .Values.podAnnotations }} - annotations: -{{ toYaml .Values.podAnnotations | indent 8 }} -{{- end }} - spec: - hostNetwork: {{ .Values.hostNetwork }} - serviceAccountName: {{ template "kube-state-metrics.serviceAccountName" . }} - {{- if .Values.securityContext.enabled }} - securityContext: - fsGroup: {{ .Values.securityContext.fsGroup }} - runAsUser: {{ .Values.securityContext.runAsUser }} - {{- end }} - {{- if .Values.priorityClassName }} - priorityClassName: {{ .Values.priorityClassName }} - {{- end }} - containers: - - name: {{ .Chart.Name }} -{{- if .Values.autosharding.enabled }} - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace -{{- end }} - args: -{{ if .Values.collectors.certificatesigningrequests }} - - --collectors=certificatesigningrequests -{{ end }} -{{ if .Values.collectors.configmaps }} - - --collectors=configmaps -{{ end }} -{{ if .Values.collectors.cronjobs }} - - --collectors=cronjobs -{{ end }} -{{ if .Values.collectors.daemonsets }} - - --collectors=daemonsets -{{ end }} -{{ if .Values.collectors.deployments }} - - --collectors=deployments -{{ end }} -{{ if .Values.collectors.endpoints }} - - --collectors=endpoints -{{ end }} -{{ if .Values.collectors.horizontalpodautoscalers }} - - --collectors=horizontalpodautoscalers -{{ end }} -{{ if .Values.collectors.ingresses }} - - --collectors=ingresses -{{ end }} -{{ if .Values.collectors.jobs }} - - --collectors=jobs -{{ end }} -{{ if .Values.collectors.limitranges }} - - --collectors=limitranges -{{ end }} -{{ if .Values.collectors.mutatingwebhookconfigurations }} - - --collectors=mutatingwebhookconfigurations -{{ end }} -{{ if .Values.collectors.namespaces }} - - --collectors=namespaces -{{ end }} -{{ if .Values.collectors.networkpolicies }} - - --collectors=networkpolicies -{{ end }} -{{ if .Values.collectors.nodes }} - - --collectors=nodes -{{ end }} -{{ if .Values.collectors.persistentvolumeclaims }} - - --collectors=persistentvolumeclaims -{{ end }} -{{ if .Values.collectors.persistentvolumes }} - - --collectors=persistentvolumes -{{ end }} -{{ if .Values.collectors.poddisruptionbudgets }} - - --collectors=poddisruptionbudgets -{{ end }} -{{ if .Values.collectors.pods }} - - --collectors=pods -{{ end }} -{{ if .Values.collectors.replicasets }} - - --collectors=replicasets -{{ end }} -{{ if .Values.collectors.replicationcontrollers }} - - --collectors=replicationcontrollers -{{ end }} -{{ if .Values.collectors.resourcequotas }} - - --collectors=resourcequotas -{{ end }} -{{ if .Values.collectors.secrets }} - - --collectors=secrets -{{ end }} -{{ if .Values.collectors.services }} - - --collectors=services -{{ end }} -{{ if .Values.collectors.statefulsets }} - - --collectors=statefulsets -{{ end }} -{{ if .Values.collectors.storageclasses }} - - --collectors=storageclasses -{{ end }} -{{ if .Values.collectors.validatingwebhookconfigurations }} - - --collectors=validatingwebhookconfigurations -{{ end }} -{{ if .Values.collectors.verticalpodautoscalers }} - - --collectors=verticalpodautoscalers -{{ end }} -{{ if .Values.collectors.volumeattachments }} - - --collectors=volumeattachments -{{ end }} -{{ if .Values.namespace }} - - --namespace={{ .Values.namespace }} -{{ end }} -{{ if .Values.autosharding.enabled }} - - --pod=$(POD_NAME) - - --pod-namespace=$(POD_NAMESPACE) -{{ end }} - imagePullPolicy: {{ .Values.image.pullPolicy }} - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - ports: - - containerPort: 8080 - livenessProbe: - httpGet: - path: /healthz - port: 8080 - initialDelaySeconds: 5 - timeoutSeconds: 5 - readinessProbe: - httpGet: - path: / - port: 8080 - initialDelaySeconds: 5 - timeoutSeconds: 5 -{{- if .Values.resources }} - resources: -{{ toYaml .Values.resources | indent 10 }} -{{- end }} -{{- if .Values.affinity }} - affinity: -{{ toYaml .Values.affinity | indent 8 }} -{{- end }} -{{- if .Values.nodeSelector }} - nodeSelector: -{{ toYaml .Values.nodeSelector | indent 8 }} -{{- end }} -{{- if .Values.tolerations }} - tolerations: -{{ toYaml .Values.tolerations | indent 8 }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml deleted file mode 100644 index aeff11791..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/podsecuritypolicy.yaml +++ /dev/null @@ -1,39 +0,0 @@ -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: policy/v1beta1 -kind: PodSecurityPolicy -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -{{- if .Values.podSecurityPolicy.annotations }} - annotations: -{{ toYaml .Values.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - volumes: - - 'secret' - hostNetwork: false - hostIPC: false - hostPID: false - runAsUser: - rule: 'MustRunAsNonRoot' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml deleted file mode 100644 index dcd65e13e..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrole.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if and .Values.podSecurityPolicy.enabled -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: psp-{{ template "kube-state-metrics.fullname" . }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "kube-state-metrics.fullname" . }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml deleted file mode 100644 index a206e640d..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/psp-clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and .Values.podSecurityPolicy.enabled -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: psp-{{ template "kube-state-metrics.fullname" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: psp-{{ template "kube-state-metrics.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml deleted file mode 100644 index 5dacf5217..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/service.yaml +++ /dev/null @@ -1,36 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - app.kubernetes.io/instance: "{{ .Release.Name }}" - app.kubernetes.io/managed-by: "{{ .Release.Service }}" -{{- if .Values.customLabels }} -{{ toYaml .Values.customLabels | indent 4 }} -{{- end }} - annotations: - {{- if .Values.prometheusScrape }} - prometheus.io/scrape: '{{ .Values.prometheusScrape }}' - {{- end }} - {{- if .Values.service.annotations }} - {{- toYaml .Values.service.annotations | nindent 4 }} - {{- end }} -spec: - type: "{{ .Values.service.type }}" - ports: - - name: "http" - protocol: TCP - port: {{ .Values.service.port }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - targetPort: 8080 -{{- if .Values.service.loadBalancerIP }} - loadBalancerIP: "{{ .Values.service.loadBalancerIP }}" -{{- end }} - selector: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml deleted file mode 100644 index 32bb1640f..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/serviceaccount.yaml +++ /dev/null @@ -1,14 +0,0 @@ -{{- if .Values.serviceAccount.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -imagePullSecrets: -{{ toYaml .Values.serviceAccount.imagePullSecrets | indent 2 }} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml deleted file mode 100644 index 54cde362d..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/servicemonitor.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.prometheus.monitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" - app.kubernetes.io/instance: "{{ .Release.Name }}" - app.kubernetes.io/managed-by: "{{ .Release.Service }}" - {{- if .Values.prometheus.monitor.additionalLabels }} -{{ toYaml .Values.prometheus.monitor.additionalLabels | indent 4 }} - {{- end }} -spec: - selector: - matchLabels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - endpoints: - - port: http - {{- if .Values.prometheus.monitor.honorLabels }} - honorLabels: true - {{- end }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml deleted file mode 100644 index bf5396072..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-role.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if and .Values.autosharding.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -rules: -- apiGroups: - - "" - resources: - - pods - verbs: - - get -- apiGroups: - - apps - resourceNames: - - kube-state-metrics - resources: - - statefulsets - verbs: - - get -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml deleted file mode 100644 index 6a2e5bfe7..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/templates/stsdiscovery-rolebinding.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if and .Values.autosharding.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} - labels: - app.kubernetes.io/name: {{ template "kube-state-metrics.name" . }} - helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/instance: {{ .Release.Name }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: stsdiscovery-{{ template "kube-state-metrics.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kube-state-metrics.fullname" . }} - namespace: {{ template "kube-state-metrics.namespace" . }} -{{- end }} diff --git a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml b/charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml deleted file mode 100644 index 888ca544b..000000000 --- a/charts/kubecost/charts/prometheus/charts/kube-state-metrics/values.yaml +++ /dev/null @@ -1,126 +0,0 @@ -# Default values for kube-state-metrics. -prometheusScrape: true -image: - repository: quay.io/coreos/kube-state-metrics - tag: v1.9.5 - pullPolicy: IfNotPresent - -# If set to true, this will deploy kube-state-metrics as a StatefulSet and the data -# will be automatically sharded across <.Values.replicas> pods using the built-in -# autodiscovery feature: https://github.com/kubernetes/kube-state-metrics#automated-sharding -# This is an experimental feature and there are no stability guarantees. -autosharding: - enabled: false - -replicas: 1 - -service: - port: 8080 - # Default to clusterIP for backward compatibility - type: ClusterIP - nodePort: 0 - loadBalancerIP: "" - annotations: {} - -customLabels: {} - -hostNetwork: false - -rbac: - # If true, create & use RBAC resources - create: true - -serviceAccount: - # Specifies whether a ServiceAccount should be created, require rbac true - create: true - # The name of the ServiceAccount to use. - # If not set and create is true, a name is generated using the fullname template - name: - # Reference to one or more secrets to be used when pulling images - # ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ - imagePullSecrets: [] - -prometheus: - monitor: - enabled: false - additionalLabels: {} - namespace: "" - honorLabels: false - -## Specify if a Pod Security Policy for kube-state-metrics must be created -## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ -## -podSecurityPolicy: - enabled: false - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - -securityContext: - enabled: true - runAsUser: 65534 - fsGroup: 65534 - -## Node labels for pod assignment -## Ref: https://kubernetes.io/docs/user-guide/node-selection/ -nodeSelector: {} - -## Affinity settings for pod assignment -## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ -affinity: {} - -## Tolerations for pod assignment -## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ -tolerations: [] - -# Annotations to be added to the pod -podAnnotations: {} - -## Assign a PriorityClassName to pods if set -# priorityClassName: "" - -# Available collectors for kube-state-metrics. By default all available -# collectors are enabled. -collectors: - certificatesigningrequests: true - configmaps: true - cronjobs: true - daemonsets: true - deployments: true - endpoints: true - horizontalpodautoscalers: true - ingresses: true - jobs: true - limitranges: true - mutatingwebhookconfigurations: false - namespaces: true - networkpolicies: false - nodes: true - persistentvolumeclaims: true - persistentvolumes: true - poddisruptionbudgets: true - pods: true - replicasets: true - replicationcontrollers: true - resourcequotas: true - secrets: false - services: true - statefulsets: true - storageclasses: true - validatingwebhookconfigurations: false - verticalpodautoscalers: false - volumeattachments: false - -# Namespace to be enabled for collecting resources. By default all namespaces are collected. -# namespace: "" - -## Override the deployment namespace -## -namespaceOverride: "" diff --git a/charts/kubecost/charts/prometheus/requirements.yaml b/charts/kubecost/charts/prometheus/requirements.yaml deleted file mode 100644 index 6e079ae7d..000000000 --- a/charts/kubecost/charts/prometheus/requirements.yaml +++ /dev/null @@ -1,7 +0,0 @@ -dependencies: - - - name: kube-state-metrics - version: "2.7.*" - repository: https://kubernetes-charts.storage.googleapis.com/ - condition: kubeStateMetrics.enabled - diff --git a/charts/kubecost/charts/prometheus/templates/NOTES.txt b/charts/kubecost/charts/prometheus/templates/NOTES.txt deleted file mode 100644 index 0e8868f0b..000000000 --- a/charts/kubecost/charts/prometheus/templates/NOTES.txt +++ /dev/null @@ -1,112 +0,0 @@ -{{- if .Values.server.enabled -}} -The Prometheus server can be accessed via port {{ .Values.server.service.servicePort }} on the following DNS name from within your cluster: -{{ template "prometheus.server.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - -{{ if .Values.server.ingress.enabled -}} -From outside the cluster, the server URL(s) are: -{{- range .Values.server.ingress.hosts }} -http://{{ . }} -{{- end }} -{{- else }} -Get the Prometheus server URL by running these commands in the same shell: -{{- if contains "NodePort" .Values.server.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "prometheus.server.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.server.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "prometheus.server.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "prometheus.server.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.server.service.servicePort }} -{{- else if contains "ClusterIP" .Values.server.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" . }},component={{ .Values.server.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9090 -{{- end }} -{{- end }} - -{{- if .Values.server.persistentVolume.enabled }} -{{- else }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the Server pod is terminated. ##### -################################################################################# -{{- end }} -{{- end }} - -{{ if .Values.alertmanager.enabled }} -The Prometheus alertmanager can be accessed via port {{ .Values.alertmanager.service.servicePort }} on the following DNS name from within your cluster: -{{ template "prometheus.alertmanager.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - -{{ if .Values.alertmanager.ingress.enabled -}} -From outside the cluster, the alertmanager URL(s) are: -{{- range .Values.alertmanager.ingress.hosts }} -http://{{ . }} -{{- end }} -{{- else }} -Get the Alertmanager URL by running these commands in the same shell: -{{- if contains "NodePort" .Values.alertmanager.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "prometheus.alertmanager.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.alertmanager.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "prometheus.alertmanager.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "prometheus.alertmanager.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.alertmanager.service.servicePort }} -{{- else if contains "ClusterIP" .Values.alertmanager.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" . }},component={{ .Values.alertmanager.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9093 -{{- end }} -{{- end }} - -{{- if .Values.alertmanager.persistentVolume.enabled }} -{{- else }} -################################################################################# -###### WARNING: Persistence is disabled!!! You will lose your data when ##### -###### the AlertManager pod is terminated. ##### -################################################################################# -{{- end }} -{{- end }} - -{{- if .Values.nodeExporter.podSecurityPolicy.enabled }} -{{- else }} -################################################################################# -###### WARNING: Pod Security Policy has been moved to a global property. ##### -###### use .Values.podSecurityPolicy.enabled with pod-based ##### -###### annotations ##### -###### (e.g. .Values.nodeExporter.podSecurityPolicy.annotations) ##### -################################################################################# -{{- end }} - -{{ if .Values.pushgateway.enabled }} -The Prometheus PushGateway can be accessed via port {{ .Values.pushgateway.service.servicePort }} on the following DNS name from within your cluster: -{{ template "prometheus.pushgateway.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local - -{{ if .Values.pushgateway.ingress.enabled -}} -From outside the cluster, the pushgateway URL(s) are: -{{- range .Values.pushgateway.ingress.hosts }} -http://{{ . }} -{{- end }} -{{- else }} -Get the PushGateway URL by running these commands in the same shell: -{{- if contains "NodePort" .Values.pushgateway.service.type }} - export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "prometheus.pushgateway.fullname" . }}) - export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") - echo http://$NODE_IP:$NODE_PORT -{{- else if contains "LoadBalancer" .Values.pushgateway.service.type }} - NOTE: It may take a few minutes for the LoadBalancer IP to be available. - You can watch the status of by running 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "prometheus.pushgateway.fullname" . }}' - - export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "prometheus.pushgateway.fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') - echo http://$SERVICE_IP:{{ .Values.pushgateway.service.servicePort }} -{{- else if contains "ClusterIP" .Values.pushgateway.service.type }} - export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "prometheus.name" . }},component={{ .Values.pushgateway.name }}" -o jsonpath="{.items[0].metadata.name}") - kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9091 -{{- end }} -{{- end }} -{{- end }} - -For more information on running Prometheus, visit: -https://prometheus.io/ diff --git a/charts/kubecost/charts/prometheus/templates/_helpers.tpl b/charts/kubecost/charts/prometheus/templates/_helpers.tpl deleted file mode 100644 index 295aa01c5..000000000 --- a/charts/kubecost/charts/prometheus/templates/_helpers.tpl +++ /dev/null @@ -1,276 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "prometheus.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "prometheus.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create unified labels for prometheus components -*/}} -{{- define "prometheus.common.matchLabels" -}} -app: {{ template "prometheus.name" . }} -release: {{ .Release.Name }} -{{- end -}} - -{{- define "prometheus.common.metaLabels" -}} -chart: {{ template "prometheus.chart" . }} -heritage: {{ .Release.Service }} -{{- end -}} - -{{- define "prometheus.alertmanager.labels" -}} -{{ include "prometheus.alertmanager.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.alertmanager.matchLabels" -}} -component: {{ .Values.alertmanager.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.kubeStateMetrics.labels" -}} -{{ include "prometheus.kubeStateMetrics.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.kubeStateMetrics.matchLabels" -}} -component: {{ .Values.kubeStateMetrics.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.nodeExporter.labels" -}} -{{ include "prometheus.nodeExporter.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.nodeExporter.matchLabels" -}} -component: {{ .Values.nodeExporter.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.pushgateway.labels" -}} -{{ include "prometheus.pushgateway.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.pushgateway.matchLabels" -}} -component: {{ .Values.pushgateway.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{- define "prometheus.server.labels" -}} -{{ include "prometheus.server.matchLabels" . }} -{{ include "prometheus.common.metaLabels" . }} -{{- end -}} - -{{- define "prometheus.server.matchLabels" -}} -component: {{ .Values.server.name | quote }} -{{ include "prometheus.common.matchLabels" . }} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified alertmanager name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} - -{{- define "prometheus.alertmanager.fullname" -}} -{{- if .Values.alertmanager.fullnameOverride -}} -{{- .Values.alertmanager.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.alertmanager.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.alertmanager.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified kube-state-metrics name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.kubeStateMetrics.fullname" -}} -{{- if .Values.kubeStateMetrics.fullnameOverride -}} -{{- .Values.kubeStateMetrics.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.kubeStateMetrics.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.kubeStateMetrics.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified node-exporter name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.nodeExporter.fullname" -}} -{{- if .Values.nodeExporter.fullnameOverride -}} -{{- .Values.nodeExporter.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.nodeExporter.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.nodeExporter.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified Prometheus server name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.server.fullname" -}} -{{- if .Values.server.fullnameOverride -}} -{{- .Values.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.server.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.server.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create a fully qualified pushgateway name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -*/}} -{{- define "prometheus.pushgateway.fullname" -}} -{{- if .Values.pushgateway.fullnameOverride -}} -{{- .Values.pushgateway.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- printf "%s-%s" .Release.Name .Values.pushgateway.name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s-%s" .Release.Name $name .Values.pushgateway.name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for deployment. -*/}} -{{- define "prometheus.deployment.apiVersion" -}} -{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "prometheus.daemonset.apiVersion" -}} -{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "prometheus.networkPolicy.apiVersion" -}} -{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} -{{/* -Return the appropriate apiVersion for podsecuritypolicy. -*/}} -{{- define "prometheus.podSecurityPolicy.apiVersion" -}} -{{- if semverCompare ">=1.3-0, <1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "policy/v1beta1" -}} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the alertmanager component -*/}} -{{- define "prometheus.serviceAccountName.alertmanager" -}} -{{- if .Values.serviceAccounts.alertmanager.create -}} - {{ default (include "prometheus.alertmanager.fullname" .) .Values.serviceAccounts.alertmanager.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.alertmanager.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the kubeStateMetrics component -*/}} -{{- define "prometheus.serviceAccountName.kubeStateMetrics" -}} -{{- if .Values.serviceAccounts.kubeStateMetrics.create -}} - {{ default (include "prometheus.kubeStateMetrics.fullname" .) .Values.serviceAccounts.kubeStateMetrics.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.kubeStateMetrics.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the nodeExporter component -*/}} -{{- define "prometheus.serviceAccountName.nodeExporter" -}} -{{- if .Values.serviceAccounts.nodeExporter.create -}} - {{ default (include "prometheus.nodeExporter.fullname" .) .Values.serviceAccounts.nodeExporter.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.nodeExporter.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the pushgateway component -*/}} -{{- define "prometheus.serviceAccountName.pushgateway" -}} -{{- if .Values.serviceAccounts.pushgateway.create -}} - {{ default (include "prometheus.pushgateway.fullname" .) .Values.serviceAccounts.pushgateway.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.pushgateway.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for the server component -*/}} -{{- define "prometheus.serviceAccountName.server" -}} -{{- if .Values.serviceAccounts.server.create -}} - {{ default (include "prometheus.server.fullname" .) .Values.serviceAccounts.server.name }} -{{- else -}} - {{ default "default" .Values.serviceAccounts.server.name }} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml deleted file mode 100644 index 9bec69257..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrole.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -rules: -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: - - extensions - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "prometheus.alertmanager.fullname" . }} -{{- else }} - [] -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml deleted file mode 100644 index a058c7121..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.alertmanager" . }} - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "prometheus.alertmanager.fullname" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml deleted file mode 100644 index 09708915c..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-configmap.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled (and (empty .Values.alertmanager.configMapOverrideName) (empty .Values.alertmanager.configFromSecret)) -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -data: -{{- $root := . -}} -{{- range $key, $value := .Values.alertmanagerFiles }} - {{- if $key | regexMatch ".*\\.ya?ml$" }} - {{ $key }}: | -{{ toYaml $value | default "{}" | indent 4 }} - {{- else }} - {{ $key }}: {{ toYaml $value | indent 4 }} - {{- end }} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml deleted file mode 100644 index 892204ab2..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-deployment.yaml +++ /dev/null @@ -1,141 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled (not .Values.alertmanager.statefulSet.enabled) -}} -apiVersion: {{ template "prometheus.deployment.apiVersion" . }} -kind: Deployment -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - selector: - matchLabels: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} - replicas: {{ .Values.alertmanager.replicaCount }} - {{- if .Values.alertmanager.strategy }} - strategy: -{{ toYaml .Values.alertmanager.strategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.alertmanager.podAnnotations }} - annotations: -{{ toYaml .Values.alertmanager.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 8 }} - {{- if .Values.alertmanager.podLabels}} - {{ toYaml .Values.alertmanager.podLabels | nindent 8 }} - {{- end}} - spec: -{{- if .Values.alertmanager.schedulerName }} - schedulerName: "{{ .Values.alertmanager.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.alertmanager" . }} -{{- if .Values.alertmanager.priorityClassName }} - priorityClassName: "{{ .Values.alertmanager.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }} - image: "{{ .Values.alertmanager.image.repository }}:{{ .Values.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.alertmanager.image.pullPolicy }}" - env: - {{- range $key, $value := .Values.alertmanager.extraEnv }} - - name: {{ $key }} - value: {{ $value }} - {{- end }} - - name: POD_IP - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: status.podIP - args: - - --config.file=/etc/config/{{ .Values.alertmanager.configFileName }} - - --storage.path={{ .Values.alertmanager.persistentVolume.mountPath }} - - --cluster.advertise-address=$(POD_IP):6783 - {{- range $key, $value := .Values.alertmanager.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- if .Values.alertmanager.baseURL }} - - --web.external-url={{ .Values.alertmanager.baseURL }} - {{- end }} - - ports: - - containerPort: 9093 - readinessProbe: - httpGet: - path: {{ .Values.alertmanager.prefixURL }}/-/ready - port: 9093 - initialDelaySeconds: 30 - timeoutSeconds: 30 - resources: -{{ toYaml .Values.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: "{{ .Values.alertmanager.persistentVolume.mountPath }}" - subPath: "{{ .Values.alertmanager.persistentVolume.subPath }}" - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - - {{- if .Values.configmapReload.alertmanager.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }}-{{ .Values.configmapReload.alertmanager.name }} - image: "{{ .Values.configmapReload.alertmanager.image.repository }}:{{ .Values.configmapReload.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.alertmanager.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://127.0.0.1:9093{{ .Values.alertmanager.prefixURL }}/-/reload - resources: -{{ toYaml .Values.configmapReload.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.alertmanager.nodeSelector }} - nodeSelector: -{{ toYaml .Values.alertmanager.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.securityContext }} - securityContext: -{{ toYaml .Values.alertmanager.securityContext | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.tolerations }} - tolerations: -{{ toYaml .Values.alertmanager.tolerations | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.affinity }} - affinity: -{{ toYaml .Values.alertmanager.affinity | indent 8 }} - {{- end }} - volumes: - - name: config-volume - {{- if empty .Values.alertmanager.configFromSecret }} - configMap: - name: {{ if .Values.alertmanager.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.alertmanager.configMapOverrideName }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} - {{- else }} - secret: - secretName: {{ .Values.alertmanager.configFromSecret }} - {{- end }} - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} - - name: storage-volume - {{- if .Values.alertmanager.persistentVolume.enabled }} - persistentVolumeClaim: - claimName: {{ if .Values.alertmanager.persistentVolume.existingClaim }}{{ .Values.alertmanager.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} - {{- else }} - emptyDir: {} - {{- end -}} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml deleted file mode 100644 index dc6ba4418..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-ingress.yaml +++ /dev/null @@ -1,44 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.ingress.enabled -}} -{{- $releaseName := .Release.Name -}} -{{- $serviceName := include "prometheus.alertmanager.fullname" . }} -{{- $servicePort := .Values.alertmanager.service.servicePort -}} -{{- $extraPaths := .Values.alertmanager.ingress.extraPaths -}} -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -apiVersion: networking.k8s.io/v1beta1 -{{ else }} -apiVersion: extensions/v1beta1 -{{ end -}} -kind: Ingress -metadata: -{{- if .Values.alertmanager.ingress.annotations }} - annotations: -{{ toYaml .Values.alertmanager.ingress.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -{{- range $key, $value := .Values.alertmanager.ingress.extraLabels }} - {{ $key }}: {{ $value }} -{{- end }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - rules: - {{- range .Values.alertmanager.ingress.hosts }} - {{- $url := splitList "/" . }} - - host: {{ first $url }} - http: - paths: -{{ if $extraPaths }} -{{ toYaml $extraPaths | indent 10 }} -{{- end }} - - path: /{{ rest $url | join "/" }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} -{{- if .Values.alertmanager.ingress.tls }} - tls: -{{ toYaml .Values.alertmanager.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml deleted file mode 100644 index 62633d0bc..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-networkpolicy.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.networkPolicy.enabled -}} -apiVersion: {{ template "prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ template "prometheus.alertmanager.fullname" . }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} - ingress: - - from: - - podSelector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 12 }} - - ports: - - port: 9093 -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml deleted file mode 100644 index bb190f23d..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-pdb.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.alertmanager.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ template "prometheus.alertmanager.fullname" . }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -spec: - maxUnavailable: {{ .Values.alertmanager.podDisruptionBudget.maxUnavailable }} - selector: - matchLabels: - {{- include "prometheus.alertmanager.labels" . | nindent 6 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml deleted file mode 100644 index da2fbbd1c..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-podsecuritypolicy.yaml +++ /dev/null @@ -1,50 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.alertmanager.fullname" . }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - annotations: -{{- if .Values.alertmanager.podSecurityPolicy.annotations }} -{{ toYaml .Values.alertmanager.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'configMap' - - 'persistentVolumeClaim' - - 'emptyDir' - - 'secret' - allowedHostPaths: - - pathPrefix: /etc - readOnly: true - - pathPrefix: {{ .Values.alertmanager.persistentVolume.mountPath }} - hostNetwork: false - hostPID: false - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: true -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml deleted file mode 100644 index 58de9fd39..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-pvc.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if not .Values.alertmanager.statefulSet.enabled -}} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.persistentVolume.enabled -}} -{{- if not .Values.alertmanager.persistentVolume.existingClaim -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - {{- if .Values.alertmanager.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.alertmanager.persistentVolume.annotations | indent 4 }} - {{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - accessModes: -{{ toYaml .Values.alertmanager.persistentVolume.accessModes | indent 4 }} -{{- if .Values.alertmanager.persistentVolume.storageClass }} -{{- if (eq "-" .Values.alertmanager.persistentVolume.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.alertmanager.persistentVolume.storageClass }}" -{{- end }} -{{- end }} -{{- if .Values.alertmanager.persistentVolume.volumeBindingMode }} - volumeBindingModeName: "{{ .Values.alertmanager.persistentVolume.volumeBindingMode }}" -{{- end }} - resources: - requests: - storage: "{{ .Values.alertmanager.persistentVolume.size }}" -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml deleted file mode 100644 index 1519344ba..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-service-headless.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.statefulSet.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.alertmanager.statefulSet.headless.annotations }} - annotations: -{{ toYaml .Values.alertmanager.statefulSet.headless.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -{{- if .Values.alertmanager.statefulSet.headless.labels }} -{{ toYaml .Values.alertmanager.statefulSet.headless.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.alertmanager.fullname" . }}-headless -spec: - clusterIP: None - ports: - - name: http - port: {{ .Values.alertmanager.statefulSet.headless.servicePort }} - protocol: TCP - targetPort: 9093 -{{- if .Values.alertmanager.statefulSet.headless.enableMeshPeer }} - - name: meshpeer - port: 6783 - protocol: TCP - targetPort: 6783 -{{- end }} - selector: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 4 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml deleted file mode 100644 index 9bc45f7c6..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-service.yaml +++ /dev/null @@ -1,54 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.alertmanager.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.alertmanager.service.annotations }} - annotations: -{{ toYaml .Values.alertmanager.service.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} -{{- if .Values.alertmanager.service.labels }} -{{ toYaml .Values.alertmanager.service.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: -{{- if .Values.alertmanager.service.clusterIP }} - clusterIP: {{ .Values.alertmanager.service.clusterIP }} -{{- end }} -{{- if .Values.alertmanager.service.externalIPs }} - externalIPs: -{{ toYaml .Values.alertmanager.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.alertmanager.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.alertmanager.service.loadBalancerIP }} -{{- end }} -{{- if .Values.alertmanager.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.alertmanager.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.alertmanager.service.servicePort }} - protocol: TCP - targetPort: 9093 - {{- if .Values.alertmanager.service.nodePort }} - nodePort: {{ .Values.alertmanager.service.nodePort }} - {{- end }} -{{- if .Values.alertmanager.service.enableMeshPeer }} - - name: meshpeer - port: 6783 - protocol: TCP - targetPort: 6783 -{{- end }} - selector: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 4 }} -{{- if .Values.alertmanager.service.sessionAffinity }} - sessionAffinity: {{ .Values.alertmanager.service.sessionAffinity }} -{{- end }} - type: "{{ .Values.alertmanager.service.type }}" -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml deleted file mode 100644 index d99c29996..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-serviceaccount.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.serviceAccounts.alertmanager.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.alertmanager" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml b/charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml deleted file mode 100644 index 25a9b7a9c..000000000 --- a/charts/kubecost/charts/prometheus/templates/alertmanager-statefulset.yaml +++ /dev/null @@ -1,154 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.alertmanager.enabled .Values.alertmanager.statefulSet.enabled -}} -apiVersion: apps/v1 -kind: StatefulSet -metadata: - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 4 }} - name: {{ template "prometheus.alertmanager.fullname" . }} -spec: - serviceName: {{ template "prometheus.alertmanager.fullname" . }}-headless - selector: - matchLabels: - {{- include "prometheus.alertmanager.matchLabels" . | nindent 6 }} - replicas: {{ .Values.alertmanager.replicaCount }} - podManagementPolicy: {{ .Values.alertmanager.statefulSet.podManagementPolicy }} - template: - metadata: - {{- if .Values.alertmanager.podAnnotations }} - annotations: -{{ toYaml .Values.alertmanager.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.alertmanager.labels" . | nindent 8 }} - spec: -{{- if .Values.alertmanager.affinity }} - affinity: -{{ toYaml .Values.alertmanager.affinity | indent 8 }} -{{- end }} -{{- if .Values.alertmanager.schedulerName }} - schedulerName: "{{ .Values.alertmanager.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.alertmanager" . }} -{{- if .Values.alertmanager.priorityClassName }} - priorityClassName: "{{ .Values.alertmanager.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }} - image: "{{ .Values.alertmanager.image.repository }}:{{ .Values.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.alertmanager.image.pullPolicy }}" - env: - {{- range $key, $value := .Values.alertmanager.extraEnv }} - - name: {{ $key }} - value: {{ $value }} - {{- end }} - - name: POD_IP - valueFrom: - fieldRef: - apiVersion: v1 - fieldPath: status.podIP - args: - - --config.file=/etc/config/alertmanager.yml - - --storage.path={{ .Values.alertmanager.persistentVolume.mountPath }} - - --cluster.advertise-address=$(POD_IP):6783 - {{- if .Values.alertmanager.statefulSet.headless.enableMeshPeer }} - - --cluster.listen-address=0.0.0.0:6783 - {{- range $n := until (.Values.alertmanager.replicaCount | int) }} - - --cluster.peer={{ template "prometheus.alertmanager.fullname" $ }}-{{ $n }}.{{ template "prometheus.alertmanager.fullname" $ }}-headless:6783 - {{- end }} - {{- end }} - {{- range $key, $value := .Values.alertmanager.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- if .Values.alertmanager.baseURL }} - - --web.external-url={{ .Values.alertmanager.baseURL }} - {{- end }} - - ports: - - containerPort: 9093 - readinessProbe: - httpGet: - path: {{ .Values.alertmanager.prefixURL }}/#/status - port: 9093 - initialDelaySeconds: 30 - timeoutSeconds: 30 - resources: -{{ toYaml .Values.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: "{{ .Values.alertmanager.persistentVolume.mountPath }}" - subPath: "{{ .Values.alertmanager.persistentVolume.subPath }}" - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.configmapReload.alertmanager.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.alertmanager.name }}-{{ .Values.configmapReload.alertmanager.name }} - image: "{{ .Values.configmapReload.alertmanager.image.repository }}:{{ .Values.configmapReload.alertmanager.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.alertmanager.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://localhost:9093{{ .Values.alertmanager.prefixURL }}/-/reload - resources: -{{ toYaml .Values.configmapReload.alertmanager.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.alertmanager.nodeSelector }} - nodeSelector: -{{ toYaml .Values.alertmanager.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.securityContext }} - securityContext: -{{ toYaml .Values.alertmanager.securityContext | indent 8 }} - {{- end }} - {{- if .Values.alertmanager.tolerations }} - tolerations: -{{ toYaml .Values.alertmanager.tolerations | indent 8 }} - {{- end }} - volumes: - - name: config-volume - configMap: - name: {{ if .Values.alertmanager.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.alertmanager.configMapOverrideName }}{{- else }}{{ template "prometheus.alertmanager.fullname" . }}{{- end }} - {{- range .Values.alertmanager.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} -{{- if .Values.alertmanager.persistentVolume.enabled }} - volumeClaimTemplates: - - metadata: - name: storage-volume - {{- if .Values.alertmanager.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.alertmanager.persistentVolume.annotations | indent 10 }} - {{- end }} - spec: - accessModes: -{{ toYaml .Values.alertmanager.persistentVolume.accessModes | indent 10 }} - resources: - requests: - storage: "{{ .Values.alertmanager.persistentVolume.size }}" - {{- if .Values.server.persistentVolume.storageClass }} - {{- if (eq "-" .Values.server.persistentVolume.storageClass) }} - storageClassName: "" - {{- else }} - storageClassName: "{{ .Values.alertmanager.persistentVolume.storageClass }}" - {{- end }} - {{- end }} -{{- else }} - - name: storage-volume - emptyDir: {} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml deleted file mode 100644 index fce0f2714..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-daemonset.yaml +++ /dev/null @@ -1,125 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.nodeExporter.enabled -}} -apiVersion: {{ template "prometheus.daemonset.apiVersion" . }} -kind: DaemonSet -metadata: -{{- if .Values.nodeExporter.deploymentAnnotations }} - annotations: -{{ toYaml .Values.nodeExporter.deploymentAnnotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - name: {{ template "prometheus.nodeExporter.fullname" . }} -spec: - selector: - matchLabels: - {{- include "prometheus.nodeExporter.matchLabels" . | nindent 6 }} - {{- if .Values.nodeExporter.updateStrategy }} - updateStrategy: -{{ toYaml .Values.nodeExporter.updateStrategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.nodeExporter.podAnnotations }} - annotations: -{{ toYaml .Values.nodeExporter.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 8 }} -{{- if .Values.nodeExporter.pod.labels }} -{{ toYaml .Values.nodeExporter.pod.labels | indent 8 }} -{{- end }} - spec: - serviceAccountName: {{ template "prometheus.serviceAccountName.nodeExporter" . }} -{{- if .Values.nodeExporter.priorityClassName }} - priorityClassName: "{{ .Values.nodeExporter.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.nodeExporter.name }} - image: "{{ .Values.nodeExporter.image.repository }}:{{ .Values.nodeExporter.image.tag }}" - imagePullPolicy: "{{ .Values.nodeExporter.image.pullPolicy }}" - args: - - --path.procfs=/host/proc - - --path.sysfs=/host/sys - {{- if .Values.nodeExporter.hostNetwork }} - - --web.listen-address=:{{ .Values.nodeExporter.service.hostPort }} - {{- end }} - {{- range $key, $value := .Values.nodeExporter.extraArgs }} - {{- if $value }} - - --{{ $key }}={{ $value }} - {{- else }} - - --{{ $key }} - {{- end }} - {{- end }} - ports: - - name: metrics - {{- if .Values.nodeExporter.hostNetwork }} - containerPort: {{ .Values.nodeExporter.service.hostPort }} - {{- else }} - containerPort: 9100 - {{- end }} - hostPort: {{ .Values.nodeExporter.service.hostPort }} - resources: -{{ toYaml .Values.nodeExporter.resources | indent 12 }} - volumeMounts: - - name: proc - mountPath: /host/proc - readOnly: true - - name: sys - mountPath: /host/sys - readOnly: true - {{- range .Values.nodeExporter.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- if .mountPropagation }} - mountPropagation: {{ .mountPropagation }} - {{- end }} - {{- end }} - {{- range .Values.nodeExporter.extraConfigmapMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.nodeExporter.hostNetwork }} - hostNetwork: true - {{- end }} - {{- if .Values.nodeExporter.hostPID }} - hostPID: true - {{- end }} - {{- if .Values.nodeExporter.tolerations }} - tolerations: -{{ toYaml .Values.nodeExporter.tolerations | indent 8 }} - {{- end }} - {{- if .Values.nodeExporter.nodeSelector }} - nodeSelector: -{{ toYaml .Values.nodeExporter.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.nodeExporter.securityContext }} - securityContext: -{{ toYaml .Values.nodeExporter.securityContext | indent 8 }} - {{- end }} - volumes: - - name: proc - hostPath: - path: /proc - - name: sys - hostPath: - path: /sys - {{- range .Values.nodeExporter.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- range .Values.nodeExporter.extraConfigmapMounts }} - - name: {{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml deleted file mode 100644 index 243667dd1..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-podsecuritypolicy.yaml +++ /dev/null @@ -1,57 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.nodeExporter.fullname" . }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - annotations: -{{- if .Values.nodeExporter.podSecurityPolicy.annotations }} -{{ toYaml .Values.nodeExporter.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'configMap' - - 'hostPath' - - 'secret' - allowedHostPaths: - - pathPrefix: /proc - readOnly: true - - pathPrefix: /sys - readOnly: true - {{- range .Values.nodeExporter.extraHostPathMounts }} - - pathPrefix: {{ .hostPath }} - readOnly: {{ .readOnly }} - {{- end }} - hostNetwork: {{ .Values.nodeExporter.hostNetwork }} - hostPID: {{ .Values.nodeExporter.hostPID }} - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false - hostPorts: - - min: 1 - max: 65535 -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml deleted file mode 100644 index 1926db04e..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-role.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.rbac.create }} -{{- if or (default .Values.nodeExporter.podSecurityPolicy.enabled false) (.Values.podSecurityPolicy.enabled) }} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: Role -metadata: - name: {{ template "prometheus.nodeExporter.fullname" . }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - namespace: {{ .Release.Namespace }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - {{ template "prometheus.nodeExporter.fullname" . }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml deleted file mode 100644 index fb39ab64f..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-rolebinding.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "prometheus.nodeExporter.fullname" . }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - namespace: {{ .Release.Namespace }} -roleRef: - kind: Role - name: {{ template "prometheus.nodeExporter.fullname" . }} - apiGroup: rbac.authorization.k8s.io -subjects: -- kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.nodeExporter" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml deleted file mode 100644 index 40cbd8d69..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-service.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.nodeExporter.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.nodeExporter.service.annotations }} - annotations: -{{ toYaml .Values.nodeExporter.service.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} -{{- if .Values.nodeExporter.service.labels }} -{{ toYaml .Values.nodeExporter.service.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.nodeExporter.fullname" . }} -spec: -{{- if .Values.nodeExporter.service.clusterIP }} - clusterIP: {{ .Values.nodeExporter.service.clusterIP }} -{{- end }} -{{- if .Values.nodeExporter.service.externalIPs }} - externalIPs: -{{ toYaml .Values.nodeExporter.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.nodeExporter.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.nodeExporter.service.loadBalancerIP }} -{{- end }} -{{- if .Values.nodeExporter.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.nodeExporter.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: metrics - port: {{ .Values.nodeExporter.service.servicePort }} - protocol: TCP - {{- if .Values.nodeExporter.hostNetwork }} - targetPort: {{ .Values.nodeExporter.service.hostPort }} - {{- else }} - targetPort: 9100 - {{- end }} - selector: - {{- include "prometheus.nodeExporter.matchLabels" . | nindent 4 }} - type: "{{ .Values.nodeExporter.service.type }}" -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml deleted file mode 100644 index b75c4a4b6..000000000 --- a/charts/kubecost/charts/prometheus/templates/node-exporter-serviceaccount.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.nodeExporter.enabled .Values.serviceAccounts.nodeExporter.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.nodeExporter.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.nodeExporter" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml deleted file mode 100644 index 9ea81e4a2..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrole.yaml +++ /dev/null @@ -1,23 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -rules: -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: - - extensions - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "prometheus.pushgateway.fullname" . }} -{{- else }} - [] -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml deleted file mode 100644 index 475d9d63d..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.pushgateway" . }} - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "prometheus.pushgateway.fullname" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml deleted file mode 100644 index 9dec641fc..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-deployment.yaml +++ /dev/null @@ -1,99 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.enabled -}} -apiVersion: {{ template "prometheus.deployment.apiVersion" . }} -kind: Deployment -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: - selector: - {{- if .Values.schedulerName }} - schedulerName: "{{ .Values.schedulerName }}" - {{- end }} - matchLabels: - {{- include "prometheus.pushgateway.matchLabels" . | nindent 6 }} - replicas: {{ .Values.pushgateway.replicaCount }} - {{- if .Values.pushgateway.strategy }} - strategy: -{{ toYaml .Values.pushgateway.strategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.pushgateway.podAnnotations }} - annotations: -{{ toYaml .Values.pushgateway.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 8 }} - spec: - serviceAccountName: {{ template "prometheus.serviceAccountName.pushgateway" . }} -{{- if .Values.pushgateway.priorityClassName }} - priorityClassName: "{{ .Values.pushgateway.priorityClassName }}" -{{- end }} - containers: - - name: {{ template "prometheus.name" . }}-{{ .Values.pushgateway.name }} - image: "{{ .Values.pushgateway.image.repository }}:{{ .Values.pushgateway.image.tag }}" - imagePullPolicy: "{{ .Values.pushgateway.image.pullPolicy }}" - args: - {{- range $key, $value := .Values.pushgateway.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - ports: - - containerPort: 9091 - livenessProbe: - httpGet: - {{- if (index .Values "pushgateway" "extraArgs" "web.route-prefix") }} - path: /{{ index .Values "pushgateway" "extraArgs" "web.route-prefix" }}/-/healthy - {{- else }} - path: /-/healthy - {{- end }} - port: 9091 - initialDelaySeconds: 10 - timeoutSeconds: 10 - readinessProbe: - httpGet: - {{- if (index .Values "pushgateway" "extraArgs" "web.route-prefix") }} - path: /{{ index .Values "pushgateway" "extraArgs" "web.route-prefix" }}/-/ready - {{- else }} - path: /-/ready - {{- end }} - port: 9091 - initialDelaySeconds: 10 - timeoutSeconds: 10 - resources: -{{ toYaml .Values.pushgateway.resources | indent 12 }} - {{- if .Values.pushgateway.persistentVolume.enabled }} - volumeMounts: - - name: storage-volume - mountPath: "{{ .Values.pushgateway.persistentVolume.mountPath }}" - subPath: "{{ .Values.pushgateway.persistentVolume.subPath }}" - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.pushgateway.nodeSelector }} - nodeSelector: -{{ toYaml .Values.pushgateway.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.securityContext }} - securityContext: -{{ toYaml .Values.pushgateway.securityContext | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.tolerations }} - tolerations: -{{ toYaml .Values.pushgateway.tolerations | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.affinity }} - affinity: -{{ toYaml .Values.pushgateway.affinity | indent 8 }} - {{- end }} - {{- if .Values.pushgateway.persistentVolume.enabled }} - volumes: - - name: storage-volume - persistentVolumeClaim: - claimName: {{ if .Values.pushgateway.persistentVolume.existingClaim }}{{ .Values.pushgateway.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.pushgateway.fullname" . }}{{- end }} - {{- end -}} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml deleted file mode 100644 index 422129b6f..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-ingress.yaml +++ /dev/null @@ -1,41 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.pushgateway.ingress.enabled -}} -{{- $releaseName := .Release.Name -}} -{{- $serviceName := include "prometheus.pushgateway.fullname" . }} -{{- $servicePort := .Values.pushgateway.service.servicePort -}} -{{- $extraPaths := .Values.pushgateway.ingress.extraPaths -}} -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -apiVersion: networking.k8s.io/v1beta1 -{{ else }} -apiVersion: extensions/v1beta1 -{{ end -}} -kind: Ingress -metadata: -{{- if .Values.pushgateway.ingress.annotations }} - annotations: -{{ toYaml .Values.pushgateway.ingress.annotations | indent 4}} -{{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: - rules: - {{- range .Values.pushgateway.ingress.hosts }} - {{- $url := splitList "/" . }} - - host: {{ first $url }} - http: - paths: -{{ if $extraPaths }} -{{ toYaml $extraPaths | indent 10 }} -{{- end }} - - path: /{{ rest $url | join "/" }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} -{{- if .Values.pushgateway.ingress.tls }} - tls: -{{ toYaml .Values.pushgateway.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml deleted file mode 100644 index 70a5ada3b..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-networkpolicy.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.networkPolicy.enabled -}} -apiVersion: {{ template "prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ template "prometheus.pushgateway.fullname" . }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "prometheus.pushgateway.matchLabels" . | nindent 6 }} - ingress: - - from: - - podSelector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 12 }} - - ports: - - port: 9091 -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml deleted file mode 100644 index edf2318fe..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-pdb.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ template "prometheus.pushgateway.fullname" . }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} -spec: - maxUnavailable: {{ .Values.pushgateway.podDisruptionBudget.maxUnavailable }} - selector: - matchLabels: - {{- include "prometheus.pushgateway.labels" . | nindent 6 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml deleted file mode 100644 index 80617cbc7..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-podsecuritypolicy.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.pushgateway.fullname" . }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - annotations: -{{- if .Values.pushgateway.podSecurityPolicy.annotations }} -{{ toYaml .Values.pushgateway.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - requiredDropCapabilities: - - ALL - volumes: - - 'persistentVolumeClaim' - - 'secret' - allowedHostPaths: - - pathPrefix: {{ .Values.pushgateway.persistentVolume.mountPath }} - hostNetwork: false - hostPID: false - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: true -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml deleted file mode 100644 index 5b4eeb937..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-pvc.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.persistentVolume.enabled -}} -{{- if not .Values.pushgateway.persistentVolume.existingClaim -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - {{- if .Values.pushgateway.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.pushgateway.persistentVolume.annotations | indent 4 }} - {{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: - accessModes: -{{ toYaml .Values.pushgateway.persistentVolume.accessModes | indent 4 }} -{{- if .Values.pushgateway.persistentVolume.storageClass }} -{{- if (eq "-" .Values.pushgateway.persistentVolume.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.pushgateway.persistentVolume.storageClass }}" -{{- end }} -{{- end }} -{{- if .Values.pushgateway.persistentVolume.volumeBindingMode }} - volumeBindingModeName: "{{ .Values.pushgateway.persistentVolume.volumeBindingMode }}" -{{- end }} - resources: - requests: - storage: "{{ .Values.pushgateway.persistentVolume.size }}" -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml deleted file mode 100644 index ffcc4a20b..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-service.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.pushgateway.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.pushgateway.service.annotations }} - annotations: -{{ toYaml .Values.pushgateway.service.annotations | indent 4}} -{{- end }} - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} -{{- if .Values.pushgateway.service.labels }} -{{ toYaml .Values.pushgateway.service.labels | indent 4}} -{{- end }} - name: {{ template "prometheus.pushgateway.fullname" . }} -spec: -{{- if .Values.pushgateway.service.clusterIP }} - clusterIP: {{ .Values.pushgateway.service.clusterIP }} -{{- end }} -{{- if .Values.pushgateway.service.externalIPs }} - externalIPs: -{{ toYaml .Values.pushgateway.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.pushgateway.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.pushgateway.service.loadBalancerIP }} -{{- end }} -{{- if .Values.pushgateway.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.pushgateway.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.pushgateway.service.servicePort }} - protocol: TCP - targetPort: 9091 - selector: - {{- include "prometheus.pushgateway.matchLabels" . | nindent 4 }} - type: "{{ .Values.pushgateway.service.type }}" -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml deleted file mode 100644 index 3b221e43d..000000000 --- a/charts/kubecost/charts/prometheus/templates/pushgateway-serviceaccount.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.pushgateway.enabled .Values.serviceAccounts.pushgateway.create -}} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.pushgateway.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.pushgateway" . }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml b/charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml deleted file mode 100644 index 410685193..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-clusterrole.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.server.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRole -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -rules: -{{- if .Values.podSecurityPolicy.enabled }} - - apiGroups: - - extensions - resources: - - podsecuritypolicies - verbs: - - use - resourceNames: - - {{ template "prometheus.server.fullname" . }} -{{- end }} - - apiGroups: - - "" - resources: - - nodes - - nodes/proxy - - nodes/metrics - - services - - endpoints - - pods - - ingresses - - configmaps - verbs: - - get - - list - - watch - - apiGroups: - - "extensions" - resources: - - ingresses/status - - ingresses - verbs: - - get - - list - - watch - - nonResourceURLs: - - "/metrics" - verbs: - - get -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml b/charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml deleted file mode 100644 index a89f3bd76..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-clusterrolebinding.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if and .Values.server.enabled .Values.rbac.create -}} -apiVersion: rbac.authorization.k8s.io/v1beta1 -kind: ClusterRoleBinding -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "prometheus.serviceAccountName.server" . }} - namespace: {{ .Release.Namespace }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "prometheus.server.fullname" . }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-configmap.yaml b/charts/kubecost/charts/prometheus/templates/server-configmap.yaml deleted file mode 100644 index 52a5d5e53..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-configmap.yaml +++ /dev/null @@ -1,83 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if (empty .Values.server.configMapOverrideName) -}} -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -data: -{{- $root := . -}} -{{- range $key, $value := .Values.serverFiles }} - {{ $key }}: | -{{- if eq $key "prometheus.yml" }} - global: -{{ $root.Values.server.global | toYaml | trimSuffix "\n" | indent 6 }} -{{- if $root.Values.server.remoteWrite }} - remote_write: -{{ $root.Values.server.remoteWrite | toYaml | indent 4 }} -{{- end }} -{{- if $root.Values.server.remoteRead }} - remote_read: -{{ $root.Values.server.remoteRead | toYaml | indent 4 }} -{{- end }} -{{- end }} -{{- if eq $key "alerts" }} -{{- if and (not (empty $value)) (empty $value.groups) }} - groups: -{{- range $ruleKey, $ruleValue := $value }} - - name: {{ $ruleKey -}}.rules - rules: -{{ $ruleValue | toYaml | trimSuffix "\n" | indent 6 }} -{{- end }} -{{- else }} -{{ toYaml $value | indent 4 }} -{{- end }} -{{- else }} -{{ toYaml $value | default "{}" | indent 4 }} -{{- end }} -{{- if eq $key "prometheus.yml" -}} -{{- if $root.Values.extraScrapeConfigs }} -{{ tpl $root.Values.extraScrapeConfigs $root | indent 4 }} -{{- end -}} -{{- if or ($root.Values.alertmanager.enabled) ($root.Values.server.alertmanagers) }} - alerting: -{{- if $root.Values.alertRelabelConfigs }} -{{ $root.Values.alertRelabelConfigs | toYaml | trimSuffix "\n" | indent 6 }} -{{- end }} - alertmanagers: -{{- if $root.Values.server.alertmanagers }} -{{ toYaml $root.Values.server.alertmanagers | indent 8 }} -{{- else }} - - kubernetes_sd_configs: - - role: pod - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - {{- if $root.Values.alertmanager.prefixURL }} - path_prefix: {{ $root.Values.alertmanager.prefixURL }} - {{- end }} - relabel_configs: - - source_labels: [__meta_kubernetes_namespace] - regex: {{ $root.Release.Namespace }} - action: keep - - source_labels: [__meta_kubernetes_pod_label_app] - regex: {{ template "prometheus.name" $root }} - action: keep - - source_labels: [__meta_kubernetes_pod_label_component] - regex: alertmanager - action: keep - - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_probe] - regex: {{ index $root.Values.alertmanager.podAnnotations "prometheus.io/probe" | default ".*" }} - action: keep - - source_labels: [__meta_kubernetes_pod_container_port_number] - regex: - action: drop -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-deployment.yaml b/charts/kubecost/charts/prometheus/templates/server-deployment.yaml deleted file mode 100644 index 4a1c14f08..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-deployment.yaml +++ /dev/null @@ -1,216 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if not .Values.server.statefulSet.enabled -}} -apiVersion: {{ template "prometheus.deployment.apiVersion" . }} -kind: Deployment -metadata: -{{- if .Values.server.deploymentAnnotations }} - annotations: -{{ toYaml .Values.server.deploymentAnnotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -spec: - selector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 6 }} - replicas: {{ .Values.server.replicaCount }} - {{- if .Values.server.strategy }} - strategy: -{{ toYaml .Values.server.strategy | indent 4 }} - {{- end }} - template: - metadata: - {{- if .Values.server.podAnnotations }} - annotations: -{{ toYaml .Values.server.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 8 }} - {{- if .Values.server.podLabels}} - {{ toYaml .Values.server.podLabels | nindent 8 }} - {{- end}} - spec: -{{- if .Values.server.priorityClassName }} - priorityClassName: "{{ .Values.server.priorityClassName }}" -{{- end }} -{{- if .Values.server.schedulerName }} - schedulerName: "{{ .Values.server.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.server" . }} - {{- if .Values.server.extraInitContainers }} - initContainers: -{{ toYaml .Values.server.extraInitContainers | indent 8 }} - {{- end }} - containers: - {{- if .Values.configmapReload.prometheus.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }}-{{ .Values.configmapReload.prometheus.name }} - image: "{{ .Values.configmapReload.prometheus.image.repository }}:{{ .Values.configmapReload.prometheus.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.prometheus.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://127.0.0.1:9090{{ .Values.server.prefixURL }}/-/reload - {{- range $key, $value := .Values.configmapReload.prometheus.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraVolumeDirs }} - - --volume-dir={{ . }} - {{- end }} - resources: -{{ toYaml .Values.configmapReload.prometheus.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- end }} - - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }} - image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - {{- if .Values.server.env }} - env: -{{ toYaml .Values.server.env | indent 12}} - {{- end }} - args: - {{- if .Values.server.retention }} - - --storage.tsdb.retention.time={{ .Values.server.retention }} - {{- end }} - - --config.file={{ .Values.server.configPath }} - - --storage.tsdb.path={{ .Values.server.persistentVolume.mountPath }} - - --web.console.libraries=/etc/prometheus/console_libraries - - --web.console.templates=/etc/prometheus/consoles - {{- range .Values.server.extraFlags }} - - --{{ . }} - {{- end }} - {{- if .Values.server.baseURL }} - - --web.external-url={{ .Values.server.baseURL }} - {{- end }} - - {{- range $key, $value := .Values.server.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - ports: - - containerPort: 9090 - readinessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/ready - port: 9090 - initialDelaySeconds: {{ .Values.server.readinessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.readinessProbeTimeout }} - failureThreshold: {{ .Values.server.readinessProbeFailureThreshold }} - successThreshold: {{ .Values.server.readinessProbeSuccessThreshold }} - livenessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/healthy - port: 9090 - initialDelaySeconds: {{ .Values.server.livenessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.livenessProbeTimeout }} - failureThreshold: {{ .Values.server.livenessProbeFailureThreshold }} - successThreshold: {{ .Values.server.livenessProbeSuccessThreshold }} - resources: -{{ toYaml .Values.server.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: "{{ .Values.server.persistentVolume.subPath }}" - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.server.extraVolumeMounts }} - {{ toYaml .Values.server.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- if .Values.server.sidecarContainers }} - {{- toYaml .Values.server.sidecarContainers | nindent 8 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.server.nodeSelector }} - nodeSelector: -{{ toYaml .Values.server.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.server.securityContext }} - securityContext: -{{ toYaml .Values.server.securityContext | indent 8 }} - {{- end }} - {{- if .Values.server.tolerations }} - tolerations: -{{ toYaml .Values.server.tolerations | indent 8 }} - {{- end }} - {{- if .Values.server.affinity }} - affinity: -{{ toYaml .Values.server.affinity | indent 8 }} - {{- end }} - terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} - volumes: - - name: config-volume - configMap: - name: {{ if .Values.server.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.server.configMapOverrideName }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} - - name: storage-volume - {{- if .Values.server.persistentVolume.enabled }} - persistentVolumeClaim: - claimName: {{ if .Values.server.persistentVolume.existingClaim }}{{ .Values.server.persistentVolume.existingClaim }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} - {{- else }} - emptyDir: - {{- if .Values.server.emptyDir.sizeLimit }} - sizeLimit: {{ .Values.server.emptyDir.sizeLimit }} - {{- else }} - {} - {{- end -}} - {{- end -}} -{{- if .Values.server.extraVolumes }} -{{ toYaml .Values.server.extraVolumes | indent 8}} -{{- end }} - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-ingress.yaml b/charts/kubecost/charts/prometheus/templates/server-ingress.yaml deleted file mode 100644 index 4cdca92a3..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-ingress.yaml +++ /dev/null @@ -1,46 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.ingress.enabled -}} -{{- $releaseName := .Release.Name -}} -{{- $serviceName := include "prometheus.server.fullname" . }} -{{- $servicePort := .Values.server.service.servicePort -}} -{{- $extraPaths := .Values.server.ingress.extraPaths -}} -{{- if .Capabilities.APIVersions.Has "networking.k8s.io/v1beta1" }} -apiVersion: networking.k8s.io/v1beta1 -{{ else }} -apiVersion: extensions/v1beta1 -{{ end -}} -kind: Ingress -metadata: -{{- if .Values.server.ingress.annotations }} - annotations: -{{ toYaml .Values.server.ingress.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -{{- range $key, $value := .Values.server.ingress.extraLabels }} - {{ $key }}: {{ $value }} -{{- end }} - name: {{ template "prometheus.server.fullname" . }} -spec: - rules: - {{- range .Values.server.ingress.hosts }} - {{- $url := splitList "/" . }} - - host: {{ first $url }} - http: - paths: -{{ if $extraPaths }} -{{ toYaml $extraPaths | indent 10 }} -{{- end }} - - path: /{{ rest $url | join "/" }} - backend: - serviceName: {{ $serviceName }} - servicePort: {{ $servicePort }} - {{- end -}} -{{- if .Values.server.ingress.tls }} - tls: -{{ toYaml .Values.server.ingress.tls | indent 4 }} - {{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml b/charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml deleted file mode 100644 index 152f3a967..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-networkpolicy.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.networkPolicy.enabled }} -apiVersion: {{ template "prometheus.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: {{ template "prometheus.server.fullname" . }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 6 }} - ingress: - - ports: - - port: 9090 -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-pdb.yaml b/charts/kubecost/charts/prometheus/templates/server-pdb.yaml deleted file mode 100644 index ec90cd5c9..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-pdb.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ template "prometheus.server.fullname" . }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -spec: - maxUnavailable: {{ .Values.server.podDisruptionBudget.maxUnavailable }} - selector: - matchLabels: - {{- include "prometheus.server.labels" . | nindent 6 }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml b/charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml deleted file mode 100644 index 73bf065dc..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-podsecuritypolicy.yaml +++ /dev/null @@ -1,55 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.rbac.create }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ template "prometheus.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: {{ template "prometheus.server.fullname" . }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - annotations: -{{- if .Values.server.podSecurityPolicy.annotations }} -{{ toYaml .Values.server.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -spec: - privileged: false - allowPrivilegeEscalation: false - allowedCapabilities: - - 'CHOWN' - volumes: - - 'configMap' - - 'persistentVolumeClaim' - - 'emptyDir' - - 'secret' - - 'hostPath' - allowedHostPaths: - - pathPrefix: /etc - readOnly: true - - pathPrefix: {{ .Values.server.persistentVolume.mountPath }} - {{- range .Values.server.extraHostPathMounts }} - - pathPrefix: {{ .hostPath }} - readOnly: {{ .readOnly }} - {{- end }} - hostNetwork: false - hostPID: false - hostIPC: false - runAsUser: - rule: 'RunAsAny' - seLinux: - rule: 'RunAsAny' - supplementalGroups: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - fsGroup: - rule: 'MustRunAs' - ranges: - # Forbid adding the root group. - - min: 1 - max: 65535 - readOnlyRootFilesystem: false -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-pvc.yaml b/charts/kubecost/charts/prometheus/templates/server-pvc.yaml deleted file mode 100644 index 22cb51afc..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-pvc.yaml +++ /dev/null @@ -1,36 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if not .Values.server.statefulSet.enabled -}} -{{- if .Values.server.persistentVolume.enabled -}} -{{- if not .Values.server.persistentVolume.existingClaim -}} -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - {{- if .Values.server.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.server.persistentVolume.annotations | indent 4 }} - {{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }} -spec: - accessModes: -{{ toYaml .Values.server.persistentVolume.accessModes | indent 4 }} -{{- if .Values.server.persistentVolume.storageClass }} -{{- if (eq "-" .Values.server.persistentVolume.storageClass) }} - storageClassName: "" -{{- else }} - storageClassName: "{{ .Values.server.persistentVolume.storageClass }}" -{{- end }} -{{- end }} -{{- if .Values.server.persistentVolume.volumeBindingMode }} - volumeBindingModeName: "{{ .Values.server.persistentVolume.volumeBindingMode }}" -{{- end }} - resources: - requests: - storage: "{{ .Values.server.persistentVolume.size }}" -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-service-headless.yaml b/charts/kubecost/charts/prometheus/templates/server-service-headless.yaml deleted file mode 100644 index 018a75b79..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-service-headless.yaml +++ /dev/null @@ -1,28 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.statefulSet.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.server.statefulSet.headless.annotations }} - annotations: -{{ toYaml .Values.server.statefulSet.headless.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -{{- if .Values.server.statefulSet.headless.labels }} -{{ toYaml .Values.server.statefulSet.headless.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.server.fullname" . }}-headless -spec: - clusterIP: None - ports: - - name: http - port: {{ .Values.server.statefulSet.headless.servicePort }} - protocol: TCP - targetPort: 9090 - selector: - {{- include "prometheus.server.matchLabels" . | nindent 4 }} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-service.yaml b/charts/kubecost/charts/prometheus/templates/server-service.yaml deleted file mode 100644 index e03faf974..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-service.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -apiVersion: v1 -kind: Service -metadata: -{{- if .Values.server.service.annotations }} - annotations: -{{ toYaml .Values.server.service.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} -{{- if .Values.server.service.labels }} -{{ toYaml .Values.server.service.labels | indent 4 }} -{{- end }} - name: {{ template "prometheus.server.fullname" . }} -spec: -{{- if .Values.server.service.clusterIP }} - clusterIP: {{ .Values.server.service.clusterIP }} -{{- end }} -{{- if .Values.server.service.externalIPs }} - externalIPs: -{{ toYaml .Values.server.service.externalIPs | indent 4 }} -{{- end }} -{{- if .Values.server.service.loadBalancerIP }} - loadBalancerIP: {{ .Values.server.service.loadBalancerIP }} -{{- end }} -{{- if .Values.server.service.loadBalancerSourceRanges }} - loadBalancerSourceRanges: - {{- range $cidr := .Values.server.service.loadBalancerSourceRanges }} - - {{ $cidr }} - {{- end }} -{{- end }} - ports: - - name: http - port: {{ .Values.server.service.servicePort }} - protocol: TCP - targetPort: 9090 - {{- if .Values.server.service.nodePort }} - nodePort: {{ .Values.server.service.nodePort }} - {{- end }} - {{- if .Values.server.service.gRPC.enabled }} - - name: grpc - port: {{ .Values.server.service.gRPC.servicePort }} - protocol: TCP - targetPort: 10901 - {{- if .Values.server.service.gRPC.nodePort }} - nodePort: {{ .Values.server.service.gRPC.nodePort }} - {{- end }} - {{- end }} - selector: - {{- if and .Values.server.statefulSet.enabled .Values.server.service.statefulsetReplica.enabled }} - statefulset.kubernetes.io/pod-name: {{ .Release.Name }}-{{ .Values.server.name }}-{{ .Values.server.service.statefulsetReplica.replica }} - {{- else -}} - {{- include "prometheus.server.matchLabels" . | nindent 4 }} -{{- if .Values.server.service.sessionAffinity }} - sessionAffinity: {{ .Values.server.service.sessionAffinity }} -{{- end }} - {{- end }} - type: "{{ .Values.server.service.type }}" -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml b/charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml deleted file mode 100644 index 6cf017c20..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-serviceaccount.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.serviceAccounts.server.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.serviceAccountName.server" . }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-statefulset.yaml b/charts/kubecost/charts/prometheus/templates/server-statefulset.yaml deleted file mode 100644 index 9369ddf38..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-statefulset.yaml +++ /dev/null @@ -1,224 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.statefulSet.enabled -}} -apiVersion: apps/v1 -kind: StatefulSet -metadata: -{{- if .Values.server.statefulSet.annotations }} - annotations: -{{ toYaml .Values.server.statefulSet.annotations | indent 4 }} -{{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - {{- if .Values.server.statefulSet.labels}} - {{ toYaml .Values.server.statefulSet.labels | nindent 4 }} - {{- end}} - name: {{ template "prometheus.server.fullname" . }} -spec: - serviceName: {{ template "prometheus.server.fullname" . }}-headless - selector: - matchLabels: - {{- include "prometheus.server.matchLabels" . | nindent 6 }} - replicas: {{ .Values.server.replicaCount }} - podManagementPolicy: {{ .Values.server.statefulSet.podManagementPolicy }} - template: - metadata: - {{- if .Values.server.podAnnotations }} - annotations: -{{ toYaml .Values.server.podAnnotations | indent 8 }} - {{- end }} - labels: - {{- include "prometheus.server.labels" . | nindent 8 }} - {{- if .Values.server.statefulSet.labels}} - {{ toYaml .Values.server.statefulSet.labels | nindent 8 }} - {{- end}} - spec: -{{- if .Values.server.affinity }} - affinity: -{{ toYaml .Values.server.affinity | indent 8 }} -{{- end }} -{{- if .Values.server.priorityClassName }} - priorityClassName: "{{ .Values.server.priorityClassName }}" -{{- end }} -{{- if .Values.server.schedulerName }} - schedulerName: "{{ .Values.server.schedulerName }}" -{{- end }} - serviceAccountName: {{ template "prometheus.serviceAccountName.server" . }} - containers: - {{- if .Values.configmapReload.prometheus.enabled }} - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }}-{{ .Values.configmapReload.prometheus.name }} - image: "{{ .Values.configmapReload.prometheus.image.repository }}:{{ .Values.configmapReload.prometheus.image.tag }}" - imagePullPolicy: "{{ .Values.configmapReload.prometheus.image.pullPolicy }}" - args: - - --volume-dir=/etc/config - - --webhook-url=http://127.0.0.1:9090{{ .Values.server.prefixURL }}/-/reload - {{- range $key, $value := .Values.configmapReload.prometheus.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraVolumeDirs }} - - --volume-dir={{ . }} - {{- end }} - resources: -{{ toYaml .Values.configmapReload.prometheus.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- end }} - - name: {{ template "prometheus.name" . }}-{{ .Values.server.name }} - image: "{{ .Values.server.image.repository }}:{{ .Values.server.image.tag }}" - imagePullPolicy: "{{ .Values.server.image.pullPolicy }}" - {{- if .Values.server.env }} - env: -{{ toYaml .Values.server.env | indent 12}} - {{- end }} - args: - {{- if .Values.server.retention }} - - --storage.tsdb.retention.time={{ .Values.server.retention }} - {{- end }} - - --config.file={{ .Values.server.configPath }} - - --storage.tsdb.path={{ .Values.server.persistentVolume.mountPath }} - - --web.console.libraries=/etc/prometheus/console_libraries - - --web.console.templates=/etc/prometheus/consoles - {{- range .Values.server.extraFlags }} - - --{{ . }} - {{- end }} - {{- range $key, $value := .Values.server.extraArgs }} - - --{{ $key }}={{ $value }} - {{- end }} - {{- if .Values.server.baseURL }} - - --web.external-url={{ .Values.server.baseURL }} - {{- end }} - ports: - - containerPort: 9090 - readinessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/ready - port: 9090 - initialDelaySeconds: {{ .Values.server.readinessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.readinessProbeTimeout }} - livenessProbe: - httpGet: - path: {{ .Values.server.prefixURL }}/-/healthy - port: 9090 - initialDelaySeconds: {{ .Values.server.livenessProbeInitialDelay }} - timeoutSeconds: {{ .Values.server.livenessProbeTimeout }} - resources: -{{ toYaml .Values.server.resources | indent 12 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - - name: storage-volume - mountPath: {{ .Values.server.persistentVolume.mountPath }} - subPath: "{{ .Values.server.persistentVolume.subPath }}" - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - mountPath: {{ .mountPath }} - subPath: {{ .subPath }} - readOnly: {{ .readOnly }} - {{- end }} - {{- if .Values.server.extraVolumeMounts }} - {{ toYaml .Values.server.extraVolumeMounts | nindent 12 }} - {{- end }} - {{- if .Values.server.sidecarContainers }} - {{- toYaml .Values.server.sidecarContainers | nindent 8 }} - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.server.nodeSelector }} - nodeSelector: -{{ toYaml .Values.server.nodeSelector | indent 8 }} - {{- end }} - {{- if .Values.server.securityContext }} - securityContext: -{{ toYaml .Values.server.securityContext | indent 8 }} - {{- end }} - {{- if .Values.server.tolerations }} - tolerations: -{{ toYaml .Values.server.tolerations | indent 8 }} - {{- end }} - {{- if .Values.server.affinity }} - affinity: -{{ toYaml .Values.server.affinity | indent 8 }} - {{- end }} - terminationGracePeriodSeconds: {{ .Values.server.terminationGracePeriodSeconds }} - volumes: - - name: config-volume - configMap: - name: {{ if .Values.server.configMapOverrideName }}{{ .Release.Name }}-{{ .Values.server.configMapOverrideName }}{{- else }}{{ template "prometheus.server.fullname" . }}{{- end }} - {{- range .Values.server.extraHostPathMounts }} - - name: {{ .name }} - hostPath: - path: {{ .hostPath }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ $.Values.configmapReload.prometheus.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraConfigmapMounts }} - - name: {{ $.Values.server.name }}-{{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} - {{- range .Values.server.extraSecretMounts }} - - name: {{ .name }} - secret: - secretName: {{ .secretName }} - {{- end }} - {{- range .Values.configmapReload.prometheus.extraConfigmapMounts }} - - name: {{ .name }} - configMap: - name: {{ .configMap }} - {{- end }} -{{- if .Values.server.extraVolumes }} -{{ toYaml .Values.server.extraVolumes | indent 8}} -{{- end }} -{{- if .Values.server.persistentVolume.enabled }} - volumeClaimTemplates: - - metadata: - name: storage-volume - {{- if .Values.server.persistentVolume.annotations }} - annotations: -{{ toYaml .Values.server.persistentVolume.annotations | indent 10 }} - {{- end }} - spec: - accessModes: -{{ toYaml .Values.server.persistentVolume.accessModes | indent 10 }} - resources: - requests: - storage: "{{ .Values.server.persistentVolume.size }}" - {{- if .Values.server.persistentVolume.storageClass }} - {{- if (eq "-" .Values.server.persistentVolume.storageClass) }} - storageClassName: "" - {{- else }} - storageClassName: "{{ .Values.server.persistentVolume.storageClass }}" - {{- end }} - {{- end }} -{{- else }} - - name: storage-volume - emptyDir: {} -{{- end }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/templates/server-vpa.yaml b/charts/kubecost/charts/prometheus/templates/server-vpa.yaml deleted file mode 100644 index 8aec16ad5..000000000 --- a/charts/kubecost/charts/prometheus/templates/server-vpa.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{ if .Values.global.prometheus.enabled }} -{{- if .Values.server.enabled -}} -{{- if .Values.server.verticalAutoscaler.enabled -}} -apiVersion: autoscaling.k8s.io/v1beta2 -kind: VerticalPodAutoscaler -metadata: - labels: - {{- include "prometheus.server.labels" . | nindent 4 }} - name: {{ template "prometheus.server.fullname" . }}-vpa -spec: - targetRef: -{{- if .Values.server.statefulSet.enabled }} - apiVersion: "apps/v1" - kind: StatefulSet -{{- else }} - apiVersion: "extensions/v1beta1" - kind: Deployment -{{- end }} - name: {{ template "prometheus.server.fullname" . }} - updatePolicy: - updateMode: {{ .Values.server.verticalAutoscaler.updateMode | default "Off" | quote }} - resourcePolicy: - containerPolicies: {{ .Values.server.verticalAutoscaler.containerPolicies | default list | toYaml | trim | nindent 4 }} -{{- end -}} {{/* if .Values.server.verticalAutoscaler.enabled */}} -{{- end -}} {{/* .Values.server.enabled */}} -{{ end }} diff --git a/charts/kubecost/charts/prometheus/values.yaml b/charts/kubecost/charts/prometheus/values.yaml deleted file mode 100644 index 3d44e7f59..000000000 --- a/charts/kubecost/charts/prometheus/values.yaml +++ /dev/null @@ -1,1387 +0,0 @@ -rbac: - create: true - -podSecurityPolicy: - enabled: false - -imagePullSecrets: -# - name: "image-pull-secret" - -## Define serviceAccount names for components. Defaults to component's fully qualified name. -## -serviceAccounts: - alertmanager: - create: true - name: - nodeExporter: - create: true - name: - pushgateway: - create: true - name: - server: - create: true - name: - -alertmanager: - ## If false, alertmanager will not be installed - ## - enabled: true - - strategy: - type: Recreate - rollingUpdate: null - - ## alertmanager container name - ## - name: alertmanager - - ## alertmanager container image - ## - image: - repository: prom/alertmanager - tag: v0.20.0 - pullPolicy: IfNotPresent - - ## alertmanager priorityClassName - ## - priorityClassName: "" - - ## Additional alertmanager container arguments - ## - extraArgs: {} - - ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug - ## so that the various internal URLs are still able to access as they are in the default case. - ## (Optional) - prefixURL: "" - - ## External URL which can access alertmanager - baseURL: "http://localhost:9093" - - ## Additional alertmanager container environment variable - ## For instance to add a http_proxy - ## - extraEnv: {} - - ## Additional alertmanager Secret mounts - # Defines additional mounts with secrets. Secrets must be manually created in the namespace. - extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # subPath: "" - # secretName: alertmanager-secret-files - # readOnly: true - - ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.alertmanager.configMapOverrideName}} - ## Defining configMapOverrideName will cause templates/alertmanager-configmap.yaml - ## to NOT generate a ConfigMap resource - ## - configMapOverrideName: "" - - ## The name of a secret in the same kubernetes namespace which contains the Alertmanager config - ## Defining configFromSecret will cause templates/alertmanager-configmap.yaml - ## to NOT generate a ConfigMap resource - ## - configFromSecret: "" - - ## The configuration file name to be loaded to alertmanager - ## Must match the key within configuration loaded from ConfigMap/Secret - ## - configFileName: alertmanager.yml - - ingress: - ## If true, alertmanager Ingress will be created - ## - enabled: false - - ## alertmanager Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - ## alertmanager Ingress additional labels - ## - extraLabels: {} - - ## alertmanager Ingress hostnames with optional path - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - alertmanager.domain.com - # - domain.com/alertmanager - - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - - ## alertmanager Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: [] - # - secretName: prometheus-alerts-tls - # hosts: - # - alertmanager.domain.com - - ## Alertmanager Deployment Strategy type - # strategy: - # type: Recreate - - ## Node tolerations for alertmanager scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for alertmanager pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Pod affinity - ## - affinity: {} - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: - - persistentVolume: - ## If true, alertmanager will create/use a Persistent Volume Claim - ## If false, use emptyDir - ## - enabled: true - - ## alertmanager data Persistent Volume access modes - ## Must match those of existing PV or dynamic provisioner - ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ - ## - accessModes: - - ReadWriteOnce - - ## alertmanager data Persistent Volume Claim annotations - ## - annotations: {} - - ## alertmanager data Persistent Volume existing claim name - ## Requires alertmanager.persistentVolume.enabled: true - ## If defined, PVC must be created manually before volume will be bound - existingClaim: "" - - ## alertmanager data Persistent Volume mount root path - ## - mountPath: /data - - ## alertmanager data Persistent Volume size - ## - size: 2Gi - - ## alertmanager data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - - ## alertmanager data Persistent Volume Binding Mode - ## If defined, volumeBindingMode: - ## If undefined (the default) or set to null, no volumeBindingMode spec is - ## set, choosing the default mode. - ## - # volumeBindingMode: "" - - ## Subdirectory of alertmanager data Persistent Volume to mount - ## Useful if the volume's root directory is not empty - ## - subPath: "" - - ## Annotations to be added to alertmanager pods - ## - podAnnotations: {} - ## Tell prometheus to use a specific set of alertmanager pods - ## instead of all alertmanager pods found in the same namespace - ## Useful if you deploy multiple releases within the same namespace - ## - ## prometheus.io/probe: alertmanager-teamA - - ## Labels to be added to Prometheus AlertManager pods - ## - podLabels: {} - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below) - ## - replicaCount: 1 - - statefulSet: - ## If true, use a statefulset instead of a deployment for pod management. - ## This allows to scale replicas to more than 1 pod - ## - enabled: false - - podManagementPolicy: OrderedReady - - ## Alertmanager headless service to use for the statefulset - ## - headless: - annotations: {} - labels: {} - - ## Enabling peer mesh service end points for enabling the HA alert manager - ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md - # enableMeshPeer : true - - servicePort: 80 - - ## alertmanager resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 10m - # memory: 32Mi - # requests: - # cpu: 10m - # memory: 32Mi - - ## Security context to be added to alertmanager pods - ## - securityContext: - runAsUser: 65534 - runAsNonRoot: true - runAsGroup: 65534 - fsGroup: 65534 - - service: - annotations: {} - labels: {} - clusterIP: "" - - ## Enabling peer mesh service end points for enabling the HA alert manager - ## Ref: https://github.com/prometheus/alertmanager/blob/master/README.md - # enableMeshPeer : true - - ## List of IP addresses at which the alertmanager service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 80 - # nodePort: 30000 - sessionAffinity: None - type: ClusterIP - -## Monitors ConfigMap changes and POSTs to a URL -## Ref: https://github.com/jimmidyson/configmap-reload -## -configmapReload: - prometheus: - ## If false, the configmap-reload container will not be deployed - ## - enabled: true - - ## configmap-reload container name - ## - name: configmap-reload - - ## configmap-reload container image - ## - image: - repository: jimmidyson/configmap-reload - tag: v0.3.0 - pullPolicy: IfNotPresent - - ## Additional configmap-reload container arguments - ## - extraArgs: {} - ## Additional configmap-reload volume directories - ## - extraVolumeDirs: [] - - - ## Additional configmap-reload mounts - ## - extraConfigmapMounts: [] - # - name: prometheus-alerts - # mountPath: /etc/alerts.d - # subPath: "" - # configMap: prometheus-alerts - # readOnly: true - - - ## configmap-reload resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - alertmanager: - ## If false, the configmap-reload container will not be deployed - ## - enabled: true - - ## configmap-reload container name - ## - name: configmap-reload - - ## configmap-reload container image - ## - image: - repository: jimmidyson/configmap-reload - tag: v0.3.0 - pullPolicy: IfNotPresent - - ## Additional configmap-reload container arguments - ## - extraArgs: {} - ## Additional configmap-reload volume directories - ## - extraVolumeDirs: [] - - - ## Additional configmap-reload mounts - ## - extraConfigmapMounts: [] - # - name: prometheus-alerts - # mountPath: /etc/alerts.d - # subPath: "" - # configMap: prometheus-alerts - # readOnly: true - - - ## configmap-reload resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - -kubeStateMetrics: - ## If false, kube-state-metrics sub-chart will not be installed - ## Please see https://github.com/helm/charts/tree/master/stable/kube-state-metrics for configurable values - ## - enabled: true - -nodeExporter: - ## If false, node-exporter will not be installed - ## - enabled: true - - ## If true, node-exporter pods share the host network namespace - ## - hostNetwork: true - - ## If true, node-exporter pods share the host PID namespace - ## - hostPID: true - - ## node-exporter container name - ## - name: node-exporter - - ## node-exporter container image - ## - image: - repository: prom/node-exporter - tag: v0.18.1 - pullPolicy: IfNotPresent - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - ## node-exporter priorityClassName - ## - priorityClassName: "" - - ## Custom Update Strategy - ## - updateStrategy: - type: RollingUpdate - - ## Additional node-exporter container arguments - ## - extraArgs: {} - - ## Additional node-exporter hostPath mounts - ## - extraHostPathMounts: [] - # - name: textfile-dir - # mountPath: /srv/txt_collector - # hostPath: /var/lib/node-exporter - # readOnly: true - # mountPropagation: HostToContainer - - extraConfigmapMounts: [] - # - name: certs-configmap - # mountPath: /prometheus - # configMap: certs-configmap - # readOnly: true - - ## Node tolerations for node-exporter scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for node-exporter pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Annotations to be added to node-exporter pods - ## - podAnnotations: {} - - ## Labels to be added to node-exporter pods - ## - pod: - labels: {} - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## node-exporter resource limits & requests - ## Ref: https://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 200m - # memory: 50Mi - # requests: - # cpu: 100m - # memory: 30Mi - - ## Security context to be added to node-exporter pods - ## - securityContext: {} - # runAsUser: 0 - - service: - annotations: - prometheus.io/scrape: "true" - labels: {} - - # Exposed as a headless service: - # https://kubernetes.io/docs/concepts/services-networking/service/#headless-services - clusterIP: None - - ## List of IP addresses at which the node-exporter service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - hostPort: 9100 - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 9100 - type: ClusterIP - -server: - ## Prometheus server container name - ## - enabled: true - name: server - sidecarContainers: - strategy: - type: Recreate - rollingUpdate: null - - ## Prometheus server container image - ## - image: - repository: prom/prometheus - tag: v2.17.2 - pullPolicy: IfNotPresent - - ## prometheus server priorityClassName - ## - priorityClassName: "" - - ## The URL prefix at which the container can be accessed. Useful in the case the '-web.external-url' includes a slug - ## so that the various internal URLs are still able to access as they are in the default case. - ## (Optional) - prefixURL: "" - - ## External URL which can access alertmanager - ## Maybe same with Ingress host name - baseURL: "" - - ## Additional server container environment variables - ## - ## You specify this manually like you would a raw deployment manifest. - ## This means you can bind in environment variables from secrets. - ## - ## e.g. static environment variable: - ## - name: DEMO_GREETING - ## value: "Hello from the environment" - ## - ## e.g. secret environment variable: - ## - name: USERNAME - ## valueFrom: - ## secretKeyRef: - ## name: mysecret - ## key: username - env: [] - - extraFlags: - - web.enable-lifecycle - ## web.enable-admin-api flag controls access to the administrative HTTP API which includes functionality such as - ## deleting time series. This is disabled by default. - # - web.enable-admin-api - ## - ## storage.tsdb.no-lockfile flag controls BD locking - # - storage.tsdb.no-lockfile - ## - ## storage.tsdb.wal-compression flag enables compression of the write-ahead log (WAL) - # - storage.tsdb.wal-compression - - ## Path to a configuration file on prometheus server container FS - configPath: /etc/config/prometheus.yml - - global: - ## How frequently to scrape targets by default - ## - scrape_interval: 1m - ## How long until a scrape request times out - ## - scrape_timeout: 10s - ## How frequently to evaluate rules - ## - evaluation_interval: 1m - ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_write - ## - remoteWrite: {} - ## https://prometheus.io/docs/prometheus/latest/configuration/configuration/#remote_read - ## - remoteRead: {} - - ## Additional Prometheus server container arguments - ## - extraArgs: {} - - ## Additional InitContainers to initialize the pod - ## - extraInitContainers: [] - - ## Additional Prometheus server Volume mounts - ## - extraVolumeMounts: [] - - ## Additional Prometheus server Volumes - ## - extraVolumes: [] - - ## Additional Prometheus server hostPath mounts - ## - extraHostPathMounts: [] - # - name: certs-dir - # mountPath: /etc/kubernetes/certs - # subPath: "" - # hostPath: /etc/kubernetes/certs - # readOnly: true - - extraConfigmapMounts: [] - # - name: certs-configmap - # mountPath: /prometheus - # subPath: "" - # configMap: certs-configmap - # readOnly: true - - ## Additional Prometheus server Secret mounts - # Defines additional mounts with secrets. Secrets must be manually created in the namespace. - extraSecretMounts: [] - # - name: secret-files - # mountPath: /etc/secrets - # subPath: "" - # secretName: prom-secret-files - # readOnly: true - - ## ConfigMap override where fullname is {{.Release.Name}}-{{.Values.server.configMapOverrideName}} - ## Defining configMapOverrideName will cause templates/server-configmap.yaml - ## to NOT generate a ConfigMap resource - ## - configMapOverrideName: "" - - ingress: - ## If true, Prometheus server Ingress will be created - ## - enabled: false - - ## Prometheus server Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - ## Prometheus server Ingress additional labels - ## - extraLabels: {} - - ## Prometheus server Ingress hostnames with optional path - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - prometheus.domain.com - # - domain.com/prometheus - - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - - ## Prometheus server Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: [] - # - secretName: prometheus-server-tls - # hosts: - # - prometheus.domain.com - - ## Server Deployment Strategy type - # strategy: - # type: Recreate - - ## Node tolerations for server scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for Prometheus server pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Pod affinity - ## - affinity: {} - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: - - persistentVolume: - ## If true, Prometheus server will create/use a Persistent Volume Claim - ## If false, use emptyDir - ## - enabled: true - - ## Prometheus server data Persistent Volume access modes - ## Must match those of existing PV or dynamic provisioner - ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ - ## - accessModes: - - ReadWriteOnce - - ## Prometheus server data Persistent Volume annotations - ## - annotations: {} - - ## Prometheus server data Persistent Volume existing claim name - ## Requires server.persistentVolume.enabled: true - ## If defined, PVC must be created manually before volume will be bound - existingClaim: "" - - ## Prometheus server data Persistent Volume mount root path - ## - mountPath: /data - - ## Prometheus server data Persistent Volume size - ## - size: 8Gi - - ## Prometheus server data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - - ## Prometheus server data Persistent Volume Binding Mode - ## If defined, volumeBindingMode: - ## If undefined (the default) or set to null, no volumeBindingMode spec is - ## set, choosing the default mode. - ## - # volumeBindingMode: "" - - ## Subdirectory of Prometheus server data Persistent Volume to mount - ## Useful if the volume's root directory is not empty - ## - subPath: "" - - emptyDir: - sizeLimit: "" - - ## Annotations to be added to Prometheus server pods - ## - podAnnotations: {} - # iam.amazonaws.com/role: prometheus - - ## Labels to be added to Prometheus server pods - ## - podLabels: {} - - ## Prometheus AlertManager configuration - ## - alertmanagers: [] - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - ## Use a StatefulSet if replicaCount needs to be greater than 1 (see below) - ## - replicaCount: 1 - - statefulSet: - ## If true, use a statefulset instead of a deployment for pod management. - ## This allows to scale replicas to more than 1 pod - ## - enabled: false - - annotations: {} - labels: {} - podManagementPolicy: OrderedReady - - ## Alertmanager headless service to use for the statefulset - ## - headless: - annotations: {} - labels: {} - servicePort: 80 - - ## Prometheus server readiness and liveness probe initial delay and timeout - ## Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/ - ## - readinessProbeInitialDelay: 30 - readinessProbeTimeout: 30 - readinessProbeFailureThreshold: 3 - readinessProbeSuccessThreshold: 1 - livenessProbeInitialDelay: 30 - livenessProbeTimeout: 30 - livenessProbeFailureThreshold: 3 - livenessProbeSuccessThreshold: 1 - - ## Prometheus server resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 500m - # memory: 512Mi - # requests: - # cpu: 500m - # memory: 512Mi - - ## Vertical Pod Autoscaler config - ## Ref: https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler - verticalAutoscaler: - ## If true a VPA object will be created for the controller (either StatefulSet or Deployemnt, based on above configs) - enabled: false - # updateMode: "Auto" - # containerPolicies: - # - containerName: 'prometheus-server' - - ## Security context to be added to server pods - ## - securityContext: - runAsUser: 65534 - runAsNonRoot: true - runAsGroup: 65534 - fsGroup: 65534 - - service: - annotations: {} - labels: {} - clusterIP: "" - - ## List of IP addresses at which the Prometheus server service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 80 - sessionAffinity: None - type: ClusterIP - - ## Enable gRPC port on service to allow auto discovery with thanos-querier - gRPC: - enabled: false - servicePort: 10901 - # nodePort: 10901 - - ## If using a statefulSet (statefulSet.enabled=true), configure the - ## service to connect to a specific replica to have a consistent view - ## of the data. - statefulsetReplica: - enabled: false - replica: 0 - - ## Prometheus server pod termination grace period - ## - terminationGracePeriodSeconds: 300 - - ## Prometheus data retention period (default if not specified is 15 days) - ## - retention: "15d" - -pushgateway: - ## If false, pushgateway will not be installed - ## - enabled: true - - ## Use an alternate scheduler, e.g. "stork". - ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ - ## - # schedulerName: - - ## pushgateway container name - ## - name: pushgateway - - ## pushgateway container image - ## - image: - repository: prom/pushgateway - tag: v1.0.1 - pullPolicy: IfNotPresent - - ## pushgateway priorityClassName - ## - priorityClassName: "" - - ## Additional pushgateway container arguments - ## - ## for example: persistence.file: /data/pushgateway.data - extraArgs: {} - - ingress: - ## If true, pushgateway Ingress will be created - ## - enabled: false - - ## pushgateway Ingress annotations - ## - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: 'true' - - ## pushgateway Ingress hostnames with optional path - ## Must be provided if Ingress is enabled - ## - hosts: [] - # - pushgateway.domain.com - # - domain.com/pushgateway - - ## Extra paths to prepend to every host configuration. This is useful when working with annotation based services. - extraPaths: [] - # - path: /* - # backend: - # serviceName: ssl-redirect - # servicePort: use-annotation - - ## pushgateway Ingress TLS configuration - ## Secrets must be manually created in the namespace - ## - tls: [] - # - secretName: prometheus-alerts-tls - # hosts: - # - pushgateway.domain.com - - ## Node tolerations for pushgateway scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## Node labels for pushgateway pod assignment - ## Ref: https://kubernetes.io/docs/user-guide/node-selection/ - ## - nodeSelector: {} - - ## Annotations to be added to pushgateway pods - ## - podAnnotations: {} - - ## Specify if a Pod Security Policy for node-exporter must be created - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/ - ## - podSecurityPolicy: - annotations: {} - ## Specify pod annotations - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#apparmor - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#seccomp - ## Ref: https://kubernetes.io/docs/concepts/policy/pod-security-policy/#sysctl - ## - # seccomp.security.alpha.kubernetes.io/allowedProfileNames: '*' - # seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' - # apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' - - replicaCount: 1 - - ## PodDisruptionBudget settings - ## ref: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/ - ## - podDisruptionBudget: - enabled: false - maxUnavailable: 1 - - ## pushgateway resource requests and limits - ## Ref: http://kubernetes.io/docs/user-guide/compute-resources/ - ## - resources: {} - # limits: - # cpu: 10m - # memory: 32Mi - # requests: - # cpu: 10m - # memory: 32Mi - - ## Security context to be added to push-gateway pods - ## - securityContext: - runAsUser: 65534 - runAsNonRoot: true - - service: - annotations: - prometheus.io/probe: pushgateway - labels: {} - clusterIP: "" - - ## List of IP addresses at which the pushgateway service is available - ## Ref: https://kubernetes.io/docs/user-guide/services/#external-ips - ## - externalIPs: [] - - loadBalancerIP: "" - loadBalancerSourceRanges: [] - servicePort: 9091 - type: ClusterIP - - strategy: - type: Recreate - rollingUpdate: null - - - persistentVolume: - ## If true, pushgateway will create/use a Persistent Volume Claim - ## If false, use emptyDir - ## - enabled: false - - ## pushgateway data Persistent Volume access modes - ## Must match those of existing PV or dynamic provisioner - ## Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ - ## - accessModes: - - ReadWriteOnce - - ## pushgateway data Persistent Volume Claim annotations - ## - annotations: {} - - ## pushgateway data Persistent Volume existing claim name - ## Requires pushgateway.persistentVolume.enabled: true - ## If defined, PVC must be created manually before volume will be bound - existingClaim: "" - - ## pushgateway data Persistent Volume mount root path - ## - mountPath: /data - - ## pushgateway data Persistent Volume size - ## - size: 2Gi - - ## pushgateway data Persistent Volume Storage Class - ## If defined, storageClassName: - ## If set to "-", storageClassName: "", which disables dynamic provisioning - ## If undefined (the default) or set to null, no storageClassName spec is - ## set, choosing the default provisioner. (gp2 on AWS, standard on - ## GKE, AWS & OpenStack) - ## - # storageClass: "-" - - ## pushgateway data Persistent Volume Binding Mode - ## If defined, volumeBindingMode: - ## If undefined (the default) or set to null, no volumeBindingMode spec is - ## set, choosing the default mode. - ## - # volumeBindingMode: "" - - ## Subdirectory of pushgateway data Persistent Volume to mount - ## Useful if the volume's root directory is not empty - ## - subPath: "" - - -## alertmanager ConfigMap entries -## -alertmanagerFiles: - alertmanager.yml: - global: {} - # slack_api_url: '' - - receivers: - - name: default-receiver - # slack_configs: - # - channel: '@you' - # send_resolved: true - - route: - group_wait: 10s - group_interval: 5m - receiver: default-receiver - repeat_interval: 3h - -## Prometheus server ConfigMap entries -## -serverFiles: - - ## Alerts configuration - ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/ - alerting_rules.yml: {} - # groups: - # - name: Instances - # rules: - # - alert: InstanceDown - # expr: up == 0 - # for: 5m - # labels: - # severity: page - # annotations: - # description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' - # summary: 'Instance {{ $labels.instance }} down' - ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use alerting_rules.yml - alerts: {} - - ## Records configuration - ## Ref: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/ - recording_rules.yml: {} - ## DEPRECATED DEFAULT VALUE, unless explicitly naming your files, please use recording_rules.yml - rules: {} - - prometheus.yml: - rule_files: - - /etc/config/recording_rules.yml - - /etc/config/alerting_rules.yml - ## Below two files are DEPRECATED will be removed from this default values file - - /etc/config/rules - - /etc/config/alerts - - scrape_configs: - - job_name: prometheus - static_configs: - - targets: - - localhost:9090 - - # A scrape configuration for running Prometheus on a Kubernetes cluster. - # This uses separate scrape configs for cluster components (i.e. API server, node) - # and services to allow each to use different authentication configs. - # - # Kubernetes labels will be added as Prometheus labels on metrics via the - # `labelmap` relabeling action. - - - job_name: 'kubernetes-nodes-cadvisor' - - # Default to scraping over https. If required, just disable this or change to - # `http`. - scheme: https - - # This TLS & bearer token file config is used to connect to the actual scrape - # endpoints for cluster components. This is separate to discovery auth - # configuration because discovery & scraping are two separate concerns in - # Prometheus. The discovery auth config is automatic if Prometheus runs inside - # the cluster. Otherwise, more config options have to be provided within the - # . - tls_config: - ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - # If your node certificates are self-signed or use a different CA to the - # master CA, then disable certificate verification below. Note that - # certificate verification is an integral part of a secure infrastructure - # so this should only be disabled in a controlled environment. You can - # disable certificate verification by uncommenting the line below. - # - insecure_skip_verify: true - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token - - kubernetes_sd_configs: - - role: node - - # This configuration will work only on kubelet 1.7.3+ - # As the scrape endpoints for cAdvisor have changed - # if you are using older version you need to change the replacement to - # replacement: /api/v1/nodes/$1:4194/proxy/metrics - # more info here https://github.com/coreos/prometheus-operator/issues/633 - relabel_configs: - - action: labelmap - regex: __meta_kubernetes_node_label_(.+) - - target_label: __address__ - replacement: kubernetes.default.svc:443 - - source_labels: [__meta_kubernetes_node_name] - regex: (.+) - target_label: __metrics_path__ - replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor - - metric_relabel_configs: - - source_labels: [ __name__ ] - regex: (container_cpu_usage_seconds_total|container_memory_working_set_bytes|container_network_receive_errors_total|container_network_transmit_errors_total|container_network_receive_packets_dropped_total|container_network_transmit_packets_dropped_total|container_memory_usage_bytes|container_cpu_cfs_throttled_periods_total|container_cpu_cfs_periods_total|container_fs_usage_bytes|container_fs_limit_bytes|container_cpu_cfs_periods_total|container_fs_inodes_free|container_fs_inodes_total|container_fs_usage_bytes|container_fs_limit_bytes|container_cpu_cfs_throttled_periods_total|container_cpu_cfs_periods_total|container_network_receive_bytes_total|container_network_transmit_bytes_total|container_fs_inodes_free|container_fs_inodes_total|container_fs_usage_bytes|container_fs_limit_bytes|container_spec_cpu_shares|container_spec_memory_limit_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|container_fs_reads_bytes_total|container_network_receive_bytes_total|container_fs_writes_bytes_total|container_fs_reads_bytes_total|cadvisor_version_info) - action: keep - - source_labels: [ container ] - target_label: container_name - regex: (.+) - action: replace - - source_labels: [ pod ] - target_label: pod_name - regex: (.+) - action: replace - - # Scrape config for service endpoints. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - - job_name: 'kubernetes-service-endpoints' - - kubernetes_sd_configs: - - role: endpoints - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] - action: keep - regex: true - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_service_name] - action: replace - target_label: kubernetes_name - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: kubernetes_node - metric_relabel_configs: - - source_labels: [ __name__ ] - regex: (container_cpu_allocation|container_cpu_usage_seconds_total|container_fs_limit_bytes|container_memory_allocation_bytes|container_memory_usage_bytes|container_memory_working_set_bytes|container_network_receive_bytes_total|container_network_transmit_bytes_total|deployment_match_labels|kube_deployment_spec_replicas|kube_deployment_status_replicas_available|kube_job_status_failed|kube_namespace_annotations|kube_namespace_labels|kube_node_info|kube_node_labels|kube_node_status_capacity_cpu_cores|kube_node_status_capacity_memory_bytes|kube_node_status_condition|kube_persistentvolume_capacity_bytes|kube_persistentvolume_status_phase|kube_persistentvolumeclaim_info|kube_persistentvolumeclaim_resource_requests_storage_bytes|kube_persistentvolumeclaim_resource_requests_storage_bytes|container_memory_allocation_bytes|kube_pod_container_resource_limits_cpu_cores|kube_pod_container_resource_limits_memory_bytes|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests_cpu_cores|container_cpu_usage_seconds_total|kube_pod_container_resource_requests_memory_bytes|kube_pod_container_resource_requests_memory_bytes|kube_node_status_capacity_memory_bytes|kube_pod_container_resource_requests|kube_pod_container_status_restarts_total|kube_pod_container_status_running|kube_pod_container_status_terminated_reason|kube_pod_labels|kube_pod_owner|kube_pod_status_phase|kubecost_cluster_memory_working_set_bytes|kubecost_pod_network_egress_bytes_total|node_cpu_hourly_cost|node_cpu_seconds_total|node_disk_reads_completed|node_disk_reads_completed_total|node_disk_writes_completed|node_disk_writes_completed_total|node_filesystem_device_error|node_gpu_hourly_cost|node_memory_Buffers_bytes|node_memory_Cached_bytes|node_memory_MemAvailable_bytes|node_memory_MemFree_bytes|node_memory_MemTotal_bytes|node_network_transmit_bytes_total|node_ram_hourly_cost|pod_pvc_allocation|pv_hourly_cost|service_selector_labels|statefulSet_match_labels|up|kube_node_status_allocatable_cpu_cores|kube_node_status_allocatable_memory_bytes|container_fs_writes_bytes_total|kube_deployment_status_replicas|kube_statefulset_replicas|kube_daemonset_status_desired_number_scheduled|kube_deployment_status_replicas_available|kube_statefulset_status_replicas|kube_daemonset_status_number_ready|kube_deployment_status_replicas|kube_statefulset_replicas|kube_daemonset_status_desired_number_scheduled|kube_replicaset_owner|kube_pod_container_info) - action: keep - - # Scrape config for slow service endpoints; same as above, but with a larger - # timeout and a larger interval - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/scrape-slow`: Only scrape services that have a value of `true` - # * `prometheus.io/scheme`: If the metrics endpoint is secured then you will need - # to set this to `https` & most likely set the `tls_config` of the scrape config. - # * `prometheus.io/path`: If the metrics path is not `/metrics` override this. - # * `prometheus.io/port`: If the metrics are exposed on a different port to the - # service then set this appropriately. - - job_name: 'kubernetes-service-endpoints-slow' - - scrape_interval: 5m - scrape_timeout: 30s - - kubernetes_sd_configs: - - role: endpoints - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape_slow] - action: keep - regex: true - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] - action: replace - target_label: __scheme__ - regex: (https?) - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] - action: replace - target_label: __metrics_path__ - regex: (.+) - - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port] - action: replace - target_label: __address__ - regex: ([^:]+)(?::\d+)?;(\d+) - replacement: $1:$2 - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - action: replace - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_service_name] - action: replace - target_label: kubernetes_name - - source_labels: [__meta_kubernetes_pod_node_name] - action: replace - target_label: kubernetes_node - - - job_name: 'prometheus-pushgateway' - honor_labels: true - - kubernetes_sd_configs: - - role: service - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] - action: keep - regex: pushgateway - - # Example scrape config for probing services via the Blackbox Exporter. - # - # The relabeling allows the actual service scrape endpoint to be configured - # via the following annotations: - # - # * `prometheus.io/probe`: Only probe services that have a value of `true` - - job_name: 'kubernetes-services' - - metrics_path: /probe - params: - module: [http_2xx] - - kubernetes_sd_configs: - - role: service - - relabel_configs: - - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] - action: keep - regex: true - - source_labels: [__address__] - target_label: __param_target - - target_label: __address__ - replacement: blackbox - - source_labels: [__param_target] - target_label: instance - - action: labelmap - regex: __meta_kubernetes_service_label_(.+) - - source_labels: [__meta_kubernetes_namespace] - target_label: kubernetes_namespace - - source_labels: [__meta_kubernetes_service_name] - target_label: kubernetes_name - -# adds additional scrape configs to prometheus.yml -# must be a string so you have to add a | after extraScrapeConfigs: -# example adds prometheus-blackbox-exporter scrape config -extraScrapeConfigs: - # - job_name: 'prometheus-blackbox-exporter' - # metrics_path: /probe - # params: - # module: [http_2xx] - # static_configs: - # - targets: - # - https://example.com - # relabel_configs: - # - source_labels: [__address__] - # target_label: __param_target - # - source_labels: [__param_target] - # target_label: instance - # - target_label: __address__ - # replacement: prometheus-blackbox-exporter:9115 - -# Adds option to add alert_relabel_configs to avoid duplicate alerts in alertmanager -# useful in H/A prometheus with different external labels but the same alerts -alertRelabelConfigs: - # alert_relabel_configs: - # - source_labels: [dc] - # regex: (.+)\d+ - # target_label: dc - -networkPolicy: - ## Enable creation of NetworkPolicy resources. - ## - enabled: false diff --git a/charts/kubecost/charts/thanos/.helmignore b/charts/kubecost/charts/thanos/.helmignore deleted file mode 100644 index f0c131944..000000000 --- a/charts/kubecost/charts/thanos/.helmignore +++ /dev/null @@ -1,21 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*~ -# Various IDEs -.project -.idea/ -*.tmproj diff --git a/charts/kubecost/charts/thanos/Chart.yaml b/charts/kubecost/charts/thanos/Chart.yaml deleted file mode 100644 index bf76cbf27..000000000 --- a/charts/kubecost/charts/thanos/Chart.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -appVersion: 0.15.0 -description: Thanos is a set of components that can be composed into a highly available - metric system with unlimited storage capacity, which can be added seamlessly on - top of existing Prometheus deployments. -icon: https://raw.githubusercontent.com/thanos-io/thanos/master/website/static/Thanos-logo_full.svg -keywords: -- thanos -- prometheus -- metrics -maintainers: -- email: info@banzaicloud.com - name: Banzai Cloud -name: thanos -sources: -- https://github.com/thanos-io/thanos -- https://github.com/banzaicloud/banzai-charts/tree/master/thanos -version: 0.15.0 diff --git a/charts/kubecost/charts/thanos/requirements.yaml b/charts/kubecost/charts/thanos/requirements.yaml deleted file mode 100644 index e69de29bb..000000000 diff --git a/charts/kubecost/charts/thanos/templates/NOTES.txt b/charts/kubecost/charts/thanos/templates/NOTES.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/charts/kubecost/charts/thanos/templates/_helpers.tpl b/charts/kubecost/charts/thanos/templates/_helpers.tpl deleted file mode 100644 index 7b5fb57d8..000000000 --- a/charts/kubecost/charts/thanos/templates/_helpers.tpl +++ /dev/null @@ -1,51 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "thanos.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "thanos.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "thanos.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - - -{{/* -Create a default fully qualified component name from the full app name and a component name. -We truncate the full name at 63 - 1 (last dash) - len(component name) chars because some Kubernetes name fields are limited to this (by the DNS naming spec) -and we want to make sure that the component is included in the name. -*/}} -{{- define "thanos.componentname" -}} -{{- $global := index . 0 -}} -{{- $component := index . 1 | trimPrefix "-" -}} -{{- printf "%s-%s" (include "thanos.fullname" $global | trunc (sub 62 (len $component) | int) | trimSuffix "-" ) $component | trimSuffix "-" -}} -{{- end -}} - -{{/* - -*/}} -{{- define "thanos.secretname" }} -{{- default (include "thanos.name" .) .Values.storeSecretName }} -{{- end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-deployment.yaml b/charts/kubecost/charts/thanos/templates/bucket-deployment.yaml deleted file mode 100644 index e8757af68..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-deployment.yaml +++ /dev/null @@ -1,87 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.bucket.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end -}} - {{- with .Values.bucket.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.bucket.replicaCount | default 1 }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.bucket.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - spec: - containers: - - name: thanos-bucket - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: {{- with .Values.bucket.extraEnv }}{{ toYaml . | nindent 8 }}{{- end }} - args: - - "tools" - - "bucket" - - "web" - - "--log.level={{ .Values.bucket.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.bucket.http.port }}" - - "--objstore.config-file=/etc/config/object-store.yaml" - {{- if .Values.bucket.refresh }} - - "--refresh={{ .Values.bucket.refresh }}" - {{- end }} - {{- if .Values.bucket.timeout }} - - "--timeout={{ .Values.bucket.timeout }}" - {{- end }} - {{- if .Values.bucket.label }} - - "--label={{ .Values.bucket.label }}" - {{- end }} - {{ with .Values.bucket.extraArgs }}{{ toYaml . | nindent 8 }}{{- end }} - ports: - - name: http - containerPort: {{ .Values.bucket.http.port }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - resources: {{ toYaml .Values.bucket.resources | nindent 10 }} - volumes: - - name: config-volume - secret: - secretName: {{ include "thanos.secretname" . }} - {{- with .Values.bucket.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.bucket.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-ingress.yaml b/charts/kubecost/charts/thanos/templates/bucket-ingress.yaml deleted file mode 100644 index 28b037bda..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-ingress.yaml +++ /dev/null @@ -1,42 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if and .Values.bucket.enabled .Values.bucket.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - {{- with .Values.bucket.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket - {{- if .Values.bucket.http.ingress.labels }} -{{ toYaml .Values.bucket.http.ingress.labels | indent 4 }} - {{- end }} -spec: - {{- if .Values.bucket.http.ingress.tls }} - tls: - {{- range .Values.bucket.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.bucket.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.bucket.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "bucket") }} - servicePort: {{ $.Values.bucket.http.port }} - {{- end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml b/charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml deleted file mode 100644 index fb3fd1cb7..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-poddisruptionbudget.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.bucket.enabled .Values.bucket.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - {{- if .Values.bucket.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.bucket.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.bucket.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.bucket.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/component: bucket -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/bucket-service.yaml b/charts/kubecost/charts/thanos/templates/bucket-service.yaml deleted file mode 100644 index 0d56d8a2b..000000000 --- a/charts/kubecost/charts/thanos/templates/bucket-service.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.bucket.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "bucket") }} - {{- with .Values.bucket.http.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - ports: - - port: {{ .Values.bucket.http.port }} - protocol: TCP - targetPort: http - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: bucket -{{ with .Values.bucket.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-deployment.yaml b/charts/kubecost/charts/thanos/templates/compact-deployment.yaml deleted file mode 100644 index a5b0347ad..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-deployment.yaml +++ /dev/null @@ -1,108 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.compact.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "compact") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: compact -{{ with .Values.compact.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end -}} - {{- with .Values.compact.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.compact.replicaCount | default 1 }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact -{{ with .Values.compact.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact -{{ with .Values.compact.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.compact.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.compact.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.compact.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-compact - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - env: {{- with .Values.compact.extraEnv }}{{ toYaml . | nindent 8 }}{{- end }} - args: - - "compact" - - "--log.level={{ .Values.compact.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.compact.http.port }}" - - "--objstore.config-file=/etc/config/object-store.yaml" - - "--data-dir=/var/thanos/compact" - - "--consistency-delay={{ .Values.compact.consistencyDelay }}" - - "--retention.resolution-raw={{ .Values.compact.retentionResolutionRaw }}" - - "--retention.resolution-5m={{ .Values.compact.retentionResolution5m }}" - - "--retention.resolution-1h={{ .Values.compact.retentionResolution1h }}" - - "--block-sync-concurrency={{ .Values.compact.blockSyncConcurrency }}" - - "--compact.concurrency={{ .Values.compact.compactConcurrency }}" -{{- if .Values.compact.disableDownsampling }} - - "--downsampling.disable" -{{- end }} - - "--wait" -{{ with .Values.compact.extraArgs }}{{ toYaml . | indent 8 }}{{- end }} - ports: - - name: http - containerPort: {{ .Values.compact.http.port }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - - name: data-volume - mountPath: /var/thanos/compact - resources: {{ toYaml .Values.compact.resources | nindent 10 }} - volumes: - - name: data-volume - {{- if .Values.compact.dataVolume }} - {{- if .Values.compact.dataVolume.persistentVolumeClaim }} - {{- if .Values.compact.dataVolume.persistentVolumeClaim.claimName }} - persistentVolumeClaim: - claimName: {{ .Values.compact.dataVolume.persistentVolumeClaim.claimName }} - {{- else }} - emptyDir: {} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - {{- else }} - emptyDir: {} - {{- end }} - - name: config-volume - secret: - secretName: {{ include "thanos.secretname" . }} - {{- with .Values.compact.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.compact.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-pvc.yaml b/charts/kubecost/charts/thanos/templates/compact-pvc.yaml deleted file mode 100644 index f6b33e491..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-pvc.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.compact.enabled }} -{{- if .Values.compact.dataVolume -}} -{{- if .Values.compact.dataVolume.persistentVolumeClaim -}} -{{- if .Values.compact.dataVolume.persistentVolumeClaim.claimName -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ .Values.compact.dataVolume.persistentVolumeClaim.claimName }} -spec: - accessModes: - - ReadWriteOnce - {{- if .Values.compact.dataVolume.persistentVolumeClaim.storageClass }} - storageClassName: {{ .Values.compact.dataVolume.persistentVolumeClaim.storageClass }} - {{- end }} - resources: - requests: - {{- if .Values.compact.dataVolume.persistentVolumeClaim.storage }} - storage: {{ .Values.compact.dataVolume.persistentVolumeClaim.storage }} - {{- else }} - storage: 100Gi - {{- end }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-service.yaml b/charts/kubecost/charts/thanos/templates/compact-service.yaml deleted file mode 100644 index 080821849..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-service.yaml +++ /dev/null @@ -1,30 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.compact.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "compact") }} - {{- with .Values.compact.http.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: compact -{{ with .Values.compact.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - ports: - - port: {{ .Values.compact.http.port }} - protocol: TCP - targetPort: http - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact -{{ with .Values.compact.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{ end}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml deleted file mode 100644 index bc224d802..000000000 --- a/charts/kubecost/charts/thanos/templates/compact-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.compact.enabled .Values.compact.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "compact") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: compact -{{ with .Values.compact.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-compact - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: compact - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.compact.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.compact.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-deployment.yaml b/charts/kubecost/charts/thanos/templates/query-deployment.yaml deleted file mode 100644 index 74e96d09c..000000000 --- a/charts/kubecost/charts/thanos/templates/query-deployment.yaml +++ /dev/null @@ -1,148 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.query.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} - {{- with .Values.query.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if not .Values.query.autoscaling.enabled }} - replicas: {{ .Values.query.replicaCount | default 1 }} -{{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.query.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.query.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.query.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-query - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - args: - - "query" - - "--log.level={{ .Values.query.logLevel }}" - - "--grpc-address=0.0.0.0:{{ .Values.query.grpc.port }}" - - "--http-address=0.0.0.0:{{ .Values.query.http.port }}" - - "--query.timeout={{ .Values.query.timeout }}" - - "--query.max-concurrent={{ .Values.query.maxConcurrent }}" - {{- if .Values.query.autoDownsampling }} - - "--query.auto-downsampling" - {{- end }} - {{- if .Values.query.replicaLabel }} - - "--query.replica-label={{ .Values.query.replicaLabel }}" - {{- end }} - {{- if .Values.query.webRoutePrefix }} - - "--web.route-prefix={{ .Values.query.webRoutePrefix }}" - {{- end }} - {{- if .Values.query.webExternalPrefix }} - - "--web.external-prefix={{ .Values.query.webExternalPrefix }}" - {{- end }} - {{- if .Values.query.webPrefixHeader }} - - "--web.prefix-header={{ .Values.query.webPrefixHeader }}" - {{- end }} - {{- if .Values.query.storeDNSResolver }} - - "--store.sd-dns-resolver={{ .Values.query.storeDNSResolver }}" - {{- end }} - {{- if .Values.query.storeDNSDiscovery }} - - "--store=dnssrv+_grpc._tcp.{{ include "thanos.componentname" (list $ "store") }}-grpc.{{ .Release.Namespace }}.svc" - {{- end }} - {{- if .Values.query.sidecarDNSDiscovery }} - - "--store=dnssrv+_grpc._tcp.{{ include "thanos.componentname" (list $ "sidecar") }}-grpc.{{ .Release.Namespace }}.svc" - {{- end }} - {{- range .Values.query.stores }} - - "--store={{ . }}" - {{- end }} - {{- range .Values.query.serviceDiscoveryFiles }} - - "--store.sd-files={{ . }}" - {{- end }} - {{- range .Values.query.serviceDiscoveryFileConfigMaps }} - - "--store.sd-files=/etc/query/{{ . }}/*.yaml" - - "--store.sd-files=/etc/query/{{ . }}/*.yml" - - "--store.sd-files=/etc/query/{{ . }}/*.json" - {{- end }} - {{- if .Values.query.serviceDiscoveryInterval }} - - "--store.sd-interval={{ .Values.query.serviceDiscoveryInterval }}" - {{- end }} - - {{- if .Values.query.extraArgs }} - {{ toYaml .Values.query.extraArgs | nindent 8 }} - {{- end }} - ports: - - name: http - containerPort: {{ .Values.query.http.port }} - - name: grpc - containerPort: {{ .Values.query.grpc.port }} - resources: - {{ toYaml .Values.query.resources | nindent 10 }} - env: - {{- toYaml .Values.query.extraEnv | nindent 10 }} - volumeMounts: - {{- range .Values.query.serviceDiscoveryFileConfigMaps }} - - mountPath: /etc/query/{{ . }} - name: {{ . }} - {{- end }} - {{- if .Values.query.certSecretName }} - - mountPath: /etc/certs - name: {{ .Values.query.certSecretName }} - readOnly: true - {{- end }} - livenessProbe: - httpGet: - path: /-/healthy - port: http - volumes: - {{- range .Values.query.serviceDiscoveryFileConfigMaps }} - - name: {{ . }} - configMap: - defaultMode: 420 - name: {{ . }} - {{- end }} - {{- if .Values.query.certSecretName }} - - name: {{ .Values.query.certSecretName }} - secret: - defaultMode: 420 - secretName: {{ .Values.query.certSecretName }} - {{- end }} - {{- with .Values.query.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.query.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml deleted file mode 100644 index 05c32682d..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-deployment.yaml +++ /dev/null @@ -1,122 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.queryFrontend.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} - {{- with .Values.queryFrontend.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if not .Values.queryFrontend.autoscaling.enabled }} - replicas: {{ .Values.queryFrontend.replicaCount | default 1 }} -{{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.labels }}{{ toYaml . | indent 8 }}{{ end }} - {{- with .Values.queryFrontend.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.queryFrontend.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.queryFrontend.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-query-frontend - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - args: - - "query-frontend" - - "--log.level={{ .Values.queryFrontend.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.queryFrontend.http.port }}" - - "--query-frontend.downstream-url=http://{{ include "thanos.componentname" (list $ "query") }}-http.{{ .Release.Namespace }}:{{ .Values.query.http.port }}" - - "--query-range.split-interval={{ .Values.queryFrontend.splitInterval }}" - - "--query-range.max-retries-per-request={{ .Values.queryFrontend.maxRetriesPerRequest }}" - - "--query-range.max-query-length={{ .Values.queryFrontend.maxQueryLength }}" - - "--query-range.max-query-parallelism={{ .Values.queryFrontend.maxQueryParallelism }}" - - "--query-range.response-cache-max-freshness={{ .Values.queryFrontend.responseCacheMaxFreshness }}" - {{- if .Values.queryFrontend.responseCache.enabled }} - {{- with .Values.queryFrontend.responseCache }} - - |- - --query-range.response-cache-config= - config: - max_size: {{ quote .maxSize }} - max_size_items: {{ .maxSizeItems }} - validity: {{ quote .validity }} - type: "in-memory" - {{- end }} - {{- else if .Values.queryFrontend.responseCacheConfigFile }} - - "--query-range.response-cache-config-file={{ .Values.queryFrontend.responseCacheConfigFile }}" - {{- else if .Values.queryFrontend.responseCacheConfig }} - - |- - --query-range.response-cache-config={{ toYaml .Values.queryFrontend.responseCacheConfig | nindent 12 }} - {{- end }} - {{- if .Values.queryFrontend.compressResponses }} - - "--query-frontend.compress-responses" - {{- end }} - {{- if .Values.queryFrontend.partialResponse }} - - "--query-range.partial-response" - {{- end }} - {{- if .Values.queryFrontend.extraArgs }} - {{ toYaml .Values.queryFrontend.extraArgs | nindent 8 }} - {{- end }} - ports: - - name: http - containerPort: {{ .Values.queryFrontend.http.port }} - resources: - {{ toYaml .Values.queryFrontend.resources | nindent 10 }} - env: - {{- toYaml .Values.queryFrontend.extraEnv | nindent 10 }} - volumeMounts: - {{- if .Values.queryFrontend.certSecretName }} - - mountPath: /etc/certs - name: {{ .Values.queryFrontend.certSecretName }} - readOnly: true - {{- end }} - livenessProbe: - httpGet: - path: /-/healthy - port: http - volumes: - {{- if .Values.queryFrontend.certSecretName }} - - name: {{ .Values.queryFrontend.certSecretName }} - secret: - defaultMode: 420 - secretName: {{ .Values.queryFrontend.certSecretName }} - {{- end }} - {{- with .Values.queryFrontend.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.queryFrontend.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{ end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml deleted file mode 100644 index 3d08e459b..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-horizontalpodautoscaler.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.queryFrontend.enabled }} -{{- if .Values.queryFrontend.autoscaling.enabled }} -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - minReplicas: {{ .Values.queryFrontend.autoscaling.minReplicas }} - maxReplicas: {{ .Values.queryFrontend.autoscaling.maxReplicas }} - metrics: -{{- with .Values.queryFrontend.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - targetAverageUtilization: {{ . }} -{{- end }} -{{- with .Values.queryFrontend.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - targetAverageUtilization: {{ . }} -{{- end }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml b/charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml deleted file mode 100644 index 5423cecf2..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-ingress.yml +++ /dev/null @@ -1,45 +0,0 @@ ---- -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.queryFrontend.enabled .Values.queryFrontend.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }}-http - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend - {{- if .Values.queryFrontend.http.ingress.labels }} - {{ toYaml .Values.queryFrontend.http.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.queryFrontend.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.queryFrontend.http.ingress.tls }} - tls: - {{- range .Values.queryFrontend.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - {{- if .secretName }} - secretName: {{ .secretName }} - {{- end}} - {{- end }} - {{- end }} - rules: - {{- range .Values.queryFrontend.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.queryFrontend.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "query-frontend") }}-http - servicePort: {{ $.Values.queryFrontend.http.port }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml deleted file mode 100644 index 5cfef4756..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-poddisruptionbudget.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.queryFrontend.enabled .Values.queryFrontend.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - {{- if .Values.queryFrontend.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.queryFrontend.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.queryFrontend.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.queryFrontend.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/component: query-frontend -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-service.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-service.yaml deleted file mode 100644 index 2521e898a..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-service.yaml +++ /dev/null @@ -1,34 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.queryFrontend.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }}-http - {{- with .Values.queryFrontend.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.queryFrontend.http.service.type }} - {{- if .Values.queryFrontend.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.queryFrontend.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.queryFrontend.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml deleted file mode 100644 index 004367519..000000000 --- a/charts/kubecost/charts/thanos/templates/query-frontend-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.queryFrontend.enabled .Values.queryFrontend.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "query-frontend") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query-frontend -{{ with .Values.queryFrontend.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-query - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query-frontend - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.queryFrontend.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.queryFrontend.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml b/charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml deleted file mode 100644 index 9b38473d8..000000000 --- a/charts/kubecost/charts/thanos/templates/query-horizontalpodautoscaler.yaml +++ /dev/null @@ -1,37 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.query.enabled }} -{{- if .Values.query.autoscaling.enabled }} -apiVersion: autoscaling/v2beta1 -kind: HorizontalPodAutoscaler -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: {{ include "thanos.componentname" (list $ "query") }} - minReplicas: {{ .Values.query.autoscaling.minReplicas }} - maxReplicas: {{ .Values.query.autoscaling.maxReplicas }} - metrics: -{{- with .Values.query.autoscaling.targetMemoryUtilizationPercentage }} - - type: Resource - resource: - name: memory - targetAverageUtilization: {{ . }} -{{- end }} -{{- with .Values.query.autoscaling.targetCPUUtilizationPercentage }} - - type: Resource - resource: - name: cpu - targetAverageUtilization: {{ . }} -{{- end }} -{{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-ingress.yml b/charts/kubecost/charts/thanos/templates/query-ingress.yml deleted file mode 100644 index cfda4a0e3..000000000 --- a/charts/kubecost/charts/thanos/templates/query-ingress.yml +++ /dev/null @@ -1,89 +0,0 @@ ---- -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.query.enabled .Values.query.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-http - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query - {{- if .Values.query.http.ingress.labels }} - {{ toYaml .Values.query.http.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.query.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.query.http.ingress.tls }} - tls: - {{- range .Values.query.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - {{- if .secretName }} - secretName: {{ .secretName }} - {{- end}} - {{- end }} - {{- end }} - rules: - {{- range .Values.query.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.query.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "query") }}-http - servicePort: {{ $.Values.query.http.port }} - {{- end }} -{{- end }} - -{{- if and .Values.query.enabled .Values.query.grpc.ingress.enabled }} ---- -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-grpc - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query - {{- if .Values.query.grpc.ingress.labels }} - {{ toYaml .Values.grpc.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.query.grpc.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.query.grpc.ingress.tls }} - tls: - {{- range .Values.query.grpc.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - {{- if .secretName }} - secretName: {{ .secretName }} - {{- end}} - {{- end }} - {{- end }} - rules: - {{- range .Values.query.grpc.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.query.grpc.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "query") }}-grpc - servicePort: {{ $.Values.query.http.port }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml b/charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml deleted file mode 100644 index efc2c817c..000000000 --- a/charts/kubecost/charts/thanos/templates/query-poddisruptionbudget.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.query.enabled .Values.query.podDisruptionBudget.enabled }} -apiVersion: policy/v1beta1 -kind: PodDisruptionBudget -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - {{- if .Values.query.podDisruptionBudget.minAvailable }} - minAvailable: {{ .Values.query.podDisruptionBudget.minAvailable }} - {{- end }} - {{- if .Values.query.podDisruptionBudget.maxUnavailable }} - maxUnavailable: {{ .Values.query.podDisruptionBudget.maxUnavailable }} - {{- end }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/component: query -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-service.yaml b/charts/kubecost/charts/thanos/templates/query-service.yaml deleted file mode 100644 index 89178a4e1..000000000 --- a/charts/kubecost/charts/thanos/templates/query-service.yaml +++ /dev/null @@ -1,65 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.query.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-grpc - {{- with .Values.query.grpc.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.grpc.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: ClusterIP - clusterIP: None - ports: - - port: {{ .Values.query.grpc.port }} - targetPort: grpc - protocol: TCP - name: grpc - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.grpc.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} - ---- - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "query") }}-http - {{- with .Values.query.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.query.http.service.type }} - {{- if .Values.query.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.query.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.query.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query -{{ with .Values.query.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml deleted file mode 100644 index 673445428..000000000 --- a/charts/kubecost/charts/thanos/templates/query-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.query.enabled .Values.query.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "query") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: query -{{ with .Values.query.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-query - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: query - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.query.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.query.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/sidecar-service.yaml b/charts/kubecost/charts/thanos/templates/sidecar-service.yaml deleted file mode 100644 index 021bdfaf9..000000000 --- a/charts/kubecost/charts/thanos/templates/sidecar-service.yaml +++ /dev/null @@ -1,61 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.sidecar.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "sidecar") }}-grpc - {{- with .Values.sidecar.grpc.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: sidecar -{{ with .Values.sidecar.grpc.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: ClusterIP - clusterIP: None - ports: - - port: {{ .Values.sidecar.grpc.port }} - protocol: TCP - targetPort: grpc - name: grpc - selector: - app: prometheus -{{ with .Values.sidecar.grpc.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} - ---- - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "sidecar") }}-http - {{- with .Values.sidecar.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: sidecar -{{ with .Values.store.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.sidecar.http.service.type }} - {{- if .Values.sidecar.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.sidecar.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.sidecar.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app: prometheus -{{ with .Values.sidecar.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml deleted file mode 100644 index 6271a23ca..000000000 --- a/charts/kubecost/charts/thanos/templates/sidecar-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.sidecar.enabled .Values.sidecar.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "sidecar") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: sidecar -{{ with .Values.sidecar.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-sidecar - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: sidecar - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.sidecar.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.sidecar.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-deployment.yaml b/charts/kubecost/charts/thanos/templates/store-deployment.yaml deleted file mode 100644 index d8f0d3b1b..000000000 --- a/charts/kubecost/charts/thanos/templates/store-deployment.yaml +++ /dev/null @@ -1,121 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{ if .Values.store.enabled }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "thanos.componentname" (list $ "store") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.deploymentLabels }}{{ toYaml . | indent 4 }}{{ end }} - {{- with .Values.store.deploymentAnnotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - replicas: {{ .Values.store.replicaCount | default 1 }} - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store -{{ with .Values.store.deploymentMatchLabels }}{{ toYaml . | indent 6 }}{{ end }} - template: - metadata: - labels: -{{ with .Values.store.labels }}{{ toYaml . | indent 8 }}{{ end }} - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store - {{- with .Values.store.annotations }} - annotations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- if .Values.store.metrics.annotations.enabled }} - prometheus.io/scrape: "true" - prometheus.io/port: "{{ .Values.store.http.port }}" - {{- end }} - spec: - containers: - - name: thanos-store - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} - args: - - "store" - - "--data-dir=/var/thanos/store" - - "--log.level={{ .Values.store.logLevel }}" - - "--http-address=0.0.0.0:{{ .Values.store.http.port }}" - - "--grpc-address=0.0.0.0:{{ .Values.store.grpc.port }}" - - "--objstore.config-file=/etc/config/object-store.yaml" - {{- if .Values.store.indexCacheSize }} - - "--index-cache-size={{ .Values.store.indexCacheSize }}" - {{- end }} - {{- if .Values.store.chunkPoolSize }} - - "--chunk-pool-size={{ .Values.store.chunkPoolSize }}" - {{- end }} - {{- if .Values.store.grpcSeriesSampleLimit }} - - "--store.grpc.series-sample-limit={{ .Values.store.grpcSeriesSampleLimit }}" - {{- end }} - {{- if .Values.store.grpcSeriesMaxConcurrency }} - - "--store.grpc.series-max-concurrency={{ .Values.store.grpcSeriesMaxConcurrency }}" - {{- end }} - {{- if .Values.store.syncBlockDuration }} - - "--sync-block-duration={{ .Values.store.syncBlockDuration }}" - {{- end }} - {{- if .Values.store.blockSyncConcurrency }} - - "--block-sync-concurrency={{ .Values.store.blockSyncConcurrency }}" - {{- end }} - {{- if .Values.store.extraArgs }} - {{ toYaml .Values.store.extraArgs | nindent 8 }} - {{- end }} - ports: - - name: http - containerPort: {{ .Values.store.http.port }} - - name: grpc - containerPort: {{ .Values.store.grpc.port }} - env: - {{- toYaml .Values.store.extraEnv | nindent 10 }} - volumeMounts: - - name: config-volume - mountPath: /etc/config - readOnly: true - - name: data - mountPath: /var/thanos/store - {{- if .Values.store.certSecretName }} - - mountPath: /etc/certs - name: {{ .Values.store.certSecretName }} - readOnly: true - {{- end }} - resources: - {{ toYaml .Values.store.resources | nindent 10 }} - volumes: - - name: data - emptyDir: {} - - name: config-volume - secret: - secretName: {{ include "thanos.secretname" . }} - {{- if .Values.store.certSecretName }} - - name: {{ .Values.store.certSecretName }} - secret: - defaultMode: 420 - secretName: {{ .Values.store.certSecretName }} - {{- end }} - {{- with .Values.store.securityContext }} - securityContext: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.nodeSelector }} - nodeSelector: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.affinity }} - affinity: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.tolerations }} - tolerations: {{ toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.store.serviceAccount }} - serviceAccountName: "{{ . }}" - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-ingress.yaml b/charts/kubecost/charts/thanos/templates/store-ingress.yaml deleted file mode 100644 index 4d18c019e..000000000 --- a/charts/kubecost/charts/thanos/templates/store-ingress.yaml +++ /dev/null @@ -1,85 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.store.enabled .Values.store.http.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-http - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store - {{- if .Values.store.http.ingress.labels }} - {{ toYaml .Values.store.http.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.store.http.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.store.http.ingress.tls }} - tls: - {{- range .Values.store.http.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.store.http.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.store.http.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "store") }}-http - servicePort: {{ $.Values.store.http.port }} - {{- end }} -{{- end }} - ---- - - {{- if and .Values.store.enabled .Values.store.grpc.ingress.enabled }} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-grpc - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store - {{- if .Values.store.grpc.ingress.labels }} - {{ toYaml .Values.grpc.ingress.labels | indent 4 }} - {{- end }} - {{- with .Values.store.grpc.ingress.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} -spec: - {{- if .Values.store.grpc.ingress.tls }} - tls: - {{- range .Values.store.grpc.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} - {{- end }} - rules: - {{- range .Values.store.grpc.ingress.hosts }} - - host: {{ . }} - http: - paths: - - path: {{ $.Values.store.grpc.ingress.path }} - backend: - serviceName: {{ include "thanos.componentname" (list $ "store") }}-grpc - servicePort: {{ $.Values.store.http.port }} - {{- end }} -{{- end }} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-service.yaml b/charts/kubecost/charts/thanos/templates/store-service.yaml deleted file mode 100644 index ce5894fa3..000000000 --- a/charts/kubecost/charts/thanos/templates/store-service.yaml +++ /dev/null @@ -1,65 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if .Values.store.enabled }} -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-grpc - {{- with .Values.store.grpc.service.annotations }} - annotations: {{ toYaml . | nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.grpc.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: ClusterIP - clusterIP: None - ports: - - port: {{ .Values.store.grpc.port }} - targetPort: grpc - protocol: TCP - name: grpc - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store -{{ with .Values.store.grpc.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} - ---- - -apiVersion: v1 -kind: Service -metadata: - name: {{ include "thanos.componentname" (list $ "store") }}-http - {{- with .Values.store.http.service.annotations }} - annotations: {{ toYaml .| nindent 4 }} - {{- end }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ $.Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.http.service.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - type: {{ .Values.store.http.service.type }} - {{- if .Values.store.http.service.externalTrafficPolicy }} - externalTrafficPolicy: {{ .Values.store.http.externalTrafficPolicy }} - {{- end }} - ports: - - port: {{ .Values.store.http.port }} - targetPort: http - protocol: TCP - name: http - selector: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store -{{ with .Values.store.http.service.matchLabels }}{{ toYaml . | indent 4 }}{{ end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml b/charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml deleted file mode 100644 index c181c6416..000000000 --- a/charts/kubecost/charts/thanos/templates/store-servicemonitor.yaml +++ /dev/null @@ -1,32 +0,0 @@ -{{ if .Values.global.thanos.enabled }} -{{- if and .Values.store.enabled .Values.store.metrics.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "thanos.componentname" (list $ "store") }} - labels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - helm.sh/chart: {{ include "thanos.chart" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{ .Release.Service }} - app.kubernetes.io/version: {{ .Chart.AppVersion | replace "+" "_" }} - app.kubernetes.io/component: store -{{ with .Values.store.metrics.serviceMonitor.labels }}{{ toYaml . | indent 4 }}{{ end }} -spec: - jobLabel: thanos-store - selector: - matchLabels: - app.kubernetes.io/name: {{ include "thanos.name" . }} - app.kubernetes.io/instance: {{ .Release.Name }} - app.kubernetes.io/component: store - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - endpoints: - - port: http - interval: {{ .Values.store.metrics.serviceMonitor.interval | default "15s" }} - {{- with .Values.store.metrics.serviceMonitor.relabellings }} - metricRelabelings: {{ toYaml . | nindent 8 }} - {{- end }} -{{- end -}} -{{ end }} diff --git a/charts/kubecost/charts/thanos/values.yaml b/charts/kubecost/charts/thanos/values.yaml deleted file mode 100644 index 0a11a2627..000000000 --- a/charts/kubecost/charts/thanos/values.yaml +++ /dev/null @@ -1,739 +0,0 @@ -image: - repository: thanosio/thanos - tag: v0.15.0 - pullPolicy: IfNotPresent - -store: - enabled: true - # Maximum size of items held in the index cache. - indexCacheSize: 250MB - # Maximum size of concurrently allocatable bytes for chunks. - chunkPoolSize: 2GB - # Maximum amount of samples returned via a single series call. 0 means no limit. - # NOTE: for efficiency we take 120 as the number of samples in chunk (it cannot be bigger than that), - # so the actual number of samples might be lower, even though the maximum could be hit. - grpcSeriesSampleLimit: 0 - # Maximum number of concurrent Series calls. - grpcSeriesMaxConcurrency: 20 - # Repeat interval for syncing the blocks between local and remote view. - syncBlockDuration: 3m - # Number of goroutines to use when syncing blocks from object storage. - blockSyncConcurrency: 20 - # Log filtering level. - logLevel: info - # Add extra environment variables to store - extraEnv: [] - # - name: ENV - # value: value - # - # Add extra arguments to the store service - extraArgs: [] - # - "--extraargs=extravalue" - # - # Number of replicas running from store component - replicaCount: 1 - # Extra labels for store pod template - labels: {} - # cluster: example - # - # Extra annotations for store pod template - annotations: {} - # example.com: default - # - # Add extra labels to store deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to store deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to store deployment - deploymentMatchLabels: {} - # Enable metrics collecting for store service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - # The grpc endpoint to communicate with other components - grpc: - # grpc listen port number - port: 10901 - # Service definition for query grpc service - service: - # Annotations to query grpc service - annotations: {} - # Labels to query grpc service - labels: {} - matchLabels: {} - # Set up ingress for the grpc service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for query http service - service: - type: ClusterIP - # Annotations to query http service - annotations: {} - # Labels to query http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for store pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - serviceAccount: "" - -# Query Frontend Component -queryFrontend: - enabled: true - - # Split queries by an interval and execute in parallel, 0 disables it. - splitInterval: 24h - - # Maximum number of retries for a single request; beyond this, the downstream error is returned. - maxRetriesPerRequest: 5 - - # Limit the query time range (end - start time) in the query-frontend, 0 disables it. - maxQueryLength: 0 - - # Maximum number of queries will be scheduled in parallel by the frontend.\ - maxQueryParallelism: 14 - - # Most recent allowed cacheable result, to prevent caching very recent results that might still be in flux. - responseCacheMaxFreshness: 1m - - # Path to YAML file that contains response cache configuration. - # responseCacheConfigFile: - - # Response Cache Configuration - responseCache: - enabled: false - maxSize: 512MB - maxSizeItems: 0 - validity: 10m - - # Response cache configuration content - # responseCacheConfig: - - # Enable partial response for queries if no partial_response param is specified. --no-query-range.partial-response for disabling. - # partialResponse: false - - # Compress HTTP responses. - compressResponses: true - - logLevel: info - # Add extra environment variables to query - extraEnv: [] - # - name: ENV - # value: value - # - # Add extra arguments to the query service - extraArgs: [] - # - "--extraargs=extravalue" - # - # Number of replicas running from query component - replicaCount: 1 - # Enable HPA for query component - autoscaling: - enabled: false - minReplicas: 2 - maxReplicas: 3 - targetCPUUtilizationPercentage: 50 - targetMemoryUtilizationPercentage: 50 - # Enable podDisruptionBudget for query component - podDisruptionBudget: - enabled: false - # minAvailable and maxUnavailable can't be used simultaneous. Choose one. - minAvailable: 1 - # maxUnavailable: 50% - - serviceAccount: "" - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for query http service - service: - type: ClusterIP - # Annotations to query http service - annotations: {} - # Labels to query http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - certSecretName: "" - # Extra labels for query pod template - labels: {} - # cluster: example - # - # Extra annotations for query pod template - annotations: {} - # example.com: default - # - # Add extra labels to query deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to query deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to query deployment - deploymentMatchLabels: {} - - # Enable metrics collecting for query service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for compact pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - -query: - enabled: true - # Label to treat as a replica indicator along which data is deduplicated. - # Still you will be able to query without deduplication using 'dedup=false' parameter. - replicaLabel: "" - # Prefix for API and UI endpoints. This allows thanos UI to be served on a sub-path. - # This option is analogous to --web.route-prefix of Promethus. - webRoutePrefix: "" - # Static prefix for all HTML links and redirect - # URLs in the UI query web interface. Actual - # endpoints are still served on / or the - # web.route-prefix. This allows thanos UI to be - # served behind a reverse proxy that strips a URL - # sub-path. - webExternalPrefix: "" - # Name of HTTP request header used for dynamic prefixing of UI links and redirects. - # This option is ignored if web.external-prefix argument is set. Security risk: enable this - # option only if a reverse proxy in front of thanos is resetting the header. The --web.prefix-header=X-Forwarded-Prefix option - # can be useful, for example, if Thanos UI is served via Traefik reverse proxy with PathPrefixStrip option enabled, which sends the - # stripped prefix value in X-Forwarded-Prefix header. This allows thanos UI to be served on a sub-path - webPrefixHeader: "" - # Maximum time to process query by query node. - timeout: 2m - # Maximum number of queries processed concurrently by query node. - maxConcurrent: 16 - # Maximum number of select requests made concurrently per a query. - maxConcurrentSelect: 4 - # Enable automatic adjustment (step / 5) to what source of data should be used in store gateways - # if no max_source_resolution param is specified. - autoDownsampling: false - # https://github.com/improbable-eng/thanos/issues/1015 - storeDNSResolver: miekgdns - # Enable DNS discovery for stores - storeDNSDiscovery: true - # Enable DNS discovery for sidecars (this is for the chart built-in sidecar service) - sidecarDNSDiscovery: true - # Addresses of statically configured store API servers (repeatable). - # The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect store API servers through respective DNS lookups. - stores: [] - # - "dnssrv+_grpc._tcp...svc" - # - # Path to files that contains addresses of store API servers. The path can be a glob pattern (repeatable). - serviceDiscoveryFiles: [] - # Names of configmaps that contain addresses of store API servers, used for file service discovery. - serviceDiscoveryFileConfigMaps: [] - # Refresh interval to re-read file SD files. It is used as a resync fallback. - serviceDiscoveryInterval: 5m - # Log filtering level. - logLevel: info - # Add extra environment variables to query - extraEnv: [] - # - name: ENV - # value: value - # - # Add extra arguments to the query service - extraArgs: [] - # - "--extraargs=extravalue" - # - # Number of replicas running from query component - replicaCount: 1 - # Enable HPA for query component - autoscaling: - enabled: false - minReplicas: 2 - maxReplicas: 3 - targetCPUUtilizationPercentage: 50 - targetMemoryUtilizationPercentage: 50 - # Enable podDisruptionBudget for query component - podDisruptionBudget: - enabled: false - # minAvailable and maxUnavailable can't be used simultaneous. Choose one. - minAvailable: 1 - # maxUnavailable: 50% - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for query http service - service: - type: ClusterIP - # Annotations to query http service - annotations: {} - # Labels to query http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - certSecretName: "" - # Extra labels for query pod template - labels: {} - # cluster: example - # - # Extra annotations for query pod template - annotations: {} - # example.com: default - # - # Add extra labels to query deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to query deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to query deployment - deploymentMatchLabels: {} - - # Enable metrics collecting for query service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for compact pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - - # The grpc endpoint to communicate with other components - grpc: - # grpc listen port number - port: 10901 - # Service definition for query grpc service - service: - # Annotations to query grpc service - annotations: {} - # labels to query grpc service - labels: {} - matchLabels: {} - # Set up ingress for the grpc service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - serviceAccount: "" - -compact: - enabled: true - # Minimum age of fresh (non-compacted) blocks before they are being processed. - # Malformed blocks older than the maximum of consistency-delay and 30m0s will be removed. - consistencyDelay: 30m - # How long to retain raw samples in bucket. Setting this to 0d will retain samples of this resolution forever - retentionResolutionRaw: 1825d - # How long to retain samples of resolution 1 (5 minutes) in bucket. Setting this to 0d will retain samples of this resolution forever - retentionResolution5m: 1825d - # How long to retain samples of resolution 2 (1 hour) in bucket. Setting this to 0d will retain samples of this resolution forever - retentionResolution1h: 1825d - # Number of goroutines to use when compacting groups. - compactConcurrency: 1 - # Number of goroutines to use when syncing block metadata from object storage. - blockSyncConcurrency: 20 - # Disables Downsampling data - disableDownsampling: false - # Log filtering level. - logLevel: info - # Compact service listening http port - http: - port: 10902 - service: - labels: {} - # Add extra environment variables to compact - extraEnv: - # - name: ENV - # value: value - # - # Add extra arguments to the compact service - extraArgs: - # - "--extraargs=extravalue" - # - # Data volume for the compactor to store temporary data defaults to emptyDir - # dataVolume: - # persistentVolumeClaim: - # claimName: compact-data-volume - # storage: 100Gi - # Extra labels for compact pod template - labels: {} - # cluster: example - # - # Extra annotations for compact pod template - annotations: {} - # example.com: default - # - # Add extra labels to compact deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to compact deployment - deploymentAnnotations: {} - # extraAnnotation: extraAnnotationValue - # - # Add extra selector matchLabels to compact deployment - deploymentMatchLabels: {} - # - # Enable metrics collecting for compact service - metrics: - # This is the Prometheus annotation type scraping configuration - annotations: - enabled: false - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - serviceAccount: "" - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for compact pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - -bucket: - enabled: true - # Number of replicas running from bucket component - replicaCount: 1 - # Log filtering level. - logLevel: info - # Refresh interval to download metadata from remote storage - refresh: 30m - # Timeout to download metadata from remote storage - timeout: 5m - # Prometheus label to use as timeline title - label: "" - # The http endpoint to communicate with other components - http: - # http listen port number - port: 8080 - # Service definition for bucket http service - service: - type: ClusterIP - # Annotations to bucket http service - annotations: {} - # Labels to bucket http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - # Add extra environment variables to bucket - extraEnv: - # - name: ENV - # value: value - # - # Add extra arguments to the bucket service - extraArgs: - # - "--extraargs=extravalue" - # - # Extra labels for bucket pod template - labels: {} - # cluster: example - # - # Extra annotations for bucket pod template - annotations: {} - # example.com: default - # - # Add extra labels to bucket deployment - deploymentLabels: {} - # extraLabel: extraLabelValue - # - # Add extra annotations to bucket deployment - deploymentAnnotations: {} - # - # Add extra selector matchLabels to bucket deployment - deploymentMatchLabels: {} - - # Enable podDisruptionBudget for bucket component - podDisruptionBudget: - enabled: false - # minAvailable and maxUnavailable can't be used simultaneous. Choose one. - minAvailable: 1 - # maxUnavailable: 50% - - # Optional securityContext - securityContext: {} - resources: {} - # limits: - # cpu: 2000m - # memory: 16Gi - # requests: - # cpu: 1000m - # memory: 4Gi - # - # Node tolerations for server scheduling to nodes with taints - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - # - # Node labels for bucket pod assignment - # Ref: https://kubernetes.io/docs/user-guide/node-selection/ - # - nodeSelector: {} - # - # Pod affinity - # Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#node-affinity - affinity: {} - serviceAccount: "" - -sidecar: - # NOTE: This is only the service references for the sidecar - enabled: true - # Enable metrics collecting for sidecar service - metrics: - # Enable ServiceMonitor https://github.com/coreos/prometheus-operator - serviceMonitor: - enabled: false - # Labels for prometheus-operator to find servicemonitor - labels: {} - # The grpc endpoint to communicate with other components - grpc: - # grpc listen port number - port: 10901 - # Service definition for sidecar grpc service - service: - # Annotations to sidecar grpc service - annotations: {} - # Labels to sidecar grpc service - labels: {} - matchLabels: {} - # Set up ingress for the grpc service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - - # The http endpoint to communicate with other components - http: - # http listen port number - port: 10902 - # Service definition for sidecar http service - service: - type: ClusterIP - # Annotations to sidecar http service - annotations: {} - # Labels to sidecar http service - labels: {} - matchLabels: {} - # Set up ingress for the http service - ingress: - enabled: false - annotations: {} - # kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - labels: {} - path: "/" - hosts: - - "/" - tls: [] - # - secretName: chart-example-tls - # hosts: - # - chart-example.local - -storeSecretName: diff --git a/charts/kubecost/cluster-metrics.json b/charts/kubecost/cluster-metrics.json deleted file mode 100644 index 0e6638252..000000000 --- a/charts/kubecost/cluster-metrics.json +++ /dev/null @@ -1,1663 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Cost metrics from the Kubecost product", - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 7, - "iteration": 1558062099204, - "links": [], - "panels": [ - { - "content": "Note: this dashboard requires Kubecost metrics to be available in your Prometheus deployment. [Learn more](https://github.com/kubecost/cost-model/blob/master/PROMETHEUS.md)", - "gridPos": { - "h": 2, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 27, - "links": [], - "mode": "markdown", - "title": "", - "transparent": true, - "type": "text" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly run rate of CPU + GPU costs based on currently provisioned resources.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 0, - "y": 2 - }, - "hideTimeOverride": true, - "id": 2, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "CPU Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly run rate of memory costs based on currently provisioned expenses.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 6, - "y": 2 - }, - "hideTimeOverride": true, - "id": 3, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n)", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Memory Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly run rate of attached storage and PV costs based on currently provisioned resources.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 6, - "x": 12, - "y": 2 - }, - "hideTimeOverride": true, - "id": 4, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Storage Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Sum of compute, memory, storage and network costs.", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 7, - "w": 6, - "x": 18, - "y": 2 - }, - "hideTimeOverride": true, - "id": 11, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "# Compute\nsum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n\n# Memory\nsum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n# Storage \n\nsum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Total Cost", - "type": "singlestat", - "valueFontSize": "120%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Current CPU use from applications divided by allocatable CPUs", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 5 - }, - "height": "180px", - "hideTimeOverride": true, - "id": 13, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(\n sum(\n count(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n * on (instance) \n sum(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n ) \n / \n (sum (kube_node_status_allocatable_cpu_cores))\n) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30, 80", - "timeFrom": "", - "title": "CPU Utilization", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Current CPU reservation requests from applications vs allocatable CPU", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 5 - }, - "height": "180px", - "id": 15, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "SUM(kube_pod_container_resource_requests_cpu_cores) / SUM(kube_node_status_allocatable_cpu_cores) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30, 80", - "title": "CPU Requests", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "description": "Current RAM use vs RAM available", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 5 - }, - "height": "180px", - "hideTimeOverride": true, - "id": 17, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "SUM(container_memory_usage_bytes{namespace!=\"\"}) / SUM(kube_node_status_allocatable_memory_bytes) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - }, - { - "expr": "", - "format": "time_series", - "intervalFactor": 1, - "refId": "B" - } - ], - "thresholds": "30,80", - "timeFrom": "", - "title": "RAM Utilization", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "description": "Current RAM requests vs RAM available", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 5 - }, - "height": "180px", - "id": 19, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"})\n /\n sum(kube_node_status_allocatable_memory_bytes)\n) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30,80", - "title": "RAM Requests", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "This gauge shows the current standard storage use, including cluster storage, vs storage available", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 5 - }, - "height": "180px", - "hideTimeOverride": true, - "id": 21, - "interval": null, - "isNew": true, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) /\nsum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) * 100", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "refId": "A", - "step": 10 - } - ], - "thresholds": "30, 80", - "timeFrom": "", - "title": "Storage Utilization", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of CPU + GPU costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 0, - "y": 9 - }, - "id": 6, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 +\n avg(node_gpu_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "compute cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Compute Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "currencyUSD", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of memory costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 6, - "y": 9 - }, - "id": 9, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "memory cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Memory Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "currencyUSD", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of attached disk + PV storage costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 12, - "y": 9 - }, - "id": 10, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(avg_over_time(pv_hourly_cost[$timeRange] offset 1m)) by (persistentvolume) * 730 \n * avg(avg_over_time(kube_persistentvolume_capacity_bytes[$timeRange] offset 1m)) by (persistentvolume) / 1024 / 1024 / 1024\n) +\nsum(avg(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "storage cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Storage Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Sum of compute, memory, and storage costs", - "fill": 1, - "gridPos": { - "h": 7, - "w": 6, - "x": 18, - "y": 9 - }, - "id": 22, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "# Compute\nsum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n\n# Memory\nsum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n) +\n\n# Storage \n\nsum(avg(pv_hourly_cost) by (persistentvolume) * 730 * avg(kube_persistentvolume_capacity_bytes) by (persistentvolume) / 1024 / 1024 / 1024) \n+\nsum(sum(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "total cost", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Total Cost", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "columns": [], - "datasource": "default-kubecost", - "description": "Cost of by resource class of currently provisioned nodes", - "fontSize": "100%", - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 16 - }, - "id": 8, - "links": [], - "pageSize": null, - "scroll": true, - "showHeader": true, - "sort": { - "col": 4, - "desc": false - }, - "styles": [ - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Time", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Compute Cost", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "CPU Cost", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #A", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Mem Cost", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Total", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "instance", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "GPU", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "short" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "decimals": 2, - "pattern": "/.*/", - "thresholds": [], - "type": "number", - "unit": "short" - } - ], - "targets": [ - { - "expr": "avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost or up * 0) by (node) * 730 * (1-$useDiscount/100)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - }, - { - "expr": "avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "legendFormat": "", - "refId": "B" - }, - { - "expr": "avg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "refId": "D" - }, - { - "expr": "# CPU \navg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost or up * 0) by (node) * 730 * (1-$useDiscount/100) +\n# GPU\navg(node_gpu_hourly_cost) by (node) * 730 * (1-$useDiscount/100) +\n# Memory\navg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730 * (1-$useDiscount/100)\n", - "format": "table", - "instant": true, - "intervalFactor": 1, - "refId": "C" - } - ], - "title": "Cost by node", - "transform": "table", - "type": "table" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Monthly run rate of attached disk + PV storage costs based on currently provisioned resources.", - "fill": 1, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 16 - }, - "id": 25, - "interval": "1m", - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n avg(kube_node_status_capacity_cpu_cores) by (node) * avg(node_cpu_hourly_cost) by (node) * 730 +\n avg(node_gpu_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "cpu", - "refId": "B" - }, - { - "expr": "sum(\n avg(kube_node_status_capacity_memory_bytes) by (node) / 1024 / 1024 / 1024 * avg(node_ram_hourly_cost) by (node) * 730\n)", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "memory", - "refId": "A" - }, - { - "expr": "sum(\n avg(avg_over_time(pv_hourly_cost[$timeRange] offset 1m)) by (persistentvolume) * 730 \n * avg(avg_over_time(kube_persistentvolume_capacity_bytes[$timeRange] offset 1m)) by (persistentvolume) / 1024 / 1024 / 1024\n) +\nsum(avg(container_fs_limit_bytes{device!=\"tmpfs\", id=\"/\"}) by (instance) / 1024 / 1024 / 1024) * $localStorageGBCost", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "storage", - "refId": "C" - }, - { - "expr": "SUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $percentEgress * $egressCost ", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "network", - "refId": "D" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Cost by Resource", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "currencyUSD", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "auto": true, - "auto_count": 1, - "auto_min": "1m", - "current": { - "text": "auto", - "value": "$__auto_interval_timeRange" - }, - "hide": 2, - "label": null, - "name": "timeRange", - "options": [ - { - "selected": true, - "text": "auto", - "value": "$__auto_interval_timeRange" - }, - { - "selected": false, - "text": "1h", - "value": "1h" - }, - { - "selected": false, - "text": "6h", - "value": "6h" - }, - { - "selected": false, - "text": "12h", - "value": "12h" - }, - { - "selected": false, - "text": "1d", - "value": "1d" - }, - { - "selected": false, - "text": "7d", - "value": "7d" - }, - { - "selected": false, - "text": "14d", - "value": "14d" - }, - { - "selected": false, - "text": "30d", - "value": "30d" - }, - { - "selected": false, - "text": "90d", - "value": "90d" - } - ], - "query": "1h,6h,12h,1d,7d,14d,30d,90d", - "refresh": 2, - "skipUrlSync": false, - "type": "interval" - }, - { - "current": { - "text": ".04", - "value": ".04" - }, - "hide": 2, - "label": "Cost per Gb hour for attached disks", - "name": "localStorageGBCost", - "options": [ - { - "selected": true, - "text": ".04", - "value": ".04" - } - ], - "query": ".04", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "tags": [], - "text": "0", - "value": "0" - }, - "hide": 0, - "label": "Sustained Use Discount %", - "name": "useDiscount", - "options": [ - { - "selected": true, - "text": "0", - "value": "0" - } - ], - "query": "0", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": ".1", - "value": ".1" - }, - "hide": 2, - "label": null, - "name": "percentEgress", - "options": [ - { - "selected": true, - "text": ".1", - "value": ".1" - } - ], - "query": ".1", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": ".12", - "value": ".12" - }, - "hide": 2, - "label": null, - "name": "egressCost", - "options": [ - { - "selected": true, - "text": ".12", - "value": ".12" - } - ], - "query": ".12", - "skipUrlSync": false, - "type": "constant" - } - ] - }, - "time": { - "from": "now-7d", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "Kubecost cluster metrics", - "uid": "JOUdHGZZz", - "version": 20 -} diff --git a/charts/kubecost/cluster-utilization.json b/charts/kubecost/cluster-utilization.json deleted file mode 100644 index 0c3acfc76..000000000 --- a/charts/kubecost/cluster-utilization.json +++ /dev/null @@ -1,3473 +0,0 @@ -{ - "annotations":{ - "list":[ - { - "builtIn":1, - "datasource":"-- Grafana --", - "enable":true, - "hide":true, - "iconColor":"rgba(0, 211, 255, 1)", - "name":"Annotations & Alerts", - "type":"dashboard" - } - ] - }, - "description":"A dashboard to help manage Kubernetes cluster costs and resources", - "editable":true, - "gnetId":6873, - "graphTooltip":0, - "id":4, - "iteration":1556759633456, - "links":[ - - ], - "panels":[ - { - "content":"This dashboard shows monthly cost estimates for the cluster, based on **current** CPU, RAM and storage provisioned.", - "gridPos":{ - "h":2, - "w":24, - "x":0, - "y":0 - }, - "id":86, - "links":[ - - ], - "mode":"markdown", - "title":"", - "transparent":true, - "type":"text" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":0, - "y":2 - }, - "hideTimeOverride":true, - "id":75, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"sum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) ", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"CPU Cost", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":6, - "y":2 - }, - "hideTimeOverride":true, - "id":77, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"sum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n) ", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"RAM Cost", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":12, - "y":2 - }, - "hideTimeOverride":true, - "id":78, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"Storage Cost (Cluster and PVC)", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Represents a near worst-case approximation of network costs.", - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":18, - "y":2 - }, - "hideTimeOverride":true, - "id":129, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"SUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"Network Egress Cost", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Current CPU use from applications divided by allocatable CPUs", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":0, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":82, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"(\n sum(\n count(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n * on (instance) \n sum(irate(container_cpu_usage_seconds_total{id=\"/\"}[10m])) by (instance)\n ) \n / \n (sum (kube_node_status_allocatable_cpu_cores))\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "timeFrom":"", - "title":"CPU Utilization", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Current CPU reservation requests from applications vs allocatable CPU", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":3, - "y":6 - }, - "height":"180px", - "id":91, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"SUM(kube_pod_container_resource_requests_cpu_cores) / SUM(kube_node_status_allocatable_cpu_cores) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "title":"CPU Requests", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "description":"Current RAM use vs RAM available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":6, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":80, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"SUM(container_memory_usage_bytes{namespace!=\"\"}) / SUM(kube_node_status_allocatable_memory_bytes) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - }, - { - "expr":"", - "format":"time_series", - "intervalFactor":1, - "refId":"B" - } - ], - "thresholds":"30,80", - "timeFrom":"", - "title":"RAM Utilization", - "transparent":false, - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "description":"Current RAM requests vs RAM available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":9, - "y":6 - }, - "height":"180px", - "id":92, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"})\n /\n sum(kube_node_status_allocatable_memory_bytes)\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30,80", - "title":"RAM Requests", - "transparent":false, - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"This gauge shows the current standard storage use, including cluster storage, vs storage available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":12, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":95, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) /\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n + sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"})\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "timeFrom":"", - "title":"Storage Utilization", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":true, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"This gauge shows the current SSD use vs SSD available", - "editable":true, - "error":false, - "format":"percent", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":3, - "x":15, - "y":6 - }, - "height":"180px", - "hideTimeOverride":true, - "id":96, - "interval":null, - "isNew":true, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace)\n) /\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace)\n) * 100", - "format":"time_series", - "interval":"", - "intervalFactor":1, - "refId":"A", - "step":10 - } - ], - "thresholds":"30, 80", - "timeFrom":"", - "title":"SSD Utilization", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":2, - "description":"Expected monthly cost given current CPU, memory storage, and network resource consumption", - "format":"currencyUSD", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":6, - "x":18, - "y":6 - }, - "hideTimeOverride":true, - "id":93, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"label_cloud_google_com_gke_preemptible", - "targets":[ - { - "expr":"# CPU\nsum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) \n\n+ \n\n# Storage\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard \n\n+\n\n# END STORAGE\n# RAM \nsum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n)\n\n+\n\n#Network \nSUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", - "format":"time_series", - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":" {{ node }}", - "refId":"A" - } - ], - "thresholds":"", - "timeFrom":"15m", - "timeShift":null, - "title":"Total Monthly Cost", - "type":"singlestat", - "valueFontSize":"120%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "description":"Expected monthly CPU, memory and storage costs given provisioned resources", - "fill":1, - "gridPos":{ - "h":8, - "w":12, - "x":0, - "y":10 - }, - "id":120, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":false, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"# CPU\nsum(\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) * $costpcpu\n )\n or\n (\n (\n sum(kube_node_status_capacity_cpu_cores) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) * ($costcpu - ($costcpu / 100 * $costDiscount))\n )\n) \n\n+ \n\n# Storage\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageSSD\n\n+\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) or up * 0\n) / 1024 / 1024 /1024 * $costStorageStandard\n\n+ \n\nsum(container_fs_limit_bytes{id=\"/\"}) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard \n\n+\n\n# END STORAGE\n# RAM \nsum(\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible=\"true\"}) by (node)\n ) /1024/1024/1024 * $costpram\n )\n or\n (\n (\n sum(kube_node_status_capacity_memory_bytes) by (node)\n * on (node) group_left (label_cloud_google_com_gke_preemptible)\n avg(kube_node_labels{label_cloud_google_com_gke_preemptible!=\"true\"}) by (node)\n ) /1024/1024/1024 * ($costram - ($costram / 100 * $costDiscount))\n)\n) \n\n+\n\n#Network \nSUM(rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]) / 1024 / 1024 / 1024 ) * (60 * 60 * 24 * 30) * $costEgress", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"cluster cost", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Total monthly cost", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"currencyUSD", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"Resources allocated to namespace based on container requests", - "fontSize":"100%", - "gridPos":{ - "h":8, - "w":12, - "x":12, - "y":10 - }, - "hideTimeOverride":false, - "id":73, - "links":[ - - ], - "pageSize":10, - "repeat":null, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":7, - "desc":true - }, - "styles":[ - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "pattern":"namespace", - "thresholds":[ - "30", - "80" - ], - "type":"string", - "unit":"currencyUSD" - }, - { - "alias":"RAM", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"CPU", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"PV Storage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Total", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #D", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"CPU Utilization", - "colorMode":"value", - "colors":[ - "#bf1b00", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #E", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"RAM Utilization", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #F", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - } - ], - "targets":[ - { - "expr":"(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"}*($costcpu - ($costcpu / 100 * $costDiscount))) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"}*$costpcpu) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"A" - }, - { - "expr":"(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"} / 1024 / 1024 / 1024*($costram- ($costram / 100 * $costDiscount))) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"} / 1024 / 1024 / 1024 * $costpram ) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"B" - }, - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageSSD \n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageStandard", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"C" - }, - { - "expr":"# CPU \n(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"}*($costcpu - ($costcpu / 100 * $costDiscount))) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"}*$costpcpu) by(namespace)\n or\n count(\n count(container_spec_cpu_shares{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n#END CPU \n# Memory \n\n(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible!=\"true\"} / 1024 / 1024 / 1024*($costram- ($costram / 100 * $costDiscount))) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n(\n sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\",namespace!=\"kube-system\",cloud_google_com_gke_preemptible=\"true\"} / 1024 / 1024 / 1024 * $costpram ) by (namespace) \n or\n count(\n count(container_spec_memory_limit_bytes{namespace!=\"\",namespace!=\"kube-system\"}) by(namespace)\n ) by(namespace) -1\n)\n\n+\n\n# PV storage\n\n(\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageSSD \n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim, namespace) \n) by (namespace) / 1024 / 1024 /1024 * $costStorageStandard \n)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"Total", - "refId":"D" - } - ], - "timeFrom":"", - "timeShift":null, - "title":"Namespace cost allocation", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":18 - }, - "id":108, - "panels":[ - - ], - "title":"CPU Metrics", - "type":"row" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":19 - }, - "id":116, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(kube_node_status_capacity_cpu_cores)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"capacity", - "refId":"A" - }, - { - "expr":"SUM(kube_pod_container_resource_requests_cpu_cores)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"requests", - "refId":"C" - }, - { - "expr":"SUM(irate(container_cpu_usage_seconds_total{id=\"/\"}[5m]))", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"usage", - "refId":"B" - }, - { - "expr":"SUM(kube_pod_container_resource_limits_cpu_cores) ", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"limits", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster CPUs", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":1, - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":27 - }, - "id":130, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"avg(irate(node_cpu_seconds_total{mode!=\"idle\"}[5m])) by (mode) * 100", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"{{mode}}", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"CPU Mode", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percent", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"percent", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"This table shows the comparison of CPU requests and usage by namespace", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":0, - "y":35 - }, - "hideTimeOverride":true, - "id":104, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":1, - "desc":true - }, - "styles":[ - { - "alias":"CPU Requests", - "colorMode":null, - "colors":[ - "#fceaca", - "#fce2de", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Requests", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#cffaff" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"24h CPU Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - "30" - ], - "type":"number", - "unit":"none" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum(kube_pod_container_resource_requests_cpu_cores{namespace!=\"\"}) by (namespace) ", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"", - "refId":"A" - }, - { - "expr":"sum (rate (container_cpu_usage_seconds_total{image!=\"\",namespace!=\"\"}[24h])) by (namespace)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ namespace }}", - "refId":"C" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"CPU request utilization by namespace", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"This table shows the comparison of application CPU usage vs the capacity of the node (measured over last 60 minutes)", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":12, - "y":35 - }, - "hideTimeOverride":true, - "id":90, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":2, - "desc":true - }, - "styles":[ - { - "alias":"CPU Request Utilization", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - ".30", - " .80" - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Utilization", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - ".20", - " .80" - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"24h Utilization ", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"percentunit" - } - ], - "targets":[ - { - "expr":"SUM(\nSUM(rate(container_cpu_usage_seconds_total[24h])) by (pod_name)\n* on (pod_name) group_left (node) \nlabel_replace(\n avg(kube_pod_info{}),\n \"pod_name\", \n \"$1\", \n \"pod\", \n \"(.+)\"\n)\n) by (node) \n/ \nsum(kube_node_status_capacity_cpu_cores) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - }, - { - "expr":"sum(kube_pod_container_resource_requests_cpu_cores) by (node) / sum(kube_node_status_capacity_cpu_cores) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"A" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster cost & utilization by node", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":45 - }, - "id":113, - "panels":[ - - ], - "title":"Memory Metrics", - "type":"row" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":46 - }, - "id":117, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":false, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(kube_node_status_capacity_memory_bytes / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"capacity", - "refId":"A" - }, - { - "expr":"SUM(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"} / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"requests", - "refId":"C" - }, - { - "expr":"SUM(container_memory_usage_bytes{image!=\"\"} / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"usage", - "refId":"B" - }, - { - "expr":"SUM(kube_pod_container_resource_limits_memory_bytes {namespace!=\"\"} / 1024 / 1024 / 1024)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"limits", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster memory (GB)", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"decgbytes", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":8, - "w":24, - "x":0, - "y":54 - }, - "id":131, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":false, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"1 - sum(node_memory_MemAvailable_bytes) by (node) / sum(node_memory_MemTotal_bytes) by (node)", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"usage", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Cluster Memory Utilization", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percentunit", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"Comparison of memory requests and current usage by namespace", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":0, - "y":62 - }, - "hideTimeOverride":true, - "id":109, - "links":[ - - ], - "pageSize":7, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":1, - "desc":true - }, - "styles":[ - { - "alias":"Mem Requests (GB)", - "colorMode":null, - "colors":[ - "#fceaca", - "#fce2de", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Requests", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#cffaff" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - "" - ], - "type":"number", - "unit":"short" - }, - { - "alias":"24h Mem Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "#508642", - "#e5ac0e" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - ".30", - ".75" - ], - "type":"number", - "unit":"none" - }, - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"} / 1024 / 1024 / 1024) by (namespace) ", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"", - "refId":"A" - }, - { - "expr":"SUM(container_memory_usage_bytes{image!=\"\",namespace!=\"\"} / 1024 / 1024 / 1024) by (namespace)", - "format":"table", - "instant":true, - "intervalFactor":1, - "legendFormat":"", - "refId":"C" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Memory requests & utilization by namespace", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "description":"Container RAM usage vs node capacity", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":12, - "y":62 - }, - "hideTimeOverride":true, - "id":114, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":1, - "desc":true - }, - "styles":[ - { - "alias":"RAM Requests", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - "30", - " 80" - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"node", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"RAM Usage", - "colorMode":"value", - "colors":[ - "#ef843c", - "rgba(50, 172, 45, 0.97)", - "rgba(245, 54, 54, 0.9)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - "25", - " 80" - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"SUM(label_replace(container_memory_usage_bytes{namespace!=\"\"}, \"node\", \"$1\", \"instance\",\"(.+)\")) by (node) * 100\n/\nSUM(kube_node_status_capacity_memory_bytes) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - }, - { - "expr":"sum(kube_pod_container_resource_requests_memory_bytes{namespace!=\"\"}) by (node) / SUM(kube_node_status_capacity_memory_bytes) by (node)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"A" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Node utilization of allocatable RAM", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":72 - }, - "id":101, - "panels":[ - - ], - "title":"Storage Metrics", - "type":"row" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":9, - "w":12, - "x":0, - "y":73 - }, - "hideTimeOverride":true, - "id":97, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":4, - "desc":true - }, - "styles":[ - { - "alias":"Node", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"instance", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"PVC Name", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"persistentvolumeclaim", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Storage Class", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"storageclass", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Size (GB)", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"percentunit" - } - ], - "targets":[ - { - "expr":"SUM(container_fs_limit_bytes{id=\"/\"}) by (instance) / 1024 / 1024 / 1024 * 1.03", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - }, - { - "expr":"SUM(container_fs_limit_bytes{id=\"/\"}) by (instance) / 1024 / 1024 / 1024 * 1.03 * $costStorageStandard\n", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ persistentvolumeclaim }}", - "refId":"A" - }, - { - "expr":"sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"} / container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\"}) by (instance) \n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"C" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Local Storage", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":9, - "w":12, - "x":12, - "y":73 - }, - "id":128, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(container_fs_usage_bytes{id=\"/\"}) / SUM(container_fs_limit_bytes{id=\"/\"})", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"reads", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Local storage utilization", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percent", - "label":"IOPS", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":10, - "w":12, - "x":0, - "y":82 - }, - "hideTimeOverride":true, - "id":94, - "links":[ - - ], - "pageSize":10, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":2, - "desc":true - }, - "styles":[ - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":true, - "linkTooltip":"View namespace cost metrics", - "linkUrl":"d/at-cost-analysis-namespace2/namespace-cost-metrics?&var-namespace=$__cell", - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"string", - "unit":"short" - }, - { - "alias":"PVC Name", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"persistentvolumeclaim", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Storage Class", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"storageclass", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"Cost", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"percentunit" - }, - { - "alias":"Size (GB)", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024\n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024\n\n\n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"C" - }, - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 * $costStorageSSD\n\nor\n\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 * $costStorageStandard\n", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ persistentvolumeclaim }}", - "refId":"A" - }, - { - "expr":"sum(kubelet_volume_stats_used_bytes) by (persistentvolumeclaim, namespace) \n/\nsum (\n sum(kube_persistentvolumeclaim_info{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace, storageclass)\n * on (persistentvolumeclaim, namespace) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{storageclass!~\".*ssd.*\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"B" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Persistent Volume Claims", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":10, - "w":12, - "x":12, - "y":82 - }, - "id":132, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM(rate(node_disk_reads_completed_total[10m])) or SUM(rate(node_disk_reads_completed[10m]))\n", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"reads", - "refId":"D" - }, - { - "expr":"SUM(rate(node_disk_writes_completed_total[10m])) or SUM(rate(node_disk_writes_completed[10m]))", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"writes", - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Disk IOPS", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"none", - "label":"IOPS", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":9, - "w":24, - "x":0, - "y":92 - }, - "id":122, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"SUM( kubelet_volume_stats_inodes_used / kubelet_volume_stats_inodes) by (persistentvolumeclaim) * 100", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"", - "refId":"D" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Inode usage", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"percent", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "collapsed":false, - "gridPos":{ - "h":1, - "w":24, - "x":0, - "y":101 - }, - "id":127, - "panels":[ - - ], - "title":"Network", - "type":"row" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "fill":1, - "gridPos":{ - "h":9, - "w":24, - "x":0, - "y":102 - }, - "id":123, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (node_network_transmit_bytes_total{}[60m]))\n", - "format":"time_series", - "intervalFactor":1, - "legendFormat":"node_out", - "refId":"B" - }, - { - "expr":"SUM ( rate(node_network_transmit_bytes_total{device=\"eth0\"}[60m]))", - "format":"time_series", - "instant":false, - "intervalFactor":1, - "legendFormat":"eth0 out", - "refId":"C" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Node network transmit", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"decbytes", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - } - ], - "refresh":"15m", - "schemaVersion":16, - "style":"dark", - "tags":[ - "cost", - "utilization", - "metrics" - ], - "templating":{ - "list":[ - { - "current":{ - "text":"23.076", - "value":"23.076" - }, - "hide":0, - "label":"CPU", - "name":"costcpu", - "options":[ - { - "text":"23.076", - "value":"23.076" - } - ], - "query":"23.076", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"5.10", - "value":"5.10" - }, - "hide":0, - "label":"PE CPU", - "name":"costpcpu", - "options":[ - { - "text":"5.10", - "value":"5.10" - } - ], - "query":"5.10", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"3.25", - "value":"3.25" - }, - "hide":0, - "label":"RAM", - "name":"costram", - "options":[ - { - "text":"3.25", - "value":"3.25" - } - ], - "query":"3.25", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.6862", - "value":"0.6862" - }, - "hide":0, - "label":"PE RAM", - "name":"costpram", - "options":[ - { - "text":"0.6862", - "value":"0.6862" - } - ], - "query":"0.6862", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.040", - "value":"0.040" - }, - "hide":0, - "label":"Storage", - "name":"costStorageStandard", - "options":[ - { - "text":"0.040", - "value":"0.040" - } - ], - "query":"0.040", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":".17", - "value":".17" - }, - "hide":0, - "label":"SSD", - "name":"costStorageSSD", - "options":[ - { - "text":".17", - "value":".17" - } - ], - "query":".17", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":".12", - "value":".12" - }, - "hide":0, - "label":"Egress", - "name":"costEgress", - "options":[ - { - "selected":true, - "text":".12", - "value":".12" - } - ], - "query":".12", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"30", - "value":"30" - }, - "hide":0, - "label":"Discount", - "name":"costDiscount", - "options":[ - { - "text":"30", - "value":"30" - } - ], - "query":"30", - "skipUrlSync":false, - "type":"constant" - } - ] - }, - "time":{ - "from":"now-24h", - "to":"now" - }, - "timepicker":{ - "hidden":false, - "refresh_intervals":[ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options":[ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone":"browser", - "title":"Cluster cost & utilization metrics", - "uid":"cluster-costs", - "version":1 -} diff --git a/charts/kubecost/deployment-utilization.json b/charts/kubecost/deployment-utilization.json deleted file mode 100644 index ff5526c15..000000000 --- a/charts/kubecost/deployment-utilization.json +++ /dev/null @@ -1,1366 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Monitors Kubernetes deployments in cluster using Prometheus and kube-state-metrics. Shows resource utilization of deployments, daemonsets, and statefulsets.", - "editable": true, - "gnetId": 8588, - "graphTooltip": 0, - "id": 2, - "iteration": 1586200623748, - "links": [], - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 0, - "y": 0 - }, - "height": "180px", - "id": 1, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (container_memory_working_set_bytes{container!=\"\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\", pod_name!=\"\"}) / sum (kube_node_status_allocatable_memory_bytes{node=~\"^$Node.*$\"}) * 100", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 900 - } - ], - "thresholds": "65, 90", - "title": "Deployment memory usage", - "transparent": false, - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 0 - }, - "height": "180px", - "id": 2, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (rate (container_cpu_usage_seconds_total{pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\"}[2m])) / sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"}) * 100", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "refId": "A", - "step": 900 - } - ], - "thresholds": "65, 90", - "title": "Deployment CPU usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": true, - "colors": [ - "rgba(50, 172, 45, 0.97)", - "rgba(237, 129, 40, 0.89)", - "rgba(245, 54, 54, 0.9)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "percent", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": true, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 0 - }, - "height": "180px", - "id": 3, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(((sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))) - ((sum(kube_deployment_status_replicas_available{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_status_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_number_ready{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)))) / ((sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))) * 100", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "1,30", - "title": "Unavailable Replicas", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 0, - "y": 5 - }, - "height": "100px", - "id": 4, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(container_memory_working_set_bytes{container!=\"\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\", pod_name!=\"\"})", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 4, - "y": 5 - }, - "height": "100px", - "id": 5, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (kube_node_status_allocatable_memory_bytes{node=~\"^$Node.*$\"})", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 8, - "y": 5 - }, - "height": "100px", - "id": 6, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (rate (container_cpu_usage_seconds_total{pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\", kubernetes_io_hostname=~\"^$Node$\"}[5m]))", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Used", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 12, - "y": 5 - }, - "height": "100px", - "id": 7, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum (machine_cpu_cores{kubernetes_io_hostname=~\"^$Node$\"})", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Total", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "avg" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 16, - "y": 5 - }, - "height": "100px", - "id": 8, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(sum(kube_deployment_status_replicas_available{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_status_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_number_ready{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))", - "format": "time_series", - "intervalFactor": 2, - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Available (cluster)", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "datasource": "default-kubecost", - "editable": true, - "error": false, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 20, - "y": 5 - }, - "height": "100px", - "id": 9, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "(sum(kube_deployment_status_replicas{deployment=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_statefulset_replicas{statefulset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0)) + (sum(kube_daemonset_status_desired_number_scheduled{daemonset=~\".*$Deployment$Statefulset$Daemonset\"}) or vector(0))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ $Daemonset }}", - "refId": "A", - "step": 1800 - } - ], - "thresholds": "", - "title": "Total (cluster)", - "type": "singlestat", - "valueFontSize": "50%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 3, - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 11, - "w": 24, - "x": 0, - "y": 8 - }, - "height": "", - "id": 10, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": false, - "hideZero": false, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/avlbl.*/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (irate (container_cpu_usage_seconds_total{container!=\"\",image!=\"\",name=~\"^k8s_.*\",io_kubernetes_container_name!=\"POD\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[5m])) by (pod_name,kubernetes_io_hostname)", - "format": "time_series", - "hide": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "usage: {{ kubernetes_io_hostname }} | {{ pod_name }} ", - "metric": "container_cpu", - "refId": "A", - "step": 60 - }, - { - "expr": "sum (kube_pod_container_resource_requests_cpu_cores{pod=~\"^$Deployment$Statefulset$Daemonset.*$\",node=~\"^$Node$\"}) by (pod,node)", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "legendFormat": "rqst: {{ node }} | {{ pod }}", - "refId": "B", - "step": 120 - }, - { - "expr": "sum ((kube_node_status_allocatable_cpu_cores{node=~\"^$Node$\"})) by (node)", - "format": "time_series", - "hide": true, - "intervalFactor": 2, - "legendFormat": "avlbl: {{ node }}", - "refId": "C", - "step": 30 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "CPU usage & requests", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": "cores", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 19 - }, - "id": 11, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/^avlbl.*$/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "max (container_memory_working_set_bytes{container!=\"POD\",container!=\"\",id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}) by (pod_name,kubernetes_io_hostname)", - "format": "time_series", - "hide": false, - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "usage: {{kubernetes_io_hostname }} | {{ pod_name }}", - "metric": "container_memory_usage:sort_desc", - "refId": "A", - "step": 60 - }, - { - "expr": "sum ((kube_pod_container_resource_requests_memory_bytes{pod=~\"^$Deployment$Statefulset$Daemonset.*$\",node=~\"^$Node$\"})) by (pod,node)", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "rqst: {{ node }} | {{ pod }}", - "refId": "B", - "step": 120 - }, - { - "expr": "sum ((kube_node_status_allocatable_memory_bytes{node=~\"^$Node$\"})) by (node)", - "format": "time_series", - "hide": true, - "intervalFactor": 2, - "legendFormat": "avlbl: {{ node }}", - "refId": "C", - "step": 30 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Memory usage & requests", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 32 - }, - "id": 12, - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "100 * (kubelet_volume_stats_used_bytes{kubernetes_io_hostname=~\"^$Node$\", persistentvolumeclaim=~\".*$Deployment$Statefulset$Daemonset.*$\"} / kubelet_volume_stats_capacity_bytes{kubernetes_io_hostname=~\"^$Node$\", persistentvolumeclaim=~\".*$Deployment$Statefulset$Daemonset.*$\"})", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{ persistentvolumeclaim }} | {{ kubernetes_io_hostname }}", - "refId": "A", - "step": 120 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Disk Usage", - "tooltip": { - "shared": true, - "sort": 2, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "percent", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 13, - "w": 24, - "x": 0, - "y": 41 - }, - "id": 13, - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": false, - "rightSide": true, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum (rate (container_network_receive_bytes_total{id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[2m])) by (pod_name, kubernetes_io_hostname)", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "-> {{ kubernetes_io_hostname }} | {{ pod_name }}", - "metric": "network", - "refId": "A", - "step": 60 - }, - { - "expr": "- sum( rate (container_network_transmit_bytes_total{id!=\"/\",pod_name=~\"^$Deployment$Statefulset$Daemonset.*$\",kubernetes_io_hostname=~\"^$Node$\"}[2m])) by (pod_name, kubernetes_io_hostname)", - "format": "time_series", - "interval": "10s", - "intervalFactor": 1, - "legendFormat": "<- {{ kubernetes_io_hostname }} | {{ pod_name }}", - "metric": "network", - "refId": "B", - "step": 60 - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "All processes network I/O", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "kubernetes", - "deployment" - ], - "templating": { - "list": [ - { - "allValue": "()", - "current": { - "selected": false, - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Deployment", - "options": [], - "query": "label_values(deployment)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "()", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Statefulset", - "options": [], - "query": "label_values(statefulset)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "()", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Daemonset", - "options": [], - "query": "label_values(daemonset)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".*", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Node", - "options": [], - "query": "label_values(kubernetes_io_hostname)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Deployment/Statefulset/Daemonset utilization metrics", - "uid": "deployment-metrics", - "version": 1 -} diff --git a/charts/kubecost/label-cost-utilization.json b/charts/kubecost/label-cost-utilization.json deleted file mode 100644 index 46d508aa0..000000000 --- a/charts/kubecost/label-cost-utilization.json +++ /dev/null @@ -1,1193 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 7, - "iteration": 1586214000479, - "links": [], - "panels": [ - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Monthly projected CPU cost given last 10m", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 0 - }, - "hideTimeOverride": true, - "id": 15, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(container_cpu_allocation) by (pod,node)\n\n * on (node) group_left()\n avg(avg_over_time(node_cpu_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "CPU Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Based on CPU usage over last 24 hours", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 0 - }, - "hideTimeOverride": true, - "id": 16, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n avg(container_memory_allocation_bytes) by (pod,node) / 1024 / 1024 / 1024\n\n * on (node) group_left()\n avg(avg_over_time(node_ram_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Memory Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 12, - "y": 0 - }, - "hideTimeOverride": true, - "id": 21, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "sum(\n sum(kube_persistentvolumeclaim_info{storageclass!=\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .04 \n\n+\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .17 \n", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Storage Cost", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "description": "Cost of memory + CPU usage", - "format": "currencyUSD", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 18, - "y": 0 - }, - "hideTimeOverride": true, - "id": 20, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "label_cloud_google_com_gke_preemptible", - "targets": [ - { - "expr": "# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CPU ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nsum(\n avg(container_cpu_allocation) by (pod,node)\n\n * on (node) group_left()\n avg(avg_over_time(node_cpu_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730\n\n#END CPU\n+\n\n# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Memory ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\nsum(\n avg(container_memory_allocation_bytes) by (pod,node) / 1024 / 1024 / 1024\n\n * on (node) group_left()\n avg(avg_over_time(node_ram_hourly_cost[10m])) by (node)\n\n * on (pod) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n )\n) * 730\n\n# END MEMORY\n\n+\n\n# ~~~~~~~~~~~~~~~~~~~~~~~~~~~ STORAGE ~~~~~~~~~~~~~~~~~~~~~~~~~\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass!=\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .04 \n\n+\n\nsum(\n sum(kube_persistentvolumeclaim_info{storageclass=~\".*ssd.*\"}) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) / 1024 / 1024 /1024 * .17 \n\n\n# END STORAGE\n", - "format": "time_series", - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": " {{ node }}", - "refId": "A" - } - ], - "thresholds": "", - "timeFrom": "15m", - "timeShift": null, - "title": "Total Cost", - "type": "singlestat", - "valueFontSize": "110%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 0, - "y": 5 - }, - "id": 10, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n sum (kube_pod_container_resource_requests_cpu_cores) by (pod)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n) ", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "CPU Request", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 2, - "format": "none", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 3, - "y": 5 - }, - "id": 17, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": " cores", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n label_replace(\n sum(rate(container_cpu_usage_seconds_total{image!=\"\",container_name!=\"POD\"}[1h])) by (kubernetes_io_hostname,pod_name),\n \"node\",\n \"$1\", \n \"kubernetes_io_hostname\", \n \"(.+)\"\n ) \n * on (pod_name) group_left()\n label_replace(\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod),\n \"pod_name\",\n \"$1\", \n \"pod\", \n \"(.+)\"\n ) or up * 0\n) ", - "format": "time_series", - "intervalFactor": 2, - "refId": "A" - } - ], - "thresholds": "", - "title": "CPU Used", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 0, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 6, - "y": 5 - }, - "id": 11, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": true, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n sum (kube_pod_container_resource_requests_memory_bytes) by (pod)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n) ", - "format": "time_series", - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "Memory Request", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 3, - "x": 9, - "y": 5 - }, - "id": 18, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n label_replace(\n sum (container_memory_working_set_bytes{pod_name!=\"\",container!=\"POD\",container!=\"\"}) by (pod_name),\n \"pod\",\n \"$1\", \n \"pod_name\", \n \"(.+)\")\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod)\n or up * 0\n)", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "Memory Usage", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "cacheTimeout": null, - "colorBackground": false, - "colorValue": false, - "colors": [ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource": "default-kubecost", - "decimals": 0, - "format": "bytes", - "gauge": { - "maxValue": 100, - "minValue": 0, - "show": false, - "thresholdLabels": false, - "thresholdMarkers": true - }, - "gridPos": { - "h": 4, - "w": 6, - "x": 12, - "y": 5 - }, - "id": 22, - "interval": null, - "links": [], - "mappingType": 1, - "mappingTypes": [ - { - "name": "value to text", - "value": 1 - }, - { - "name": "range to text", - "value": 2 - } - ], - "maxDataPoints": 100, - "nullPointMode": "connected", - "nullText": null, - "postfix": "", - "postfixFontSize": "50%", - "prefix": "", - "prefixFontSize": "50%", - "rangeMaps": [ - { - "from": "null", - "text": "N/A", - "to": "null" - } - ], - "sparkline": { - "fillColor": "rgba(31, 118, 189, 0.18)", - "full": false, - "lineColor": "rgb(31, 120, 193)", - "show": false - }, - "tableColumn": "", - "targets": [ - { - "expr": "sum(\n max(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, storageclass)\n * on (persistentvolumeclaim) group_right(storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes) by (persistentvolumeclaim)\n * on (persistentvolumeclaim) group_left(label_app)\n max(kube_persistentvolumeclaim_labels{label_$label=~\"$label_value\"}) by (persistentvolumeclaim) or up * 0\n) \n", - "format": "time_series", - "instant": true, - "intervalFactor": 1, - "refId": "A" - } - ], - "thresholds": "", - "title": "Storage Request", - "type": "singlestat", - "valueFontSize": "80%", - "valueMaps": [ - { - "op": "=", - "text": "N/A", - "value": "null" - } - ], - "valueName": "current" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_limits_cpu_cores) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "limit", - "refId": "C" - }, - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_requests_cpu_cores) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "request", - "refId": "B" - }, - { - "expr": "sum(\n label_replace(\n sum (rate (container_cpu_usage_seconds_total{image!=\"\",container!=\"POD\",container!=\"\"}[10m])) by (container,pod),\n \"pod\", \n \"$1\", \n \"pod_name\", \n \"(.+)\"\n )\n * on (pod) group_left (label_$label)\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container)\n)\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "usage", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "CPU Usage vs Requests vs Limits", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fill": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 9 - }, - "id": 23, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_limits_memory_bytes) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "limit", - "refId": "C" - }, - { - "expr": "sum(\n label_replace(\n sum (kube_pod_container_resource_requests_memory_bytes) by (pod, container)\n * on (pod) group_left()\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container),\n \"container_name\",\n \"$1\", \n \"container\", \n \"(.+)\"\n )\n) \n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "request", - "refId": "B" - }, - { - "expr": "sum(\n label_replace(\n sum (container_memory_working_set_bytes{container!=\"\",container!=\"POD\"}) by (container,pod),\n \"pod\", \n \"$1\", \n \"pod_name\", \n \"(.+)\"\n )\n * on (pod) group_left (label_$label)\n max(kube_pod_labels{label_$label=~\"$label_value\"}) by (pod,container)\n)\n", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "usage", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeShift": null, - "title": "Memory Usage vs Requests vs Limits", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "datasource": "default-kubecost", - "filters": [], - "hide": 0, - "label": "", - "name": "Filters", - "skipUrlSync": false, - "type": "adhoc" - }, - { - "allValue": null, - "current": { - "tags": [], - "text": "app", - "value": "app" - }, - "hide": 0, - "includeAll": false, - "label": "Label", - "multi": false, - "name": "label", - "options": [ - { - "selected": false, - "text": "app", - "value": "app" - }, - { - "selected": false, - "text": "tier", - "value": "tier" - }, - { - "selected": false, - "text": "component", - "value": "component" - }, - { - "selected": true, - "text": "release", - "value": "release" - }, - { - "selected": false, - "text": "name", - "value": "name" - }, - { - "selected": false, - "text": "team", - "value": "team" - }, - { - "selected": false, - "text": "department", - "value": "department" - }, - { - "selected": false, - "text": "owner", - "value": "owner" - }, - { - "selected": false, - "text": "contact", - "value": "contact" - } - ], - "query": "app, tier, component, release, name, team, department, owner, contact", - "skipUrlSync": false, - "type": "custom" - }, - { - "allValue": ".*", - "current": { - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": "Value", - "multi": false, - "name": "label_value", - "options": [], - "query": "query_result(SUM(kube_pod_labels{label_$label!=\"\",namespace!=\"kube-system\"}) by (label_$label))", - "refresh": 1, - "regex": "/label_$label=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": "()", - "current": { - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": "", - "multi": false, - "name": "Deployments", - "options": [], - "query": "label_values(deployment)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "tags": [], - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": true, - "label": null, - "multi": false, - "name": "Secondary", - "options": [ - { - "selected": true, - "text": "All", - "value": "$__all" - }, - { - "selected": false, - "text": "app", - "value": "app" - }, - { - "selected": false, - "text": "component", - "value": "component" - }, - { - "selected": false, - "text": "controller_revision_hash", - "value": "controller_revision_hash" - }, - { - "selected": false, - "text": "k8s_app", - "value": "k8s_app" - } - ], - "query": "query_result(kube_pod_labels)", - "refresh": 0, - "regex": "/.+?label_([^=]*).*/", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "", - "title": "Label costs & utilization", - "uid": "lWMhIA-ik", - "version": 2 -} diff --git a/charts/kubecost/logo.png b/charts/kubecost/logo.png deleted file mode 100644 index 607af6ccfbea82494428c0b2bc90868daaa4f6d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28017 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 Y0&eV=I24$NBI7?$QP7l!f-FM+AJb0{;s5{u diff --git a/charts/kubecost/namespace-utilization.json b/charts/kubecost/namespace-utilization.json deleted file mode 100644 index 7260cced1..000000000 --- a/charts/kubecost/namespace-utilization.json +++ /dev/null @@ -1,1156 +0,0 @@ -{ - "annotations":{ - "list":[ - { - "builtIn":1, - "datasource":"-- Grafana --", - "enable":true, - "hide":true, - "iconColor":"rgba(0, 211, 255, 1)", - "name":"Annotations & Alerts", - "type":"dashboard" - } - ] - }, - "description":"A dashboard to help with utilization and resource allocation", - "editable":true, - "gnetId":8673, - "graphTooltip":0, - "id":9, - "iteration":1553150922105, - "links":[ - - ], - "panels":[ - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":9, - "w":16, - "x":0, - "y":0 - }, - "hideTimeOverride":true, - "id":73, - "links":[ - - ], - "pageSize":8, - "repeat":null, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":2, - "desc":false - }, - "styles":[ - { - "alias":"Pod", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":false, - "linkTooltip":"", - "linkUrl":"", - "pattern":"pod_name", - "thresholds":[ - "30", - "80" - ], - "type":"string", - "unit":"currencyUSD" - }, - { - "alias":"RAM", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"decbytes" - }, - { - "alias":"CPU %", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"Storage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"Total", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #D", - "thresholds":[ - - ], - "type":"number", - "unit":"currencyUSD" - }, - { - "alias":"CPU Utilization", - "colorMode":"value", - "colors":[ - "#bf1b00", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #E", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - }, - { - "alias":"RAM Utilization", - "colorMode":"value", - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #F", - "thresholds":[ - "30", - "80" - ], - "type":"number", - "unit":"percent" - } - ], - "targets":[ - { - "expr":"sum (rate (container_cpu_usage_seconds_total{namespace=\"$namespace\"}[10m])) by (pod_name) * 100", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ pod_name }}", - "refId":"A" - }, - { - "expr":"sum (avg_over_time (container_memory_working_set_bytes{namespace=\"$namespace\", container_name!=\"POD\"}[10m])) by (pod_name)", - "format":"table", - "hide":false, - "instant":true, - "intervalFactor":1, - "legendFormat":"{{ pod_name }}", - "refId":"B" - } - ], - "timeFrom":"1M", - "timeShift":null, - "title":"Pod utilization analysis", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":9, - "w":8, - "x":16, - "y":0 - }, - "hideTimeOverride":true, - "id":90, - "links":[ - - ], - "pageSize":8, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":4, - "desc":true - }, - "styles":[ - { - "alias":"Namespace", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"namespace", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"PVC Name", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"persistentvolumeclaim", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Storage Class", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"storageclass", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Size", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":1, - "mappingType":1, - "pattern":"Value", - "thresholds":[ - - ], - "type":"number", - "unit":"gbytes" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - } - ], - "targets":[ - { - "expr":"sum (\n sum(kube_persistentvolumeclaim_info) by (persistentvolumeclaim, namespace, storageclass)\n + on (persistentvolumeclaim, namespace) group_right (storageclass)\n sum(kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace=~\"$namespace\"}) by (persistentvolumeclaim, namespace)\n) by (namespace,persistentvolumeclaim,storageclass) / 1024 / 1024 /1024 ", - "format":"table", - "hide":false, - "instant":true, - "interval":"", - "intervalFactor":1, - "legendFormat":"{{ persistentvolumeclaim }}", - "refId":"A" - } - ], - "timeFrom":null, - "timeShift":null, - "title":"Persistent Volume Claims", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "description":"CPU requests by pod divided by the rate of CPU usage over the last hour", - "fill":1, - "gridPos":{ - "h":9, - "w":24, - "x":0, - "y":9 - }, - "id":100, - "legend":{ - "avg":false, - "current":false, - "max":false, - "min":false, - "show":true, - "total":false, - "values":false - }, - "lines":true, - "linewidth":1, - "links":[ - - ], - "nullPointMode":"null", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"topk(10,\n label_replace(\n sum(kube_pod_container_resource_requests_cpu_cores{namespace=\"$namespace\"}) by (pod),\n \"pod_name\", \n \"$1\", \n \"pod\", \n \"(.+)\"\n ) \n/ on (pod_name) sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\",pod_name=~\".+\"}[1h])) by (pod_name))", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":[ - - ], - "timeFrom":null, - "timeShift":null, - "title":"Ratio of CPU requests to usage (Top 10 pods)", - "tooltip":{ - "shared":true, - "sort":0, - "value_type":"individual" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":true - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":3, - "description":"This panel shows historical utilization as an average across all pods in this namespace. It only accounts for currently deployed pods", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":18 - }, - "height":"", - "id":94, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"sum (rate (container_cpu_usage_seconds_total{namespace=\"$namespace\"}[10m])) by (namespace)\n", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"10s", - "intervalFactor":1, - "legendFormat":"cpu utilization", - "metric":"container_cpu", - "refId":"A", - "step":10 - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Overall CPU Utilization", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percent", - "label":"", - "logBase":1, - "max":"110", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"This panel shows historical utilization as an average across all pods in this namespace. It only accounts for currently deployed pods", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":18 - }, - "id":92, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":200, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"sum (container_memory_working_set_bytes{namespace=\"$namespace\"})\n/\nsum(node_memory_MemTotal_bytes)", - "format":"time_series", - "instant":false, - "intervalFactor":1, - "legendFormat":"mem utilization", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Overall RAM Utilization", - "tooltip":{ - "msResolution":false, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percent", - "label":null, - "logBase":1, - "max":"110", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Traffic in and out of this namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":24 - }, - "height":"", - "id":96, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_network_receive_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- in", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_network_transmit_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> out", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Network IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Disk reads and writes for the namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":24 - }, - "height":"", - "id":98, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_fs_writes_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- write", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_fs_reads_bytes_total{namespace=\"$namespace\"}[10m])) by (namespace)", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> read", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Disk IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - } - ], - "refresh":"10s", - "schemaVersion":16, - "style":"dark", - "tags":[ - "cost", - "utilization", - "metrics" - ], - "templating":{ - "list":[ - { - "current":{ - "text":"23.06", - "value":"23.06" - }, - "hide":0, - "label":"CPU", - "name":"costcpu", - "options":[ - { - "text":"23.06", - "value":"23.06" - } - ], - "query":"23.06", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"7.28", - "value":"7.28" - }, - "hide":0, - "label":"PE CPU", - "name":"costpcpu", - "options":[ - { - "text":"7.28", - "value":"7.28" - } - ], - "query":"7.28", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"3.25", - "value":"3.25" - }, - "hide":0, - "label":"RAM", - "name":"costram", - "options":[ - { - "text":"3.25", - "value":"3.25" - } - ], - "query":"3.25", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.6862", - "value":"0.6862" - }, - "hide":0, - "label":"PE RAM", - "name":"costpram", - "options":[ - { - "text":"0.6862", - "value":"0.6862" - } - ], - "query":"0.6862", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"0.04", - "value":"0.04" - }, - "hide":0, - "label":"Storage", - "name":"costStorageStandard", - "options":[ - { - "text":"0.04", - "value":"0.04" - } - ], - "query":"0.04", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":".17", - "value":".17" - }, - "hide":0, - "label":"SSD", - "name":"costStorageSSD", - "options":[ - { - "text":".17", - "value":".17" - } - ], - "query":".17", - "skipUrlSync":false, - "type":"constant" - }, - { - "current":{ - "text":"30", - "value":"30" - }, - "hide":0, - "label":"Disc.", - "name":"costDiscount", - "options":[ - { - "text":"30", - "value":"30" - } - ], - "query":"30", - "skipUrlSync":false, - "type":"constant" - }, - { - "allValue":null, - "current":{ - "text":"kube-system", - "value":"kube-system" - }, - "datasource":"default-kubecost", - "hide":0, - "includeAll":false, - "label":"NS", - "multi":false, - "name":"namespace", - "options":[ - - ], - "query":"query_result(sum(kube_namespace_created{namespace!=\"\"}) by (namespace))", - "refresh":1, - "regex":"/namespace=\\\"(.*?)(\\\")/", - "skipUrlSync":false, - "sort":0, - "tagValuesQuery":"", - "tags":[ - - ], - "tagsQuery":"", - "type":"query", - "useTags":false - }, - { - "datasource":"default-kubecost", - "filters":[ - - ], - "hide":0, - "label":"", - "name":"Filters", - "skipUrlSync":false, - "type":"adhoc" - } - ] - }, - "time":{ - "from":"now-15m", - "to":"now" - }, - "timepicker":{ - "hidden":false, - "refresh_intervals":[ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options":[ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone":"browser", - "title":"Namespace utilization metrics", - "uid":"at-cost-analysis-namespace2", - "version":1 -} diff --git a/charts/kubecost/node-utilization.json b/charts/kubecost/node-utilization.json deleted file mode 100644 index ce751c199..000000000 --- a/charts/kubecost/node-utilization.json +++ /dev/null @@ -1,1370 +0,0 @@ -{ - "annotations":{ - "list":[ - { - "builtIn":1, - "datasource":"-- Grafana --", - "enable":true, - "hide":true, - "iconColor":"rgba(0, 211, 255, 1)", - "name":"Annotations & Alerts", - "type":"dashboard" - } - ] - }, - "editable":true, - "gnetId":null, - "graphTooltip":0, - "id":6, - "iteration":1557245882378, - "links":[ - - ], - "panels":[ - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"percentunit", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":7, - "w":8, - "x":0, - "y":0 - }, - "id":2, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(irate(container_cpu_usage_seconds_total{id=\"/\",instance=\"$node\"}[10m]))", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"CPU Usage", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"percentunit", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":7, - "w":8, - "x":8, - "y":0 - }, - "id":3, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"SUM(container_memory_usage_bytes{namespace!=\"\",instance=\"$node\"}) / SUM(kube_node_status_capacity_memory_bytes{node=\"$node\"})", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Memory Usage", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"percentunit", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":true, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":7, - "w":8, - "x":16, - "y":0 - }, - "id":4, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(container_fs_usage_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"}) /\nsum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"})", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Storage Usage", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "columns":[ - { - "text":"Avg", - "value":"avg" - } - ], - "datasource":"default-kubecost", - "fontSize":"100%", - "gridPos":{ - "h":8, - "w":16, - "x":0, - "y":7 - }, - "hideTimeOverride":true, - "id":21, - "links":[ - - ], - "pageSize":8, - "repeat":null, - "repeatDirection":"v", - "scroll":true, - "showHeader":true, - "sort":{ - "col":4, - "desc":true - }, - "styles":[ - { - "alias":"Pod", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "link":false, - "linkTooltip":"", - "linkUrl":"", - "pattern":"pod_name", - "thresholds":[ - "30", - "80" - ], - "type":"string", - "unit":"currencyUSD" - }, - { - "alias":"", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Time", - "thresholds":[ - - ], - "type":"hidden", - "unit":"short" - }, - { - "alias":"CPU Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #C", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"CPU Request", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #A", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"CPU Limit", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #B", - "thresholds":[ - - ], - "type":"number", - "unit":"short" - }, - { - "alias":"Mem Usage", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #D", - "thresholds":[ - - ], - "type":"number", - "unit":"bytes" - }, - { - "alias":"Mem Request", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #E", - "thresholds":[ - - ], - "type":"number", - "unit":"bytes" - }, - { - "alias":"Mem Limit", - "colorMode":null, - "colors":[ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat":"YYYY-MM-DD HH:mm:ss", - "decimals":2, - "mappingType":1, - "pattern":"Value #F", - "thresholds":[ - - ], - "type":"number", - "unit":"bytes" - } - ], - "targets":[ - { - "expr":"sum(rate(container_cpu_usage_seconds_total{container_name!=\"\",container_name!=\"POD\",pod_name!=\"\",instance=\"$node\"}[24h])) by (pod_name)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"C" - }, - { - "expr":"sum(label_replace(\nsum(avg_over_time(kube_pod_container_resource_requests_cpu_cores{container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod), \n\"pod_name\",\"$1\",\"pod\",\"(.+)\")\nor up * 0\n) by (pod_name)", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"A" - }, - { - "expr":"sum(avg_over_time(container_memory_usage_bytes{container_name!=\"\",container_name!=\"POD\",pod_name!=\"\",instance=\"$node\"}[24h])) by (pod_name)\n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"D" - }, - { - "expr":"sum(label_replace(label_replace(\nsum(avg_over_time(kube_pod_container_resource_requests_memory_bytes{container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod),\n\"container_name\",\"$1\",\"container\",\"(.+)\"), \"pod_name\",\"$1\",\"pod\",\"(.+)\")\nor up * 0\n) by (pod_name)\n", - "format":"table", - "instant":true, - "intervalFactor":1, - "refId":"E" - } - ], - "timeFrom":"1M", - "timeShift":null, - "title":"Current pods", - "transform":"table", - "transparent":false, - "type":"table" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "decimals":0, - "format":"none", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":16, - "y":7 - }, - "id":8, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(\n count(avg_over_time(kube_pod_container_resource_requests_cpu_cores{container!=\"\",container!=\"POD\",node=\"$node\"}[24h])) by (pod)\n * on (pod) group_right()\n sum(kube_pod_container_status_running) by (pod)\n)", - "format":"time_series", - "instant":true, - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Pods Running", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"bytes", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":20, - "y":7 - }, - "id":18, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"sum(container_fs_limit_bytes{device=~\"^/dev/[sv]d[a-z][1-9]$\",id=\"/\",instance=\"$node\"})", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"Storage Capacity", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"none", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":16, - "y":11 - }, - "id":9, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"kube_node_status_capacity_cpu_cores{node=\"$node\"}", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"CPU Capacity", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"avg" - }, - { - "cacheTimeout":null, - "colorBackground":false, - "colorValue":false, - "colors":[ - "#299c46", - "rgba(237, 129, 40, 0.89)", - "#d44a3a" - ], - "datasource":"default-kubecost", - "format":"bytes", - "gauge":{ - "maxValue":100, - "minValue":0, - "show":false, - "thresholdLabels":false, - "thresholdMarkers":true - }, - "gridPos":{ - "h":4, - "w":4, - "x":20, - "y":11 - }, - "id":19, - "interval":null, - "links":[ - - ], - "mappingType":1, - "mappingTypes":[ - { - "name":"value to text", - "value":1 - }, - { - "name":"range to text", - "value":2 - } - ], - "maxDataPoints":100, - "nullPointMode":"connected", - "nullText":null, - "postfix":"", - "postfixFontSize":"50%", - "prefix":"", - "prefixFontSize":"50%", - "rangeMaps":[ - { - "from":"null", - "text":"N/A", - "to":"null" - } - ], - "sparkline":{ - "fillColor":"rgba(31, 118, 189, 0.18)", - "full":false, - "lineColor":"rgb(31, 120, 193)", - "show":false - }, - "tableColumn":"", - "targets":[ - { - "expr":"kube_node_status_capacity_memory_bytes{node=\"$node\"}", - "format":"time_series", - "intervalFactor":1, - "refId":"A" - } - ], - "thresholds":"", - "title":"RAM Capacity", - "type":"singlestat", - "valueFontSize":"80%", - "valueMaps":[ - { - "op":"=", - "text":"N/A", - "value":"null" - } - ], - "valueName":"current" - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":3, - "description":"This panel shows historical utilization for the node.", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":15 - }, - "height":"", - "id":11, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"sum(irate(container_cpu_usage_seconds_total{id=\"/\",instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"10s", - "intervalFactor":1, - "legendFormat":"cpu utilization", - "metric":"container_cpu", - "refId":"A", - "step":10 - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"CPU Utilization", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percentunit", - "label":"", - "logBase":1, - "max":"1.1", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"This panel shows historical utilization for the node.", - "editable":true, - "error":false, - "fill":0, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":15 - }, - "id":13, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":false, - "current":false, - "max":false, - "min":false, - "rightSide":false, - "show":false, - "sideWidth":200, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":true, - "targets":[ - { - "expr":"SUM(container_memory_usage_bytes{namespace!=\"\",instance=\"$node\"}) / SUM(kube_node_status_capacity_memory_bytes{node=\"$node\"})", - "format":"time_series", - "instant":false, - "interval":"10s", - "intervalFactor":1, - "legendFormat":"ram utilization", - "metric":"container_memory_usage:sort_desc", - "refId":"A", - "step":10 - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"RAM Utilization", - "tooltip":{ - "msResolution":false, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "decimals":null, - "format":"percentunit", - "label":null, - "logBase":1, - "max":"1.1", - "min":"0", - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Traffic in and out of this namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":0, - "y":21 - }, - "height":"", - "id":15, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_network_receive_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- in", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_network_transmit_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> out", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Network IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - }, - { - "aliasColors":{ - - }, - "bars":false, - "dashLength":10, - "dashes":false, - "datasource":"default-kubecost", - "decimals":2, - "description":"Disk reads and writes for the namespace, as a sum of the pods within it", - "editable":true, - "error":false, - "fill":1, - "grid":{ - - }, - "gridPos":{ - "h":6, - "w":12, - "x":12, - "y":21 - }, - "height":"", - "id":17, - "isNew":true, - "legend":{ - "alignAsTable":false, - "avg":true, - "current":true, - "hideEmpty":false, - "hideZero":false, - "max":false, - "min":false, - "rightSide":false, - "show":true, - "sideWidth":null, - "sort":"current", - "sortDesc":true, - "total":false, - "values":true - }, - "lines":true, - "linewidth":2, - "links":[ - - ], - "nullPointMode":"connected", - "percentage":false, - "pointradius":5, - "points":false, - "renderer":"flot", - "seriesOverrides":[ - - ], - "spaceLength":10, - "stack":false, - "steppedLine":false, - "targets":[ - { - "expr":"sum (rate (container_fs_writes_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"<- write", - "metric":"container_cpu", - "refId":"A", - "step":10 - }, - { - "expr":"- sum (rate (container_fs_reads_bytes_total{instance=\"$node\"}[10m]))", - "format":"time_series", - "hide":false, - "instant":false, - "interval":"", - "intervalFactor":1, - "legendFormat":"-> read", - "refId":"B" - } - ], - "thresholds":[ - - ], - "timeFrom":"", - "timeShift":null, - "title":"Disk IO", - "tooltip":{ - "msResolution":true, - "shared":true, - "sort":2, - "value_type":"cumulative" - }, - "type":"graph", - "xaxis":{ - "buckets":null, - "mode":"time", - "name":null, - "show":true, - "values":[ - - ] - }, - "yaxes":[ - { - "format":"Bps", - "label":"", - "logBase":1, - "max":null, - "min":null, - "show":true - }, - { - "format":"short", - "label":null, - "logBase":1, - "max":null, - "min":null, - "show":false - } - ], - "yaxis":{ - "align":false, - "alignLevel":null - } - } - ], - "schemaVersion":16, - "style":"dark", - "tags":[ - "cost", - "utilization", - "metrics" - ], - "templating":{ - "list":[ - { - "allValue":null, - "current":{ - "text":"ip-172-20-44-170.us-east-2.compute.internal", - "value":"ip-172-20-44-170.us-east-2.compute.internal" - }, - "datasource":"default-kubecost", - "hide":0, - "includeAll":false, - "label":null, - "multi":false, - "name":"node", - "options":[ - - ], - "query":"query_result(kube_node_labels)", - "refresh":1, - "regex":"/node=\\\"(.*?)(\\\")/", - "skipUrlSync":false, - "sort":0, - "tagValuesQuery":"", - "tags":[ - - ], - "tagsQuery":"", - "type":"query", - "useTags":false - } - ] - }, - "time":{ - "from":"now-6h", - "to":"now" - }, - "timepicker":{ - "refresh_intervals":[ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options":[ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone":"", - "title":"Node utilization metrics", - "uid":"NUQW37Lmk", - "version":1 -} diff --git a/charts/kubecost/pod-utilization.json b/charts/kubecost/pod-utilization.json deleted file mode 100644 index 4e0abff2d..000000000 --- a/charts/kubecost/pod-utilization.json +++ /dev/null @@ -1,798 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Visualize your kubernetes costs at the pod level.", - "editable": true, - "gnetId": 9063, - "graphTooltip": 0, - "id": 4, - "iteration": 1560100821196, - "links": [], - "panels": [ - { - "columns": [ - { - "text": "Avg", - "value": "avg" - } - ], - "datasource": "default-kubecost", - "fontSize": "100%", - "gridPos": { - "h": 5, - "w": 24, - "x": 0, - "y": 0 - }, - "hideTimeOverride": true, - "id": 98, - "links": [], - "pageSize": 5, - "repeatDirection": "v", - "scroll": true, - "showHeader": true, - "sort": { - "col": 6, - "desc": true - }, - "styles": [ - { - "alias": "Container", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(50, 172, 45, 0.97)", - "#c15c17" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "link": false, - "pattern": "container_name", - "thresholds": [ - "30", - "80" - ], - "type": "string", - "unit": "currencyUSD" - }, - { - "alias": "Memory Allocation", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "pattern": "Value #B", - "thresholds": [], - "type": "number", - "unit": "bytes" - }, - { - "alias": "CPU Allocation", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #A", - "thresholds": [], - "type": "number", - "unit": "none" - }, - { - "alias": "", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Time", - "thresholds": [], - "type": "hidden", - "unit": "short" - }, - { - "alias": "Memory ($/hour)", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #C", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Spot/PE RAM", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #D", - "thresholds": [], - "type": "number", - "unit": "currencyUSD" - }, - { - "alias": "Total", - "colorMode": null, - "colors": [ - "#bf1b00", - "rgba(50, 172, 45, 0.97)", - "#ef843c" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Value #E", - "thresholds": [ - "" - ], - "type": "number", - "unit": "currencyUSD" - } - ], - "targets": [ - { - "expr": "sum(\n avg_over_time(container_memory_allocation_bytes{namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\"}[$__range])\n) by (container,node)", - "format": "table", - "instant": true, - "intervalFactor": 1, - "refId": "B" - }, - { - "expr": "sum(\n avg_over_time(container_cpu_allocation{namespace=\"$namespace\", pod=\"$pod\", container!=\"POD\"}[$__range])\n or up * 0 \n) by (container,node)", - "format": "table", - "hide": false, - "instant": true, - "interval": "", - "intervalFactor": 1, - "legendFormat": "", - "refId": "A" - } - ], - "timeFrom": "1M", - "timeShift": null, - "title": "Container cost & allocation analysis", - "transform": "table", - "transparent": false, - "type": "table" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 3, - "description": "This graph attempts to show you CPU use of your application vs its requests", - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 5 - }, - "height": "", - "id": 94, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "expr": "avg (rate (container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod_name=\"$pod\", container_name!=\"POD\",container_name!=\"\"}[10m])) by (container_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ container_name }} (usage)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "avg(kube_pod_container_resource_requests_cpu_cores{namespace=~\"$namespace\", pod=\"$pod\", container!=\"POD\"}) by (container)", - "format": "time_series", - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{ container}} (request)", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "CPU Usage vs Requested", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 3, - "description": "This graph attempts to show you RAM use of your application vs its requests", - "editable": true, - "error": false, - "fill": 0, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 5 - }, - "height": "", - "id": 96, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "expr": "avg (avg_over_time (container_memory_working_set_bytes{namespace=\"$namespace\", pod_name=\"$pod\", container_name!=\"POD\",container_name!=\"\"}[1m])) by (container_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{ container_name }} (usage)", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "avg(kube_pod_container_resource_requests_memory_bytes{namespace=~\"$namespace\", pod=\"$pod\", container!=\"POD\"}) by (container)", - "format": "time_series", - "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{ container }} (requested)", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "RAM Usage vs Requested", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "description": "Traffic in and out of this pod, as a sum of its containers", - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 12 - }, - "height": "", - "id": 95, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg (rate (container_network_receive_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "<- in", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "- avg (rate (container_network_transmit_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "-> out", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "Network IO", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "description": "Disk read writes", - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 12 - }, - "height": "", - "id": 97, - "isNew": true, - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sideWidth": null, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "connected", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "avg (rate (container_fs_writes_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "<- write", - "metric": "container_cpu", - "refId": "A", - "step": 10 - }, - { - "expr": "- avg (rate (container_fs_reads_bytes_total{namespace=\"$namespace\",pod_name=\"$pod\"}[10m])) by (pod_name)", - "format": "time_series", - "hide": false, - "instant": false, - "interval": "", - "intervalFactor": 1, - "legendFormat": "-> read", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": "", - "timeShift": null, - "title": "Disk IO", - "tooltip": { - "msResolution": true, - "shared": true, - "sort": 2, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "Bps", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 16, - "style": "dark", - "tags": [ - "cost", - "utilization", - "metrics" - ], - "templating": { - "list": [ - { - "current": { - "text": "0.044", - "value": "0.044" - }, - "hide": 0, - "label": "Storage", - "name": "costStorageStandard", - "options": [ - { - "text": "0.044", - "value": "0.044" - } - ], - "query": "0.044", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": "0.187", - "value": "0.187" - }, - "hide": 0, - "label": "SSD", - "name": "costStorageSSD", - "options": [ - { - "text": "0.187", - "value": "0.187" - } - ], - "query": "0.187", - "skipUrlSync": false, - "type": "constant" - }, - { - "current": { - "text": "30", - "value": "30" - }, - "hide": 0, - "label": "Disc.", - "name": "costDiscount", - "options": [ - { - "text": "30", - "value": "30" - } - ], - "query": "30", - "skipUrlSync": false, - "type": "constant" - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "kubecost", - "value": "kubecost" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": false, - "label": "NS", - "multi": false, - "name": "namespace", - "options": [], - "query": "query_result(sum(container_memory_working_set_bytes{namespace!=\"\"}) by (namespace))", - "refresh": 1, - "regex": "/namespace=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "tags": [], - "text": "kubecost-grafana-5cc9f5bf6-7kmgl", - "value": "kubecost-grafana-5cc9f5bf6-7kmgl" - }, - "datasource": "default-kubecost", - "hide": 0, - "includeAll": false, - "label": "Pod", - "multi": false, - "name": "pod", - "options": [], - "query": "query_result(sum(container_memory_working_set_bytes{namespace=\"$namespace\"}) by (pod_name))", - "refresh": 1, - "regex": "/pod_name=\\\"(.*?)(\\\")/", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "hidden": false, - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "browser", - "title": "Pod cost & utilization metrics", - "uid": "at-cost-analysis-pod", - "version": 1 -} diff --git a/charts/kubecost/prom-benchmark.json b/charts/kubecost/prom-benchmark.json deleted file mode 100644 index 83c778bd5..000000000 --- a/charts/kubecost/prom-benchmark.json +++ /dev/null @@ -1,5670 +0,0 @@ -{ - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "description": "Metrics useful for benchmarking and loadtesting Prometheus itself. Designed primarily for Prometheus 2.17.x.", - "editable": true, - "gnetId": 12054, - "graphTooltip": 1, - "id": 9, - "iteration": 1603144824023, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 49, - "panels": [], - "title": "Basics", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 40, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_build_info{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{version}} - {{revision}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Prometheus Version", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 1 - }, - "hiddenSeries": false, - "id": 72, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "time() - process_start_time_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Age", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Uptime", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "dtdurations", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 1 - }, - "hiddenSeries": false, - "id": 107, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "time() - prometheus_config_last_reload_success_timestamp_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Age", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Last Successful Config Reload", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "dtdurations", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 8 - }, - "id": 46, - "panels": [], - "title": "Ingestion", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "Time series": "#70dbed" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 9 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_series{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Time series", - "metric": "prometheus_local_storage_memory_series", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Time series", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 9 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_active_appenders{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Head Appenders", - "metric": "prometheus_local_storage_memory_series", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Active Appenders", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "samples/s": "#e5a8e2" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 9 - }, - "hiddenSeries": false, - "id": 1, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_head_samples_appended_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "samples/s", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Samples Appended/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "To persist": "#9AC48A" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 16 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/Max.*/", - "fill": 0 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_chunks{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Chunks", - "metric": "prometheus_local_storage_memory_chunks", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Chunks", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 16 - }, - "hiddenSeries": false, - "id": 4, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_head_chunks_created_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Created", - "metric": "prometheus_local_storage_chunk_ops_total", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_head_chunks_removed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Removed", - "metric": "prometheus_local_storage_chunk_ops_total", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Chunks/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ops", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "Removed": "#e5ac0e" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 16 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_isolation_high_watermark{job=\"prometheus\",instance=\"$Prometheus:9090\"} - prometheus_tsdb_isolation_low_watermark{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Difference", - "metric": "prometheus_local_storage_chunk_ops_total", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Isolation Watermarks", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 23 - }, - "id": 52, - "panels": [], - "title": "Compaction", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max": "#447ebc", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "Min": "#447ebc", - "Now": "#7eb26d" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 24 - }, - "hiddenSeries": false, - "id": 28, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "Max", - "fillBelowTo": "Min", - "lines": false - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_head_min_time{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Min", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - }, - { - "expr": "time() * 1000", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "legendFormat": "Now", - "refId": "C" - }, - { - "expr": "prometheus_tsdb_head_max_time{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Max", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head Time Range", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "dateTimeAsIso", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 24 - }, - "hiddenSeries": false, - "id": 29, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_head_gc_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "GC Time/s", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Head GC Time/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 24 - }, - "hiddenSeries": false, - "id": 14, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "Queue length", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_blocks_loaded{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Blocks Loaded", - "metric": "prometheus_local_storage_indexing_batch_sizes_sum", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Blocks Loaded", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Failed Reloads": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 31 - }, - "hiddenSeries": false, - "id": 30, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_reloads_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Reloads", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "TSDB Reloads/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 31 - }, - "hiddenSeries": false, - "id": 31, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_wal_fsync_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_tsdb_wal_fsync_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Fsync Latency", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_wal_truncate_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m]) / rate(prometheus_tsdb_wal_trunacte_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Truncate Latency", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "WAL Fsync&Truncate Latency", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "{instance=\"demo.robustperception.io:9090\",job=\"prometheus\"}": "#bf1b00" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 31 - }, - "hiddenSeries": false, - "id": 32, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_wal_corruptions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "WAL Corruptions", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_reloads_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Reload Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "B", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_head_series_not_found{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Head Series Not Found", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "C", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_compactions_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Compaction Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "D", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_retention_cutoffs_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Retention Cutoff Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "E", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_checkpoint_creations_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "WAL Checkpoint Creation Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "F", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_checkpoint_deletions_failed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "WAL Checkpoint Deletion Failures", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "G", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "TSDB Problems/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Failed Compactions": "#bf1b00", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 38 - }, - "hiddenSeries": false, - "id": 19, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compactions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Compactions", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Compactions/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 38 - }, - "hiddenSeries": false, - "id": 33, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Compaction Time/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Allocated bytes": "#F9BA8F", - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "RSS": "#890F02" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 38 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_time_retentions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Time Cutoffs", - "metric": "last", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(prometheus_tsdb_size_retentions_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Size Cutoffs", - "metric": "last", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Retention Cutoffs/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 45 - }, - "hiddenSeries": false, - "id": 27, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_chunk_range_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_range_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Chunk Time Range", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "First Compaction, Avg Chunk Time Range", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "dtdurationms", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 45 - }, - "hiddenSeries": false, - "id": 35, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_chunk_size_bytes_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Bytes/Sample", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "First Compaction, Avg Bytes/Sample", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 45 - }, - "hiddenSeries": false, - "id": 34, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": false, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_tsdb_compaction_chunk_samples_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m]) / rate(prometheus_tsdb_compaction_chunk_samples_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[10m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Chunk Samples", - "metric": "prometheus_local_storage_series_chunks_persisted_count", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "First Compaction, Avg Chunk Samples", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 52 - }, - "id": 55, - "panels": [], - "title": "Resource Usage", - "type": "row" - }, - { - "aliasColors": { - "Allocated bytes": "#7EB26D", - "Allocated bytes - 1m max": "#BF1B00", - "Allocated bytes - 1m min": "#BF1B00", - "Allocated bytes - 5m max": "#BF1B00", - "Allocated bytes - 5m min": "#BF1B00", - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "RSS": "#447EBC" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": null, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 53 - }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/-/", - "fill": 0 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_resident_memory_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "RSS", - "metric": "process_resident_memory_bytes", - "refId": "B", - "step": 10 - }, - { - "expr": "prometheus_local_storage_target_heap_size_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "Target heap size", - "metric": "go_memstats_alloc_bytes", - "refId": "D", - "step": 10 - }, - { - "expr": "go_memstats_next_gc_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "Next GC", - "metric": "go_memstats_next_gc_bytes", - "refId": "C", - "step": 10 - }, - { - "expr": "go_memstats_alloc_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "intervalFactor": 2, - "legendFormat": "Allocated", - "metric": "go_memstats_alloc_bytes", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Memory", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Allocated bytes": "#F9BA8F", - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833", - "RSS": "#890F02" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 53 - }, - "hiddenSeries": false, - "id": 7, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(go_memstats_alloc_bytes_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Allocated Bytes/s", - "metric": "go_memstats_alloc_bytes", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Allocations", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 53 - }, - "hiddenSeries": false, - "id": 9, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(process_cpu_seconds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "intervalFactor": 2, - "legendFormat": "Irate", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - }, - { - "expr": "rate(process_cpu_seconds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", - "intervalFactor": 2, - "legendFormat": "5m rate", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "CPU", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - "avg" - ] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 60 - }, - "hiddenSeries": false, - "id": 70, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_symbol_table_size_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "RAM Used", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Symbol Tables Size", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - "avg" - ] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "decimals": 2, - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 60 - }, - "hiddenSeries": false, - "id": 71, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_tsdb_storage_blocks_bytes_total{job=\"prometheus\",instance=\"$Prometheus:9090\"} or prometheus_tsdb_storage_blocks_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Disk Used", - "metric": "prometheus_local_storage_ingested_samples_total", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Block Size", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [ - "avg" - ] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Max": "#e24d42", - "Open": "#508642" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 60 - }, - "hiddenSeries": false, - "id": 41, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "process_max_fds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Max", - "refId": "A" - }, - { - "expr": "process_open_fds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "Open", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "File Descriptors", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 67 - }, - "id": 91, - "panels": [], - "title": "Service Discovery", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 68 - }, - "hiddenSeries": false, - "id": 42, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_sd_discovered_targets{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{name}}-{{config}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Discovered Targets", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 68 - }, - "hiddenSeries": false, - "id": 96, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_sd_updates_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sent Updates/s", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 68 - }, - "hiddenSeries": false, - "id": 97, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_sd_received_updates_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[5m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Received Updates/s", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 75 - }, - "id": 99, - "panels": [], - "title": "Scraping", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 76 - }, - "hiddenSeries": false, - "id": 105, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_target_interval_length_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_target_interval_length_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{interval}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Scrape Interval", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 76 - }, - "hiddenSeries": false, - "id": 104, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_target_scrapes_exceeded_sample_limit_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Exceeded Sample Limit", - "refId": "A" - }, - { - "expr": "rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Duplicate Timestamp", - "refId": "C" - }, - { - "expr": "rate(prometheus_target_scrapes_sample_out_of_bounds_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Out Of Bounds ", - "refId": "D" - }, - { - "expr": "rate(prometheus_target_scrapes_sample_out_of_order_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "Out of Order", - "refId": "E" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Scrape Problems/s", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 76 - }, - "hiddenSeries": false, - "id": 95, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_target_metadata_cache_bytes{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 1, - "legendFormat": "{{scrape_job}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Metadata Cache Size", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 83 - }, - "id": 63, - "panels": [], - "title": "Query Engine", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "Time spent in each mode, per second", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 84 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_engine_query_duration_seconds_sum{job=\"prometheus\",}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{slice}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Query engine timings/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 84 - }, - "hiddenSeries": false, - "id": 22, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_rule_group_iterations_missed_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) ", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Rule group missed", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - }, - { - "expr": "rate(prometheus_rule_evaluation_failures_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Rule evals failed", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "C", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Rule group evaulation problems/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 84 - }, - "hiddenSeries": false, - "id": 23, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_rule_group_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Rule evaluation duration", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Evaluation time of rule groups/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": true, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 91 - }, - "id": 77, - "panels": [ - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 92 - }, - "hiddenSeries": false, - "id": 86, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_sent_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{alertmanager}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Sent/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 92 - }, - "hiddenSeries": false, - "id": 87, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_errors_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_notifications_sent_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{alertmanager}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Error Ratio", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 92 - }, - "hiddenSeries": false, - "id": 81, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_latency_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m]) / rate(prometheus_notifications_latency_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{alertmanager}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Latency", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 99 - }, - "hiddenSeries": false, - "id": 85, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_notifications_alertmanagers_discovered{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Alertmanagers", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Alertmanagers Discovered", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 99 - }, - "hiddenSeries": false, - "id": 89, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_notifications_dropped_total{job=\"prometheus\",instance=\"$Prometheus:9090\"}[1m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Dropped", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notifications Dropped/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 99 - }, - "hiddenSeries": false, - "id": 88, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_notifications_queue_length{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Pending", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - }, - { - "expr": "prometheus_notifications_queue_capacity{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "Max", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Notification Queue", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "title": "Notification", - "type": "row" - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 92 - }, - "id": 58, - "panels": [], - "title": "HTTP Server", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 0, - "y": 93 - }, - "hiddenSeries": false, - "id": 38, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_http_request_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{handler}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "HTTP requests/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 8, - "y": 93 - }, - "hiddenSeries": false, - "id": 37, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_http_request_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m]) / rate(prometheus_http_request_duration_seconds_count{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{handler}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "HTTP request latency", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "description": "", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 93 - }, - "hiddenSeries": false, - "id": 36, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": false, - "targets": [ - { - "expr": "rate(prometheus_http_request_duration_seconds_sum{job=\"prometheus\",instance=\"$Prometheus:9090\"}[2m])", - "format": "time_series", - "interval": "", - "intervalFactor": 2, - "legendFormat": "{{handler}}", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Time spent in HTTP requests/s", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 100 - }, - "id": 61, - "panels": [], - "repeat": "RuleGroup", - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;CPU", - "value": "/etc/config/rules;CPU" - } - }, - "title": "Rule Group: $RuleGroup", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 101 - }, - "hiddenSeries": false, - "id": 43, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "repeatDirection": "h", - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;CPU", - "value": "/etc/config/rules;CPU" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_interval_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Interval", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - }, - { - "expr": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Last Duration", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Duration", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 101 - }, - "hiddenSeries": false, - "id": 66, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeatDirection": "h", - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;CPU", - "value": "/etc/config/rules;CPU" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_rules{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Rules", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Rules", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "default-kubecost", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 108 - }, - "id": 108, - "panels": [], - "repeat": null, - "repeatIteration": 1603144824023, - "repeatPanelId": 61, - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;Savings", - "value": "/etc/config/rules;Savings" - } - }, - "title": "Rule Group: $RuleGroup", - "type": "row" - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 109 - }, - "hiddenSeries": false, - "id": 109, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeat": null, - "repeatDirection": "h", - "repeatIteration": 1603144824023, - "repeatPanelId": 43, - "repeatedByRow": true, - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;Savings", - "value": "/etc/config/rules;Savings" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_interval_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Interval", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - }, - { - "expr": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Last Duration", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "B", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Duration", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Chunks": "#1F78C1", - "Chunks to persist": "#508642", - "Interval": "#890f02", - "Last Duration": "#f9934e", - "Max chunks": "#052B51", - "Max to persist": "#3F6833" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "default-kubecost", - "editable": true, - "error": false, - "fieldConfig": { - "defaults": { - "custom": {}, - "links": [] - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 109 - }, - "hiddenSeries": false, - "id": 110, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.1", - "pointradius": 5, - "points": false, - "renderer": "flot", - "repeatDirection": "h", - "repeatIteration": 1603144824023, - "repeatPanelId": 66, - "repeatedByRow": true, - "scopedVars": { - "RuleGroup": { - "selected": false, - "text": "/etc/config/rules;Savings", - "value": "/etc/config/rules;Savings" - } - }, - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "prometheus_rule_group_rules{job=\"prometheus\",instance=\"$Prometheus:9090\",rule_group=~\"$RuleGroup\"}\n", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "Rules", - "metric": "prometheus_local_storage_memory_chunkdescs", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "$RuleGroup: Rules", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 26, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": { - "selected": false, - "text": "localhost", - "value": "localhost" - }, - "datasource": "default-kubecost", - "definition": "", - "hide": 0, - "includeAll": false, - "label": null, - "multi": false, - "name": "Prometheus", - "options": [], - "query": "query_result(up{job=\"prometheus\"} == 1)", - "refresh": 2, - "regex": ".*instance=\"([^\"]+):9090\".*", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": null, - "tags": [], - "tagsQuery": null, - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": "default-kubecost", - "definition": "", - "hide": 2, - "includeAll": true, - "label": null, - "multi": false, - "name": "RuleGroup", - "options": [], - "query": "prometheus_rule_group_last_duration_seconds{job=\"prometheus\",instance=\"$Prometheus:9090\"}", - "refresh": 2, - "regex": ".*rule_group=\"(.*?)\".*", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-24h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "utc", - "title": "Prometheus Benchmark - 2.17.x", - "uid": "L0HBvojWz", - "version": 4 -} diff --git a/charts/kubecost/questions.yml b/charts/kubecost/questions.yml deleted file mode 100644 index ce86c64fb..000000000 --- a/charts/kubecost/questions.yml +++ /dev/null @@ -1,160 +0,0 @@ -questions: -# General Settings -- variable: kubecostProductConfigs.clusterName - label: Cluster Name - description: "Used for display in the cost-analyzer UI (Can be renamed in the UI)" - type: string - required: true - default: "" - group: General Settings -- variable: persistentVolume.enabled - label: Enable Persistent Volume for CostAnalyzer - description: "If true, Kubecost will create a Persistent Volume Claim for product config data" - type: boolean - default: false - show_subquestion_if: true - group: "General Settings" - subquestions: - - variable: persistentVolume.size - label: CostAnalyzer Persistent Volume Size - type: string - default: "0.2Gi" - -# Prometheus Server -- variable: global.prometheus.enabled - label: Enable Prometheus - description: If false, use an existing Prometheus install - type: boolean - default: true - group: "Prometheus" -- variable: prometheus.kubeStateMetrics.enabled - label: Enable KubeStateMetrics - description: "If true, deploy kube-state-metrics for Kubernetes metrics" - type: boolean - default: true - show_if: "global.prometheus.enabled=true" - group: "Prometheus" -- variable: prometheus.server.retention - label: Prometheus Server Retention - description: "Determines when to remove old data" - type: string - default: "15d" - show_if: "global.prometheus.enabled=true" - group: "Prometheus" -- variable: prometheus.server.persistentVolume.enabled - label: Create Persistent Volume for Prometheus - description: "If true, prometheus will create a persistent volume claim" - type: boolean - required: true - default: false - group: "Prometheus" - show_if: "global.prometheus.enabled=true" - show_subquestion_if: true - subquestions: - - variable: prometheus.server.persistentVolume.size - label: Prometheus Persistent Volume Size - type: string - default: "8Gi" - - variable: prometheus.server.persistentVolume.storageClass - label: Prometheus Persistent Volume StorageClass - description: "Prometheus data persistent volume storageClass, if not set use default StorageClass" - default: "" - type: storageclass - - variable: prometheus.server.persistentVolume.existingClaim - label: Existing Persistent Volume Claim for Prometheus - description: "If not empty, uses the specified existing PVC instead of creating new one" - type: pvc - default: "" - -# Prometheus Node Exporter -- variable: prometheus.nodeExporter.enabled - label: Enable NodeExporter - description: "If false, do not create NodeExporter daemonset" - type: boolean - default: true - group: "NodeExporter" -- variable: prometheus.serviceAccounts.nodeExporter.create - label: Enable Service Accounts NodeExporter - description: "If false, do not create NodeExporter daemonset" - type: boolean - default: true - group: "NodeExporter" - -# Prometheus AlertManager -- variable: prometheus.alertmanager.enabled - label: Enable AlertManager - type: boolean - default: true - group: "AlertManager" -- variable: prometheus.alertmanager.persistentVolume.enabled - label: Create Persistent Volume for AlertManager - description: "If true, alertmanager will create a persistent volume claim" - type: boolean - required: true - default: false - group: "AlertManager" - show_if: "prometheus.alertmanager.enabled=true" - show_subquestion_if: true - subquestions: - - variable: prometheus.alertmanager.persistentVolume.size - default: "2Gi" - description: "AlertManager data persistent volume size" - type: string - label: AlertManager Persistent Volume Size - - variable: prometheus.alertmanager.persistentVolume.storageClass - default: "" - description: "Alertmanager data persistent volume storageClass, if not set use default StorageClass" - type: storageclass - label: AlertManager Persistent Volume StorageClass - - variable: prometheus.alertmanager.persistentVolume.existingClaim - default: "" - description: "If not empty, uses the specified existing PVC instead of creating new one" - type: pvc - label: Existing Persistent Volume Claim for AlertManager - -# PushGateway -- variable: prometheus.pushgateway.enabled - label: Enable PushGateway - type: boolean - default: true - group: "PushGateway" -- variable: prometheus.pushgateway.persistentVolume.enabled - label: Create Persistent Volume for PushGateway - description: "If true, PushGateway will create a persistent volume claim" - required: true - type: boolean - default: false - group: "PushGateway" - show_if: "prometheus.pushgateway.enabled=true" - show_subquestion_if: true - subquestions: - - variable: prometheus.prometheus.pushgateway.persistentVolume.size - label: PushGateway Persistent Volume Size - type: string - default: "2Gi" - - variable: prometheus.pushgateway.persistentVolume.storageClass - label: PushGateway Persistent Volume StorageClass - description: "PushGateway data persistent volume storageClass, if not set use default StorageClass" - type: storageclass - default: "" - - variable: prometheus.pushgateway.persistentVolume.existingClaim - label: Existing Persistent Volume Claim for PushGateway - description: "If not empty, uses the specified existing PVC instead of creating new one" - type: pvc - default: "" - -# Services and Load Balancing -- variable: ingress.enabled - label: Enable Ingress - description: "Expose app using Ingress (Layer 7 Load Balancer)" - default: true - type: boolean - show_subquestion_if: true - group: "Services and Load Balancing" - subquestions: - - variable: ingress.hosts[0] - default: "xip.io" - description: "Hostname to your CostAnalyzer installation" - type: hostname - required: true - label: Hostname diff --git a/charts/kubecost/templates/NOTES.txt b/charts/kubecost/templates/NOTES.txt deleted file mode 100644 index bbc2594e9..000000000 --- a/charts/kubecost/templates/NOTES.txt +++ /dev/null @@ -1,10 +0,0 @@ - - --------------------------------------------------- -{{- $servicePort := .Values.service.port | default 9090 -}} -Kubecost has been successfully installed. When pods are Ready, you can enable port-forwarding with the following command: - - kubectl port-forward --namespace {{ .Release.Namespace }} deployment/{{ template "cost-analyzer.fullname" . }} {{ $servicePort }} - -Next, navigate to http://localhost:{{ $servicePort }} in a web browser. - diff --git a/charts/kubecost/templates/_helpers.tpl b/charts/kubecost/templates/_helpers.tpl deleted file mode 100644 index 95e2dca20..000000000 --- a/charts/kubecost/templates/_helpers.tpl +++ /dev/null @@ -1,200 +0,0 @@ -{{/* vim: set filetype=mustache: */}} -{{/* -Expand the name of the chart. -*/}} -{{- define "cost-analyzer.name" -}} -{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create a default fully qualified app name. -We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). -If release name contains chart name it will be used as a full name. -*/}} -{{- define "cost-analyzer.fullname" -}} -{{- if .Values.fullnameOverride -}} -{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- $name := default .Chart.Name .Values.nameOverride -}} -{{- if contains $name .Release.Name -}} -{{- .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} -{{- end -}} - -{{/* -Create the fully qualified name for Prometheus server service. -*/}} -{{- define "cost-analyzer.prometheus.server.name" -}} -{{- if .Values.prometheus -}} -{{- if .Values.prometheus.server -}} -{{- if .Values.prometheus.server.fullnameOverride -}} -{{- .Values.prometheus.server.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-server" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{/* -Create the fully qualified name for Prometheus alertmanager service. -*/}} -{{- define "cost-analyzer.prometheus.alertmanager.name" -}} -{{- if .Values.prometheus -}} -{{- if .Values.prometheus.alertmanager -}} -{{- if .Values.prometheus.alertmanager.fullnameOverride -}} -{{- .Values.prometheus.alertmanager.fullnameOverride | trunc 63 | trimSuffix "-" -}} -{{- else -}} -{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- else -}} -{{- printf "%s-prometheus-alertmanager" .Release.Name | trunc 63 | trimSuffix "-" -}} -{{- end -}} -{{- end -}} - -{{- define "cost-analyzer.serviceName" -}} -{{- printf "%s-%s" .Release.Name "cost-analyzer" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Network Costs name used to tie autodiscovery of metrics to daemon set pods -*/}} -{{- define "cost-analyzer.networkCostsName" -}} -{{- printf "%s-%s" .Release.Name "network-costs" -}} -{{- end -}} - -{{- define "kubecost.clusterControllerName" -}} -{{- printf "%s-%s" .Release.Name "cluster-controller" -}} -{{- end -}} - -{{/* -Create chart name and version as used by the chart label. -*/}} -{{- define "cost-analyzer.chart" -}} -{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- end -}} - -{{/* -Create the name of the service account -*/}} -{{- define "cost-analyzer.serviceAccountName" -}} -{{- if .Values.serviceAccount.create -}} - {{ default (include "cost-analyzer.fullname" .) .Values.serviceAccount.name }} -{{- else -}} - {{ default "default" .Values.serviceAccount.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the common labels. -*/}} -{{- define "cost-analyzer.commonLabels" -}} -app.kubernetes.io/name: {{ include "cost-analyzer.name" . }} -helm.sh/chart: {{ include "cost-analyzer.chart" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app.kubernetes.io/managed-by: {{ .Release.Service }} -app: cost-analyzer -{{- end -}} - -{{/* -Create the selector labels. -*/}} -{{- define "cost-analyzer.selectorLabels" -}} -app.kubernetes.io/name: {{ include "cost-analyzer.name" . }} -app.kubernetes.io/instance: {{ .Release.Name }} -app: cost-analyzer -{{- end -}} - -{{/* -Return the appropriate apiVersion for daemonset. -*/}} -{{- define "cost-analyzer.daemonset.apiVersion" -}} -{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.9-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "apps/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for priorityClass. -*/}} -{{- define "cost-analyzer.priorityClass.apiVersion" -}} -{{- if semverCompare "<1.14-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "scheduling.k8s.io/v1beta1" -}} -{{- else if semverCompare "^1.14-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "scheduling.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for networkpolicy. -*/}} -{{- define "cost-analyzer.networkPolicy.apiVersion" -}} -{{- if semverCompare ">=1.4-0, <1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.7-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "networking.k8s.io/v1" -}} -{{- end -}} -{{- end -}} - -{{/* -Return the appropriate apiVersion for podsecuritypolicy. -*/}} -{{- define "cost-analyzer.podSecurityPolicy.apiVersion" -}} -{{- if semverCompare ">=1.3-0, <1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "extensions/v1beta1" -}} -{{- else if semverCompare "^1.10-0" .Capabilities.KubeVersion.GitVersion -}} -{{- print "policy/v1beta1" -}} -{{- end -}} -{{- end -}} - -{{/* -Recursive filter which accepts a map containing an input map (.v) and an output map (.r). The template -will traverse all values inside .v recursively writing non-map values to the output .r. If a nested map -is discovered, we look for an 'enabled' key. If it doesn't exist, we continue traversing the -map. If it does exist, we omit the inner map traversal iff enabled is false. This filter writes the -enabled only version to the output .r -*/}} -{{- define "cost-analyzer.filter" -}} -{{- $v := .v }} -{{- $r := .r }} -{{- range $key, $value := .v }} - {{- $tp := kindOf $value -}} - {{- if eq $tp "map" -}} - {{- $isEnabled := true -}} - {{- if (hasKey $value "enabled") -}} - {{- $isEnabled = $value.enabled -}} - {{- end -}} - {{- if $isEnabled -}} - {{- $rr := "{}" | fromYaml }} - {{- template "cost-analyzer.filter" (dict "v" $value "r" $rr) }} - {{- $_ := set $r $key $rr -}} - {{- end -}} - {{- else -}} - {{- $_ := set $r $key $value -}} - {{- end -}} -{{- end -}} -{{- end -}} - -{{/* -This template accepts a map and returns a base64 encoded json version of the map where all disabled -leaf nodes are omitted. - -The implied use case is {{ template "cost-analyzer.filterEnabled" .Values }} -*/}} -{{- define "cost-analyzer.filterEnabled" -}} -{{- $result := "{}" | fromYaml }} -{{- template "cost-analyzer.filter" (dict "v" . "r" $result) }} -{{- $result | toJson | b64enc }} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/aws-service-key-secret.yaml b/charts/kubecost/templates/aws-service-key-secret.yaml deleted file mode 100644 index 6b8de4d5e..000000000 --- a/charts/kubecost/templates/aws-service-key-secret.yaml +++ /dev/null @@ -1,17 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} -{{- if .Values.kubecostProductConfigs.awsServiceKeyName }} -apiVersion: v1 -kind: Secret -metadata: - name: cloud-service-key -type: Opaque -stringData: - service-key.json: |- - { - "aws_access_key_id": "{{ .Values.kubecostProductConfigs.awsServiceKeyName }}", - "aws_secret_access_key": "{{ .Values.kubecostProductConfigs.awsServiceKeyPassword }}" - } -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/awsstore-deployment-template.yaml b/charts/kubecost/templates/awsstore-deployment-template.yaml deleted file mode 100644 index 35f5b9991..000000000 --- a/charts/kubecost/templates/awsstore-deployment-template.yaml +++ /dev/null @@ -1,26 +0,0 @@ -{{- if .Values.awsstore }} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-awsstore - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - app: awsstore - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app: awsstore - spec: - serviceAccountName: awsstore-serviceaccount - containers: - - image: {{ .Values.awsstore.imageNameAndVersion }} - name: awsstore -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/awsstore-service-account-template.yaml b/charts/kubecost/templates/awsstore-service-account-template.yaml deleted file mode 100644 index 65f37e652..000000000 --- a/charts/kubecost/templates/awsstore-service-account-template.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.awsstore }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: awsstore-serviceaccount - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- with .Values.awsstore.annotations }} - annotations: - {{- toYaml . | nindent 4 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/azure-service-key-secret.yaml b/charts/kubecost/templates/azure-service-key-secret.yaml deleted file mode 100644 index bb71e064b..000000000 --- a/charts/kubecost/templates/azure-service-key-secret.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.createServiceKeySecret }} -{{- if .Values.kubecostProductConfigs.azureSubscriptionID }} -apiVersion: v1 -kind: Secret -metadata: - name: cloud-service-key -type: Opaque -stringData: - service-key.json: |- - { - "subscriptionId": "{{ .Values.kubecostProductConfigs.azureSubscriptionID }}", - "serviceKey": { - "appId": "{{ .Values.kubecostProductConfigs.azureClientID }}", - "password": "{{ .Values.kubecostProductConfigs.azureClientPassword }}", - "tenant": "{{ .Values.kubecostProductConfigs.azureTenantID }}" - } - } -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml b/charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml deleted file mode 100644 index b627cf874..000000000 --- a/charts/kubecost/templates/cost-analyzer-alerts-configmap.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.global.notifications.alertConfigs }} -{{- if .Values.global.notifications.alertConfigs.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: alert-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - alerts.json: '{{ toJson .Values.global.notifications.alertConfigs }}' -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-checks-template.yaml b/charts/kubecost/templates/cost-analyzer-checks-template.yaml deleted file mode 100644 index eef8d187d..000000000 --- a/charts/kubecost/templates/cost-analyzer-checks-template.yaml +++ /dev/null @@ -1,63 +0,0 @@ -{{- if .Values.kubecostChecks -}} -{{- if .Values.kubecostChecks.enabled -}} -apiVersion: batch/v1beta1 -kind: CronJob -metadata: - name: cost-analyzer-checks - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - {{- if .Values.kubecostChecks.debug }} - schedule: "*/1 * * * *" - {{- else if .Values.kubecostChecks.schedule }} - schedule: {{ .Values.kubecostChecks.schedule | quote }} - {{- else }} - schedule: "*/10 * * * *" - {{- end }} - jobTemplate: - metadata: - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 8 }} - spec: - template: - spec: - containers: - - name: cost-analyzer-checks - {{- if .Values.kubecostChecks }} - image: {{ .Values.kubecostChecks.image }}:prod-{{ $.Chart.AppVersion }} - {{- else }} - image: gcr.io/kubecost1/checks:prod-{{ $.Chart.AppVersion }} - {{ end }} - imagePullPolicy: Always - args: - - node - - ./node/cron.js - resources: -{{ toYaml .Values.kubecostChecks.resources | indent 14 }} - env: - - name: COST_ANALYZER_SERVER_ENDPOINT - value: {{ template "cost-analyzer.serviceName" . }}.{{ .Release.Namespace }}:9001 - - name: COST_ANALYZER_MODEL_ENDPOINT - {{- if .Values.saml.enabled }} - value: {{ template "cost-analyzer.serviceName" . }}.{{ .Release.Namespace }}:9004 - {{- else }} - value: {{ template "cost-analyzer.serviceName" . }}.{{ .Release.Namespace }}:9003 - {{ end }} - {{- if .Values.kubecostChecks }} - {{- if .Values.kubecostChecks.debug }} - - name: SEND_UPDATES_NOW - value: "true" - {{- end }} - {{- end }} - - name: PROMETHEUS_ALERTMANAGER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-alertmanager-endpoint - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - restartPolicy: OnFailure -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml b/charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml deleted file mode 100644 index 16f926e8a..000000000 --- a/charts/kubecost/templates/cost-analyzer-cluser-role-template.yaml +++ /dev/null @@ -1,105 +0,0 @@ -{{- if and .Values.reporting .Values.reporting.logCollection -}} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - namespace: {{ .Release.Namespace }} - name: {{ template "cost-analyzer.serviceAccountName" . }} -rules: -- apiGroups: - - '' - resources: - - "pods/log" - verbs: - - get - - list - - watch ---- -{{- end }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -rules: - - apiGroups: - - '' - resources: - - configmaps - - deployments - - nodes - - pods - - events - - services - - resourcequotas - - replicationcontrollers - - limitranges - - persistentvolumeclaims - - persistentvolumes - - namespaces - - endpoints - verbs: - - get - - list - - watch - - apiGroups: - - extensions - resources: - - daemonsets - - deployments - - replicasets - verbs: - - get - - list - - watch - - apiGroups: - - apps - resources: - - statefulsets - - deployments - - daemonsets - - replicasets - verbs: - - list - - watch - - apiGroups: - - batch - resources: - - cronjobs - - jobs - verbs: - - get - - list - - watch - - apiGroups: - - autoscaling - resources: - - horizontalpodautoscalers - verbs: - - get - - list - - watch - - apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - get - - list - - watch - - apiGroups: - - storage.k8s.io - resources: - - storageclasses - verbs: - - get - - list - - watch - - apiGroups: - - events.k8s.io - resources: - - events - verbs: - - get - - list - - watch diff --git a/charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml b/charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml deleted file mode 100644 index f2952b923..000000000 --- a/charts/kubecost/templates/cost-analyzer-cluster-role-binding-template.yaml +++ /dev/null @@ -1,33 +0,0 @@ -{{- if .Values.reporting }} -{{- if .Values.reporting.logCollection }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: {{ template "cost-analyzer.serviceAccountName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} ---- -{{- end }} -{{- end }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "cost-analyzer.serviceAccountName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-config-map-template.yaml deleted file mode 100644 index 86aa0ee51..000000000 --- a/charts/kubecost/templates/cost-analyzer-config-map-template.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - {{- if .Values.global.prometheus.enabled }} - {{- if .Values.global.zone }} - prometheus-alertmanager-endpoint: http://{{ template "cost-analyzer.prometheus.alertmanager.name" . }}.{{ .Release.Namespace }}.svc.{{ .Values.global.zone }} - {{ else }} - prometheus-alertmanager-endpoint: http://{{ template "cost-analyzer.prometheus.alertmanager.name" . }}.{{ .Release.Namespace }} - {{- end -}} - {{ else }} - prometheus-alertmanager-endpoint: {{ .Values.global.notifications.alertmanager.fqdn }} - {{- end -}} - {{- if .Values.global.prometheus.enabled }} - {{- if .Values.global.zone }} - prometheus-server-endpoint: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }}.svc.{{ .Values.global.zone }} - {{ else }} - prometheus-server-endpoint: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }} - {{- end -}} - {{ else }} - prometheus-server-endpoint: {{ .Values.global.prometheus.fqdn }} - {{- end -}} - {{- if .Values.kubecostToken }} - kubecost-token: {{ .Values.kubecostToken }} - {{ else }} - kubecost-token: not-applied - {{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml b/charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml deleted file mode 100644 index 38b7e92f8..000000000 --- a/charts/kubecost/templates/cost-analyzer-db-pvc-template.yaml +++ /dev/null @@ -1,29 +0,0 @@ -{{- if (.Values.kubecostModel.etlToDisk | default true) -}} -{{- if .Values.persistentVolume -}} -{{- if not .Values.persistentVolume.dbExistingClaim -}} -{{- if .Values.persistentVolume.enabled -}} -{{- if .Values.persistentVolume.dbPVEnabled -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.fullname" . }}-db - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - accessModes: - - ReadWriteOnce - {{- if .Values.persistentVolume.dbStorageClass }} - storageClassName: {{ .Values.persistentVolume.dbStorageClass }} - {{ end }} - resources: - requests: - {{- if .Values.persistentVolume }} - storage: {{ .Values.persistentVolume.dbSize }} - {{- else }} - storage: 32.0Gi - {{ end }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-deployment-template.yaml b/charts/kubecost/templates/cost-analyzer-deployment-template.yaml deleted file mode 100644 index 2bfd2896b..000000000 --- a/charts/kubecost/templates/cost-analyzer-deployment-template.yaml +++ /dev/null @@ -1,672 +0,0 @@ -{{- $nginxPort := int .Values.service.port | default 9090 -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- if .Values.kubecostDeployment }} -{{- with .Values.kubecostDeployment.labels }} -{{ toYaml . | indent 4 }} -{{- end }} -{{- end }} -spec: -{{- if .Values.kubecostDeployment }} - replicas: {{ .Values.kubecostDeployment.replicas | default 1 }} -{{- end }} - selector: - matchLabels: -{{ include "cost-analyzer.selectorLabels" . | nindent 8}} - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - {{ include "cost-analyzer.selectorLabels" . | nindent 8 }} -{{- if .Values.kubecostDeployment }} -{{- with .Values.kubecostDeployment.labels }} -{{ toYaml . | indent 8 }} -{{- end }} -{{- end }} -{{- if .Values.global.podAnnotations}} - annotations: -{{- with .Values.global.podAnnotations }} -{{ toYaml . | indent 8 }} -{{- end }} -{{- end }} - spec: - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - securityContext: - runAsUser: 0 - {{- else }} - securityContext: - runAsUser: 1001 - runAsGroup: 1001 - fsGroup: 1001 - {{- end }} - {{- else if lt $nginxPort 1025 }} - securityContext: - runAsUser: 0 - {{- else }} - securityContext: - runAsUser: 1001 - runAsGroup: 1001 - fsGroup: 1001 - {{- end }} - restartPolicy: Always - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - volumes: - - name: nginx-conf - configMap: - name: nginx-conf - items: - - key: nginx.conf - path: default.conf - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.productKey }} - {{- if .Values.kubecostProductConfigs.productKey.secretname }} - - name: productkey-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.productKey.secretname }} - items: - - key: productkey.json - path: productkey.json - {{- end }} - {{- end -}} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: gcp-key-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.gcpSecretName }} - items: - - key: compute-viewer-kubecost-key.json - path: key.json - {{- end }} - {{- if .Values.kubecostProductConfigs.serviceKeySecretName }} - - name: service-key-secret - secret: - secretName: {{ .Values.kubecostProductConfigs.serviceKeySecretName }} - {{- else if .Values.kubecostProductConfigs.createServiceKeySecret }} - - name: service-key-secret - secret: - secretName: cloud-service-key - {{- end }} - {{- if .Values.kubecostProductConfigs.clusters }} - - name: kubecost-clusters - configMap: - name: kubecost-clusters - {{- range .Values.kubecostProductConfigs.clusters }} - {{- if .auth }} - {{- if .auth.secretName }} - - name: {{ .auth.secretName }} - secret: - secretName: {{ .auth.secretName }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - - name: tls - secret: - secretName : {{ .Values.kubecostFrontend.tls.secretName }} - items: - - key: tls.crt - path: kc.crt - - key: tls.key - path: kc.key - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - {{- if .Values.saml.secretName }} - - name: secret-volume - secret: - secretName: {{ .Values.saml.secretName }} - {{- end }} - {{- if .Values.saml.metadataSecretName }} - - name: metadata-secret-volume - secret: - secretName: {{ .Values.saml.metadataSecretName }} - {{- end }} - {{- if .Values.saml.rbac.enabled }} - - name: saml-roles - configMap: - name: {{ template "cost-analyzer.fullname" . }}-saml - {{- end }} - {{- end }} - {{- end }} - - name: persistent-configs -{{- if .Values.persistentVolume }} -{{- if .Values.persistentVolume.enabled }} - persistentVolumeClaim: -{{- if .Values.persistentVolume.existingClaim }} - claimName: {{ .Values.persistentVolume.existingClaim }} -{{- else }} - claimName: {{ template "cost-analyzer.fullname" . }} -{{- end -}} -{{- else }} - emptyDir: {} -{{- end -}} -{{- else }} - persistentVolumeClaim: - claimName: {{ template "cost-analyzer.fullname" . }} -{{- end }} -{{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - - name: persistent-db -{{- if .Values.persistentVolume }} -{{- if .Values.persistentVolume.enabled }} - persistentVolumeClaim: -{{- if .Values.persistentVolume.dbExistingClaim }} - claimName: {{ .Values.persistentVolume.dbExistingClaim }} -{{- else }} - claimName: {{ template "cost-analyzer.fullname" . }}-db -{{- end -}} -{{- else }} - emptyDir: {} -{{- end -}} -{{- else }} - persistentVolumeClaim: - claimName: {{ template "cost-analyzer.fullname" . }}-db -{{- end }} -{{- end }} - initContainers: -{{- if .Values.supportNFS }} - - name: config-db-perms-fix - {{- if .Values.initChownDataImage }} - image: {{ .Values.initChownDataImage }} - {{- else }} - image: busybox - {{- end }} - resources: -{{ toYaml .Values.initChownData.resources | indent 12 }} - {{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - command: ["sh", "-c", "/bin/chmod -R 777 /var/configs && /bin/chmod -R 777 /var/db"] - {{- else }} - command: ["sh", "-c", "/bin/chmod -R 777 /var/configs"] - {{- end}} - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - {{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - - name: persistent-db - mountPath: /var/db - {{- end }} - securityContext: - runAsUser: 0 -{{ end }} - containers: - {{- if .Values.kubecostModel }} - {{- if .Values.imageVersion}} - - image: {{ .Values.kubecostModel.image }}:{{ .Values.imageVersion }} - {{- else }} - - image: {{ .Values.kubecostModel.image }}:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- else }} - - image: gcr.io/kubecost1/cost-model:prod-{{ $.Chart.AppVersion }} - {{ end }} - name: cost-model - {{- if .Values.kubecostModel.imagePullPolicy }} - imagePullPolicy: {{ .Values.kubecostModel.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - resources: -{{ toYaml .Values.kubecostModel.resources | indent 12 }} - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - {{- if and (.Values.kubecostModel.etlToDisk | default true) .Values.persistentVolume.dbPVEnabled }} - - name: persistent-db - mountPath: /var/db - {{- end }} - {{- if .Values.kubecostProductConfigs }} - {{- if .Values.kubecostProductConfigs.productKey }} - {{- if .Values.kubecostProductConfigs.productKey.secretname }} - - name: productkey-secret - mountPath: /var/configs/productkey - {{- end }} - {{- end }} - {{- if .Values.kubecostProductConfigs.gcpSecretName }} - - name: gcp-key-secret - mountPath: /models - {{- end }} - {{- if or .Values.kubecostProductConfigs.serviceKeySecretName .Values.kubecostProductConfigs.createServiceKeySecret }} - - name: service-key-secret - mountPath: /var/secrets - {{- end }} - {{- if .Values.kubecostProductConfigs.clusters }} - - name: kubecost-clusters - mountPath: /var/configs/clusters - {{- range .Values.kubecostProductConfigs.clusters }} - {{- if .auth }} - {{- if .auth.secretName }} - - name: {{ .auth.secretName }} - mountPath: /var/secrets/{{ .auth.secretName }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - {{- if .Values.saml.secretName }} - - name: secret-volume - mountPath: /var/configs/secret-volume - {{- end }} - {{- if .Values.saml.metadataSecretName }} - - name: metadata-secret-volume - mountPath: /var/configs/metadata-secret-volume - {{- end }} - {{- if .Values.saml.rbac.enabled }} - - name: saml-roles - mountPath: /var/configs/saml - {{- end }} - {{- end }} - {{- end }} - env: - - name: PROMETHEUS_SERVER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-server-endpoint - - name: CLOUD_PROVIDER_API_KEY - value: "AIzaSyDXQPG_MHUEy9neR7stolq6l0ujXmjJlvk" # The GCP Pricing API requires a key. - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/configs/key.json - - name: CONFIG_PATH - value: /var/configs/ - - name: DB_PATH - value: /var/db/ - - name: CLUSTER_PROFILE - {{- if .Values.kubecostProductConfigs }} - value: {{ .Values.kubecostProductConfigs.clusterProfile | default "production" }} - {{- else }} - value: production - {{- end }} - - name: REMOTE_WRITE_PASSWORD - value: {{ .Values.remoteWrite.postgres.auth.password }} - {{- if .Values.remoteWrite.postgres.enabled }} - - name: REMOTE_WRITE_ENABLED - value: "true" - {{- end }} - - name: GOGC - value: "60" - {{- if .Values.global.thanos.queryServiceBasicAuthSecretName}} - - name: MC_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: MC_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBasicAuthSecretName}} - - name: DB_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: DB_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBearerTokenSecretName }} - - name: DB_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - {{- if .Values.global.thanos.queryServiceBearerTokenSecretName }} - - name: MC_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - {{- if .Values.global.prometheus.insecureSkipVerify }} - - name: INSECURE_SKIP_VERIFY - value: {{ (quote .Values.global.prometheus.insecureSkipVerify) }} - {{- end }} - {{- if .Values.pricingCsv }} - {{- if .Values.pricingCsv.enabled }} - - name: USE_CSV_PROVIDER - value: "true" - - name: CSV_PATH - value: {{ .Values.pricingCsv.location.URI }} - - name: CSV_REGION - value: {{ .Values.pricingCsv.location.region }} - {{- if eq .Values.pricingCsv.location.provider "AWS"}} - {{- if .Values.pricingCsv.location.csvAccessCredentials }} - - name: AWS_ACCESS_KEY_ID - valueFrom: - secretKeyRef: - name: {{ .Values.pricingCsv.location.csvAccessCredentials }} - key: AWS_ACCESS_KEY_ID - - name: AWS_SECRET_ACCESS_KEY - valueFrom: - secretKeyRef: - name: {{ .Values.pricingCsv.location.csvAccessCredentials }} - key: AWS_SECRET_ACCESS_KEY - {{- end }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.reporting }} - - name: LOG_COLLECTION_ENABLED - value: {{ (quote .Values.reporting.logCollection ) | default (quote true) }} - - name: PRODUCT_ANALYTICS_ENABLED - value: {{ (quote .Values.reporting.productAnalytics ) | default (quote true) }} - - name: ERROR_REPORTING_ENABLED - value: {{ (quote .Values.reporting.errorReporting ) | default (quote true) }} - - name: VALUES_REPORTING_ENABLED - value: {{ (quote .Values.reporting.valuesReporting) | default (quote true) }} - {{- if .Values.reporting.errorReporting }} - - name: SENTRY_DSN - value: "https://71964476292e4087af8d5072afe43abd@o394722.ingest.sentry.io/5245431" - {{- end }} - {{- end }} - - name: CACHE_WARMING_ENABLED - value: {{ (quote .Values.kubecostModel.warmCache) | default (quote true) }} - - name: SAVINGS_CACHE_WARMING_ENABLED - value: {{ (quote .Values.kubecostModel.warmSavingsCache) | default (quote true) }} - - name: ETL_ENABLED - value: {{ (quote .Values.kubecostModel.etl) | default (quote true) }} - - name: ETL_TO_DISK_ENABLED - value: {{ (quote .Values.kubecostModel.etlToDisk) | default (quote true) }} - - name : ETL_CLOUD_ASSETS_ENABLED - value: {{ (quote .Values.kubecostModel.etlCloudAssets) | default (quote true) }} - {{- if .Values.persistentVolume.dbPVEnabled }} - - name: ETL_PATH_PREFIX - value: "/var/db" - {{- end }} - {{- if .Values.kubecostModel.etlStoreDurationDays }} - - name: ETL_STORE_DURATION_DAYS - value: {{ (quote .Values.kubecostModel.etlStoreDurationDays) | default (quote 120) }} - {{- end }} - - name: PV_ENABLED - value: {{ (quote .Values.persistentVolume.enabled) | default (quote true) }} - - name: MAX_QUERY_CONCURRENCY - value: {{ (quote .Values.kubecostModel.maxQueryConcurrency) | default (quote 5) }} - - name: UTC_OFFSET - value: {{ (quote .Values.kubecostModel.utcOffset) | default (quote ) }} - {{- if .Values.networkCosts }} - {{- if .Values.networkCosts.enabled }} - - name: NETWORK_COSTS_PORT - value: {{ quote .Values.networkCosts.port | default (quote 3001) }} - {{- end }} - {{- end }} - {{- /* - If queryService is set, the cost-analyzer will always pass THANOS_ENABLED as true - to ensure that the custom query service target is used. The global.thanos.enabled - flag does not have any affect on this behavior. - */}} - {{- if .Values.global.thanos.queryService }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: {{ .Values.global.thanos.queryService }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- else if and .Values.global.thanos.enabled .Values.thanos }} - {{- if .Values.thanos.query }} - {{- if .Values.thanos.query.enabled }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: http://{{ .Release.Name }}-thanos-query-frontend-http.{{ .Release.Namespace }}:{{ .Values.thanos.queryFrontend.http.port }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - - name: SAML_ENABLED - value: "true" - - name: IDP_URL - value: {{ .Values.saml.idpMetadataURL }} - - name: SP_HOST - value: {{ .Values.saml.appRootURL }} - {{- if .Values.saml.audienceURI }} - - name: AUDIENCE_URI - value: {{ .Values.saml.audienceURI }} - {{- end }} - {{- if .Values.saml.rbac.enabled }} - - name: SAML_RBAC_ENABLED - value: "true" - {{- end }} - {{- end }} - {{- end }} - {{- if and (.Values.prometheus.server.global.external_labels.cluster_id) (not .Values.prometheus.server.clusterIDConfigmap) }} - - name: CLUSTER_ID - value: {{ .Values.prometheus.server.global.external_labels.cluster_id }} - {{- end }} - {{- if .Values.prometheus.server.clusterIDConfigmap }} - - name: CLUSTER_ID - valueFrom: - configMapKeyRef: - name: {{ .Values.prometheus.server.clusterIDConfigmap }} - key: CLUSTER_ID - {{- end }} - {{- if .Values.remoteWrite.postgres.installLocal }} - - name: SQL_ADDRESS - value: pgprometheus - {{- else }} - - name: SQL_ADDRESS - value: {{ .Values.remoteWrite.postgres.remotePostgresAddress }} - {{- end }} - - name: RELEASE_NAME - value: {{ .Release.Name }} - - name: KUBECOST_NAMESPACE - value: {{ .Release.Namespace }} - - name: KUBECOST_TOKEN - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: kubecost-token - {{- if .Values.kubecostFrontend }} - {{- if .Values.imageVersion}} - - image: {{ .Values.kubecostFrontend.image }}:{{ .Values.imageVersion }} - {{- else }} - - image: {{ .Values.kubecostFrontend.image }}:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- else }} - - image: gcr.io/kubecost1/frontend:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - command: ["nginx", "-g", "daemon off;"] - ports: - - containerPort: 443 - {{- end }} - {{- end }} - env: - - name: GET_HOSTS_FROM - value: dns - name: cost-analyzer-frontend - volumeMounts: - - name: nginx-conf - mountPath: /etc/nginx/conf.d/ - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - - name: tls - mountPath: /etc/ssl/certs - {{- end }} - {{- end }} - resources: -{{ toYaml .Values.kubecostFrontend.resources | indent 12 }} - {{- if .Values.kubecostFrontend.imagePullPolicy }} - imagePullPolicy: {{ .Values.kubecostFrontend.imagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - {{- if .Values.kubecost }} - {{- if .Values.imageVersion}} - - image: {{ .Values.kubecost.image }}:{{ .Values.imageVersion }} - {{- else }} - - image: {{ .Values.kubecost.image }}:prod-{{ $.Chart.AppVersion }} - {{ end }} - {{- else }} - - image: gcr.io/kubecost1/server:prod-{{ $.Chart.AppVersion }} - {{ end }} - resources: -{{ toYaml .Values.kubecost.resources | indent 12 }} - name: cost-analyzer-server - readinessProbe: - httpGet: - path: /healthz - port: 9003 - initialDelaySeconds: 30 - periodSeconds: 10 - failureThreshold: 200 - volumeMounts: - - name: persistent-configs - mountPath: /var/configs - env: - - name: PROMETHEUS_SERVER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-server-endpoint - {{- if .Values.reporting }} - {{- if .Values.reporting.valuesReporting }} - - name: HELM_VALUES - value: {{ template "cost-analyzer.filterEnabled" .Values }} - {{- end }} - {{- end }} - {{- if .Values.global.prometheus.insecureSkipVerify }} - - name: INSECURE_SKIP_VERIFY - value: {{ (quote .Values.global.prometheus.insecureSkipVerify) }} - {{- end }} - {{- /* - If queryService is set, the cost-analyzer will always pass THANOS_ENABLED as true - to ensure that the custom query service target is used. The global.thanos.enabled - flag does not have any affect on this behavior. - */}} - {{- if .Values.global.thanos.queryService }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: {{ .Values.global.thanos.queryService }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- else if and .Values.global.thanos.enabled .Values.thanos }} - {{- if .Values.thanos.query }} - {{- if .Values.thanos.query.enabled }} - - name: THANOS_ENABLED - value: "true" - - name: THANOS_QUERY_URL - value: http://{{ .Release.Name }}-thanos-query-frontend-http.{{ .Release.Namespace }}:{{ .Values.thanos.queryFrontend.http.port }} - - name: THANOS_QUERY_OFFSET - value: {{ .Values.global.thanos.queryOffset | default "3h" }} - - name: THANOS_MAX_SOURCE_RESOLUTION - value: {{ .Values.kubecostModel.maxSourceResolution | default "raw" }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.global.thanos.queryServiceBasicAuthSecretName}} - - name: MC_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: MC_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBasicAuthSecretName}} - - name: DB_BASIC_AUTH_USERNAME - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: USERNAME - - name: DB_BASIC_AUTH_PW - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBasicAuthSecretName }} - key: PASSWORD - {{- end }} - {{- if .Values.global.prometheus.queryServiceBearerTokenSecretName }} - - name: DB_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.prometheus.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - {{- if .Values.global.thanos.queryServiceBearerTokenSecretName }} - - name: MC_BEARER_TOKEN - valueFrom: - secretKeyRef: - name: {{ .Values.global.thanos.queryServiceBearerTokenSecretName }} - key: TOKEN - {{- end }} - - name: KUBECOST_NAMESPACE - value: {{ .Release.Namespace }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/configs/key.json - - name: KUBECOST_TOKEN - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: kubecost-token - {{- if eq .Values.global.grafana.proxy false }} - - name: GRAFANA_URL - valueFrom: - configMapKeyRef: - name: external-grafana-config-map - key: grafanaURL - {{- end }} - {{- if .Values.imagePullSecrets }} - imagePullSecrets: - {{ toYaml .Values.imagePullSecrets | indent 2 }} - {{- end }} - {{- if .Values.priority }} - {{- if .Values.priority.enabled }} - priorityClassName: {{ template "cost-analyzer.fullname" . }}-priority - {{- end }} - {{- end }} - {{- with .Values.nodeSelector }} - nodeSelector: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.tolerations }} - tolerations: - {{- toYaml . | nindent 8 }} - {{- end }} - {{- with .Values.affinity }} - affinity: - {{- toYaml . | nindent 8 }} - {{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml deleted file mode 100644 index 429ed1f90..000000000 --- a/charts/kubecost/templates/cost-analyzer-frontend-config-map-template.yaml +++ /dev/null @@ -1,174 +0,0 @@ -{{- $serviceName := include "cost-analyzer.serviceName" . -}} -{{- $nginxPort := .Values.service.targetPort | default 9090 -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: nginx-conf - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - nginx.conf: | - gzip_static on; - - # Enable gzip encoding for content of the provided types of 50kb and higher. - gzip on; - gzip_min_length 50000; - gzip_proxied expired no-cache no-store private auth; - gzip_types - text/plain - text/css - text/xml - text/javascript - application/x-javascript - application/xml - application/json; - - upstream api { - server {{ $serviceName }}.{{ .Release.Namespace }}:9001; - } - - upstream model { - server {{ $serviceName }}.{{ .Release.Namespace }}:9003; - } - -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} - upstream clustercontroller { - server {{ template "kubecost.clusterControllerName" . }}-service.{{ .Release.Namespace }}:9731; - } -{{- end }} -{{- end }} - -{{- if .Values.global.grafana.proxy }} - upstream grafana { -{{- if .Values.global.grafana.enabled }} - server {{ .Release.Name }}-grafana.{{ .Release.Namespace }}; -{{ else }} - server {{.Values.global.grafana.domainName}}; -{{ end }} - } -{{ end }} - - server { - server_name _; - root /var/www; - index index.html; - add_header Cache-Control "max-age=300"; - add_header Cache-Control "must-revalidate"; -{{- if .Values.imageVersion }} - add_header ETag "{{ $.Values.imageVersion }}"; -{{- else }} - add_header ETag "{{ $.Chart.Version }}"; -{{- end }} -{{- if .Values.kubecostFrontend.tls }} -{{- if .Values.kubecostFrontend.tls.enabled }} - ssl_certificate /etc/ssl/certs/kc.crt; - ssl_certificate_key /etc/ssl/certs/kc.key; - listen 443 ssl; -{{- else }} - listen {{ $nginxPort }}; -{{- end }} -{{- else }} - listen {{ $nginxPort }}; -{{- end }} - location /api/ { - {{- if .Values.saml.enabled }} - auth_request /auth; - {{- end }} - proxy_pass http://api/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - location /model/ { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - location ~ ^/(turndown|cluster)/ { - - add_header 'Access-Control-Allow-Origin' '*' always; -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - auth_request /auth; - {{- else if .Values.saml.rbac.enabled}} - auth_request /authrbac; - {{- end }} - {{- end }} - - rewrite ^/(?:turndown|cluster)/(.*)$ /$1 break; - proxy_pass http://clustercontroller; - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - -{{- else }} - return 404; -{{- end }} -{{- else }} - return 404; -{{- end }} - } - location /saml/ { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/saml/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - location /login { - proxy_connect_timeout 180; - proxy_send_timeout 180; - proxy_read_timeout 180; - proxy_pass http://model/login; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - - {{- if .Values.global.grafana.proxy }} - location /grafana/ { - {{- if .Values.saml.enabled }} - auth_request /auth; - {{- end }} - proxy_pass http://grafana/; - proxy_redirect off; - proxy_http_version 1.1; - proxy_set_header Connection ""; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - } - {{ end }} - {{- if .Values.saml.enabled }} - location /auth { - proxy_pass http://model/isAuthenticated; - } - {{- end }} - {{- if .Values.saml.rbac.enabled }} - location /authrbac { - proxy_pass http://model/isAdminAuthenticated; - } - {{- end }} - } diff --git a/charts/kubecost/templates/cost-analyzer-ingress-template.yaml b/charts/kubecost/templates/cost-analyzer-ingress-template.yaml deleted file mode 100644 index 1b6e8776a..000000000 --- a/charts/kubecost/templates/cost-analyzer-ingress-template.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- if .Values.ingress -}} -{{- if .Values.ingress.enabled -}} -{{- $fullName := include "cost-analyzer.fullname" . -}} -{{- $serviceName := include "cost-analyzer.serviceName" . -}} -{{- $ingressPaths := .Values.ingress.paths -}} -apiVersion: extensions/v1beta1 -kind: Ingress -metadata: - name: {{ $fullName }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- with .Values.ingress.annotations }} - annotations: - {{- toYaml . | nindent 4 }} - {{- end }} -spec: -{{- if .Values.ingress.tls }} - tls: - {{- range .Values.ingress.tls }} - - hosts: - {{- range .hosts }} - - {{ . | quote }} - {{- end }} - secretName: {{ .secretName }} - {{- end }} -{{- end }} - rules: - {{- range .Values.ingress.hosts }} - - host: {{ . | quote }} - http: - paths: - {{- range $ingressPaths }} - - path: {{ . }} - backend: - serviceName: {{ $serviceName }} - servicePort: frontend - {{- end }} - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml deleted file mode 100644 index 37276f297..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-costs-config-map-template.yaml +++ /dev/null @@ -1,15 +0,0 @@ -{{- if .Values.networkCosts -}} -{{- if .Values.networkCosts.enabled -}} -{{- if .Values.networkCosts.config -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: network-costs-config - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - config.yaml: | -{{- toYaml .Values.networkCosts.config | nindent 4 }} -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml b/charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml deleted file mode 100644 index d45567616..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-costs-podmonitor-template.yaml +++ /dev/null @@ -1,31 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podMonitor }} -{{- if .Values.networkCosts.podMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PodMonitor -metadata: - name: {{ include "cost-analyzer.networkCostsName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.networkCosts.podMonitor.additionalLabels }} - {{ toYaml .Values.networkCosts.podMonitor.additionalLabels | nindent 4 }} - {{- end }} -spec: - podMetricsEndpoints: - - port: http-server - honorLabels: true - interval: 1m - scrapeTimeout: 10s - path: /metrics - scheme: http - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - app: {{ template "cost-analyzer.networkCostsName" . }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-network-costs-template.yaml b/charts/kubecost/templates/cost-analyzer-network-costs-template.yaml deleted file mode 100644 index e87d8d44b..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-costs-template.yaml +++ /dev/null @@ -1,93 +0,0 @@ -{{- if .Values.networkCosts -}} -{{- if .Values.networkCosts.enabled -}} -apiVersion: {{ include "cost-analyzer.daemonset.apiVersion" . }} -kind: DaemonSet -metadata: - name: {{ template "cost-analyzer.networkCostsName" . }} - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - updateStrategy: - type: RollingUpdate - selector: - matchLabels: - app: {{ template "cost-analyzer.networkCostsName" . }} - template: - metadata: - labels: - app: {{ template "cost-analyzer.networkCostsName" . }} - spec: - hostNetwork: true - serviceAccountName: {{ template "cost-analyzer.serviceAccountName" . }} - containers: - - name: {{ template "cost-analyzer.networkCostsName" . }} - image: {{ .Values.networkCosts.image }} -{{- if .Values.networkCosts.imagePullPolicy }} - imagePullPolicy: {{ .Values.networkCosts.imagePullPolicy }} -{{- else }} - imagePullPolicy: Always -{{- end }} -{{- if .Values.networkCosts.resources }} - resources: -{{ toYaml .Values.networkCosts.resources | indent 10 }} -{{- end }} - env: - {{- if .Values.networkCosts.hostProc }} - - name: HOST_PROC - value: {{ .Values.networkCosts.hostProc.mountPath }} - {{- end }} - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: HOST_PORT - value: {{ (quote .Values.networkCosts.port) | default (quote 3001) }} - - name: TRAFFIC_LOGGING_ENABLED - value: {{ (quote .Values.networkCosts.trafficLogging) | default (quote true) }} - volumeMounts: - {{- if .Values.networkCosts.hostProc }} - - mountPath: {{ .Values.networkCosts.hostProc.mountPath }} - name: host-proc - {{- else }} - - mountPath: /net - name: nf-conntrack - - mountPath: /netfilter - name: netfilter - {{- end }} - {{- if .Values.networkCosts.config }} - - mountPath: /network-costs/config - name: network-costs-config - {{- end }} - securityContext: - privileged: true - ports: - - name: http-server - containerPort: {{ .Values.networkCosts.port | default 3001 }} - hostPort: {{ .Values.networkCosts.port | default 3001 }} -{{- if .Values.networkCosts.priorityClassName }} - priorityClassName: "{{ .Values.networkCosts.priorityClassName }}" -{{- end }} -{{- if .Values.networkCosts.tolerations }} - tolerations: -{{ toYaml .Values.networkCosts.tolerations | indent 8 }} - {{- end }} - volumes: - {{- if .Values.networkCosts.config }} - - name: network-costs-config - configMap: - name: network-costs-config - {{- end }} - {{- if .Values.networkCosts.hostProc }} - - name: host-proc - hostPath: - path: {{ default "/proc" .Values.networkCosts.hostProc.hostPath }} - {{- else }} - - name: nf-conntrack - hostPath: - path: /proc/net - - name: netfilter - hostPath: - path: /proc/sys/net/netfilter - {{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-network-policy.yaml b/charts/kubecost/templates/cost-analyzer-network-policy.yaml deleted file mode 100644 index 872951bd1..000000000 --- a/charts/kubecost/templates/cost-analyzer-network-policy.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.networkPolicy -}} -{{- if .Values.networkPolicy.enabled -}} -apiVersion: {{ include "cost-analyzer.networkPolicy.apiVersion" . }} -kind: NetworkPolicy -metadata: - name: deny-egress - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - podSelector: - matchLabels: - {{ include "cost-analyzer.selectorLabels" . | nindent 6 }} - policyTypes: - - Egress - egress: - - to: - - namespaceSelector: {} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml b/charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml deleted file mode 100644 index 5ce22f52b..000000000 --- a/charts/kubecost/templates/cost-analyzer-pkey-configmap.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.productKey }} -{{- if .Values.kubecostProductConfigs.productKey.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: product-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - {{- if .Values.kubecostProductConfigs.productKey.key }} - key: {{ .Values.kubecostProductConfigs.productKey.key | quote }} - {{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml b/charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml deleted file mode 100644 index 08f82a5ac..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-deployment.yaml +++ /dev/null @@ -1,49 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-postgres - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - app: postgres - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app: postgres - spec: - containers: - - image: timescale/pg_prometheus:latest-pg11 - name: pgprometheus - ports: - - containerPort: 5432 - args: - - -csynchronous_commit=off - - -S 1GB - env: - - name: POSTGRES_PASSWORD - value: {{ .Values.remoteWrite.postgres.auth.password }} - - name: POSTGRES_USER - value: postgres - volumeMounts: - - mountPath: /var/lib/postgresql/data - name: postgres-pv-volume - subPath: postgres - volumes: - - name: postgres-pv-volume - persistentVolumeClaim: - claimName: postgres-pv-claim -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-postgres-pv.yaml b/charts/kubecost/templates/cost-analyzer-postgres-pv.yaml deleted file mode 100644 index 0a67fa928..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-pv.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -kind: PersistentVolume -apiVersion: v1 -metadata: - name: postgres-pv-volume - labels: - type: local - app: postgres -spec: - capacity: - storage: {{ .Values.remoteWrite.postgres.persistentVolume.size }} - accessModes: - - ReadWriteOnce - hostPath: - path: "/mnt/data" -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml b/charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml deleted file mode 100644 index 8c5deb444..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-pvc.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: postgres-pv-claim - labels: - app: postgres -spec: - accessModes: - - ReadWriteOnce - resources: - requests: - storage: {{ .Values.remoteWrite.postgres.persistentVolume.size }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-postgres-service.yaml b/charts/kubecost/templates/cost-analyzer-postgres-service.yaml deleted file mode 100644 index 5488c58b1..000000000 --- a/charts/kubecost/templates/cost-analyzer-postgres-service.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -{{- if .Values.remoteWrite.postgres.installLocal -}} -kind: Service -apiVersion: v1 -metadata: - name: pgprometheus - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - app: postgres - type: ClusterIP - ports: - - name: server - port: 5432 - targetPort: 5432 -{{- end }} -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml b/charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml deleted file mode 100644 index 7163cec98..000000000 --- a/charts/kubecost/templates/cost-analyzer-pricing-configmap.yaml +++ /dev/null @@ -1,121 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: pricing-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - {{- if .Values.kubecostProductConfigs.defaultModelPricing }} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.enabled }} - {{- if .Values.kubecostProductConfigs.customPricesEnabled }} - customPricesEnabled: "{{ .Values.kubecostProductConfigs.customPricesEnabled }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.CPU }} - CPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.CPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotCPU }} - spotCPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotCPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.RAM }} - RAM: "{{ .Values.kubecostProductConfigs.defaultModelPricing.RAM | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotRAM }} - spotRAM: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotRAM | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.GPU }} - GPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.GPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.spotGPU }} - spotGPU: "{{ .Values.kubecostProductConfigs.defaultModelPricing.spotGPU | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.storage }} - storage: "{{ .Values.kubecostProductConfigs.defaultModelPricing.storage | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.zoneNetworkEgress }} - zoneNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.zoneNetworkEgress | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.regionNetworkEgress }} - regionNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.regionNetworkEgress | toString }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultModelPricing.internetNetworkEgress }} - internetNetworkEgress: "{{ .Values.kubecostProductConfigs.defaultModelPricing.internetNetworkEgress | toString }}" - {{- end -}} - {{- end -}} - {{- end -}} - {{- if .Values.kubecostProductConfigs.clusterName }} - clusterName: "{{ .Values.kubecostProductConfigs.clusterName }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.currencyCode }} - currencyCode: "{{ .Values.kubecostProductConfigs.currencyCode }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureBillingRegion }} - azureBillingRegion: "{{ .Values.kubecostProductConfigs.azureBillingRegion }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureSubscriptionID }} - azureSubscriptionID: "{{ .Values.kubecostProductConfigs.azureSubscriptionID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureClientID }} - azureClientID: "{{ .Values.kubecostProductConfigs.azureClientID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.azureTenantID }} - azureTenantID: "{{ .Values.kubecostProductConfigs.azureTenantID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.discount }} - discount: "{{ .Values.kubecostProductConfigs.discount }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.negotiatedDiscount }} - negotiatedDiscount: "{{ .Values.kubecostProductConfigs.negotiatedDiscount }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.defaultIdle }} - defaultIdle: "{{ .Values.kubecostProductConfigs.defaultIdle }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.sharedNamespaces }} - sharedNamespaces: "{{ .Values.kubecostProductConfigs.sharedNamespaces }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.spotLabel }} - spotLabel: "{{ .Values.kubecostProductConfigs.spotLabel }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.spotLabelValue }} - spotLabelValue: "{{ .Values.kubecostProductConfigs.spotLabelValue }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.awsSpotDataRegion }} - spotDataRegion: "{{ .Values.kubecostProductConfigs.awsSpotDataRegion }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.awsSpotDataBucket }} - spotDataBucket: "{{ .Values.kubecostProductConfigs.awsSpotDataBucket }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.awsSpotDataPrefix }} - spotDataPrefix: "{{ .Values.kubecostProductConfigs.awsSpotDataPrefix }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.projectID }} - projectID: "{{ .Values.kubecostProductConfigs.projectID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.bigQueryBillingDataDataset }} - billingDataDataset: "{{ .Values.kubecostProductConfigs.bigQueryBillingDataDataset }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaProjectID }} - athenaProjectID: "{{ .Values.kubecostProductConfigs.athenaProjectID }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaBucketName }} - athenaBucketName: "{{ .Values.kubecostProductConfigs.athenaBucketName }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaRegion }} - athenaRegion: "{{ .Values.kubecostProductConfigs.athenaRegion }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaDatabase }} - athenaDatabase: "{{ .Values.kubecostProductConfigs.athenaDatabase }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.athenaTable }} - athenaTable: "{{ .Values.kubecostProductConfigs.athenaTable }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.masterPayerARN}} - masterPayerARN: "{{ .Values.kubecostProductConfigs.masterPayerARN }}" - {{- end }} - {{- if .Values.kubecostProductConfigs.gpuLabel }} - gpuLabel: "{{ .Values.kubecostProductConfigs.gpuLabel }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.gpuLabelValue }} - gpuLabelValue: "{{ .Values.kubecostProductConfigs.gpuLabelValue }}" - {{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml b/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml deleted file mode 100644 index c2b282772..000000000 --- a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-deployment.yaml +++ /dev/null @@ -1,53 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "cost-analyzer.fullname" . }}-adapter - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - matchLabels: - app: adapter - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - labels: - app: adapter - spec: - initContainers: - - name: kubecost-sql-init - image: {{ .Values.remoteWrite.postgres.initImage }}:prod-{{ $.Chart.AppVersion }} - {{- if .Values.remoteWrite.postgres.initImagePullPolicy }} - imagePullPolicy: {{ .Values.remoteWrite.postgres.initImagePullPolicy }} - {{- else }} - imagePullPolicy: Always - {{- end }} - env: - - name: PROMETHEUS_SERVER_ENDPOINT - valueFrom: - configMapKeyRef: - name: {{ template "cost-analyzer.fullname" . }} - key: prometheus-server-endpoint - containers: - - image: timescale/prometheus-postgresql-adapter:latest - name: pgprometheusadapter - ports: - - containerPort: 9201 - args: - {{- if .Values.remoteWrite.postgres.installLocal }} - - "-pg-host=pgprometheus" - {{- else }} - - "-pg-host={{ .Values.remoteWrite.postgres.remotePostgresAddress }}" - {{- end }} - - "-pg-prometheus-log-samples=true" - - "-pg-password={{ .Values.remoteWrite.postgres.auth.password }}" -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml b/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml deleted file mode 100644 index d36479439..000000000 --- a/charts/kubecost/templates/cost-analyzer-prometheus-postgres-adapter-service.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.remoteWrite -}} -{{- if .Values.remoteWrite.postgres -}} -{{- if .Values.remoteWrite.postgres.enabled -}} -kind: Service -apiVersion: v1 -metadata: - name: pgprometheus-adapter - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - selector: - app: adapter - type: ClusterIP - ports: - - name: server - port: 9201 - targetPort: 9201 -{{- end }} -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml b/charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml deleted file mode 100644 index 61380b424..000000000 --- a/charts/kubecost/templates/cost-analyzer-prometheusrule-template.yaml +++ /dev/null @@ -1,21 +0,0 @@ -{{- if .Values.prometheus }} -{{- if .Values.prometheus.serverFiles }} -{{- if .Values.prometheus.serverFiles.rules }} -{{- if .Values.prometheusRule }} -{{- if .Values.prometheusRule.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: PrometheusRule -metadata: - name: {{ include "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.prometheusRule.additionalLabels }} - {{ toYaml .Values.prometheusRule.additionalLabels | nindent 4 }} - {{- end }} -spec: - {{ toYaml .Values.prometheus.serverFiles.rules | nindent 2 }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-psp-role.template.yaml b/charts/kubecost/templates/cost-analyzer-psp-role.template.yaml deleted file mode 100644 index f326b1f1c..000000000 --- a/charts/kubecost/templates/cost-analyzer-psp-role.template.yaml +++ /dev/null @@ -1,18 +0,0 @@ -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: kubecost-cost-analyzer-psp - annotations: -{{- if .Values.podSecurityPolicy.annotations }} -{{ toYaml .Values.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - kubecost-cost-analyzer-psp -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml b/charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml deleted file mode 100644 index 8e1d925c5..000000000 --- a/charts/kubecost/templates/cost-analyzer-psp-rolebinding.template.yaml +++ /dev/null @@ -1,16 +0,0 @@ -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: kubecost-cost-analyzer-psp -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: kubecost-cost-analyzer-psp -subjects: -- kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-psp.template.yaml b/charts/kubecost/templates/cost-analyzer-psp.template.yaml deleted file mode 100644 index 885ab9ca9..000000000 --- a/charts/kubecost/templates/cost-analyzer-psp.template.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.podSecurityPolicy }} -{{- if .Values.podSecurityPolicy.enabled }} -apiVersion: {{ include "cost-analyzer.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: kubecost-cost-analyzer-psp -spec: - privileged: true - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - '*' -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-pvc-template.yaml b/charts/kubecost/templates/cost-analyzer-pvc-template.yaml deleted file mode 100644 index d3e257668..000000000 --- a/charts/kubecost/templates/cost-analyzer-pvc-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.persistentVolume -}} -{{- if not .Values.persistentVolume.existingClaim -}} -{{- if .Values.persistentVolume.enabled -}} -kind: PersistentVolumeClaim -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -spec: - accessModes: - - ReadWriteOnce - {{- if .Values.persistentVolume.storageClass }} - storageClassName: {{ .Values.persistentVolume.storageClass }} - {{ end }} - resources: - requests: - {{- if .Values.persistentVolume }} - storage: {{ .Values.persistentVolume.size }} - {{- else }} - storage: 0.2Gi - {{ end }} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml b/charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml deleted file mode 100644 index 71ac8659c..000000000 --- a/charts/kubecost/templates/cost-analyzer-saml-config-map-template.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.saml }} -{{- if .Values.saml.enabled }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: {{ template "cost-analyzer.fullname" . }}-saml - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: -{{- $root := . }} - saml.json: '{{ toJson .Values.saml }}' -{{- end -}} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/cost-analyzer-server-configmap.yaml b/charts/kubecost/templates/cost-analyzer-server-configmap.yaml deleted file mode 100644 index edf5ca6fa..000000000 --- a/charts/kubecost/templates/cost-analyzer-server-configmap.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if or .Values.kubecostProductConfigs.grafanaURL .Values.kubecostProductConfigs.labelMappingConfigs }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: app-configs - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: -{{- if .Values.kubecostProductConfigs.labelMappingConfigs }} -{{- if .Values.kubecostProductConfigs.labelMappingConfigs.enabled }} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.owner_label }} - owner_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.owner_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.team_label }} - team_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.team_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.department_label }} - department_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.department_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.product_label }} - product_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.product_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.environment_label }} - environment_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.environment_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.namespace_external_label }} - namespace_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.namespace_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.cluster_external_label }} - cluster_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.cluster_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.controller_external_label }} - controller_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.controller_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.product_external_label }} - product_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.product_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.service_external_label }} - service_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.service_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.deployment_external_label }} - deployment_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.deployment_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.team_external_label }} - team_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.team_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.environment_external_label }} - environment_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.environment_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.department_external_label }} - department_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.department_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.statefulset_external_label }} - statefulset_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.statefulset_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.daemonset_external_label }} - daemonset_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.daemonset_external_label }}" - {{- end -}} - {{- if .Values.kubecostProductConfigs.labelMappingConfigs.pod_external_label }} - pod_external_label: "{{ .Values.kubecostProductConfigs.labelMappingConfigs.pod_external_label }}" - {{- end -}} -{{- end -}} -{{- end -}} - {{- if .Values.kubecostProductConfigs.grafanaURL }} - grafanaURL: "{{ .Values.kubecostProductConfigs.grafanaURL }}" - {{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/cost-analyzer-service-account-template.yaml b/charts/kubecost/templates/cost-analyzer-service-account-template.yaml deleted file mode 100644 index d5e3be3b9..000000000 --- a/charts/kubecost/templates/cost-analyzer-service-account-template.yaml +++ /dev/null @@ -1,12 +0,0 @@ -{{- if .Values.serviceAccount.create }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "cost-analyzer.serviceAccountName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- with .Values.serviceAccount.annotations }} - annotations: - {{- toYaml . | nindent 4 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-service-template.yaml b/charts/kubecost/templates/cost-analyzer-service-template.yaml deleted file mode 100644 index dd48bb3f8..000000000 --- a/charts/kubecost/templates/cost-analyzer-service-template.yaml +++ /dev/null @@ -1,69 +0,0 @@ -{{- $nginxPort := .Values.service.targetPort | default 9090 -}} -{{- $servicePort := .Values.service.port | default 9090 -}} -kind: Service -apiVersion: v1 -metadata: - name: {{ template "cost-analyzer.serviceName" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -{{- if .Values.service.labels }} -{{ toYaml .Values.service.labels | indent 4 }} -{{- end }} -{{- if .Values.service.annotations }} - annotations: -{{ toYaml .Values.service.annotations | indent 4 }} -{{- end }} -spec: - selector: - {{ include "cost-analyzer.selectorLabels" . | nindent 4 }} -{{- if .Values.service -}} -{{- if .Values.service.type }} - type: "{{ .Values.service.type }}" -{{- else }} - type: ClusterIP -{{- end }} -{{- else }} - type: ClusterIP -{{- end }} - ports: - - name: server - port: 9001 - targetPort: 9001 - - name: model - port: 9003 - targetPort: 9003 - - name: frontend - {{- if .Values.kubecostFrontend.tls }} - {{- if .Values.kubecostFrontend.tls.enabled }} - port: 443 - targetPort: 443 - {{- if (eq .Values.service.type "NodePort") }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- end }} - {{- else }} - port: {{ $servicePort }} - targetPort: {{ $nginxPort }} - {{- if (eq .Values.service.type "NodePort") }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- end }} - {{- end}} - {{- else }} - port: {{ $servicePort }} - targetPort: {{ $nginxPort }} - {{- if (eq .Values.service.type "NodePort") }} - {{- if .Values.service.nodePort }} - nodePort: {{ .Values.service.nodePort }} - {{- end }} - {{- end }} - {{- end }} - {{- if .Values.saml }} - {{- if .Values.saml.enabled }} - - name: apiserver - port: 9004 - targetPort: 9004 - {{- end }} - {{- end }} diff --git a/charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml b/charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml deleted file mode 100644 index 6f79d8cd4..000000000 --- a/charts/kubecost/templates/cost-analyzer-servicemonitor-template.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if .Values.serviceMonitor }} -{{- if .Values.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "cost-analyzer.fullname" . }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if .Values.serviceMonitor.additionalLabels }} - {{ toYaml .Values.serviceMonitor.additionalLabels | nindent 4 }} - {{- end }} -spec: - endpoints: - - port: model - honorLabels: true - interval: 1m - scrapeTimeout: 10s - path: /metrics - scheme: http - namespaceSelector: - matchNames: - - {{ .Release.Namespace }} - selector: - matchLabels: - {{ include "cost-analyzer.selectorLabels" . | nindent 6 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/external-grafana-config-map-template.yaml b/charts/kubecost/templates/external-grafana-config-map-template.yaml deleted file mode 100644 index 5e81ed359..000000000 --- a/charts/kubecost/templates/external-grafana-config-map-template.yaml +++ /dev/null @@ -1,10 +0,0 @@ -{{- if eq .Values.global.grafana.proxy false -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: external-grafana-config-map - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - grafanaURL: {{ .Values.global.grafana.scheme | default "http" }}://{{- .Values.global.grafana.domainName }} -{{- end -}} \ No newline at end of file diff --git a/charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml b/charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml deleted file mode 100644 index 6d896a34c..000000000 --- a/charts/kubecost/templates/grafana-attached-disk-metrics-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: attached-disk-metrics-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - attached-disks.json: |- -{{ .Files.Get "attached-disks.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml b/charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml deleted file mode 100644 index 91650c74b..000000000 --- a/charts/kubecost/templates/grafana-dashboard-cluster-metrics-template.yaml +++ /dev/null @@ -1,27 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: cluster-metrics-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - cluster-metrics.json: |- -{{ .Files.Get "cluster-metrics.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} - - diff --git a/charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml deleted file mode 100644 index 8fe764c3e..000000000 --- a/charts/kubecost/templates/grafana-dashboard-cluster-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: cluster-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - cluster-utilization.json: |- -{{ .Files.Get "cluster-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml deleted file mode 100644 index d16c70bcd..000000000 --- a/charts/kubecost/templates/grafana-dashboard-deployment-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: deployment-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - deployment-utilization.json: |- -{{ .Files.Get "deployment-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml deleted file mode 100644 index 2372514d4..000000000 --- a/charts/kubecost/templates/grafana-dashboard-label-cost-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: label-cost-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - label-cost-utilization.json: |- -{{ .Files.Get "label-cost-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml deleted file mode 100644 index 17393dd16..000000000 --- a/charts/kubecost/templates/grafana-dashboard-namespace-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: namespace-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - namespace-utilization.json: |- -{{ .Files.Get "namespace-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml deleted file mode 100644 index 586a3dfca..000000000 --- a/charts/kubecost/templates/grafana-dashboard-node-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: node-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - node-utilization.json: |- -{{ .Files.Get "node-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml b/charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml deleted file mode 100644 index 92017afb8..000000000 --- a/charts/kubecost/templates/grafana-dashboard-pod-utilization-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: pod-utilization-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - pod-utilization.json: |- -{{ .Files.Get "pod-utilization.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml b/charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml deleted file mode 100644 index 32e1fc707..000000000 --- a/charts/kubecost/templates/grafana-dashboard-prometheus-metrics-template.yaml +++ /dev/null @@ -1,25 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.dashboards -}} -{{- if .Values.grafana.sidecar.dashboards.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: prom-benchmark-dashboard - {{- if $.Values.grafana.namespace_dashboards }} - namespace: {{ $.Values.grafana.namespace_dashboards }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.dashboards.label }} - {{ $.Values.grafana.sidecar.dashboards.label }}: "1" - {{- else }} - grafana_dashboard: "1" - {{- end }} -data: - pod-utilization.json: |- -{{ .Files.Get "prom-benchmark.json" | indent 8 }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/grafana-datasource-template.yaml b/charts/kubecost/templates/grafana-datasource-template.yaml deleted file mode 100644 index e79d2fa35..000000000 --- a/charts/kubecost/templates/grafana-datasource-template.yaml +++ /dev/null @@ -1,72 +0,0 @@ -{{- if .Values.grafana -}} -{{- if .Values.grafana.sidecar -}} -{{- if .Values.grafana.sidecar.datasources -}} -{{- if .Values.grafana.sidecar.datasources.enabled -}} -apiVersion: v1 -kind: ConfigMap -metadata: - name: grafana-datasource - {{- if $.Values.grafana.namespace_datasources }} - namespace: {{ $.Values.grafana.namespace_datasources }} - {{- end }} - labels: - {{ include "cost-analyzer.commonLabels" . | nindent 4 }} - {{- if $.Values.grafana.sidecar.datasources.label }} - {{ $.Values.grafana.sidecar.datasources.label }}: "1" - {{- else }} - {{- if .Values.global.grafana.enabled }} - kubecost_grafana_datasource: "1" - {{- else }} - grafana_datasource: "1" - {{- end }} - {{- end }} -data: - {{ default "datasource.yaml" .Values.grafana.sidecar.datasources.dataSourceFilename }}: |- - apiVersion: 1 - datasources: - - access: proxy -{{- if .Values.global.thanos }} -{{- if .Values.global.thanos.enabled }} - name: {{ default "Prometheus" .Values.grafana.sidecar.datasources.dataSourceName }} - isDefault: false -{{- else }} - name: "default-kubecost" -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - isDefault: true -{{- else }} - isDefault: false -{{- end }} -{{- end }} -{{- else }} - name: "default-kubecost" -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - isDefault: true -{{- else }} - isDefault: false -{{- end }} -{{- end }} - type: prometheus -{{- if .Values.global.prometheus.enabled }} - url: http://{{ template "cost-analyzer.prometheus.server.name" . }}.{{ .Release.Namespace }} -{{- else }} - url: {{ .Values.global.prometheus.fqdn }} -{{- end }} -{{- if .Values.global.thanos.enabled }} - - access: proxy - name: "default-kubecost" - type: prometheus -{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }} - isDefault: true -{{- else }} - isDefault: false -{{- end }} -{{- if .Values.global.prometheus.enabled }} - url: http://{{ .Release.Name }}-thanos-query-http.{{ .Release.Namespace }}:{{ .Values.thanos.query.http.port }} -{{ else }} - url: {{ .Values.global.thanos.queryService }} -{{- end }} -{{- end }} -{{- end -}} -{{- end -}} -{{- end -}} -{{- end -}} diff --git a/charts/kubecost/templates/kubecost-cluster-controller-template.yaml b/charts/kubecost/templates/kubecost-cluster-controller-template.yaml deleted file mode 100644 index 1a947e696..000000000 --- a/charts/kubecost/templates/kubecost-cluster-controller-template.yaml +++ /dev/null @@ -1,282 +0,0 @@ -{{- if .Values.clusterController }} -{{- if .Values.clusterController.enabled }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - labels: - app: {{ template "kubecost.clusterControllerName" . }} ---- -# -# NOTE: -# The following ClusterRole permissions are only created and assigned for the -# cluster controller feature. They will not be added to any clusters by default. -# -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - labels: - app: {{ template "kubecost.clusterControllerName" . }} -rules: - - apiGroups: - - kubecost.k8s.io - resources: - - turndownschedules - - turndownschedules/status - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - "" - - events.k8s.io - resources: - - events - verbs: - - create - - patch - - update - - apiGroups: - - '' - resources: - - deployments - - nodes - - pods - - resourcequotas - - replicationcontrollers - - limitranges - - pods/eviction - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - '' - resources: - - configmaps - - namespaces - - persistentvolumeclaims - - persistentvolumes - - endpoints - - events - - services - verbs: - - get - - list - - watch - - apiGroups: - - extensions - resources: - - daemonsets - - deployments - - replicasets - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - apps - resources: - - statefulsets - - deployments - - daemonsets - - replicasets - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - batch - resources: - - cronjobs - - jobs - verbs: - - get - - list - - watch - - create - - patch - - update - - delete - - apiGroups: - - autoscaling - resources: - - horizontalpodautoscalers - verbs: - - get - - list - - watch - - apiGroups: - - policy - resources: - - poddisruptionbudgets - verbs: - - get - - list - - watch - - apiGroups: - - storage.k8s.io - resources: - - storageclasses - verbs: - - get - - list - - watch - - apiGroups: - - events.k8s.io - resources: - - events - verbs: - - get - - list - - watch ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: {{ template "kubecost.clusterControllerName" . }} - labels: - app: {{ template "kubecost.clusterControllerName" . }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "kubecost.clusterControllerName" . }} -subjects: - - kind: ServiceAccount - name: {{ template "kubecost.clusterControllerName" . }} - namespace: {{ .Release.Namespace }} ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ template "kubecost.clusterControllerName" . }} -spec: - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - selector: - matchLabels: - app: {{ template "kubecost.clusterControllerName" . }} - template: - metadata: - labels: - app: {{ template "kubecost.clusterControllerName" . }} - spec: - containers: - - name: {{ template "kubecost.clusterControllerName" . }} - image: {{ .Values.clusterController.image }} - imagePullPolicy: {{ .Values.clusterController.imagePullPolicy }} - volumeMounts: - - name: cluster-controller-keys - mountPath: /var/keys - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - - name: TURNDOWN_NAMESPACE - value: {{ .Release.Namespace }} - - name: TURNDOWN_DEPLOYMENT - value: {{ template "kubecost.clusterControllerName" . }} - - name: GOOGLE_APPLICATION_CREDENTIALS - value: /var/keys/service-key.json - ports: - - name: http-server - containerPort: 9731 - hostPort: 9731 - serviceAccount: {{ template "kubecost.clusterControllerName" . }} - serviceAccountName: {{ template "kubecost.clusterControllerName" . }} - volumes: - - name: cluster-controller-keys - secret: - secretName: {{ .Values.clusterController.secretName | default "cluster-controller-service-key" }} ---- -apiVersion: v1 -kind: Service -metadata: - name: {{ template "kubecost.clusterControllerName" . }}-service -spec: - type: ClusterIP - ports: - - name: http - protocol: TCP - port: 9731 - targetPort: 9731 - selector: - app: {{ template "kubecost.clusterControllerName" . }} ---- -# TurndownSchedule Custom Resource Definition for persistence -apiVersion: apiextensions.k8s.io/v1beta1 -kind: CustomResourceDefinition -metadata: - name: turndownschedules.kubecost.k8s.io -spec: - group: kubecost.k8s.io - version: v1alpha1 - names: - kind: TurndownSchedule - singular: turndownschedule - plural: turndownschedules - shortNames: - - td - - tds - scope: Cluster - subresources: - status: {} - validation: - openAPIV3Schema: - properties: - spec: - type: object - properties: - start: - type: string - format: date-time - end: - type: string - format: date-time - repeat: - type: string - enum: [none, daily, weekly] - additionalPrinterColumns: - - name: State - type: string - description: The state of the turndownschedule - JSONPath: .status.state - - name: Next Turndown - type: string - description: The next turndown date-time - JSONPath: .status.nextScaleDownTime - - name: Next Turn Up - type: string - description: The next turn up date-time - JSONPath: .status.nextScaleUpTime -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml b/charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml deleted file mode 100644 index 907252f93..000000000 --- a/charts/kubecost/templates/kubecost-cluster-manager-configmap-template.yaml +++ /dev/null @@ -1,13 +0,0 @@ -{{- if .Values.kubecostProductConfigs }} -{{- if .Values.kubecostProductConfigs.clusters }} -apiVersion: v1 -kind: ConfigMap -metadata: - name: kubecost-clusters - labels: - {{- include "cost-analyzer.commonLabels" . | nindent 4 }} -data: - default-clusters.yaml: | -{{- toYaml .Values.kubecostProductConfigs.clusters | nindent 4 }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/kubecost-priority-class-template.yaml b/charts/kubecost/templates/kubecost-priority-class-template.yaml deleted file mode 100644 index a098a766e..000000000 --- a/charts/kubecost/templates/kubecost-priority-class-template.yaml +++ /dev/null @@ -1,11 +0,0 @@ -{{- if .Values.priority }} -{{- if .Values.priority.enabled }} -apiVersion: {{ include "cost-analyzer.priorityClass.apiVersion" . }} -kind: PriorityClass -metadata: - name: {{ template "cost-analyzer.fullname" . }}-priority -value: {{ .Values.priority.value | default "1000000" }} -globalDefault: false -description: "Priority class for scheduling the cost-analyzer pod" -{{- end }} -{{- end }} \ No newline at end of file diff --git a/charts/kubecost/templates/network-costs-psp.template.yaml b/charts/kubecost/templates/network-costs-psp.template.yaml deleted file mode 100644 index c6d1c5385..000000000 --- a/charts/kubecost/templates/network-costs-psp.template.yaml +++ /dev/null @@ -1,24 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podSecurityPolicy }} -{{- if .Values.networkCosts.podSecurityPolicy.enabled }} -apiVersion: {{ include "cost-analyzer.podSecurityPolicy.apiVersion" . }} -kind: PodSecurityPolicy -metadata: - name: kubecost-network-costs -spec: - privileged: true - seLinux: - rule: RunAsAny - supplementalGroups: - rule: RunAsAny - runAsUser: - rule: RunAsAny - fsGroup: - rule: RunAsAny - volumes: - - '*' -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/network-costs-role.template.yaml b/charts/kubecost/templates/network-costs-role.template.yaml deleted file mode 100644 index 04424a44e..000000000 --- a/charts/kubecost/templates/network-costs-role.template.yaml +++ /dev/null @@ -1,22 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podSecurityPolicy }} -{{- if .Values.networkCosts.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: kubecost-network-costs - annotations: -{{- if .Values.networkCosts.podSecurityPolicy.annotations }} -{{ toYaml .Values.networkCosts.podSecurityPolicy.annotations | indent 4 }} -{{- end }} -rules: -- apiGroups: ['extensions'] - resources: ['podsecuritypolicies'] - verbs: ['use'] - resourceNames: - - kubecost-network-costs -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/templates/network-costs-rolebinding.template.yaml b/charts/kubecost/templates/network-costs-rolebinding.template.yaml deleted file mode 100644 index 84ab0d1c2..000000000 --- a/charts/kubecost/templates/network-costs-rolebinding.template.yaml +++ /dev/null @@ -1,20 +0,0 @@ -{{- if .Values.networkCosts }} -{{- if .Values.networkCosts.enabled }} -{{- if .Values.networkCosts.podSecurityPolicy }} -{{- if .Values.networkCosts.podSecurityPolicy.enabled }} -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: kubecost-network-costs -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: kubecost-network-costs -subjects: -- kind: ServiceAccount - name: {{ template "cost-analyzer.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} -{{- end }} -{{- end }} -{{- end }} -{{- end }} diff --git a/charts/kubecost/values-thanos.yaml b/charts/kubecost/values-thanos.yaml deleted file mode 100644 index b0bc33889..000000000 --- a/charts/kubecost/values-thanos.yaml +++ /dev/null @@ -1,117 +0,0 @@ -global: - thanos: - enabled: true - -# For Thanos Installs, Allow Higher Concurrency from Cost-Model -# Still may require tweaking for some installs, but the thanos-query-frontend -# will greatly assist in reduction memory bloat in query. -kubecostModel: - maxQueryConcurrency: 5 - # This configuration is applied to thanos only. Expresses the resolution to - # use for longer query ranges. Options: raw, 5m, 1h - Default: raw - maxSourceResolution: 5m - -prometheus: - server: - extraArgs: - storage.tsdb.min-block-duration: 2h - storage.tsdb.max-block-duration: 2h - storage.tsdb.retention: 2w - extraVolumes: - - name: object-store-volume - secret: - # Ensure this secret name matches thanos.storeSecretName - secretName: kubecost-thanos - enableAdminApi: true - sidecarContainers: - - name: thanos-sidecar - image: thanosio/thanos:v0.15.0 - args: - - sidecar - - --log.level=debug - - --tsdb.path=/data/ - - --prometheus.url=http://127.0.0.1:9090 - - --objstore.config-file=/etc/config/object-store.yaml - # Start of time range limit to serve. Thanos sidecar will serve only metrics, which happened - # later than this value. Option can be a constant time in RFC3339 format or time duration - # relative to current time, such as -1d or 2h45m. Valid duration units are ms, s, m, h, d, w, y. - - --min-time=-3h - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - ports: - - name: sidecar-http - containerPort: 10902 - - name: grpc - containerPort: 10901 - - name: cluster - containerPort: 10900 - volumeMounts: - - name: config-volume - mountPath: /etc/prometheus - - name: storage-volume - mountPath: /data - subPath: "" - - name: object-store-volume - mountPath: /etc/config - -thanos: - store: - enabled: true - grpcSeriesMaxConcurrency: 20 - blockSyncConcurrency: 20 - extraEnv: - - name: GOGC - value: "100" - resources: - requests: - memory: "2.5Gi" - query: - enabled: true - timeout: 3m - # Maximum number of queries processed concurrently by query node. - maxConcurrent: 8 - # Maximum number of select requests made concurrently per a query. - maxConcurrentSelect: 2 - resources: - requests: - memory: "2.5Gi" - autoDownsampling: false - extraEnv: - - name: GOGC - value: "100" - - # Thanos Query Frontend - queryFrontend: - enabled: true - compressResponses: true - # Response Cache Configuration - # Configure either a max size constraint or max items. - responseCache: - enabled: true - # Maximum memory size of the cache in bytes. A unit suffix (KB, MB, GB) may be applied. - maxSize: 1.25GB - # Maximum number of entries in the cache. - maxSizeItems: 0 - # The expiry duration for the cache. - validity: 2m - resources: - requests: - memory: "1.5Gi" - - # Thanos Sidecar Service Discovery - sidecar: - enabled: true - bucket: - enabled: false - compact: - enabled: true - dataVolume: - persistentVolumeClaim: - claimName: compact-data-volume - storage: 100Gi - # This secret name should match the sidecar configured secret name volume - # in the prometheus.server.extraVolumes entry - storeSecretName: kubecost-thanos diff --git a/charts/kubecost/values.yaml b/charts/kubecost/values.yaml deleted file mode 100644 index 29e3d558f..000000000 --- a/charts/kubecost/values.yaml +++ /dev/null @@ -1,561 +0,0 @@ -global: - # zone: cluster.local (use only if your DNS server doesn't live in the same zone as kubecost) - prometheus: - enabled: true # If false, Prometheus will not be installed -- only actively supported on paid Kubecost plans - fqdn: http://cost-analyzer-prometheus-server.default.svc #example fqdn. Ignored if enabled: true - # insecureSkipVerify : false # If true, kubecost will not check the TLS cert of prometheus - # queryServiceBasicAuthSecretName: dbsecret # kubectl create secret generic dbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD - # queryServiceBearerTokenSecretName: dbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN - - # Durable storage option, product key required - thanos: - enabled: false - # queryService: http://thanos-query-frontend-http.kubecost:{{ .Values.thanos.queryFrontend.http.port }} # an address of the thanos query-frontend endpoint, if different from installed thanos - # queryServiceBasicAuthSecretName: mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=USERNAME --from-file=PASSWORD <---enter basic auth credentials like that - # queryServiceBearerTokenSecretName mcdbsecret # kubectl create secret generic mcdbsecret -n kubecost --from-file=TOKEN - # queryOffset: 3h # The offset to apply to all thanos queries in order to achieve syncronization on all cluster block stores - - grafana: - enabled: true # If false, Grafana will not be installed - domainName: cost-analyzer-grafana.default.svc #example grafana domain Ignored if enabled: true - scheme: "http" # http or https, for the domain name above. - proxy: true # If true, the kubecost frontend will route to your grafana through its service endpoint - - notifications: - # Kubecost alerting configuration - # Ref: http://docs.kubecost.com/alerts - alertConfigs: - enabled: false # the example values below are never read unless enabled is set to true - frontendUrl: http://localhost:9090 # optional, used for linkbacks - slackWebhookUrl: https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX # optional, used for Slack alerts - globalAlertEmails: - - recipient@example.com - - additionalRecipient@example.com - alerts: - # Daily namespace budget alert on namespace `kubecost` - - type: budget # supported: budget, recurringUpdate - threshold: 50 # optional, required for budget alerts - window: daily # or 1d - aggregation: namespace - filter: kubecost - ownerContact: # optional, overrides globalAlertEmails default - - owner@example.com - - owner2@example.com - # Daily cluster budget alert (clusterCosts alert) on cluster `cluster-one` - - type: budget - threshold: 200.8 # optional, required for budget alerts - window: daily # or 1d - aggregation: cluster - filter: cluster-one - # Recurring weekly update (weeklyUpdate alert) - - type: recurringUpdate - window: weekly # or 7d - aggregation: namespace - filter: '*' - # Recurring weekly namespace update on kubecost namespace - - type: recurringUpdate - window: weekly # or 7d - aggregation: namespace - filter: kubecost - ownerContact: # ownerContact(s) should be the same for the same namespace, otherwise the last namespace alert overwrites - - owner@example.com - - owner2@example.com - alertmanager: # Supply an alertmanager FQDN to receive notifications from the app. - enabled: false # If true, allow kubecost to write to your alertmanager - fqdn: http://cost-analyzer-prometheus-server.default.svc #example fqdn. Ignored if prometheus.enabled: true - - podAnnotations: {} - # iam.amazonaws.com/role: role-arn - -pricingCsv: - enabled: false - location: - provider: "AWS" - region: "us-east-1" - URI: s3://kc-csv-test/pricing_schema.csv # a valid file URI - csvAccessCredentials: pricing-schema-access-secret - -saml: # enterprise key required to use - enabled: false - secretName: "kubecost-authzero" - #metadataSecretName: "kubecost-authzero-metadata" # One of metadataSecretName or idpMetadataURL must be set. defaults to metadataURL if set - idpMetadataURL: "https://dev-elu2z98r.auth0.com/samlp/metadata/c6nY4M37rBP0qSO1IYIqBPPyIPxLS8v2" - appRootURL: "http://localhost:9090" # sample URL - # audienceURI: "http://localhost:9090" # by convention, the same as the appRootURL, but any string uniquely identifying kubecost to your samp IDP. Optional if you follow the convention - rbac: - enabled: false - groups: - - name: admin - enabled: false # if admin is disabled, all SAML users will be able to make configuration changes to the kubecost frontend - assertionName: "http://schemas.auth0.com/userType" # a SAML Assertion, one of whose elements has a value that matches on of the values in assertionValues - assertionValues: - - "admin" - - "superusers" - - name: readonly - enabled: false # if readonly is disabled, all users authorized on SAML will default to readonly - assertionName: "http://schemas.auth0.com/userType" - assertionvalues: - - "readonly" - -# imagePullSecrets: -# - name: "image-pull-secret" - -kubecostChecks: - enabled: true - image: "quay.io/kubecost1/checks" - resources: - requests: - cpu: "20m" - memory: "100Mi" - limits: - cpu: "100m" - memory: "200Mi" - -kubecostFrontend: - image: "gcr.io/kubecost1/frontend" - imagePullPolicy: Always - resources: - requests: - cpu: "10m" - memory: "55Mi" - #limits: - # cpu: "100m" - # memory: "256Mi" - -kubecost: - image: "gcr.io/kubecost1/server" - resources: - requests: - cpu: "100m" - memory: "55Mi" - #limits: - # cpu: "100m" - # memory: "256Mi" - -kubecostModel: - image: "gcr.io/kubecost1/cost-model" - imagePullPolicy: Always - warmCache: true - warmSavingsCache: true - etl: true - # The total number of days the ETL storage will build - etlStoreDurationDays: 120 - maxQueryConcurrency: 5 - # utcOffset represents a timezone in hours and minutes east (+) or west (-) - # of UTC, itself, which is defined as +00:00. - # See the tz database of timezones to look up your local UTC offset: - # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones - utcOffset: "+00:00" - resources: - requests: - cpu: "200m" - memory: "55Mi" - #limits: - # cpu: "800m" - # memory: "256Mi" - -ingress: - enabled: false - annotations: - kubernetes.io/ingress.class: nginx - # kubernetes.io/tls-acme: "true" - paths: ["/"] # There's no need to route specifically to the pods-- we have an nginx deployed that handles routing - hosts: - - cost-analyzer.local - tls: [] - # - secretName: cost-analyzer-tls - # hosts: - # - cost-analyzer.local - -nodeSelector: {} - -tolerations: [] -# - key: "key" -# operator: "Equal|Exists" -# value: "value" -# effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - -affinity: {} - -# If true, creates a PriorityClass to be used by the cost-analyzer pod -priority: - enabled: false - # value: 1000000 - -# If true, enable creation of NetworkPolicy resources. -networkPolicy: - enabled: false - -podSecurityPolicy: - enabled: false - -# Define persistence volume for cost-analyzer -persistentVolume: - size: 0.2Gi - dbSize: 32.0Gi - enabled: true # Note that setting this to false means configurations will be wiped out on pod restart. - # storageClass: "-" # - # existingClaim: kubecost-cost-analyzer # a claim in the same namespace as kubecost - -service: - type: ClusterIP - port: 9090 - targetPort: 9090 - # nodePort: - labels: {} - annotations: {} - -# enabling long-term durable storage with Postgres requires an enterprise license -remoteWrite: - postgres: - enabled: false - initImage: "gcr.io/kubecost1/sql-init" - initImagePullPolicy: Always - installLocal: true - remotePostgresAddress: "" # ignored if installing locally - persistentVolume: - size: 200Gi - auth: - password: admin # change me - -prometheus: - extraScrapeConfigs: | - - job_name: kubecost - honor_labels: true - scrape_interval: 1m - scrape_timeout: 10s - metrics_path: /metrics - scheme: http - dns_sd_configs: - - names: - - {{ template "cost-analyzer.serviceName" . }} - type: 'A' - port: 9003 - - job_name: kubecost-networking - kubernetes_sd_configs: - - role: pod - relabel_configs: - # Scrape only the the targets matching the following metadata - - source_labels: [__meta_kubernetes_pod_label_app] - action: keep - regex: {{ template "cost-analyzer.networkCostsName" . }} - server: - # If clusterIDConfigmap is defined, instead use user-generated configmap with key CLUSTER_ID - # to use as unique cluster ID in kubecost cost-analyzer deployment. - # This overrides the cluster_id set in prometheus.server.global.external_labels. - # NOTE: This does not affect the external_labels set in prometheus config. - # clusterIDConfigmap: cluster-id-configmap - - resources: {} - # limits: - # cpu: 500m - # memory: 512Mi - # requests: - # cpu: 500m - # memory: 512Mi - global: - scrape_interval: 1m - scrape_timeout: 10s - evaluation_interval: 1m - external_labels: - cluster_id: cluster-one # Each cluster should have a unique ID - persistentVolume: - size: 32Gi - enabled: true - extraArgs: - query.max-concurrency: 1 - query.max-samples: 100000000 - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - alertmanager: - # enabled: false - persistentVolume: - enabled: true - nodeExporter: - enabled: true - pushgateway: - enabled: false - persistentVolume: - enabled: true - serverFiles: - # prometheus.yml: # Sample block -- enable if using an in cluster durable store. - # remote_write: - # - url: "http://pgprometheus-adapter:9201/write" - # write_relabel_configs: - # - source_labels: [__name__] - # regex: 'container_.*_allocation|container_.*_allocation_bytes|.*_hourly_cost|kube_pod_container_resource_requests_memory_bytes|container_memory_working_set_bytes|kube_pod_container_resource_requests_cpu_cores|kube_pod_container_resource_requests|pod_pvc_allocation|kube_namespace_labels|kube_pod_labels' - # action: keep - # queue_config: - # max_samples_per_send: 1000 - #remote_read: - # - url: "http://pgprometheus-adapter:9201/read" - rules: - groups: - - name: CPU - rules: - - expr: sum(rate(container_cpu_usage_seconds_total{container_name!=""}[5m])) - record: cluster:cpu_usage:rate5m - - expr: rate(container_cpu_usage_seconds_total{container_name!=""}[5m]) - record: cluster:cpu_usage_nosum:rate5m - - expr: avg(irate(container_cpu_usage_seconds_total{container_name!="POD", container_name!=""}[5m])) by (container_name,pod_name,namespace) - record: kubecost_container_cpu_usage_irate - - expr: sum(container_memory_working_set_bytes{container_name!="POD",container_name!=""}) by (container_name,pod_name,namespace) - record: kubecost_container_memory_working_set_bytes - - expr: sum(container_memory_working_set_bytes{container_name!="POD",container_name!=""}) - record: kubecost_cluster_memory_working_set_bytes - - name: Savings - rules: - - expr: sum(avg(kube_pod_owner{owner_kind!="DaemonSet"}) by (pod) * sum(container_cpu_allocation) by (pod)) - record: kubecost_savings_cpu_allocation - labels: - daemonset: "false" - - expr: sum(avg(kube_pod_owner{owner_kind="DaemonSet"}) by (pod) * sum(container_cpu_allocation) by (pod)) / sum(kube_node_info) - record: kubecost_savings_cpu_allocation - labels: - daemonset: "true" - - expr: sum(avg(kube_pod_owner{owner_kind!="DaemonSet"}) by (pod) * sum(container_memory_allocation_bytes) by (pod)) - record: kubecost_savings_memory_allocation_bytes - labels: - daemonset: "false" - - expr: sum(avg(kube_pod_owner{owner_kind="DaemonSet"}) by (pod) * sum(container_memory_allocation_bytes) by (pod)) / sum(kube_node_info) - record: kubecost_savings_memory_allocation_bytes - labels: - daemonset: "true" - - expr: label_replace(sum(kube_pod_status_phase{phase="Running",namespace!="kube-system"} > 0) by (pod, namespace), "pod_name", "$1", "pod", "(.+)") - record: kubecost_savings_running_pods - - expr: sum(rate(container_cpu_usage_seconds_total{container_name!="",container_name!="POD",instance!=""}[5m])) by (namespace, pod_name, container_name, instance) - record: kubecost_savings_container_cpu_usage_seconds - - expr: sum(container_memory_working_set_bytes{container_name!="",container_name!="POD",instance!=""}) by (namespace, pod_name, container_name, instance) - record: kubecost_savings_container_memory_usage_bytes - - expr: avg(sum(kube_pod_container_resource_requests_cpu_cores{namespace!="kube-system"}) by (pod, namespace, instance)) by (pod, namespace) - record: kubecost_savings_pod_requests_cpu_cores - - expr: avg(sum(kube_pod_container_resource_requests_memory_bytes{namespace!="kube-system"}) by (pod, namespace, instance)) by (pod, namespace) - record: kubecost_savings_pod_requests_memory_bytes - -networkCosts: - enabled: false - podSecurityPolicy: - enabled: false - image: gcr.io/kubecost1/kubecost-network-costs:v13.7 - imagePullPolicy: Always - # Traffic Logging will enable logging the top 5 destinations for each source - # every 30 minutes. - trafficLogging: true - # Port will set both the containerPort and hostPort to this value. - # These must be identical due to network-costs being run on hostNetwork - port: 3001 - resources: {} - #requests: - # cpu: "50m" - # memory: "20Mi" - config: - # Configuration for traffic destinations, including specific classification - # for IPs and CIDR blocks. This configuration will act as an override to the - # automatic classification provided by network-costs. - destinations: - # In Zone contains a list of address/range that will be - # classified as in zone. - in-zone: - # Loopback - - "127.0.0.1" - # IPv4 Link Local Address Space - - "169.254.0.0/16" - # Private Address Ranges in RFC-1918 - - "10.0.0.0/8" - - "172.16.0.0/12" - - "192.168.0.0/16" - - # In Region contains a list of address/range that will be - # classified as in region. This is synonymous with cross - # zone traffic, where the regions between source and destinations - # are the same, but the zone is different. - in-region: [] - - # Cross Region contains a list of address/range that will be - # classified as non-internet egress from one region to another. - cross-region: [] - - # Direct Classification specifically maps an ip address or range - # to a region (required) and/or zone (optional). This classification - # takes priority over in-zone, in-region, and cross-region configurations. - direct-classification: [] - # - region: "us-east1" - # zone: "us-east1-c" - # ips: - # - "10.0.0.0/24" - - ## Node tolerations for server scheduling to nodes with taints - ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/ - ## - tolerations: [] - # - key: "key" - # operator: "Equal|Exists" - # value: "value" - # effect: "NoSchedule|PreferNoSchedule|NoExecute(1.6 only)" - - ## PriorityClassName - ## Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass - priorityClassName: [] - ## PodMonitor - ## Allows scraping of network metrics from a dedicated prometheus operator setup - podMonitor: - enabled: false - additionalLabels: {} - -# Kubecost Deployment Configuration -# Used for HA mode in Business & Enterprise tier -kubecostDeployment: - replicas: 1 - -# Kubecost Cluster Controller for Right Sizing and Cluster Turndown -clusterController: - enabled: false - image: gcr.io/kubecost1/cluster-controller:v0.0.2 - imagePullPolicy: Always - -reporting: - # Kubecost bug report feature: Logs access/collection limited to .Release.Namespace - # Ref: http://docs.kubecost.com/bug-report - logCollection: true - productAnalytics: true - errorReporting: true - valuesReporting: true - -serviceMonitor: - enabled: false - additionalLabels: {} - -prometheusRule: - enabled: false - additionalLabels: {} - -supportNFS: true -initChownDataImage: "busybox" # Supports a fully qualified Docker image eg: registry.hub.docker.com/library/busybox:latest. -initChownData: - resources: {} - #requests: - # cpu: "50m" - # memory: "20Mi" - - -grafana: - # namespace_datasources: kubecost # override the default namespace here - # namespace_dashboards: kubecost # override the default namespace here - sidecar: - dashboards: - enabled: true - # label that the configmaps with dashboards are marked with - label: grafana_dashboard - datasources: - # dataSourceFilename: foo.yml # If you need to change the name of the datasource file - enabled: true - defaultDatasourceEnabled: false - dataSourceName: default-kubecost - # label that the configmaps with datasources are marked with - label: kubecost_grafana_datasource -# For grafana to be accessible, add the path to root_url. For example, if you run kubecost at www.foo.com:9090/kubecost -# set root_url to "%(protocol)s://%(domain)s:%(http_port)s/kubecost/grafana". No change is necessary here if kubecost runs at a root URL - grafana.ini: - server: - root_url: "%(protocol)s://%(domain)s:%(http_port)s/grafana" -serviceAccount: - create: true # Set this to false if you're bringing your own service account. - annotations: {} - # name: kc-test - -# These configs can also be set from the Settings page in the Kubecost product UI -# Values in this block override config changes in the Settings UI on pod restart -# -# kubecostProductConfigs: -# An optional list of cluster definitions that can be added for frontend access. The local -# cluster is *always* included by default, so this list is for non-local clusters. -# Ref: https://github.com/kubecost/docs/blob/master/multi-cluster.md -# clusters: -# - name: "Cluster A" -# address: http://cluster-a.kubecost.com:9090 -# # Optional authentication credentials - only basic auth is currently supported. -# auth: -# type: basic -# # Secret name should be a secret formatted based on: https://github.com/kubecost/docs/blob/master/ingress-examples.md -# secretName: cluster-a-auth -# # Or pass auth directly as base64 encoded user:pass -# data: YWRtaW46YWRtaW4= -# # Or user and pass directly -# user: admin -# pass: admin -# - name: "Cluster B" -# address: http://cluster-b.kubecost.com:9090 -# defaultModelPricing: # default monthly resource prices, used predominately for on-prem clusters -# CPU: 28.0 -# spotCPU: 4.86 -# RAM: 3.09 -# spotRAM: 0.65 -# GPU: 693.50 -# spotGPU: 225.0 -# storage: 0.04 -# zoneNetworkEgress: 0.01 -# regionNetworkEgress: 0.01 -# internetNetworkEgress: 0.12 -# enabled: true -# # The cluster profile represents a predefined set of parameters to use when calculating savings. -# # Possible values are: [ development, production, high-availability ] -# clusterProfile: production -# customPricesEnabled: false # This makes the default view custom prices-- generally used for on-premises clusters -# spotLabel: lifecycle -# spotLabelValue: Ec2Spot -# gpuLabel: gpu -# gpuLabelValue: true -# awsServiceKeyName: ACCESSKEYID -# awsServiceKeyPassword: fakepassword # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName -# awsSpotDataRegion: us-east-1 -# awsSpotDataBucket: spot-data-feed-s3-bucket -# awsSpotDataPrefix: dev -# athenaProjectID: "530337586277" # The AWS AccountID where the Athena CUR is. Generally your masterpayer account -# athenaBucketName: "s3://aws-athena-query-results-530337586277-us-east-1" -# athenaRegion: us-east-1 -# athenaDatabase: athenacurcfn_athena_test1 -# athenaTable: "athena_test1" -# masterPayerARN: "" -# projectID: "123456789" # Also known as AccountID on AWS -- the current account/project that this instance of Kubecost is deployed on. -# gcpSecretName: gcp-secret # Name of a secret representing the gcp service key -# bigQueryBillingDataDataset: billing_data.gcp_billing_export_v1_01AC9F_74CF1D_5565A2 -# labelMappingConfigs: # names of k8s labels used to designate different allocation concepts -# enabled: true -# owner_label: "owner" -# team_label: "team" -# department_label: "dept" -# product_label: "product" -# environment_label: "env" -# namespace_external_label: "kubernetes_namespace" # external labels are used to map external cloud costs to kubernetes concepts -# cluster_external_label: "kubernetes_cluster" -# controller_external_label: "kubernetes_controller" -# product_external_label: "kubernetes_label_app" -# service_external_label: "kubernetes_service" -# deployment_external_label: "kubernetes_deployment" -# team_external_label: "kubernetes_label_team" -# environment_external_label: "kubernetes_label_env" -# department_external_label: "kubernetes_label_department" -# statefulset_external_label: "kubernetes_statefulset" -# daemonset_external_label: "kubernetes_daemonset" -# pod_external_label: "kubernetes_pod" -# grafanaURL: "" -# clusterName: "" # used for display in Kubecost UI -# currencyCode: "USD" # offical support for USD, CAD, EUR, and CHF -# azureBillingRegion: US # Represents 2-letter region code, e.g. West Europe = NL, Canada = CA. ref: https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes -# azureSubscriptionID: 0bd50fdf-c923-4e1e-850c-196dd3dcc5d3 -# azureClientID: f2ef6f7d-71fb-47c8-b766-8d63a19db017 -# azureTenantID: 72faf3ff-7a3f-4597-b0d9-7b0b201bb23a -# azureClientPassword: fake key # Only use if your values.yaml are stored encrypted. Otherwise provide an existing secret via serviceKeySecretName -# discount: "" # percentage discount applied to compute -# negotiatedDiscount: "" # custom negotiated cloud provider discount -# defaultIdle: false -# serviceKeySecretName: "" # Use an existing AWS or Azure secret with format as in aws-service-key-secret.yaml or azure-service-key-secret.yaml. Leave blank if using createServiceKeySecret -# createServiceKeySecret: true # Creates a secret representing your cloud service key based on data in values.yaml. If you are storing unencrypted values, add a secret manually -# sharedNamespaces: "" # namespaces with shared workloads, example value: "kube-system\,ingress-nginx\,kubecost\,monitoring" -# productKey: # apply business or enterprise product license -# key: "" -# enabled: false -# secretname: productkeysecret # create a secret out of a file named productkey.json of format { "key": "kc-b1325234" } diff --git a/index.yaml b/index.yaml deleted file mode 100644 index 85db7b955..000000000 --- a/index.yaml +++ /dev/null @@ -1,18 +0,0 @@ -apiVersion: v1 -entries: - cost-analyzer: - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/namespace: kubecost - catalog.cattle.io/release-name: kubecost - apiVersion: v1 - appVersion: 1.70.0 - created: "2020-12-08T09:55:59.539327144-08:00" - description: A Helm chart that sets up Kubecost, Prometheus, and Grafana to monitor - cloud costs. - digest: d54c4dee21a08a6fdb52ab88d4d692853008d0acf096e84d59230b5bbf248245 - name: cost-analyzer - urls: - - assets/kubecost/cost-analyzer-1.70.000.tgz - version: 1.70.000 -generated: "2020-12-08T09:55:59.523959491-08:00"