Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[kube-prometheus-stack] Grafana crd datasources #5240

Open
wants to merge 7 commits into
base: main
Choose a base branch
from

Conversation

dzirg44
Copy link

@dzirg44 dzirg44 commented Jan 27, 2025

Introducing Grafana Datasources as CRDs

Special notes for your reviewer

this PR is a result of #5216
I essence I don't expect any problems but you have to pay attention to 3 things

  1. due to the helper usage the sort order in the result yaml config map is broken, I don't think it is a big deal, but let me know if you have any other thoughts
Details

data:
  datasource.yaml: |-
    apiVersion: 1
    datasources:
      - access: proxy
        isDefault: true
        jsonData:
          httpMethod: POST
          timeInterval: 30s
          timeout: null
        name: Prometheus
        type: prometheus
        uid: prometheus
        url: http://prometheus-stack-kube-prom-prometheus.default:9090/
      - access: proxy
        isDefault: false
        jsonData:
          handleGrafanaManagedAlerts: false
          implementation: prometheus
        name: Alertmanager
        type: alertmanager
        uid: alertmanager
        url: http://prometheus-stack-kube-prom-alertmanager.default:9093/

  1. the name of name: {{ include "kube-prometheus-stack.fullname" $ }}-{{ include "kube-prometheus-stack.grafana.sanitizeName" $ds.name }} , probably you have a better idea or conventions to name it.

  2. default values for

      app.kubernetes.io/instance: grafana
      app.kubernetes.io/name: grafana-operator

I have them in 2 places (values, and the resource), but I often do like this in my charts, but idk if it is appropriate here.
@jkroepke
Also, if I have to mention about it in the documentation - let me know.

Checklist

  • DCO signed
  • Chart Version bumped
  • Title of the PR starts with chart name (e.g. [prometheus-couchdb-exporter])

Copy link
Member

@jkroepke jkroepke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, thanks for split this help. It help at least me to review this with a bit more focus.

To go through the files and leave comments that I have in my mind.

Comment on lines +1028 to +1030
operatorInstanceSelector:
app.kubernetes.io/instance: grafana
app.kubernetes.io/name: grafana-operator
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is a known helm limitation where keys can't be deleted, if kube-prometheus-stack is part of a sub-chart.

If end-users do something like

operatorInstanceSelector: 
    app.kubernetes.io/instance: ~
    app.kubernetes.io/name: another-grafana-operator
    instance: grafana

app.kubernetes.io/instance would still remains in addition of instance. Based on the limitation, my recommendation would be to leave operatorInstanceSelector to an empty map.

##
configMapDatasources: true

## OperatorDatasources Create datasources as crds
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
## OperatorDatasources Create datasources as crds
## OperatorDatasources Create datasources as Grafana Operator Custom Resource

Comment on lines +16 to +22
matchLabels:
{{- if $.Values.grafana.operatorInstanceSelector }}
{{- toYaml $.Values.grafana.operatorInstanceSelector | nindent 6 }}
{{- else }}
app.kubernetes.io/instance: grafana
app.kubernetes.io/name: grafana-operator
{{- end }}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To reduce the complexity and hidden defaults, what about:

Suggested change
matchLabels:
{{- if $.Values.grafana.operatorInstanceSelector }}
{{- toYaml $.Values.grafana.operatorInstanceSelector | nindent 6 }}
{{- else }}
app.kubernetes.io/instance: grafana
app.kubernetes.io/name: grafana-operator
{{- end }}
matchLabels:
{{- toYaml $.Values.grafana.operatorInstanceSelector | nindent 6 }}

Are they any downsides using this + the empty map on the values.yaml? I'm not a export into the operator.

@@ -0,0 +1,27 @@
{{- if or (and .Values.grafana.enabled .Values.grafana.sidecar.datasources.enabled) .Values.grafana.forceDeployDatasources }}
{{- if .Values.grafana.operatorDatasources }}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be merged into the first condition?

@@ -1,84 +1,28 @@
{{- if or (and .Values.grafana.enabled .Values.grafana.sidecar.datasources.enabled) .Values.grafana.forceDeployDatasources }}
{{- if .Values.grafana.configMapDatasources }}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this can be merged into line 1 condition

annotations:
{{- toYaml .Values.grafana.sidecar.datasources.annotations | nindent 4 }}
{{- end }}
{{ toYaml . | nindent 4 }}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
{{ toYaml . | nindent 4 }}
{{- toYaml . | nindent 4 }}

{{- $datasources := list -}}
{{- if .Values.grafana.sidecar.datasources.defaultDatasourceEnabled }}
{{/* Create jsonData dictionary first */}}
{{- $jsonData := dict
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

interesting idea to use the dict + set function to build an structure, but not sure about maintainability.

Comment on lines +17 to +29
{{- $defaultDS := dict -}}
{{- $_ := set $defaultDS "name" .Values.grafana.sidecar.datasources.name -}}
{{- $_ := set $defaultDS "type" "prometheus" -}}
{{- $_ := set $defaultDS "uid" .Values.grafana.sidecar.datasources.uid -}}
{{- $_ := set $defaultDS "url" (default (printf "http://%s-prometheus.%s:%v/%s"
(include "kube-prometheus-stack.fullname" .)
(include "kube-prometheus-stack.namespace" .)
.Values.prometheus.service.port
(trimPrefix "/" .Values.prometheus.prometheusSpec.routePrefix)
) .Values.grafana.sidecar.datasources.url) -}}
{{- $_ := set $defaultDS "access" "proxy" -}}
{{- $_ := set $defaultDS "isDefault" .Values.grafana.sidecar.datasources.isDefaultDatasource -}}
{{- $_ := set $defaultDS "jsonData" $jsonData -}}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a suggestion which can be considered as alternative. It's just an option to discuss about if possible and it's not indented as "please use this".

Suggested change
{{- $defaultDS := dict -}}
{{- $_ := set $defaultDS "name" .Values.grafana.sidecar.datasources.name -}}
{{- $_ := set $defaultDS "type" "prometheus" -}}
{{- $_ := set $defaultDS "uid" .Values.grafana.sidecar.datasources.uid -}}
{{- $_ := set $defaultDS "url" (default (printf "http://%s-prometheus.%s:%v/%s"
(include "kube-prometheus-stack.fullname" .)
(include "kube-prometheus-stack.namespace" .)
.Values.prometheus.service.port
(trimPrefix "/" .Values.prometheus.prometheusSpec.routePrefix)
) .Values.grafana.sidecar.datasources.url) -}}
{{- $_ := set $defaultDS "access" "proxy" -}}
{{- $_ := set $defaultDS "isDefault" .Values.grafana.sidecar.datasources.isDefaultDatasource -}}
{{- $_ := set $defaultDS "jsonData" $jsonData -}}
{{- $defaultDS := (dict
"name" .Values.grafana.sidecar.datasources.name
"type" "prometheus"
"uid" .Values.grafana.sidecar.datasources.uid
"url" (default (printf "http://%s-prometheus.%s:%v/%s"
(include "kube-prometheus-stack.fullname" .)
(include "kube-prometheus-stack.namespace" .)
.Values.prometheus.service.port
(trimPrefix "/" .Values.prometheus.prometheusSpec.routePrefix)
) .Values.grafana.sidecar.datasources.url)
"access" "proxy"
"isDefault" .Values.grafana.sidecar.datasources.isDefaultDatasource
"jsonData" $jsonData
) -}}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants