Skip to main content

Status page

Beta

Being rolled out. The interface described here is the one of the next release: it may still change, and may not be enabled on your tenant yet.

Monitoring is being rolled out; custom domains and maintenance windows are not available yet.

A status page publicly shows the state of your services, their availability over 24 h, 30 and 90 days, and a day-by-day history. It is served by the platform at https://status.<tenant>.dev.stackngo.app/, based on your monitors.

Prerequisites​

  • A tenant session (sng tenant use acme) and the deploy:write right.
  • At least one monitor.

1. Publish the page​

infra/StatusPage/default.yml
apiVersion: monitoring.stackngo.io/v1alpha1
kind: StatusPage
metadata:
name: default # "default": served at the root of status.<tenant>…
spec:
title: État des services Acme
groups: # public sections, in display order
- name: API
monitors: [api] # one line per monitor, under its displayName
- name: Site web
components: # named lines (see "Group and name lines")
- name: Site web
monitors: [www, www-assets]
sng apply infra/StatusPage/default.yml

There is no dedicated sng command: start from the template sng template gen StatusPage default > status.yml, then sng apply.

The page is online a few moments later:

https://status.acme.dev.stackngo.app/

2. What the page displays​

  • A global state: "Tous les services sont opérationnels", "Incident en cours sur certains services" or "Certains services ne remontent pas de mesures".

  • Per section, one line per monitor in monitors (under its displayName, or its name) and one line per entry in components (under its name), with its state (opérationnel, panne, inconnu, suspendu) and its availability over 24 h, 30 d and 90 d.

  • A daily history over historyDays days (30 or 90, default 90).

  • The p95 latency over 24 h if showLatency: true.

  • In the footer, the "Powered by stackngo" mention.

The page never displays the targets (URLs, hosts, ports): only the labels. Choose presentable displayName values ("API publique", not api-prod-gra), or name the lines with components.

3. Group and name lines​

An entry in components is a public line under its own name.

Name a line: with a single monitor, the line shows name instead of the monitor's displayName. The monitor keeps its displayName for your alerts.

Combine several monitors into one line: with several monitors (10 at most), the line combines their states according to combine:

combineThe line is operational…Use
All (default)if all monitors are: a single one down puts the line in outageA service that depends on several points (public API and its database)
Anyif at least one monitor isRedundant points (two regions, two front ends)
infra/StatusPage/default.yml
apiVersion: monitoring.stackngo.io/v1alpha1
kind: StatusPage
metadata:
name: default
spec:
title: État des services Acme
groups:
- name: API
components:
- name: API publique # a single line for two probes
monitors: [api-public, api-ready]
combine: All
- name: Site web
components:
- name: Site web
monitors: [www-gra, www-sbg]
combine: Any
- name: Base de données # renames the db-prod monitor
monitors: [db-prod]

For a combined line, the availability over 24 h, 30 d, 90 d and the history are computed on the combined state, minute by minute (hour by hour beyond 24 h), not as an average of the monitors. The p95 latency shown is that of the slowest monitor.

Within a section, the lines from monitors are displayed before those from components. A monitor can appear only once per page.

Badges stay per monitor: /badge/api-ready.svg works for a monitor shown within a combined line.

4. Several pages​

A page named other than default is served under a path:

metadata.nameAddress
defaulthttps://status.acme.dev.stackngo.app/
internehttps://status.acme.dev.stackngo.app/interne

The number of pages depends on the tier: 1 in 3XS and 2XS, 2 in XS and S, 3 in M… See Tiers and quotas.

An "internal" page remains public

All pages are accessible without authentication. Only list on a page what you are willing to show.

5. JSON summary and badges​

Each page exposes its content as JSON, to embed it elsewhere:

curl -s https://status.acme.dev.stackngo.app/api/v1/summary.json # default page
curl -s https://status.acme.dev.stackngo.app/summary.json # same document, at the root
curl -s https://status.acme.dev.stackngo.app/api/v1/pages/interne/summary.json
{
"title": "État des services Acme",
"overall": "operational",
"message": "Tous les services sont opérationnels",
"groups": [
{
"name": "API",
"state": "operational",
"components": [
{ "name": "API publique", "state": "operational", "uptime24h": 1, "uptime30d": 0.9995, "uptime90d": 0.9991, "days": [ { "date": "2026-10-07", "uptime": 1 } ] }
]
}
],
"historyDays": 90,
"updatedAt": "2026-10-07T10:12:00Z"
}

Uptime values range from 0 to 1. Possible states: operational, outage, unknown, paused. The response allows calls from any site (CORS).

One SVG badge per monitor displayed on a page:

![statut API](https://status.acme.dev.stackngo.app/badge/api.svg)

The badge reads "statut | opérationnel", "panne", "suspendu" or "inconnu". A monitor that appears on no published page has no badge (404).

Verification​

curl -s -o /dev/null -w '%{http_code}\n' https://status.acme.dev.stackngo.app/
200

A 404 ("page introuvable") means that the page does not exist or was refused by the platform (see "Common errors").

Maintenance windows​

Coming soon

In preparation. This page describes the target interface to gather your feedback; nothing is usable yet.

The MaintenanceWindow manifest is accepted by sng apply to freeze the format, but it has no effect in this version: alerts are not silenced, the "maintenance" state does not appear on the page and the window is not excluded from the uptime calculation. To avoid alerts during an intervention, suspend the monitors concerned (paused: true): they then appear as "suspendu" on the page.

Going further​

  • Delays: a monitor's state is reread at each display, but the page may stay in the browser cache for 30 seconds; uptimes are recalculated every 30 seconds, the history every 10 minutes.
  • Rate: 5 requests per second per IP address (bursts tolerated); beyond that, 429.
  • Custom domain: customDomains exists in the format, but a page that declares one is refused (NotSupported) in this version. Remove the field.
  • Deleted monitor: it disappears from the page; a page that still lists it is refused (MonitorNotFound) on the next pass. Update the page in the same sng apply.
  • Page address: the name status is reserved under your tenant's zone; an App or a site cannot use it.
  • Page name: avoid healthz, which corresponds to a technical route of the platform (the page would not be served).

Common errors​

SymptomCauseFix
404 page introuvable at the addressPage refused: listed monitor not found (MonitorNotFound), monitor shown twice (Invalid), customDomains set (NotSupported), or the tier's number of pages exceeded (QuotaExceeded)Fix the list of monitors, remove customDomains, delete a page
The address does not resolve or the certificate is invalidThe certificate for status.<tenant> is issued at the first accepted page (a few minutes); DNS publication of this address is not guaranteed on all tenants in this versionRetry later; if it persists, contact support
503 statut momentanément indisponibleThe measurement storage does not respondRetry
A component stays "inconnu"Monitor refused (interval, target, quota) or without a recent measurementSee Monitors
sng apply refuses: spec.groups: … should have at least 1 itemsPage without a sectionAt least one section
sng apply refuses: monitors ou components requisEmpty sectionList monitors in monitors or components
sng apply refuses: combine … Unsupported valueUnknown combine valueAll or Any

See also​