Skip to content
The last release, 0.1.0, predates this site: this is the documentation of main.

Observability

Every cluster carries its own monitoring stack: vmagent scrapes the cluster, OpenTelemetry carries what applications push and the containers’ logs, the Victoria family stores, Grafana reads, vmalert and Alertmanager alert. Same templates on all four clouds, no remote-write, no federation, and no cloud access: every backend stores on a volume.

ModuleRuns asDefault
monitoringthe victoria-metrics-k8s-stack chart, one release: the operator, VictoriaMetrics, VictoriaLogs, VictoriaTraces, vmagent, kube-state-metrics, node-exporter, Grafana, vmalert and Alertmanageron; traces off (pre-GA), alerting off (it needs where alerts go)
otel_gatewayOpenTelemetry Collector, 1 replicaon
otel_agentOpenTelemetry Collector, DaemonSeton, while monitoring’s logs are
kubelets, cAdvisor, kube-state-metrics,
node-exporter, annotated pods ◀──scrape── vmagent ──▶ VictoriaMetrics :8428
applications ──OTLP 4317/4318──▶ otel_gateway ──┐
Kubernetes API ◀──events────────── otel_gateway │ OTLP over HTTP
├─▶ VictoriaMetrics :8428 /opentelemetry/v1/metrics
/var/log/pods ◀──── otel_agent ─────────────────┼─▶ VictoriaLogs :9428 /insert/opentelemetry/v1/logs
└─▶ VictoriaTraces :10428 /insert/opentelemetry/v1/traces
Grafana ──▶ VictoriaMetrics, VictoriaLogs, VictoriaTraces and Alertmanager datasources
vmalert ──every VMRule──▶ VictoriaMetrics; firing ──▶ Alertmanager ──▶ your receivers
  • Metrics are scraped in one place, vmagent, with the job labels the upstream rules and dashboards select on. The collectors scrape nothing.
  • OTLP over HTTP for everything applications push, which all three backends ingest. The agent exports straight to VictoriaLogs.
  • Pipelines follow the parts that are on: turning a backend off removes its pipelines and its datasource in one reconciliation; with monitoring off, the gateway’s metrics end in nop.
  • Do not override fullnameOverride in values: the endpoints rely on it, and the plan does not refuse it.
Under the hood
SignalSourceRead by
Object statekube-state-metricsvmagent
Nodesnode-exportervmagent
Pods and containers’ resources, volumes’ fillthe kubelets and their cAdvisorvmagent
Prometheus endpoints, the collectors’ and Flux’s includedpods annotated prometheus.io/scrapevmagent
Container logs/var/log/pods, read-onlyotel_agent, no checkpoints
Kubernetes events, as logsAPI serverotel_gateway
Application OTLPgRPC 4317, HTTP 4318 on otel-gateway.otel-gateway.svcotel_gateway, with k8s_attributes

The control plane is the cloud’s and is not scraped. The collectors run the otelcol-k8s distribution. Without log checkpoints, a restarted agent loses the lines written while it was down.

PartRetentionVolume
monitoring.metrics15d20Gi
monitoring.logs7d20Gi
monitoring.traces7d10Gi

Both are attributes, retention and storage_size (Inputs). The claims use the cluster’s default StorageClass.

  • A volume can grow where the class allows expansion; shrinking is refused.
Under the hood

The operator creates each backend’s Deployment and claim. VictoriaMetrics caps new series per hour (-storage.maxHourlySeries, 100 000) and keeps Prometheus metric names for OTLP (-opentelemetry.usePrometheusNaming).

Grafana gets one datasource per backend that is on: Prometheus type for VictoriaMetrics, the victoriametrics-logs-datasource plugin, Jaeger type for VictoriaTraces, and Alertmanager with alerting on. The dashboards are the stack’s, kube-prometheus’ and VictoriaMetrics’, and any ConfigMap labelled grafana_dashboard.

  • No egress to grafana.com, no logs: the VictoriaLogs plugin downloads at start. No egress to raw.githubusercontent.com, no rules and no dashboards: the chart’s sync job downloads them.
  • No persistence: everything Grafana shows is provisioned.
  • A route needs kube.monitoring.grafana.domain and the shared Gateways; private by default.
  • Grafana is AGPL-3.0, run unmodified from upstream’s images.

kube-prometheus-stack’s rules and VictoriaMetrics’, with the socle’s for Flux and the collectors (Alert rules); a client’s own VMRules, in any namespace, load beside them.

CloudWhat differs
AWSthe bootstrap marks gp3 (EBS, encrypted) default
GCPthe agent DaemonSet is billed per Pod request on Autopilot
Azure/var/log/pods is a hostPath, forbidden once Deployment Safeguards apply: otel_agent.enabled = false until then. opentofu/azure still enables Managed Prometheus and Container Insights
Scalewaynothing; Cockpit keeps Scaleway’s own data

Anything central (remote-write, federation, multi-cluster Grafana, one Alertmanager across clusters), backups and high availability of the backends, profiles, SSO on Grafana.

Outside the cluster: the cloud’s own signals

Section titled “Outside the cluster: the cloud’s own signals”

The cloud’s metrics on managed services, and its billing, are designed to be read by a central plane that is not built yet: service metrics pulled every 300 s, cluster metrics never through the cloud API, one Alertmanager for all clouds, cost data in your own account.