Skip to content

Metrics ​

The Reporting API and the OpenStack collector each serve their instruments in the Prometheus exposition format at GET /metrics, on the port the service listens on and without a credential. Every series either of them owns is named tally_. The Go runtime and the process collectors are registered beside them, so a scrape carries the go_ and process_ series as well. Those report the process rather than the product and are not listed below.

TALLY_METRICS_ENABLED=false makes the route answer 404 instead of an exposition. On the Reporting API it also stops the gauge refresher. The two settings pages, Reporting API settings and OpenStack collector settings, carry the variable with its default.

Both services bound one scrape the same way, in internal/reporting/metrics/metrics.go and internal/providers/openstack/metrics.go. Three scrapes are served at once, and a fourth arriving while those three run is answered 503. A scrape that outlives the budget of 10 seconds is cut off.

Reporting API ​

MetricTypeLabelsHelp
tally_current_resourcesgaugeplatform, cloud, resource_type, stateResources the projection holds, by state.
tally_events_deduplicated_totalcountercloudEvents dropped because the same event was already stored.
tally_events_ingested_totalcounterplatform, cloud, resource_type, event_type, sourceEvents stored by the ingest pipeline.
tally_events_rejected_totalcountercloud, reasonEvents refused by the ingest pipeline, by the kind of check that refused them.
tally_ingest_unvalidated_size_totalcounterplatform, resource_typeEvents stored with a size no registered schema validated.
tally_projection_replays_totalcountercloudProjection rows folded again from a resource's whole event history.
tally_sync_errors_totalcountercloudErrors reconciliation runs reported.
tally_sync_resources_deferred_totalcountercloud, reasonCorrections a reconciliation run deferred to a later run, by reason.
tally_sync_resources_reconciled_totalcountercloud, actionResources a reconciliation run created, updated, or deleted.
tally_sync_runs_totalcountercloud, statusReconciliation runs that finished, by status.

The instruments are declared in internal/reporting/metrics/metrics.go.

resource_type, event_type and state carry values an ingested event decides. Each of the three admits 128 distinct values, on a first-seen basis, and records everything past that under other. A value longer than 128 characters is recorded under other too.

reason on tally_events_rejected_total is the check that refused the event, which is the text of the pipeline's reason before its first colon: schema, size_schema or scope.

reason on tally_sync_resources_deferred_total is transitional or recent.

tally_current_resources is written by the refresher rather than by the ingest path. The refresher counts the projection rows per platform, cloud, resource type and state, and it runs on the interval TALLY_REPORTING_METRICS_REFRESH_S names. A group the projection no longer holds is deleted from the gauge on the next run, and an empty projection leaves the gauge without series.

OpenStack collector ​

MetricTypeLabelsHelp
tally_collector_buffer_depthgaugecloud, platformEvents waiting in the outbox.
tally_collector_consumed_totalcountercloud, platform, event_typeNotifications mapped to an event and buffered.
tally_collector_delivered_totalcountercloud, platformEvents the Reporting API accepted.
tally_collector_delivery_errors_totalcountercloud, platformDelivery attempts the Reporting API did not accept.
tally_collector_oldest_buffered_secondsgaugecloud, platformAge of the oldest event waiting in the outbox, 0 when it is empty, and NaN when the buffer cannot be read.
tally_collector_skipped_totalcountercloud, platform, event_typeNotifications the mapping table produced no event for.
tally_collector_unparseable_totalcountercloud, platformAMQP deliveries whose body could not be parsed.

The instruments are declared in internal/providers/openstack/metrics.go.

cloud and platform are constant labels on every series the collector owns. cloud is the cloud TALLY_OSC_CLOUD names and platform is openstack.

event_type carries the oslo type off the wire. It admits 100 distinct values and records everything past that under other. The bound is the collector's own; the Reporting API bounds its labels at a different number, and the two do not track each other.

tally_collector_delivered_total counts the events one answer says the Reporting API accepted, not the events a batch carried. A resent batch is answered as duplicates and an item the API dead-lettered was refused, so neither counts here.

tally_collector_oldest_buffered_seconds is 0 while the outbox is empty and NaN while the buffer cannot be read.

OpenStack simulator ​

The simulator serves GET /metrics on its control listener while a run publishes. What it exposes is the inventory of the simulated month, in the shape of the OpenStack database exporter a real cloud runs beside its services, and none of it is a tally_ series. The inventory endpoint section of its page states every one of those.

Scrape jobs ​

The store reads these five jobs, from deploy/kubernetes/base/victoriametrics/scrape.yaml.

JobIntervalTimeoutTargetsStatic labels
reporting-api30snonediscovered, role endpointslice, kept by reporting-api;httpnone
openstack-db-exporter300s60sos-db-exporter:9180cloud=os-prod-eu1, platform=openstack
ceilometer60snoneceilometer-exporter:9101cloud=os-prod-eu1, platform=openstack
otel-collector15snonediscovered, role endpointslice, kept by otel-collector;metricsnone
openstack-collector30snonediscovered, role endpointslice, kept by openstack-collector;httpnone

The static platform and cloud labels on the two OpenStack jobs put a third-party exporter's samples in the coordinate system the label convention page states. The three in-cluster jobs set no static labels. The Reporting API's and the OTel Collector's series are service metrics, and the OpenStack collector's series carry platform and cloud from the process itself.

The targets and the cloud name of the two OpenStack jobs are placeholders: those exporters run beside an OpenStack control plane rather than in this cluster. A deployment replaces the whole file rather than patching it. Its overlay declares a configMapGenerator of its own for victoriametrics-scrape, marked behavior: replace, carrying the overlay's scrape.yaml with that deployment's addresses and cloud. The dev overlay's victoriametrics/scrape.yaml is such a file.

up is a series per target, so a job that discovers no target emits no up series at all rather than up == 0. A Deployment scaled to zero, a renamed Service, a renamed port, a removed RoleBinding and an unreachable API server all take a discovering job off the target list instead of turning it red.

See also ​

The alert rules page states which of these series are watched and what fires on them. The Grafana dashboards page states which panel reads which of them.