added repo
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
|
||||
Thanks for deploying Grafana Pyroscope.
|
||||
|
||||
# Pyroscope UI & Grafana
|
||||
|
||||
Pyroscope database comes with a built-in UI, to access it from your localhost you can use:
|
||||
|
||||
```
|
||||
{{ include "pyroscope.kubectl_port_forward_read" . }}
|
||||
```
|
||||
|
||||
You can also use Grafana to explore Pyroscope data.
|
||||
For that, you'll need to add the Pyroscope data source to your Grafana instance and configure the query URL accordingly.
|
||||
See https://grafana.com/docs/grafana/latest/datasources/grafana-pyroscope/ for more details.
|
||||
|
||||
The in-cluster query URL for the data source in Grafana is:
|
||||
|
||||
```
|
||||
{{ include "pyroscope.read_url" . }}
|
||||
```
|
||||
|
||||
# Collecting profiles.
|
||||
|
||||
{{ if or .Values.agent.enabled .Values.alloy.enabled }}
|
||||
The Grafana {{ if .Values.alloy.enabled }}Alloy{{ else }}Agent{{ end }} has been installed to scrape and discover pprof profiles endpoint via pod annotations.
|
||||
|
||||
As an example, to start collecting memory and cpu profile using the 8080 port, add the following annotations to your workload:
|
||||
|
||||
```
|
||||
profiles.grafana.com/memory.scrape: "true"
|
||||
profiles.grafana.com/memory.port: "8080"
|
||||
profiles.grafana.com/cpu.scrape: "true"
|
||||
profiles.grafana.com/cpu.port: "8080"
|
||||
```
|
||||
|
||||
|
||||
To learn more supported annotations, read our guide https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/#optional-scrape-your-own-workloads-profiles
|
||||
{{- end }}
|
||||
|
||||
There are various ways to collect profiles from your application depending on your needs.
|
||||
Follow our guide to setup profiling data collection for your workload:
|
||||
|
||||
https://grafana.com/docs/pyroscope/latest/configure-client/
|
||||
|
||||
{{- $storage := .Values.architecture.storage }}
|
||||
{{- if and $storage.v1 $storage.v2 }}
|
||||
|
||||
# Pyroscope v2 Migration is active
|
||||
|
||||
Write traffic will be written to:
|
||||
- {{ mul $storage.migration.ingesterWeight 100 }}% v1: ingester
|
||||
- {{ mul $storage.migration.segmentWriterWeight 100 }}% v2: segment-writer
|
||||
|
||||
{{ if $storage.migration.queryBackend }}
|
||||
Read traffic is served from v2 read path from {{if eq $storage.migration.queryBackendFrom "auto"}}as soon as data was first ingested to v2{{else}}{{$storage.migration.queryBackendFrom}}{{end}}.
|
||||
{{- else }}
|
||||
Read traffic is served from v1 read path.
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if and (not $storage.v1) (not $storage.v2) }}
|
||||
{{- fail "you need to set at least one of .Values.architecture.storage.v1, .Values.architecture.storage.v2 to true" }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,161 @@
|
||||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "pyroscope.name" -}}
|
||||
{{- default .Chart.Name .Values.pyroscope.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 "pyroscope.fullname" -}}
|
||||
{{- if .Values.pyroscope.fullnameOverride }}
|
||||
{{- .Values.pyroscope.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.pyroscope.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 "pyroscope.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "pyroscope.labels" -}}
|
||||
helm.sh/chart: {{ include "pyroscope.chart" . }}
|
||||
{{ include "pyroscope.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- range $k, $v := .Values.pyroscope.extraLabels }}
|
||||
{{$k}}: {{ $v | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "pyroscope.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "pyroscope.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Template labels
|
||||
*/}}
|
||||
{{- define "pyroscope.templateLabels" -}}
|
||||
{{ include "pyroscope.selectorLabels" . }}
|
||||
{{- range $k, $v := .Values.pyroscope.extraLabels }}
|
||||
{{$k}}: {{ $v | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "pyroscope.serviceAccountName" -}}
|
||||
{{- if .Values.pyroscope.serviceAccount.create }}
|
||||
{{- default (include "pyroscope.fullname" .) .Values.pyroscope.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.pyroscope.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a list of components that should be deployed.
|
||||
*/}}
|
||||
{{- define "pyroscope.components" -}}
|
||||
{{- $full_name := (include "pyroscope.fullname" .) }}
|
||||
{{- $components := dict }}
|
||||
{{- if .Values.architecture.microservices.enabled }}
|
||||
{{- if .Values.architecture.storage.v1 }}
|
||||
{{- $components = mustMergeOverwrite (deepCopy $components) (.Values.architecture.microservices.v1 | default dict)}}
|
||||
{{- end }}
|
||||
{{- if .Values.architecture.storage.v2 }}
|
||||
{{- $components = mustMergeOverwrite (deepCopy $components) (.Values.architecture.microservices.v2 | default dict)}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $components = mustMergeOverwrite (deepCopy $components) (.Values.pyroscope.components | default dict)}}
|
||||
{{- range $k, $v := $components }}
|
||||
{{- $v := set $v "name" (printf "%s-%s" $full_name $k) }}
|
||||
{{$k}}: {{ $v | toJson }}
|
||||
{{- end }}
|
||||
{{/*
|
||||
If no components are defined fall back to single binary statefulset
|
||||
*/}}
|
||||
{{- if eq (len $components) 0 }}
|
||||
all: {kind: "StatefulSet", name: "{{$full_name}}"}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
|
||||
{{/*
|
||||
Return the URL for sending profiles to Pyroscope.
|
||||
*/}}
|
||||
{{- define "pyroscope.write_url" -}}
|
||||
{{- $components := (fromYaml (include "pyroscope.components" .)) -}}
|
||||
{{- if .Values.architecture.deployUnifiedServices -}}
|
||||
http://{{ include "pyroscope.fullname" . }}-write.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}
|
||||
{{- else if hasKey $components "distributor" -}}
|
||||
http://{{ include "pyroscope.fullname" . }}-distributor.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ ($components.distributor.service).port | default .Values.pyroscope.service.port}}
|
||||
{{- else -}}
|
||||
http://{{ include "pyroscope.fullname" . }}.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.service.port }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Return the URL for querying profiles from Pyroscope.
|
||||
*/}}
|
||||
{{- define "pyroscope.read_url" -}}
|
||||
{{- $components := (fromYaml (include "pyroscope.components" .)) -}}
|
||||
{{- if .Values.architecture.deployUnifiedServices -}}
|
||||
http://{{ include "pyroscope.fullname" . }}-read.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}
|
||||
{{- else if hasKey $components "query-frontend" -}}A
|
||||
{{- $port := ((index $components "query-frontend").service).port | default .Values.pyroscope.service.port }}
|
||||
http://{{ include "pyroscope.fullname" . }}-query-frontend.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ $port }}
|
||||
{{- else -}}
|
||||
http://{{ include "pyroscope.fullname" . }}.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.service.port }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Return the kubectl port-forward command for querying profiles from Pyroscope.
|
||||
*/}}
|
||||
{{- define "pyroscope.kubectl_port_forward_read" -}}
|
||||
{{- $components := (fromYaml (include "pyroscope.components" .)) -}}
|
||||
{{- if .Values.architecture.deployUnifiedServices -}}
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "pyroscope.fullname" . }}-read {{ .Values.pyroscope.service.port }}:80
|
||||
{{- else if hasKey $components "query-frontend" -}}
|
||||
{{- $port := ((index $components "query-frontend").service).port | default .Values.pyroscope.service.port }}
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "pyroscope.fullname" . }}-query-frontend {{ $port }}:{{ $port }}
|
||||
{{- else -}}
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward svc/{{ include "pyroscope.fullname" . }} {{ .Values.pyroscope.service.port }}:{{ .Values.pyroscope.service.port }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- define "pyroscope.defaultAutoscalingComponents" -}}
|
||||
enabled: false
|
||||
minReplicas: 1
|
||||
maxReplicas: 3
|
||||
targetCPUUtilizationPercentage: 60
|
||||
targetMemoryUtilizationPercentage: null
|
||||
customMetrics: []
|
||||
behavior:
|
||||
enabled: false
|
||||
scaleDown: {}
|
||||
scaleUp: {}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,190 @@
|
||||
{{- /* Note this config file is depreacted, use the alloy one instead */}}
|
||||
{{- if and (.Values.agent.enabled) (not .Values.agent.agent.configMap.create) }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Values.agent.agent.configMap.name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
data:
|
||||
config.river: |
|
||||
logging {
|
||||
level = "info"
|
||||
format = "logfmt"
|
||||
}
|
||||
|
||||
discovery.kubernetes "pyroscope_kubernetes" {
|
||||
role = "pod"
|
||||
}
|
||||
|
||||
// The default scrape config allows to define annotations based scraping.
|
||||
//
|
||||
// For example the following annotations:
|
||||
//
|
||||
// ```
|
||||
// profiles.grafana.com/memory.scrape: "true"
|
||||
// profiles.grafana.com/memory.port: "8080"
|
||||
// profiles.grafana.com/cpu.scrape: "true"
|
||||
// profiles.grafana.com/cpu.port: "8080"
|
||||
// profiles.grafana.com/goroutine.scrape: "true"
|
||||
// profiles.grafana.com/goroutine.port: "8080"
|
||||
// ```
|
||||
//
|
||||
// will scrape the `memory`, `cpu` and `goroutine` profiles from the `8080` port of the pod.
|
||||
//
|
||||
// For more information see https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/helm/#optional-scrape-your-own-workloads-profiles
|
||||
discovery.relabel "kubernetes_pods" {
|
||||
targets = concat(discovery.kubernetes.pyroscope_kubernetes.targets)
|
||||
|
||||
rule {
|
||||
action = "drop"
|
||||
source_labels = ["__meta_kubernetes_pod_phase"]
|
||||
regex = "Pending|Succeeded|Failed|Completed"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "labelmap"
|
||||
regex = "__meta_kubernetes_pod_label_(.+)"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_namespace"]
|
||||
target_label = "namespace"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_pod_name"]
|
||||
target_label = "pod"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_pod_container_name"]
|
||||
target_label = "container"
|
||||
}
|
||||
}
|
||||
{{- $profileTypes := list "memory" "cpu" "goroutine" "block" "mutex" "fgprof" }}
|
||||
{{- range $profileTypes }}
|
||||
|
||||
discovery.relabel "kubernetes_pods_{{.}}_default_name" {
|
||||
targets = concat(discovery.relabel.kubernetes_pods.output)
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
|
||||
action = "keep"
|
||||
regex = "true"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
|
||||
action = "keep"
|
||||
regex = ""
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_container_port_number"]
|
||||
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"
|
||||
action = "keepequal"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
|
||||
action = "replace"
|
||||
regex = "(https?)"
|
||||
target_label = "__scheme__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
|
||||
action = "replace"
|
||||
regex = "(.+)"
|
||||
target_label = "__profile_path__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
|
||||
action = "replace"
|
||||
regex = "(.+?)(?::\\d+)?;(\\d+)"
|
||||
target_label = "__address__"
|
||||
replacement = "$1:$2"
|
||||
}
|
||||
}
|
||||
|
||||
discovery.relabel "kubernetes_pods_{{.}}_custom_name" {
|
||||
targets = concat(discovery.relabel.kubernetes_pods.output)
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
|
||||
action = "keep"
|
||||
regex = "true"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
|
||||
action = "drop"
|
||||
regex = ""
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_container_port_name"]
|
||||
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"
|
||||
action = "keepequal"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
|
||||
action = "replace"
|
||||
regex = "(https?)"
|
||||
target_label = "__scheme__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
|
||||
action = "replace"
|
||||
regex = "(.+)"
|
||||
target_label = "__profile_path__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
|
||||
action = "replace"
|
||||
regex = "(.+?)(?::\\d+)?;(\\d+)"
|
||||
target_label = "__address__"
|
||||
replacement = "$1:$2"
|
||||
}
|
||||
}
|
||||
|
||||
pyroscope.scrape "pyroscope_scrape_{{.}}" {
|
||||
clustering {
|
||||
enabled = true
|
||||
}
|
||||
|
||||
targets = concat(discovery.relabel.kubernetes_pods_{{.}}_default_name.output, discovery.relabel.kubernetes_pods_{{.}}_custom_name.output)
|
||||
forward_to = [pyroscope.write.pyroscope_write.receiver]
|
||||
|
||||
profiling_config {
|
||||
{{- $currentType := . -}}
|
||||
{{- range $profileTypes }}
|
||||
profile.{{if eq . "cpu"}}process_cpu{{else}}{{.}}{{end}} {
|
||||
enabled = {{if eq . $currentType}}true{{else}}false{{end}}
|
||||
}
|
||||
{{- if ne . (last $profileTypes) }}{{ printf "\n" }}{{ end }}
|
||||
{{- end }}
|
||||
}
|
||||
}
|
||||
{{- end }}
|
||||
|
||||
pyroscope.write "pyroscope_write" {
|
||||
endpoint {
|
||||
url = "{{ include "pyroscope.write_url" . }}"
|
||||
}
|
||||
}
|
||||
|
||||
{{- end }}
|
||||
@@ -0,0 +1,207 @@
|
||||
{{- if and (.Values.alloy.enabled) (not .Values.alloy.alloy.configMap.create) }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Values.alloy.alloy.configMap.name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
data:
|
||||
config.alloy: |
|
||||
logging {
|
||||
level = "info"
|
||||
format = "logfmt"
|
||||
}
|
||||
|
||||
discovery.kubernetes "pyroscope_kubernetes" {
|
||||
role = "pod"
|
||||
}
|
||||
|
||||
// The default scrape config allows to define annotations based scraping.
|
||||
//
|
||||
// For example the following annotations:
|
||||
//
|
||||
// ```
|
||||
// profiles.grafana.com/memory.scrape: "true"
|
||||
// profiles.grafana.com/memory.port: "8080"
|
||||
// profiles.grafana.com/cpu.scrape: "true"
|
||||
// profiles.grafana.com/cpu.port: "8080"
|
||||
// profiles.grafana.com/goroutine.scrape: "true"
|
||||
// profiles.grafana.com/goroutine.port: "8080"
|
||||
// ```
|
||||
//
|
||||
// will scrape the `memory`, `cpu` and `goroutine` profiles from the `8080` port of the pod.
|
||||
//
|
||||
// For more information see https://grafana.com/docs/pyroscope/latest/deploy-kubernetes/helm/#optional-scrape-your-own-workloads-profiles
|
||||
discovery.relabel "kubernetes_pods" {
|
||||
targets = concat(discovery.kubernetes.pyroscope_kubernetes.targets)
|
||||
|
||||
rule {
|
||||
action = "drop"
|
||||
source_labels = ["__meta_kubernetes_pod_phase"]
|
||||
regex = "Pending|Succeeded|Failed|Completed"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "labelmap"
|
||||
regex = "__meta_kubernetes_pod_label_(.+)"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_namespace"]
|
||||
target_label = "namespace"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_pod_name"]
|
||||
target_label = "pod"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_pod_container_name"]
|
||||
target_label = "container"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_service_repository"]
|
||||
target_label = "service_repository"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_service_git_ref"]
|
||||
target_label = "service_git_ref"
|
||||
}
|
||||
|
||||
rule {
|
||||
action = "replace"
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_service_root_path"]
|
||||
target_label = "service_root_path"
|
||||
}
|
||||
}
|
||||
{{- $profileTypes := list "memory" "cpu" "goroutine" "block" "mutex" "fgprof" }}
|
||||
{{- range $profileTypes }}
|
||||
|
||||
discovery.relabel "kubernetes_pods_{{.}}_default_name" {
|
||||
targets = concat(discovery.relabel.kubernetes_pods.output)
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
|
||||
action = "keep"
|
||||
regex = "true"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
|
||||
action = "keep"
|
||||
regex = ""
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_container_port_number"]
|
||||
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"
|
||||
action = "keepequal"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
|
||||
action = "replace"
|
||||
regex = "(https?)"
|
||||
target_label = "__scheme__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
|
||||
action = "replace"
|
||||
regex = "(.+)"
|
||||
target_label = "__profile_path__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
|
||||
action = "replace"
|
||||
regex = "(.+?)(?::\\d+)?;(\\d+)"
|
||||
target_label = "__address__"
|
||||
replacement = "$1:$2"
|
||||
}
|
||||
}
|
||||
|
||||
discovery.relabel "kubernetes_pods_{{.}}_custom_name" {
|
||||
targets = concat(discovery.relabel.kubernetes_pods.output)
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scrape"]
|
||||
action = "keep"
|
||||
regex = "true"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"]
|
||||
action = "drop"
|
||||
regex = ""
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_container_port_name"]
|
||||
target_label = "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port_name"
|
||||
action = "keepequal"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_scheme"]
|
||||
action = "replace"
|
||||
regex = "(https?)"
|
||||
target_label = "__scheme__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_path"]
|
||||
action = "replace"
|
||||
regex = "(.+)"
|
||||
target_label = "__profile_path__"
|
||||
replacement = "$1"
|
||||
}
|
||||
|
||||
rule {
|
||||
source_labels = ["__address__", "__meta_kubernetes_pod_annotation_profiles_grafana_com_{{.}}_port"]
|
||||
action = "replace"
|
||||
regex = "(.+?)(?::\\d+)?;(\\d+)"
|
||||
target_label = "__address__"
|
||||
replacement = "$1:$2"
|
||||
}
|
||||
}
|
||||
|
||||
pyroscope.scrape "pyroscope_scrape_{{.}}" {
|
||||
clustering {
|
||||
enabled = true
|
||||
}
|
||||
|
||||
targets = concat(discovery.relabel.kubernetes_pods_{{.}}_default_name.output, discovery.relabel.kubernetes_pods_{{.}}_custom_name.output)
|
||||
forward_to = [pyroscope.write.pyroscope_write.receiver]
|
||||
|
||||
profiling_config {
|
||||
{{- $currentType := . -}}
|
||||
{{- range $profileTypes }}
|
||||
profile.{{if eq . "cpu"}}process_cpu{{else}}{{.}}{{end}} {
|
||||
enabled = {{if eq . $currentType}}true{{else}}false{{end}}
|
||||
}
|
||||
{{- if ne . (last $profileTypes) }}{{ printf "\n" }}{{ end }}
|
||||
{{- end }}
|
||||
}
|
||||
}
|
||||
{{- end }}
|
||||
|
||||
pyroscope.write "pyroscope_write" {
|
||||
endpoint {
|
||||
url = "{{ include "pyroscope.write_url" . }}"
|
||||
}
|
||||
}
|
||||
|
||||
{{- end }}
|
||||
@@ -0,0 +1,11 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "pyroscope.fullname" . }}-overrides-config
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
data:
|
||||
overrides.yaml: |
|
||||
overrides:
|
||||
{{- toYaml .Values.pyroscope.tenantOverrides | nindent 6 }}
|
||||
@@ -0,0 +1,10 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "pyroscope.fullname" . }}-config
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
data:
|
||||
config.yaml: |
|
||||
{{- tpl (mergeOverwrite (tpl .Values.pyroscope.config . | fromYaml) .Values.pyroscope.structuredConfig | toYaml) . | nindent 4 }}
|
||||
@@ -0,0 +1,325 @@
|
||||
{{- $global := . }}
|
||||
{{- $components := (fromYaml (include "pyroscope.components" .)) }}
|
||||
{{- $hasV1 := $global.Values.architecture.storage.v1 }}
|
||||
{{- $hasV2 := $global.Values.architecture.storage.v2 }}
|
||||
{{- $hasMetastore := hasKey $components "metastore" }}
|
||||
{{- $hasQueryBackend := hasKey $components "query-backend" }}
|
||||
{{- range $component, $cfg := $components }}
|
||||
{{- with $global }}
|
||||
{{- $values := mustMergeOverwrite (deepCopy .Values.pyroscope ) ($cfg | default dict)}}
|
||||
{{- $extraArgs := mustMergeOverwrite (deepCopy .Values.pyroscope.extraArgs ) ($cfg.extraArgs | default dict)}}
|
||||
{{- $isMetastore := or (and (eq $component "all") ($hasV2)) (eq $component "metastore") }}
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: {{ $cfg.kind }}
|
||||
metadata:
|
||||
name: {{ $cfg.name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
spec:
|
||||
{{- if eq $values.kind "StatefulSet" }}
|
||||
serviceName: {{ $values.name }}-headless
|
||||
podManagementPolicy: Parallel
|
||||
{{- end }}
|
||||
{{- if and (hasKey $values "replicaCount") (not ($values.autoscaling).enabled) }}
|
||||
replicas: {{ $values.replicaCount }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 6 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
template:
|
||||
metadata:
|
||||
annotations:
|
||||
{{- if not (hasKey $values.podAnnotations "checksum/config") }}
|
||||
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
|
||||
{{- end }}
|
||||
{{- if not (hasKey $values.podAnnotations "profiles.grafana.com/service_repository") }}
|
||||
profiles.grafana.com/service_repository: "https://github.com/grafana/pyroscope"
|
||||
{{- end }}
|
||||
{{- if not (hasKey $values.podAnnotations "profiles.grafana.com/service_git_ref") }}
|
||||
profiles.grafana.com/service_git_ref: "v{{ .Chart.AppVersion }}"
|
||||
{{- end }}
|
||||
{{- with $values.podAnnotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "pyroscope.templateLabels" . | nindent 8 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
name: {{ if eq $component "all" }}"pyroscope"{{ else }}"{{ $component }}"{{ end }}
|
||||
spec:
|
||||
{{- with $values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "pyroscope.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml $values.podSecurityContext | nindent 8 }}
|
||||
{{- if hasKey $values "hostNetwork" }}
|
||||
hostNetwork: {{ $values.hostNetwork }}
|
||||
{{- end }}
|
||||
{{- if hasKey $values "dnsPolicy" }}
|
||||
dnsPolicy: {{ $values.dnsPolicy }}
|
||||
{{- end }}
|
||||
{{- with $values.initContainers }}
|
||||
initContainers:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ if eq $component "all" }}"pyroscope"{{ else }}"{{ $component }}"{{ end }}
|
||||
securityContext:
|
||||
{{- toYaml $values.securityContext | nindent 12 }}
|
||||
{{- $registry := $global.Values.global.imageRegistry | default $values.image.registry }}
|
||||
image: "{{ if $registry }}{{ $registry }}/{{ end }}{{ $values.image.repository }}:{{ $values.image.tag | default .Chart.AppVersion }}"
|
||||
imagePullPolicy: {{ $values.image.pullPolicy }}
|
||||
args:
|
||||
- "-target={{ $component }}"
|
||||
- "-self-profiling.disable-push={{ .Values.pyroscope.disableSelfProfile }}"
|
||||
- "-server.http-listen-port={{ $values.service.port }}"
|
||||
- "-memberlist.cluster-label={{ .Release.Namespace }}-{{ include "pyroscope.fullname" .}}{{if $global.Values.architecture.microservices.enabled}}{{$global.Values.architecture.microservices.clusterLabelSuffix}}{{end}}"
|
||||
- "-memberlist.join=dns+{{ include "pyroscope.fullname" .}}-memberlist.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.memberlist.port }}"
|
||||
- "-config.file=/etc/pyroscope/config.yaml"
|
||||
- "-runtime-config.file=/etc/pyroscope/overrides/overrides.yaml"
|
||||
{{- range $key, $value := $extraArgs }}
|
||||
- "-{{ $key }}={{ $value }}"
|
||||
{{- end }}
|
||||
{{- /* When v2 and single binary is used we need to explicitly configure "filesystem" (TODO: This should be the default in v2) */}}
|
||||
{{- if and $hasV2 (eq $component "all") }}
|
||||
{{- if (not (hasKey $extraArgs "storage.backend")) }}
|
||||
- "-storage.backend=filesystem"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- /* v2 specific options for all components */}}
|
||||
{{- if $hasV2 }}
|
||||
{{- if (not (hasKey $extraArgs "query-backend.address")) }}
|
||||
- "-query-backend.address=dns:///_grpc._tcp.{{ include "pyroscope.fullname" . }}{{ if $hasQueryBackend }}-query-backend{{ end }}-headless.$(NAMESPACE_FQDN):{{ .Values.pyroscope.grpc.port }}"
|
||||
{{- end }}
|
||||
{{- if (not (hasKey $extraArgs "metastore.address")) }}
|
||||
- "-metastore.address=kubernetes:///{{ include "pyroscope.fullname" . }}{{ if $hasMetastore }}-metastore{{ end }}-headless.$(NAMESPACE_FQDN):{{ .Values.pyroscope.grpc.port }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- /* metastore specific v2 migration config */}}
|
||||
{{- if $isMetastore }}
|
||||
{{- if (not (hasKey $extraArgs "metastore.raft.server-id")) }}
|
||||
- "-metastore.raft.bind-address=:{{ .Values.pyroscope.metastore.port }}"
|
||||
{{- end }}
|
||||
{{- if (not (hasKey $extraArgs "metastore.raft.server-id")) }}
|
||||
- "-metastore.raft.server-id=$(POD_NAME).$(PYROSCOPE_METASTORE_SERVICE)"
|
||||
{{- end }}
|
||||
{{- if (not (hasKey $extraArgs "metastore.raft.advertise-address")) }}
|
||||
- "-metastore.raft.advertise-address=$(POD_NAME).$(PYROSCOPE_METASTORE_SERVICE)"
|
||||
{{- end }}
|
||||
{{- if (not (hasKey $extraArgs "metastore.raft.server-id")) }}
|
||||
- "-metastore.raft.bootstrap-peers=dnssrvnoa+_raft._tcp.$(PYROSCOPE_METASTORE_SERVICE)"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- /* distributor specific v1/v2 migration config */}}
|
||||
{{- if or (eq $component "all") (eq $component "distributor") }}
|
||||
{{- if and $hasV2 (not (hasKey $extraArgs "write-path")) }}
|
||||
{{- if $hasV1 }}
|
||||
- "-write-path=combined"
|
||||
{{- if not (hasKey $extraArgs "write-path.segment-writer-weight") }}
|
||||
- "-write-path.segment-writer-weight=1"
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
- "-write-path=segment-writer"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- /* query-frontend specific v1/v2 migration config */}}
|
||||
{{- if or (eq $component "all") (eq $component "query-frontend") }}
|
||||
{{- if and $hasV2 (not (hasKey $extraArgs "enable-query-backend")) }}
|
||||
{{- if and $hasV1 $global.Values.architecture.storage.migration.queryBackend }}
|
||||
- "-enable-query-backend=true"
|
||||
{{- if and (not (hasKey $extraArgs "enable-query-backend-from")) $global.Values.architecture.storage.migration.queryBackendFrom }}
|
||||
- "-enable-query-backend-from={{$global.Values.architecture.storage.migration.queryBackendFrom}}"
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
- "-enable-query-backend=true"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
env:
|
||||
- name: POD_NAME
|
||||
valueFrom:
|
||||
fieldRef:
|
||||
fieldPath: metadata.name
|
||||
- name: NAMESPACE_FQDN
|
||||
value: "{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}"
|
||||
{{- if and $hasV2 (not (hasKey $values.extraEnvVars "PYROSCOPE_V2_EXPERIMENT")) }}
|
||||
- name: PYROSCOPE_V2_EXPERIMENT
|
||||
value: "1"
|
||||
{{- end }}
|
||||
{{- if and $hasV2 (not (hasKey $values.extraEnvVars "PYROSCOPE_METASTORE_SERVICE")) }}
|
||||
- name: PYROSCOPE_METASTORE_SERVICE
|
||||
value: "{{ include "pyroscope.fullname" .}}{{ if $hasMetastore }}-metastore{{ end }}-headless.{{ .Release.Namespace }}.svc{{ .Values.pyroscope.cluster_domain }}:{{ .Values.pyroscope.metastore.port }}"
|
||||
{{- end }}
|
||||
{{- with $values.extraEnvVars }}
|
||||
{{- range $key, $value := . }}
|
||||
- name: {{ $key }}
|
||||
{{- if kindIs "map" $value }}
|
||||
{{- toYaml $value | nindent 14 }}
|
||||
{{- else }}
|
||||
value: {{ $value | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with $values.extraCustomEnvVars }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with $values.extraEnvFrom }}
|
||||
envFrom:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: {{ $values.service.port_name }}
|
||||
containerPort: {{ $values.service.port }}
|
||||
protocol: TCP
|
||||
- name: {{ $values.memberlist.port_name }}
|
||||
containerPort: {{ $values.memberlist.port }}
|
||||
protocol: TCP
|
||||
{{- if $hasV2 }}
|
||||
- name: {{ $values.grpc.port_name }}
|
||||
containerPort: {{ $values.grpc.port }}
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
{{- if $isMetastore }}
|
||||
- name: {{ $values.metastore.port_name }}
|
||||
containerPort: {{ $values.metastore.port }}
|
||||
protocol: TCP
|
||||
{{- end }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /ready
|
||||
port: {{ $values.service.port_name }}
|
||||
scheme: {{ $values.service.scheme }}
|
||||
{{- if ($values.readinessProbe).initialDelaySeconds }}
|
||||
initialDelaySeconds: {{ $values.readinessProbe.initialDelaySeconds }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: config
|
||||
mountPath: /etc/pyroscope/config.yaml
|
||||
subPath: config.yaml
|
||||
- name: overrides-config
|
||||
mountPath: /etc/pyroscope/overrides/
|
||||
- name: data
|
||||
mountPath: /data
|
||||
{{- if eq $component "compactor" }}
|
||||
subPath: default
|
||||
- name: data
|
||||
mountPath: /data-compactor
|
||||
subPath: compactor
|
||||
{{- end }}
|
||||
{{- if (and $hasV2 $values.persistence.shared.enabled) }}
|
||||
- name: data
|
||||
mountPath: /data-shared
|
||||
subPath: {{ $values.persistence.shared.subPath }}
|
||||
{{- end }}
|
||||
{{- if $isMetastore }}
|
||||
- name: data
|
||||
mountPath: /data-metastore
|
||||
subPath: {{ $values.persistence.metastore.subPath }}
|
||||
{{- end }}
|
||||
{{- with $values.extraVolumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
resources:
|
||||
{{- if $global.Values.architecture.overwriteResources }}
|
||||
{{- toYaml $global.Values.architecture.overwriteResources | nindent 12 }}
|
||||
{{- else }}
|
||||
{{- toYaml $values.resources | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- with $values.extraContainers }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if hasKey $values "priorityClassName" }}
|
||||
priorityClassName: {{ $values.priorityClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if $values.terminationGracePeriodSeconds }}
|
||||
terminationGracePeriodSeconds: {{ $values.terminationGracePeriodSeconds }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
{{- with $values.extraVolumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
- name: config
|
||||
configMap:
|
||||
name: {{ include "pyroscope.fullname" . }}-config
|
||||
- name: overrides-config
|
||||
configMap:
|
||||
name: {{ include "pyroscope.fullname" . }}-overrides-config
|
||||
{{- $persistence := $values.persistence }}
|
||||
{{- if not $persistence.enabled }}
|
||||
- name: data
|
||||
emptyDir: {}
|
||||
{{- else if $persistence.existingClaim}}
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ $persistence.existingClaim }}
|
||||
{{- else if ne $cfg.kind "StatefulSet"}}
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ $cfg.name }}-data
|
||||
{{- else }}
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: data
|
||||
annotations:
|
||||
{{- toYaml $persistence.annotations | nindent 8 }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{- toYaml $persistence.accessModes | nindent 8 }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ $persistence.size | quote }}
|
||||
storageClassName: {{ $persistence.storageClassName }}
|
||||
{{- if $persistence.selector }}
|
||||
selector:
|
||||
{{- toYaml $persistence.selector | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $persistence.extraVolumeClaimTemplates }}
|
||||
{{- toYaml . | nindent 2 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- $pdb := $values.podDisruptionBudget }}
|
||||
{{- if $pdb.enabled }}
|
||||
apiVersion: policy/v1
|
||||
kind: PodDisruptionBudget
|
||||
metadata:
|
||||
name: {{ $cfg.name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
spec:
|
||||
{{- if hasKey $pdb "minAvailable" }}
|
||||
minAvailable: {{ $pdb.minAvailable }}
|
||||
{{- else }}
|
||||
maxUnavailable: {{ $pdb.maxUnavailable }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 6 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,54 @@
|
||||
{{- $global := . }}
|
||||
{{- range $component, $cfg := (fromYaml (include "pyroscope.components" .)) }}
|
||||
{{- with $global }}
|
||||
{{- $autoScalingValues := mergeOverwrite (fromYaml (include "pyroscope.defaultAutoscalingComponents" .)) ($cfg.autoscaling | default dict) }}
|
||||
|
||||
{{- if $autoScalingValues.enabled }}
|
||||
---
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ $cfg.name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: {{ $cfg.kind }}
|
||||
name: {{ $cfg.name }}
|
||||
minReplicas: {{ $autoScalingValues.minReplicas }}
|
||||
maxReplicas: {{ $autoScalingValues.maxReplicas }}
|
||||
metrics:
|
||||
{{- with $autoScalingValues.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ . }}
|
||||
{{- end }}
|
||||
{{- with $autoScalingValues.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ . }}
|
||||
{{- end }}
|
||||
{{- with $autoScalingValues.customMetrics }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- if $autoScalingValues.behavior.enabled }}
|
||||
behavior:
|
||||
{{- with $autoScalingValues.behavior.scaleDown }}
|
||||
scaleDown: {{ toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
{{- with $autoScalingValues.behavior.scaleUp }}
|
||||
scaleUp: {{ toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,118 @@
|
||||
{{- if .Values.ingress.enabled }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ include "pyroscope.fullname" . }}-ingress
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.ingress.className }}
|
||||
ingressClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- with .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range $.Values.ingress.hosts }}
|
||||
- host: {{ . | quote }}
|
||||
http:
|
||||
paths:
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-query-frontend
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-query-frontend
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /querier.v1.QuerierService/
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-query-frontend
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /render
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-query-frontend
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /render-diff
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-distributor
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /push.v1.PusherService/
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-distributor
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /ingest
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-tenant-settings
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /settings.v1.SettingsService/
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
- backend:
|
||||
service:
|
||||
{{- if gt (len $.Values.pyroscope.components) 1}}
|
||||
name: {{ include "pyroscope.fullname" $ }}-ad-hoc-profiles
|
||||
{{- else }}
|
||||
name: {{ include "pyroscope.fullname" $ }}
|
||||
{{- end }}
|
||||
port:
|
||||
number: {{ $.Values.pyroscope.service.port }}
|
||||
path: /adhocprofiles.v1.AdHocProfileService/
|
||||
pathType: {{ $.Values.ingress.pathType }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,20 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ template "pyroscope.fullname" . }}-memberlist
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: ClusterIP
|
||||
clusterIP: None
|
||||
ports:
|
||||
- name: {{ .Values.pyroscope.memberlist.port_name }}
|
||||
port: {{ .Values.pyroscope.memberlist.port }}
|
||||
protocol: TCP
|
||||
targetPort: {{ .Values.pyroscope.memberlist.port }}
|
||||
publishNotReadyAddresses: true
|
||||
selector:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
|
||||
# TODO: Ensure only services that offer memberlist register
|
||||
# pyroscope.grafana.com/memberlist: "true"
|
||||
@@ -0,0 +1,38 @@
|
||||
{{- $hasV2 := .Values.architecture.storage.v2 }}
|
||||
{{- if $hasV2 }}
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: Role
|
||||
metadata:
|
||||
name: {{ template "pyroscope.fullname" . }}-discovery
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
rules:
|
||||
- apiGroups:
|
||||
- ""
|
||||
- discovery.k8s.io
|
||||
resources:
|
||||
- endpointslices
|
||||
- endpoints
|
||||
- services
|
||||
- pods
|
||||
verbs:
|
||||
- get
|
||||
- watch
|
||||
- list
|
||||
---
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: RoleBinding
|
||||
metadata:
|
||||
name: {{ template "pyroscope.fullname" . }}-discovery
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: Role
|
||||
name: {{ template "pyroscope.fullname" . }}-discovery
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: {{ include "pyroscope.serviceAccountName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,13 @@
|
||||
{{- if .Values.pyroscope.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "pyroscope.serviceAccountName" . }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
{{- with .Values.pyroscope.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,69 @@
|
||||
{{- if .Values.serviceMonitor.enabled }}
|
||||
{{- $global := . }}
|
||||
{{- $serviceMonitor := .Values.serviceMonitor }}
|
||||
{{- range $component, $cfg := (fromYaml (include "pyroscope.components" .)) }}
|
||||
{{- with $global }}
|
||||
{{- $values := mustMergeOverwrite (deepCopy .Values.pyroscope ) ($cfg | default dict)}}
|
||||
---
|
||||
apiVersion: monitoring.coreos.com/v1
|
||||
kind: ServiceMonitor
|
||||
metadata:
|
||||
name: {{ $cfg.name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
{{- with $serviceMonitor.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with $serviceMonitor.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with $serviceMonitor.namespaceSelector }}
|
||||
namespaceSelector:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 6 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
matchExpressions:
|
||||
- key: prometheus.io/service-monitor
|
||||
operator: NotIn
|
||||
values:
|
||||
- "false"
|
||||
{{- with $serviceMonitor.matchExpressions }}
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
endpoints:
|
||||
- port: {{ $values.service.port_name }}
|
||||
{{- with $serviceMonitor.interval }}
|
||||
interval: {{ . }}
|
||||
{{- end }}
|
||||
{{- with $serviceMonitor.scrapeTimeout }}
|
||||
scrapeTimeout: {{ . }}
|
||||
{{- end }}
|
||||
{{- with $serviceMonitor.relabelings }}
|
||||
relabelings:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $serviceMonitor.metricRelabelings }}
|
||||
metricRelabelings:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $serviceMonitor.scheme }}
|
||||
scheme: {{ . }}
|
||||
{{- end }}
|
||||
{{- with $serviceMonitor.tlsConfig }}
|
||||
tlsConfig:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with $serviceMonitor.targetLabels }}
|
||||
targetLabels:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,94 @@
|
||||
{{- $global := . }}
|
||||
{{- $components := (fromYaml (include "pyroscope.components" .)) }}
|
||||
{{- $hasV2 := $global.Values.architecture.storage.v2 }}
|
||||
{{- range $component, $cfg := $components }}
|
||||
{{- with $global }}
|
||||
{{- $values := mustMergeOverwrite (deepCopy .Values.pyroscope ) ($cfg | default dict)}}
|
||||
{{- $isMetastore := or (and (eq $component "all") ($hasV2)) (eq $component "metastore") }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ $cfg.name }}
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
{{- if $values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml $values.service.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ $values.service.type }}
|
||||
ports:
|
||||
- port: {{ $values.service.port }}
|
||||
targetPort: {{ $values.service.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ $values.service.port_name }}
|
||||
{{- if $hasV2 }}
|
||||
- port: {{ $values.grpc.port }}
|
||||
targetPort: {{ $values.grpc.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ $values.grpc.port_name }}
|
||||
{{- end }}
|
||||
{{- if $isMetastore }}
|
||||
- port: {{ $values.metastore.port }}
|
||||
targetPort: {{ $values.metastore.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ $values.metastore.port_name }}
|
||||
{{- end }}
|
||||
{{- with $values.service.extraPorts }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ $cfg.name }}-headless
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
{{- if or .Values.serviceMonitor.enabled $values.service.headlessAnnotations }}
|
||||
annotations:
|
||||
{{- if .Values.serviceMonitor.enabled }}
|
||||
prometheus.io/service-monitor: "false"
|
||||
{{- end }}
|
||||
{{- with $values.service.headlessAnnotations }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: ClusterIP
|
||||
clusterIP: None
|
||||
ports:
|
||||
- port: {{ $values.service.port }}
|
||||
targetPort: {{ $values.service.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ $values.service.port_name }}
|
||||
{{- if $hasV2 }}
|
||||
- port: {{ $values.grpc.port }}
|
||||
targetPort: {{ $values.grpc.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ $values.grpc.port_name }}
|
||||
{{- end }}
|
||||
{{- if $isMetastore }}
|
||||
- port: {{ $values.metastore.port }}
|
||||
targetPort: {{ $values.metastore.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ $values.metastore.port_name }}
|
||||
{{- end }}
|
||||
{{- with $values.service.extraPorts }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- if or $values.service.publishNotReadyAddresses $isMetastore }}
|
||||
publishNotReadyAddresses: true
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
|
||||
app.kubernetes.io/component: {{ $component | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,47 @@
|
||||
{{- $global := . }}
|
||||
{{- $components := (fromYaml (include "pyroscope.components" .)) }}
|
||||
{{- if $global.Values.architecture.deployUnifiedServices }}
|
||||
{{- /* There services are useful wanting to switch from single binary to microservices without reconfiguring the endpoints */}}
|
||||
{{- $hasDistributor := hasKey $components "distributor" }}
|
||||
{{- $hasQueryFrontend := hasKey $components "query-frontend" }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-write
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: "ClusterIP"
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: {{ .Values.pyroscope.service.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ .Values.pyroscope.service.port_name }}
|
||||
selector:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
|
||||
{{- if $hasDistributor }}
|
||||
app.kubernetes.io/component: distributor
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ .Release.Name }}-read
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "pyroscope.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: "ClusterIP"
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: {{ .Values.pyroscope.service.port_name }}
|
||||
protocol: TCP
|
||||
name: {{ .Values.pyroscope.service.port_name }}
|
||||
selector:
|
||||
{{- include "pyroscope.selectorLabels" . | nindent 4 }}
|
||||
{{- if $hasQueryFrontend }}
|
||||
app.kubernetes.io/component: query-frontend
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
Reference in New Issue
Block a user