Skip to main content

Metrics reference

Names below are the registry's dotted names. At GET /metrics every character outside [a-zA-Z0-9_:] becomes _, so config.reload.stale is scraped as config_reload_stale; the exposition rules are in Management endpoints and ports. Types: a counter only rises, a meter is a counter with _rate_1m and _rate_5m gauges beside it, a gauge is a current reading, a timer is a summary in seconds.

Configuration and inventory reload​

Registered only while riptide.config.reload-interval is set. Semantics are in How configuration reloads work.

MetricTypeMeaningAlert on
config.reload.successescountera changed config.yaml validated and committedabsence of increments while edits are expected
config.reload.failurescountera changed config.yaml failed validation; the running configuration is kept> 0
config.reload.partialcounterthe config committed but the inventory rebuild against it is still pending; a subset of successes, counted once per editnot an alert on its own
config.reload.stalegauge1 while the last file that could be read did not commit; a skipped cycle does not recompute it== 1, and on absence if hot reload is mandatory
config.reload.deadgauge1 when the poll schedule stopped and will not run again, including after a deliberate shutdown> 0 on processes expected to be up
inventory.reload.successescounteras above, for the inventory file; shared with the discovery watcheras above
inventory.reload.failurescounteras above; with discovery on, a refused or unreachable poll counts here on every poll> 0
inventory.reload.stalegaugeas above; with discovery on, the endpoint's document differs from what is serving== 1
inventory.reload.deadgaugeas above> 0

Classification rules​

classification.reload.stale, classification.rules.* are registered whether or not riptide.classification.reload-interval is set; classification.reload.dead only with an interval.

MetricTypeMeaningAlert on
classification.reload.successescounterloads that published a ruleset; a healthy start leaves this at 1absence of increments while edits are expected
classification.reload.failurescounterreloads that did not happen: a fetch that failed, or a load that threw; not latched, every failing attempt counts again> 0
classification.reload.stalegauge1 when the last fetch or load attempt failed and no later one has succeeded; a skipped cycle does not recompute it== 1
classification.reload.deadgauge1 if the poll schedule stopped and will never run again, including after a deliberate shutdown> 0 on processes expected to be up
classification.rules.rejectedgaugerules in the serving ruleset that classify nothing because the engine could not use them; -1 means no ruleset has ever been published> 0
classification.rules.publishedgaugerules in the serving ruleset, rejected ones included; -1 on the same conditionnot an alert
classification.rules.preprocessedgaugethe same ruleset counted the way the tree build works on it, reversed rules included, roughly double the row count for an omnidirectional ruleset; -1 on the same condition. This is the number the size bound is about> 25000
reloadtimerthe whole classification reload: resource read, preprocessing and buildnot an alert

Ingest loss​

What each of these counts, and the delivery arithmetic between them, is in Where flows can be lost.

MetricTypeMeaningAlert on
listeners.<name>.socketDropsgaugedatagrams the kernel discarded because the socket receive buffer was full; read from /proc/net/udp, Linux only, absent elsewhererising
parsers.<name>.undecodableSetscounterData Sets discarded because their IPFIX or NetFlow v9 Template was not known; counts Sets, not records, and includes Options Data Setssustained non-zero rate; a burst at startup is normal
parsers.<name>.dispatchQueueDepthgaugepackets waiting to be enriched; registered while the parser runsapproaching 4096
parsers.<name>.dispatchDropscounterrecords discarded because enrichment or persistence fell behind, or discarded at shutdown> 0
parsers.<name>.unmodelledElementTemplatescounterIPFIX templates announcing an information element riptide parses and then discards (today IE 390 to 399); not an errorthe total, not a rate
parsers.<name>.recordsReceivedmeterrecords parsedthe base of the delivery arithmetic
parsers.<name>.recordsScheduledmeterrecords handed to the dispatch queue; excludes queue-full dropsnot an alert
parsers.<name>.recordsDispatchedmeterrecords the dispatcher returned from, errors includednot a delivery confirmation
pipeline.dispatchErrorscounterrecords lost because enrichment or persistence threw; with batching off, a refused insert counts here> 0
persister.batch.queueDepthgaugerows waiting to be insertedapproaching riptide.clickhouse.batch.queue-capacity
persister.batch.droppedRowscounterrows the queue never handed to an insert: queue full, repository stopping, producer interrupted, offered after the shutdown drain; exactsustained rate
persister.batch.failedRowscounterrows an insert was attempted for and lost; charges the whole batch, so an upper bound for a refused insertsustained rate, as a signal and not a loss figure
persister.batch.deadLetteredRowscounterrows of a refused batch kept in flows_dead_letter instead of being droppednot an alert; read with failedRows
persister.batch.deadLetterFailedRowscounterrows of a refused batch that could not be kept eitherany movement
persister.batch.batchSizehistogramrows per flushed batchnot an alert
persister.batch.flushtimerinsert duration per batchnot an alert
logPersisting.persistertimerthe enqueue latency, the hand-off into the buffer, normally microseconds; not the insert durationnot an alert

Parser gauges​

Registered while the parser runs and deregistered when it stops, so a stopped receiver publishes no series. Only IPFIX and NetFlow v9 populate them; NetFlow v5 and sFlow pairs read 0.

