Files
zeekay b1c90463be Name the registry that answers
The host these referenced does not serve a registry — it resolves to the edge
wildcard and 404s on /v2/. oci.hanzo.ai is the one that answers, with IAM token
auth, and there is no second name for it.
2026-08-21 10:58:31 -07:00

452 lines
15 KiB
YAML

web:
port: 8080
storage:
type: sqlite
path: /data/status.db
ui:
title: "Hanzo Status"
description: "Real-time health of the Hanzo cloud — every product on api.hanzo.ai"
header: "Status"
brand: hanzo
link: "https://hanzo.ai"
dark-mode: true
buttons:
- name: "Docs"
link: "https://docs.hanzo.ai"
- name: "Console"
link: "https://console.hanzo.ai"
- name: "HIPs"
link: "https://github.com/hanzoai/HIPs"
- name: "GitHub"
link: "https://github.com/hanzoai"
# ─────────────────────────────────────────────────────────────────────────────
# One unified cloud binary serves the entire /v1 surface at api.hanzo.ai.
# Every product below is a subsystem of that binary — health is measured by
# probing its own /v1/<product> route through the public edge (api.hanzo.ai),
# exactly the path a customer hits.
#
# UP = 200, or an auth gate (401/403), or a tenancy gate (500
# "X-Org-Id required" — the gateway currently mis-codes the missing
# org header as 500 instead of 400/401; the route IS served, so it
# counts as reachable). See tenancy note on the DATA group.
# DOWN = 404 (route not mounted) · 502/503/504 (binary unreachable) · timeout.
#
# A capability that is NOT served on the /v1 surface but ships as its own
# public host (Base, Registry, and the Web properties) is probed at its real
# host — never a /v1 route that 404s.
#
# NOTE: the live source of truth for this config is
# universe/infra/k8s/status/configmap-hanzo.yaml (mounted as the status-config
# ConfigMap). This file mirrors it for the repo-native kustomize build.
# ─────────────────────────────────────────────────────────────────────────────
endpoints:
# ═══════════════════════════════════════════════
# CORE API — the unified cloud binary
# ═══════════════════════════════════════════════
- name: "api.hanzo.ai"
group: "Core API"
url: "https://api.hanzo.ai/health"
interval: 30s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
- name: "/v1 surface"
group: "Core API"
url: "https://api.hanzo.ai/v1/health"
interval: 30s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
# ═══════════════════════════════════════════════
# AI — inference, agents, retrieval
# ═══════════════════════════════════════════════
# TWO ADDRESSES, TWO SERVICES, TWO ROWS — one row per thing measured. A single
# row against a shared path measures whichever component answers it, not the
# one it is named after.
#
# The API's own /v1/models is authenticated — an anonymous 401 is the route
# ANSWERING, and a 404 is the front door having lost it, which is the failure
# this row catches. Chat completions is POST-only (GET/HEAD 404 by design),
# so serving health is the in-cluster engine below.
- name: "Models & Inference"
group: "AI"
url: "https://api.hanzo.ai/v1/models"
interval: 60s
conditions:
- "[STATUS] == any(200, 401)"
- "[RESPONSE_TIME] < 3000"
# The public, tokenless model catalog: its own host, edge-cached, refreshed
# daily from pricing.hanzo.ai. This is what marketing, the extension picker and
# pre-login browsing actually read, so it is checked where it is served.
- name: "Model Catalog"
group: "AI"
url: "https://catalog.hanzo.ai/v1/models"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 3000"
# In-cluster inference engine / model router (Zen + Enso serving). Probed on
# the cluster Service — the status pod runs in-namespace, so this is the
# ground-truth serving signal behind the public /v1/models catalog.
- name: "Inference Engine"
group: "AI"
url: "http://engine.hanzo.svc:36900/health"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
# Model router stats — the flywheel/routing control plane (auth-gated).
- name: "Router"
group: "AI"
url: "https://api.hanzo.ai/v1/router/stats"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403)"
- "[RESPONSE_TIME] < 3000"
- name: "Agents"
group: "AI"
url: "https://api.hanzo.ai/v1/agents"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
- name: "RAG"
group: "AI"
url: "https://api.hanzo.ai/v1/rag/query"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403)"
- "[RESPONSE_TIME] < 3000"
# The public prompts surface is the catalog (200); bare /v1/prompts is
# tenancy-gated (500 "X-Org-Id required").
- name: "Prompts"
group: "AI"
url: "https://api.hanzo.ai/v1/prompts/catalog"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 3000"
- name: "Code Exec"
group: "AI"
url: "https://api.hanzo.ai/v1/exec"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403)"
- "[RESPONSE_TIME] < 3000"
- name: "Chat"
group: "AI"
url: "https://hanzo.chat"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 5000"
# ═══════════════════════════════════════════════
# IDENTITY & SECURITY
# ═══════════════════════════════════════════════
- name: "Identity (IAM)"
group: "Identity & Security"
url: "https://api.hanzo.ai/v1/iam/.well-known/openid-configuration"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
- name: "KMS"
group: "Identity & Security"
url: "https://api.hanzo.ai/v1/kms/health"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
# ═══════════════════════════════════════════════
# COMMERCE
# ═══════════════════════════════════════════════
- name: "Billing"
group: "Commerce"
url: "https://api.hanzo.ai/v1/billing/balance"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403)"
- "[RESPONSE_TIME] < 3000"
- name: "Plans"
group: "Commerce"
url: "https://api.hanzo.ai/v1/plans"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
- name: "Pricing"
group: "Commerce"
url: "https://api.hanzo.ai/v1/pricing"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 2000"
- name: "Entitlements"
group: "Commerce"
url: "https://api.hanzo.ai/v1/orgs/hanzo/entitlements"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
# ═══════════════════════════════════════════════
# DATA — datastore primitives on the unified /v1 surface
#
# These routes are tenancy-scoped: a request without an org context returns
# 500 "X-Org-Id required" (a gateway mis-code — it should be 400/401). The
# route IS served, so any(200,401,403,500) = reachable; a real outage shows
# as 502/503/504/timeout. TODO(gateway): return 400/401 for missing org so
# these can tighten to any(200,401,403).
# ═══════════════════════════════════════════════
- name: "SQL"
group: "Data"
url: "https://api.hanzo.ai/v1/sql"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
- name: "KV"
group: "Data"
url: "https://api.hanzo.ai/v1/kv"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
- name: "DocDB"
group: "Data"
url: "https://api.hanzo.ai/v1/docdb"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
- name: "Datastore"
group: "Data"
url: "https://api.hanzo.ai/v1/datastore"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
# Base ships as its OWN app at base.hanzo.ai (the binary does NOT mount
# /v1/base). Probe the real host; it 307-redirects anon traffic to /dashboard/.
- name: "Base"
group: "Data"
url: "https://base.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == any(200, 302, 307, 308)"
- "[RESPONSE_TIME] < 3000"
- name: "Storage (S3)"
group: "Data"
url: "https://api.hanzo.ai/v1/s3"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
- name: "Vector"
group: "Data"
url: "https://api.hanzo.ai/v1/vector"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
# ═══════════════════════════════════════════════
# STREAMS — messaging · durable tasks
# ═══════════════════════════════════════════════
- name: "Tasks"
group: "Streams"
url: "https://api.hanzo.ai/v1/tasks"
interval: 60s
conditions:
- "[STATUS] == any(200, 301, 302, 307, 308, 401, 403)"
- "[RESPONSE_TIME] < 3000"
# ═══════════════════════════════════════════════
# APPS
# ═══════════════════════════════════════════════
- name: "Search"
group: "Apps"
url: "https://api.hanzo.ai/v1/search"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
- name: "Bot"
group: "Apps"
url: "https://api.hanzo.ai/v1/bot"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
- name: "Functions"
group: "Apps"
url: "https://api.hanzo.ai/v1/functions"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
# ═══════════════════════════════════════════════
# OBSERVE
# ═══════════════════════════════════════════════
- name: "Analytics"
group: "Observe"
url: "https://api.hanzo.ai/v1/analytics/overview"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403, 500)"
- "[RESPONSE_TIME] < 3000"
# Observability (o11y / SigNoz) is IAM-gated at the edge — a 403 means
# UP-but-gated, not down.
- name: "Observability"
group: "Observe"
url: "https://api.hanzo.ai/v1/o11y"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403)"
- "[RESPONSE_TIME] < 3000"
# ═══════════════════════════════════════════════
# PLATFORM
# ═══════════════════════════════════════════════
- name: "PaaS"
group: "Platform"
url: "https://api.hanzo.ai/v1/platform/health"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 3000"
# Container registry ships as its own host; /v2/ answers 401 (token auth) = UP.
- name: "Registry"
group: "Platform"
url: "https://oci.hanzo.ai/v2/"
interval: 60s
conditions:
- "[STATUS] == any(200, 401)"
- "[RESPONSE_TIME] < 3000"
# ═══════════════════════════════════════════════
# WEB — external surfaces (CF edge)
# ═══════════════════════════════════════════════
- name: "hanzo.ai"
group: "Web"
url: "https://hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 3000"
- name: "Console"
group: "Web"
url: "https://console.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 5000"
- name: "Admin"
group: "Web"
url: "https://admin.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == any(200, 401, 403)"
- "[RESPONSE_TIME] < 5000"
- name: "Docs"
group: "Web"
url: "https://docs.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 3000"
- name: "World"
group: "Web"
url: "https://world.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 5000"
# World's in-app proxy to the cloud model-router stats (public, 200).
- name: "World Router Stats"
group: "Web"
url: "https://world.hanzo.ai/v1/world/cloud/router-stats"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 5000"
- name: "App"
group: "Web"
url: "https://hanzo.app"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 5000"
- name: "Studio"
group: "Web"
url: "https://studio.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 5000"
- name: "Flow"
group: "Web"
url: "https://flow.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == any(200, 301, 302)"
- "[RESPONSE_TIME] < 5000"
- name: "Status"
group: "Web"
url: "https://status.hanzo.ai"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] < 3000"