Dashboard see history edit this page

Talks about: , , , , and

JaaS publishes a maintained Grafana dashboard for its own operator as a single-layer OCI image at ghcr.io/metio/jaas-dashboard. Render it through JaaS the same way you’d render any snippet — no manual JSON to copy around.

The dashboard opens with an SLO band — reconcile availability against its objective, error budget remaining, reconcile-latency p95 against its objective, and an availability-versus-objective trend — over a band of operator internals that explain any movement: reconciles by reason, evaluation throughput and backpressure, rendered output size, storage sweeps, and the controller-runtime workqueue. The series are the metrics the operator exports.

To author your own dashboards in grafonnet, see the Grafana dashboards tutorial ; this page covers consuming the ready-made one.

1. Point a Flux source at the image

It’s an OCI artifact, so use an OCIRepository. The dashboard imports grafonnet, so also install the grafonnet JsonnetLibrary (the joi chart , --set libraries.grafonnet.enabled=true).

apiVersion: source.toolkit.fluxcd.io/v1
kind: OCIRepository
metadata:
  name: jaas-dashboard
  namespace: monitoring
spec:
  interval: 1h
  url: oci://ghcr.io/metio/jaas-dashboard
  ref:
    tag: latest        # or a dated tag like 2026.6.22 to pin

The dashboard source also lives in the JaaS repository under dashboards/; if you mirror it into Git, a GitRepository pointing there works identically.

2. Render it with a JsonnetSnippet, passing the dashboard’s TLAs

The dashboard is a function of top-level arguments — datasource (the Prometheus datasource UID, default prometheus), title (default JaaS operator), a selector label matcher folded into every query (default empty), and the SLO knobs window (default 28d), availabilityTarget (default 0.99), and latencyTarget seconds (default 30) — supplied through spec.tlas.

selector is how you adapt to your Prometheus: scope the dashboard to one scrape job or cluster, e.g. selector: ['job="jaas"'] or ['cluster="prod"']. The queries never touch the namespace label, so a Prometheus that relabels it to exported_namespace doesn’t affect them; selector pins anything else.

apiVersion: jaas.metio.wtf/v1
kind: JsonnetSnippet
metadata:
  name: jaas-operator-dashboard
  namespace: monitoring
spec:
  serviceAccountName: dashboards-tenant
  # The OCI image's only file is main.jsonnet, which is spec.entryFile's default,
  # so no entryFile is needed.
  sourceRef:
    kind: OCIRepository
    name: jaas-dashboard
  # grafonnet, which the dashboard imports by its full jb-vendor path, is served
  # by the JOI library installed above — together with its dependency closure
  # (grafonnet's panel utilities import xtd at render time). The joi chart
  # installs all four JsonnetLibrary objects; each snippet lists the ones its
  # imports reach.
  libraries:
    - kind: JsonnetLibrary
      name: grafonnet
    - kind: JsonnetLibrary
      name: docsonnet
    - kind: JsonnetLibrary
      name: testonnet
    - kind: JsonnetLibrary
      name: xtd
  # The dashboard's top-level arguments. Each entry binds one argument as a
  # string, unless code: true marks the value as Jsonnet source to parse.
  tlas:
    - name: datasource
      value: prometheus # your Prometheus datasource UID
    - name: title
      value: JaaS operator — prod
    - name: selector
      value: 'job="jaas"' # scope every query to your scrape job/cluster
    - name: window
      value: 28d # SLO window
    - name: availabilityTarget
      value: "0.99" # reconcile-availability objective (99%)
      code: true
    - name: latencyTarget
      value: "30" # reconcile-latency p95 objective (seconds)
      code: true
  interval: 10m
  output: rendered

This is zero-maintenance: the OCIRepository polls ghcr.io/metio/jaas-dashboard, so when a new dashboard is published JaaS re-renders, the ExternalArtifact digest changes, and the grafana-operator pushes the new JSON to Grafana — you reference the upstream image once and get every update automatically. Pin ref.tag to a dated tag instead of latest if you’d rather adopt updates deliberately.

JaaS renders the dashboard JSON and publishes it as an ExternalArtifact named after the snippet — jaas-operator-dashboard.

To fan this dashboard out per cluster — one rendered instance per cluster, each scoped to its own Prometheus — template the snippet with a Flux Operator ResourceSet; see the Flux Operator integration page.

3. Hand the artifact to the grafana-operator

A GrafanaDashboard that references the published ExternalArtifact reconciles it into Grafana:

apiVersion: grafana.integreatly.org/v1beta1
kind: GrafanaDashboard
metadata:
  name: jaas-operator
  namespace: monitoring
spec:
  instanceSelector:
    matchLabels:
      dashboards: "grafana"
  resyncPeriod: 30s
  sourceRef:
    apiVersion: source.toolkit.fluxcd.io/v1
    kind: ExternalArtifact
    name: jaas-operator-dashboard
    namespace: monitoring

When the published image updates (or you change the TLAs), JaaS re-renders, the ExternalArtifact digest changes, and the grafana-operator pushes the new JSON to Grafana — no manual export step.