MetricTypeMeaningAlert on
parsers.<name>.sessionCountgaugeexporters, one per (session, observation domain) pair; eventually consistent with "holds at least one template"absence, not a value
parsers.<name>.templateCountgaugetemplates held across all exporters; what drives the per-record cost of the parse pathabsence, not a value

NetFlow v5 sampling rate resolution​

Per packet and per receiver; each leaf name is the value written to that flow's samplingProvenance.

MetricTypeMeaningAlert on
parsers.<name>.samplingRate.headermeterpackets whose rate came from the exporter's header, including an explicit 1a header rate falling to zero on a fleet that used to advertise
parsers.<name>.samplingRate.fallbackmeterpackets that fell through to the receiver's flow-sampling-interval-fallbacknot an alert
parsers.<name>.samplingRate.assumedmeterpackets with no rate anywhere, recorded as 1rising on a fleet that samples

Sampling rate tables​

Registry names are dotted; /metrics renders them with underscores (parser_optionSampling_expired).

MetricTypeMeaningAlert on
parser.optionSampling.consumedmeterSampler options records stored as an exporter-wide rate.not an alert
parser.optionSampling.skippedmeterSampler options records the table declined (no usable interval, an algorithm riptide cannot store).a rise together with parser.options.recognisedUnusable
parser.optionSampling.expiredmeterLearned rates dropped 24 h after the exporter stopped advertising. Flows fall to the receiver fallback or assumed.any sustained rate: an exporter is losing its learned rate
parser.optionSampling.evictedmeterRate entries displaced by table pressure rather than silence, live ones included.> 0: the table is full
parser.optionSampling.resolvedmeterFlow lookups that found a learned rate.not an alert
parser.optionSampling.unresolvedmeterFlow lookups that found none.not an alert; compare against resolved
parser.selectorReport.consumedmeterIPFIX Selector Reports stored per selectorId.not an alert
parser.selectorReport.skippedmeterSelector Reports declined (ratio not storable, parameters missing).a rise together with parser.options.recognisedUnusable
parser.selectorReport.expiredmeterSelector entries dropped after 24 h of silence. Flows naming the Selector fall back to the exporter-wide rate (derived becomes options).any sustained rate
parser.selectorReport.evictedmeterSelector entries displaced by table pressure.> 0

Option records at the tap​

Collector-wide; nothing here names an exporter. offered always equals the sum of the other three.

MetricTypeMeaningAlert on
parser.options.offeredmeterOption data records seen.not an alert
parser.options.claimedmeterRecords stored by at least one consumer.not an alert
parser.options.recognisedUnusablemeterRecords a consumer understood and stored nothing from: an unusable applicationId or over-long name, an interface record with no ifIndex, an interval of 0 (a withdrawal), or a sampling algorithm riptide cannot store.a climb; the per-consumer _skipped meter that moves with it names the consumer
parser.options.unrecognisedmeterRecords no consumer knew the shape of (VRF tables, metering-process statistics).a change in rate, not presence

Session state bounds​

MetricTypeMeaningAlert on
flows.session.sourcesgaugeUDP sources currently holding a slot.approaching riptide.flows.session.max-sources
flows.session.scopesgaugeAdmitted scope identities across all sources.not an alert
flows.session.rejectedSourcesmeterA new source was refused because max-sources was reached.any rate on a healthy fleet: the bound is too low, or a spray is running
flows.session.rejectedScopesmeterA source's least-recently-used scope was displaced because max-scopes-per-source was reached.a steady rate
enrichment.optionInterfaces.rejectedmeterAn interface entry was evicted because max-ifindexes-per-scope was reached. Degrades only.a steady rate: raise the bound
enrichment.optionApplications.rejectedmeterAn application-table entry was evicted because the fixed 16,384-id scope cap was reached.a steady rate

Exporter application tables​

MetricTypeMeaningAlert on
enrichment.optionApplications.consumedmeterApplication-table option rows stored.not an alert
enrichment.optionApplications.skippedmeterA named row with no usable applicationId, an id of 0, or a name longer than 64 characters.a sustained rate on an exporter you expect names from
enrichment.optionApplications.rejectedmeterAn entry evicted because a scope reached its fixed cap of 16,384 ids.> 0 on a healthy fleet: an exporter is sending more ids than a protocol pack holds
enrichment.application.unresolvedmeterA record carried a non-zero applicationId the exporter's table cannot name; the rules answered instead. Normal for the first table refresh interval after a restart, permanent on a device that exports ids without a table.a rate that does not fall to zero after the exporter's table refresh interval

Discovery​

MetricTypeMeaningAlert on
discovery.targetsgaugeExporter entries in the inventory currently serving. Never describes a candidate that was composed and then refused.A drop below the fleet size you expect; safe to alert on because it only ever describes what serves.
discovery.skippedgaugeEntries the most recent render dropped for want of a usable address (a prefix length, an unparsable value, a NetBox device with no primary IP), whether or not the candidate built from it was published.> 0 when every device should carry an address. Legitimately disagrees with discovery.targets while a candidate is being refused.

Both exist only while riptide.discovery.url or riptide.discovery.urls is set. discovery.skipped is summed across every endpoint in riptide.discovery.urls.