mirror of
https://github.com/hanzoai/status.git
synced 2026-10-30 18:21:48 +00:00
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.
452 lines
15 KiB
YAML
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"
|