statetelemetry

package
v0.19.1249 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 16, 2026 License: AGPL-3.0 Imports: 20 Imported by: 0

README

State telemetry

State telemetry provides periodic snapshots of your Nuon fleet: inventory, recorded health, reporting coverage and deployment/workflow state. Metrics are exported over OTLP, including when no operations are running.

What you can see Coverage
Fleet size and lifecycle Organizations, apps, component definitions, installs and installed components.
Install identity Install and tracked app-branch names, sandbox mode and opt-in vendor labels at detailed level.
Install runner Recorded current-runner status, with missing and unknown states shown explicitly.
Recorded workload health Install health summaries and component verdicts, including unknown and unevaluated components.
Health reporting Recent, older and missing health-report arrivals.
Sandbox state Provisioning lifecycle and recorded runtime health, shown separately.
Work in progress Install workflows by operation, status and plan-only mode, including approval/retry waits and oldest creation time.
Latest deployment Each install's most recent non-plan deployment attempt and recorded status, including installs with no eligible history.
Configuration position Selected install versions and newest-created branch versions/times—not applied versions or deployability.
Collection status Collection freshness, leadership, refresh failures and series limits.

State metrics complement operational metrics and logs; they are not live probes or completed-operation counters.

Enable collection

Configure OTLP export, then set:

STATE_TELEMETRY_ENABLED=true
STATE_TELEMETRY_LEVEL=summary

Collection is off by default and runs in internal or all-in-one API processes. It requires an OTLP endpoint and a stable nuon.control_plane.id. The switch controls state collection only, not operational metrics, logs or health checks.

Collection level

STATE_TELEMETRY_LEVEL selects the detail and series cost for the whole catalog. The default is summary.

Level Detail Series cost
fleet Fleet totals without entity IDs. Bounded independently of fleet size.
summary Org counts by org; other counts by org/app. Grows with orgs, apps and occupied categories.
detailed Adds install IDs to install-owned measurements, plus install information and report timestamps. Grows with installs and occupied categories.

Metric names stay the same at every level; only their grouping changes. Org, app and component-definition counts keep their natural ownership at detailed level. Individual installed-component IDs are not exported. Branch configuration versions/times are available at summary and detailed levels; selected install versions require detailed collection. Configuration positions are absent at fleet level: version numbers cannot meaningfully be summed.

Each metric stream is limited to 4,095 series. Exceeding a limit does not produce partial totals or automatically reduce detail. Database query cost still grows with the retained population at every level.

Metric reference

Names below are OpenTelemetry names, before backend-specific translation. All .count metrics are gauges: they describe the recorded population at a point in time, not cumulative events.

Inventory

Each inventory count is broken down by resource.state.

Metric Counts
nuon.org.count Organizations.
nuon.app.count Apps.
nuon.component.count App-defined components.
nuon.install.count Installs.
nuon.install.component.count Installed component targets.

Counts include retained resources and exclude soft-deleted records and invalid ownership links. Retained deprovisioned resources still count; component definitions and installed targets are distinct populations.

Install runner

nuon.install.runner.count counts installs, broken down by nuon.runner.status. Each retained install contributes once: its runner's recorded status when exactly one retained install-owned group and runner identify it, or missing when no runner exists. unknown covers both a recorded unknown status and multiple groups or runners preventing a unique selection.

Deleted and invalid ownership links are excluded. Neither runner name, creation time nor an active status resolves ambiguity. Disabled and deprovisioned runners keep their recorded status; a missing runner is not deprovisioned. This is not a live-process count or proof that jobs can execute. Detailed collection uses one series per install, regardless of how many runner records are retained.

Health, reporting and sandboxes
Metric Breakdown Meaning
nuon.install.health.count nuon.health.status Installs by recorded component-health summary.
nuon.install.component.health.count nuon.health.status Installed components by recorded health verdict.
nuon.install.health.report_age.count nuon.health.report_age Installs by age of their last health-report arrival.
nuon.install.sandbox.lifecycle.count nuon.sandbox.status Installs by sandbox lifecycle, including missing sandboxes.
nuon.install.sandbox.health.count nuon.health.status Installs by recorded sandbox runtime health.

Health has eight values: healthy, progressing, degraded, unhealthy, unknown, not-applicable, unset, other. An install's summary can be healthy while some components remain unevaluated, so read it alongside component coverage. unset does not mean healthy, and an active sandbox does not establish runtime health.

Report age Meaning
within_5m A valid report arrived within five minutes of collection.
over_5m The last valid arrival was older than five minutes.
never_reported No recorded report arrival.
invalid_time The recorded arrival is at/before Unix epoch or in the future.

Arrival age is not health-evaluation freshness. Five minutes is a reporting bucket, not a promised reporting cadence.

Workflow activity and waits
Metric Meaning
nuon.workflow.current.count Current install-owned workflows, including recorded approval and retry waits.
nuon.workflow.oldest_created_at Earliest creation time among those workflows, in Unix seconds.

Both use nuon.workflow.type, nuon.workflow.status and nuon.workflow.plan_only as breakdowns. They cover install operations such as provisioning, deployment, configuration changes, actions and teardown; app/branch builds are excluded. Retries do not create additional workflow counts. Creation age includes retries and is not time in the current wait. Empty groups or groups with invalid creation times have no oldest timestamp.

