Skip to content

llo/v31: attributed observation telemetry and per job plugin telemetry - #276

Merged
brunotm merged 5 commits into
masterfrom
DS-4298-llo-attributed-observation-telemetry
Oct 9, 2026
Merged

brunotm merged 5 commits into
masterfrom
DS-4298-llo-attributed-observation-telemetry

Conversation

@brunotm

@brunotm brunotm commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

Add telemetry carrying the decoded observation of every oracle in a v31 round, as seen by the state transition, and move v31 plugin telemetry to the job [v31] config. Today only the agreed aggregates (outcome telemetry) and each
node's own values are visible. Per oracle values never leave the state transition.

Add the capability to capture and transmit a staging instance telemetry.

Add LLOAttributedObservationTelemetry, carrying the decoded observation of
oracles in a round: stream values, channel votes, the oracle and agreed
observation timestamps, and the decode error if the observation was
dropped. Large observations are split across messages sharing
(config_digest, seq_nr, observer).

Used in v31 instead of the messagePropose.
Add a staging marker report: a JSON report with its own shape that a
staging round appends last, so a staging instance always has a report
reaching the transmitter. Allowing the transmitter to notify attached
listeners also for a staging instance
Add captureOutcomeTelemetry, captureReportTelemetry and
captureAttributedObservationTelemetry to the v31 job config, so v31 plugin
telemetry is enabled per job instead of by the node CaptureEATelemetry
setting, which keeps driving data source telemetry. Add
captureStagingTelemetry to let a staging instance emit it too. All are off
by default.
Emit, from StateTransition, the decoded observation of every oracle in the
round as LLOAttributedObservationTelemetry, built and split off the
StateTransition path by a plugin owned telemeter.

Outcome and attributed observation telemetry are emitted by f+1 oracles
rotating with seqNr. Plugin telemetry is emitted for production rounds,
and for staging rounds with CaptureStagingTelemetry.
@brunotm
brunotm requested a review from a team as a code owner October 8, 2026 18:15
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

👋 brunotm, thanks for creating this pull request!

To help reviewers, please consider creating future PRs as drafts first. This allows you to self-review and make any final changes before notifying the team.

Once you're ready, you can mark it as "Ready for review" to request feedback. Thanks!

Comment thread llo/dev/v31/telemetry.go
func (p *Plugin) captureAttributedObservationTelemetry(out precursor, seqNr uint64, aos []attributedObservation) {
if len(aos) == 0 || !p.emitsTelemetry(out.LifeCycleStage) {
return
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

worth a check in case p.attributedObservationTelemeter is nil ?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

already gated on

// collectAttributedObservations reports whether StateTransition should keep the
// decoded observations of seqNr for telemetry.
func (p *Plugin) collectAttributedObservations(seqNr uint64) bool {
	return p.attributedObservationTelemeter != nil && p.isTelemetryEmitter(seqNr)
}

https://github.com/smartcontractkit/chainlink-data-streams/pull/276/changes/BASE..27c662575a869d4414a76efd8c8736b1a85272a9#diff-8fbaf95ce376f96c9c25b588ff564a9abb7c12bb6ab2347bd646fd95c7f5160fR175-R177

@dav009

dav009 commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Driving with the LLM to review this PR we bumped into this:

It seems Blue and Green wipe each other's buffered telemetry:

  • Blue and Green instances of the same job share one telemeter

  • sendBufferedTelemetry drops the buffers of every other digest on each flush (chainlink telemetry.go#L296-L302). So a Blue transmit wipes Green's telemetry before the staging marker flushes it.

  • Green's telemetry will be dropped for a round when Blue transmit between (i) Green's StateTransition (when its telemetry is buffered) and (ii) Green's marker transmit

@brunotm

brunotm commented Oct 9, 2026

Copy link
Copy Markdown
Contributor Author
  • sendBufferedTelemetry drops the buffers of every other digest on each flush (chainlink telemetry.go#L296-L302). So a Blue transmit wipes Green's telemetry before the staging marker flushes it.

there is companion PR for chainlink which already addresses this.

@brunotm
brunotm merged commit 68424c7 into master Oct 9, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants