Skip to content

Observability Naming-Konvention

Referenz fuer alle Metric- und Span-Namen im Kumiko Framework und in Features.

Warum das wichtig ist: einmal in Prod emittiert, ist ein Metric- oder Span-Name schwer zu aendern — Dashboards, Alerts und Queries haengen daran. Einheitliche Konvention verhindert, dass jedes Feature seinen eigenen Stil erfindet.

Durchgesetzt wird die Konvention per Runtime-Validation beim Boot (fail fast — analog boot-validation.md).

Metrics

Grundregeln

  • snake_case nur. Keine camelCase, keine Dots.
  • Prefix: kumiko_ fuer Framework-Metrics, kumiko_<feature>_ fuer Feature-Metrics (Framework haengt Prefix automatisch an — siehe unten).
  • Unit gehoert in den Namen, nicht ins Label.
  • Typ-Suffix folgt Prometheus-Standard.

Typ-Suffixe

Metric-TypSuffix-MusterBeispiel
Counter<noun>_totalorders_created_total
Counter (Fehler)<noun>_errors_totaldispatcher_handler_errors_total
Histogram (Zeit)<noun>_duration_secondshttp_request_duration_seconds
Histogram (Bytes)<noun>_byteshttp_request_body_bytes
Histogram (Domain-Unit)<noun>_<unit>orders_value_eur, upload_size_bytes
Gauge (Stand)<noun> (kein Suffix)db_pool_active_connections, outbox_depth

Feature-Prefix automatisch

Feature-Autoren schreiben den Namen ohne Feature-Prefix. Das Framework haengt kumiko_<feature>_ an:

defineFeature("orders", (r) => {
r.metric("created_total", { type: "counter", labels: ["status"] });
// ^ registriert als: kumiko_orders_created_total
r.metric("value_eur", { type: "histogram", buckets: [10, 50, 100, 500] });
// ^ registriert als: kumiko_orders_value_eur
});

Doppelungen wie orders_orders_created_total sind damit unmoeglich.

Labels

  • Nur niedrig-kardinale Werte (Status-Codes, Methoden-Namen, Handler-Namen).
  • Nie User-IDs, Tenant-IDs (ausser tenantLabel: true opt-in), Request-IDs, UUIDs.
  • Label-Keys ebenfalls snake_case: error_class, nicht errorClass.
  • Mehrere Label-Werte pro Metric sind erlaubt, aber die Kardinalitaet multipliziert sich: status × method × route = Cartesian-Explosion vermeiden.

Framework-Standard-Metrics (v1)

Werden automatisch beim Boot registriert, nicht per Feature-Code:

NameTypLabels
kumiko_http_requests_totalcounterroute, method, status
kumiko_http_request_duration_secondshistogramroute, method
kumiko_dispatcher_handler_duration_secondshistogramhandler, success
kumiko_dispatcher_handler_errors_totalcounterhandler, error_class
kumiko_db_query_duration_secondshistogramoperation, table

Weitere Standard-Metrics kommen in v2 (Outbox, Redis, Jobs).

Spans

Grundregeln

  • dot.notation, lowercase.
  • OTel-Semantic-Conventions wenn es eine gibt (http.request, db.query, redis.cmd).
  • Kumiko-spezifisches mit Prefix kumiko.* (kumiko.dispatcher.handler, kumiko.pipeline.hook).
  • Pattern: <layer>.<operation>.

Framework-Spans (v1)

Span-NameWo entstehtOTel-Standard?
http.requestHono-MiddlewareJa (OTel HTTP)
auth.verifyAuth-MiddlewareJa (OTel Auth)
kumiko.dispatcher.handlerDispatcher-EintrittNein — kumiko-spezifisch
kumiko.pipeline.hookLifecycle-Pipeline pro HookNein — kumiko-spezifisch
db.queryTenantDb / CrudExecutorJa (OTel DB)
db.transactionTX-WrapperJa (OTel DB)
redis.cmdRedis-WrapperJa (OTel Redis)
outbox.publishOutbox-PollerNein — kumiko-spezifisch
job.executeJobRunner-WorkerNein — kumiko-spezifisch

Span-Attribute

OTel-Semantic-Conventions (wo verfuegbar):

AttributeBeispiel-Wert
http.method"POST"
http.route"/api/write"
http.status_code200
db.system"postgresql"
db.operation"insert"
db.table"orders"
db.row_count3

Kumiko-spezifische Attribute mit kumiko.-Prefix:

AttributeBeispiel-Wert
kumiko.feature"orders"
kumiko.handler"order.create"
kumiko.tenant_id42
kumiko.user_id17
kumiko.request_id"req-abc123"
kumiko.hook_type"postSave"
kumiko.hook_phase"inTransaction"

Nie als Span-Attribut:

  • Request-Body (egal wie gross)
  • Auth-Header, Cookies
  • DB-Query-Parameter (nur parametrisiert, nie raw)
  • Redis-Keys (nur Pattern, nie raw Key)
  • Felder die am Entity als encrypted: true markiert sind

Siehe observability.md fuer den Sensitive-Filter.

Runtime-Validation beim Boot

registry.build() validiert jeden registrierten Metric-Namen. Verstoesse fuehren zu einem Boot-Error mit praeziser Message:

ValidationError: Metric "orders_created" muss als Counter auf "_total" enden.
Feature: orders
Typ: counter
Vorschlag: "orders_created_total"

Damit koennen falsche Namen gar nicht erst in Prod gelangen.

Migration bestehender Namen

Wenn ein Name bereits in Prod emittiert wurde und sich als falsch herausstellt:

  1. Nicht umbenennen — Dashboards brechen.
  2. Neuen Namen einfuehren, beide parallel emittieren.
  3. Dashboards/Alerts umstellen.
  4. Alten Namen nach Beobachtungszeitraum entfernen.

In Dev / vor First-Release ist free-for-all — einfach umbenennen.

Zusammenhang zu anderen Docs