40ffac4acf
The per-application dashboards answer "how is this component behaving". This one answers "where did that string come from", across every source at once, and is kept separate so neither has to compromise for the other. Scope is a curated preset rather than a free namespace picker: the cluster carries 48 log sources and most are infrastructure noise. The presets are job regexes over the <namespace>/<container> label Alloy sets — except kong-audit, which Fluent Bit ships with no namespace at all. That mismatch between the two collection paths is the reason a single naive selector cannot span both, and why the presets spell the sources out. The search term is injected inside LogQL backticks, a raw string, so a quote typed in the box cannot break the query; an empty box yields `(?i)`, a valid regex matching every line, which makes "no search" the default rather than a special case. The four stat panels carry `or vector(0)` so an empty result reads as 0 rather than "No data" — on a search box, finding nothing is an answer, not a failure. Two deliberate omissions. No per-format parsing: the Message column holds the line as emitted, because the five formats agree on nothing and that is what the per-application dashboards are for. And the level filter is partial by nature — roughly 40% of lines are `unknown`, since access lines and Kong records carry no severity for Loki to infer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
34 lines
1.1 KiB
YAML
34 lines
1.1 KiB
YAML
# Grafana dashboards -- declarative provisioning.
|
|
#
|
|
# Rules:
|
|
# * one .json file per dashboard, named after its UID;
|
|
# * every JSON carries a STABLE "uid" field (never regenerated): that is what
|
|
# keeps URLs, cross-links and alerts alive across redeployments;
|
|
# * `disableNameSuffixHash: true` -> the ConfigMap always keeps the same name,
|
|
# so `kubectl apply` updates it in place and Grafana reloads WITHOUT
|
|
# restarting the pod, in about 70s (see dashboard-providers.yaml).
|
|
#
|
|
# Adding a dashboard = drop the .json here and add it to `files:` below.
|
|
apiVersion: kustomize.config.k8s.io/v1beta1
|
|
kind: Kustomization
|
|
namespace: observability
|
|
|
|
configMapGenerator:
|
|
- name: grafana-dashboards
|
|
files:
|
|
# >>> dashboards (generated by `make dashboards-sync`) >>>
|
|
- obs-classic-models-api.json
|
|
- obs-keycloak.json
|
|
- obs-kong-gateways.json
|
|
- obs-librechat.json
|
|
- obs-log-search.json
|
|
- obs-stack-health.json
|
|
# <<< dashboards <<<
|
|
|
|
generatorOptions:
|
|
disableNameSuffixHash: true
|
|
labels:
|
|
app.kubernetes.io/name: grafana
|
|
app.kubernetes.io/component: dashboards
|
|
app.kubernetes.io/part-of: observability
|