Observability Configuration
Use this page when an application should install standard observability exporters from one plugin configuration document instead of manually registering each subscriber.
The plugin kind is observability. The core runtime registers it, so
applications do not need to register a plugin implementation before validation
or initialization.
For plugin file discovery, precedence, merge behavior, editor controls, and gateway conflict rules, refer to Plugin Configuration Files.
Observability plugin configuration uses the generic NeMo Relay plugin document
shape, so field names are snake_case in every binding. This differs from
Node.js runtime classes such as OpenTelemetrySubscriber, which use
Node-native camelCase option names outside the plugin system.
What It Installs
Every exporter section is optional and defaults to disabled. A section is active
only when it includes enabled = true.
The following table lists the runtime behavior that each section installs:
subscriber_name is not part of this config. The runtime infers
component-local subscriber names and registers them under the observability
plugin namespace:
- Agent Trajectory Observability Format (ATOF):
__nemo_relay_plugin__observability__atof - Agent Trajectory Interchange Format (ATIF) dispatcher:
__nemo_relay_plugin__observability__atif - Per-trajectory-root ATIF scope subscriber:
__nemo_relay_plugin__observability__atif-{root_scope_uuid} - OpenTelemetry:
__nemo_relay_plugin__observability__opentelemetry - OpenInference:
__nemo_relay_plugin__observability__openinference
plugins.toml Example
Add the following observability component configuration to plugins.toml:
Include only the sections you want to configure. In layered plugins.toml
files, omission inherits lower-precedence values; write enabled = false to
disable an inherited section.
Failure Behavior
NeMo Relay treats exporter configuration and exporter delivery failures differently. Configuration and activation failures are fail-closed for the observability setup: validation or initialization returns an error before the new plugin configuration becomes active. Runtime delivery failures are fail-open for application work: the tool, LLM, or agent run continues while the affected exporter records, logs, or reports the delivery problem.
The following table describes how each failure affects application work:
Missing or delayed telemetry is represented as absence of exporter output, not as synthetic success or failure events. NeMo Relay does not backfill events for subscribers that register late. If the plugin is cleared while an Agent scope or supported coding-agent turn scope is still open, the ATIF dispatcher writes the partial trajectory it has already observed.
Use nemo-relay doctor to validate local ATOF and ATIF output directories,
OTLP HTTP endpoints, and ATOF streaming endpoints. Validate ATIF remote storage
destinations, including HTTP storage and S3-compatible storage, with exporter
logs and backend-side checks because nemo-relay doctor does not probe
atif.storage. For local artifact paths, verify that the running process can
create the output directory and that teardown calls plugin.clear() or
clear_plugin_configuration() before the process exits.
Per-Language Plugin Configuration
The following examples configure and activate the Observability component through each supported language binding:
validate() checks only the supplied in-memory object. initialize() also
layers discovered plugins.toml configuration. For effective file-backed
validation, refer to Plugin Configuration Files
and run the gateway with the same configuration path that production uses.
Python
Node.js
Rust
Validation and Teardown
Validate plugin configuration before activating it. The plugin reports unsupported transports, unsupported ATOF modes, invalid ATOF streaming endpoint URLs, non-string endpoint headers, non-positive endpoint timeouts, unsafe ATIF filename templates, unknown fields according to policy, and enabled exporters that are unavailable in the current build or target.
Call plugin.clear() or clear_plugin_configuration() during teardown.
Clearing the plugin config deregisters inferred subscribers, flushes file
exporters, drains and closes ATOF streaming endpoints, and shuts down owned OTLP
subscribers.
Use manual subscriber/exporter APIs instead of the plugin when you need custom subscriber names, explicit per-run exporter objects, or direct control over the collection window.