Latest deployment

nuon.install.deploy.latest.count counts installs by their latest eligible deployment's nuon.workflow.type and nuon.workflow.status. Each install contributes once; type=none, status=never_deployed means no eligible retained history, not a failed read. Results remain visible when workflows finish. This is not a completion counter or success rate.

Deployment eligibility follows the install deployment feed: provisioning/reprovisioning, stack/sandbox changes, component deployments and teardown, component enablement/recovery, app-branch/install sync, input/secret changes and deprovisioning. Configuration-only changes can qualify without rolling out workloads. Plan-only workflows, actions, runbooks and app-owned workflows are excluded. Actual deployments to preview installs still qualify.

The newest creation time wins, with ID as a tie-breaker—not the newest success or finish time. Recorded approval/retry statuses are preserved; a finish timestamp alone proves neither success nor terminality. Missing or unrecognized statuses appear as unset or other rather than success.

Configuration position
Metric Meaning Level
nuon.install.config.selected.ordinal App-wide version ordinal of the install's selected config—not necessarily applied. Detailed
nuon.app_branch.config.latest_created.ordinal App-wide ordinal of the newest retained config created on each branch, including branches without installs. Summary/detailed
nuon.app_branch.config.latest_created.created_at Valid creation time of that same branch config, in Unix seconds. Summary/detailed

Ordinals include deleted configuration history and are app-wide, not branch-local run counts. Equal creation times can make ordinals ambiguous; unresolved ordinals are omitted, never reported as zero. A non-unique newest branch config has neither measurement. Missing/deleted configs and invalid ownership are excluded; invalid creation clocks are omitted.

nuon.app_branch.id identifies the configuration's branch, which can differ from the install's tracked branch. Unbranched selections have no branch attribute. nuon.config.status describes config sync (active, pending, syncing, error, outdated, unset, other), not build readiness; nuon.config.source reports a bounded recorded source (git-run, manual-run, git-preview-run, unset, other). Newest-created can be a preview, failed or incomplete configuration. It is not the latest deployable release, a drift verdict or proof of a completed rollout.

These streams cost at most one selected point per install and two points per branch. They refresh independently of install metadata; read positions as observations, not an atomic convergence result.

Install details

The detailed level also provides:

Metric Meaning
nuon.install.info Value 1 per install, with its name, tracked app-branch ID/name, resolved sandbox mode and optional vendor labels.
nuon.install.health.last_report_at Last valid health-report arrival, in Unix seconds; absent when unavailable or invalid.
nuon.install.deploy.latest.created_at Creation time of the selected latest deployment, in Unix seconds.
nuon.install.deploy.latest.finished_at Recorded finish time of that same deployment, in Unix seconds; not proof of success.

Deployment timestamps use the count's workflow type/status dimensions. Missing, nonpositive and future timestamps are omitted; an older deployment's timestamps are never substituted. Detailed deployment telemetry costs at most three points per install across its count and two timestamp streams.

Install info uses nuon.install.name, nuon.app_branch.id, nuon.app_branch.name and boolean nuon.install.sandbox_mode, alongside org/app/install IDs. Branch metadata describes the newest active connection, not the configuration successfully deployed. Unavailable branch metadata is omitted without removing the install.

To correlate installs with your own customer/account identifiers, explicitly allow selected stored install labels:

STATE_TELEMETRY_LEVEL=detailed
TELEMETRY_INSTALL_LABELS=customer_id,tier

No install labels are exported by default. Selected values appear only on nuon.install.info as nuon.install.label.customer_id, for example; other state metrics do not gain these dimensions. Names and labels can contain sensitive data: allow only nonsecret identifiers approved for your telemetry destination.

The allowlist accepts at most eight distinct keys, each 1–64 ASCII characters, starting with a letter and containing only letters, digits, _, . or -. Reserved nuon, otel and service prefixes and keys colliding after Prometheus normalization are rejected. Metadata values must fit 256 UTF-8 bytes without control characters. Invalid/oversized values are omitted, never truncated or logged; nuon.install.metadata.status=omitted signals this. complete means no invalid values were withheld, not that every optional label or branch exists.

There is still one current info point per install. Renames, branch moves and label changes create historical backend series. Use fresh info with one unambiguous entry per org/app/install before joining by those IDs; do not join raw retained info series or attach metadata to every measurement.

Collection diagnostics use the nuon.fleet.snapshot.* prefix and describe collection status, not workload health.

Reading the metrics

  • Sum count contributions at one instant; do not apply counter rates to state gauges. Use MIN for oldest workflow timestamps, never SUM.
  • Collection intervals are five minutes for org/app/component definitions and one minute for install-level state and workflows. Measurements refresh independently. Short workflows can finish between reads; use logs for their history.
  • Missing data is unknown, not zero or recovery. Sparse categories and old samples require care when writing custom queries; successful export alone does not guarantee complete, coherent backend ingestion.
  • These snapshots describe recorded state, not workload availability, uptime or complete operation history. They are intended for observational dashboards, not correctness-dependent aggregate health or recovery alerts.

Collection covers the configured database. Send it only to destinations authorized for that scope; dashboard filters and entity labels are not tenant access controls.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Register

func Register(lc fx.Lifecycle, cfg *internal.Config, tc *telemetry.Config, provider metric.MeterProvider, l *zap.Logger) error

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL