Observability of Kit Apps#

This guide explains how to set up observability for Omniverse Kit applications running in self-hosted deployments.

Customers are responsible for collecting telemetry data.

Important

For documentation on observability configuration and best practices, see the Omniverse DGXC Observability Guide.

Observability Architecture#

The Omniverse platform is transitioning to OpenTelemetry (OTel) as the standard for observability:

Apps using Kit 109 or later

  • Native OTel log signal export directly from the Kit application

  • OTel metrics via streaming (when enabled)

  • OTel traces support

  • Standard OTLP (OpenTelemetry Protocol) compliance

Function worker pods are annotated with function_id and function_version_id to facilitate filtering and correlation of telemetry data across your deployment.

Note

Across the entire cluster, some services may continue to expose Prometheus metrics and log only to stdout. Your observability solution should accommodate both approaches.

Configuring OTel in Kit 109+#

Kit 109+ includes native OpenTelemetry support through the Carbonite SDK. The OTel infrastructure is automatically loaded at Kit kernel startup - no explicit extension dependencies required.

Environment Variables:

Kit uses standard OTel environment variables for configuration. The full list of available configuration options is available from the Carbonite SDK Documentation.

Specify the service URL for a Kit collector via environment variables:

env:
  # Collector endpoint
  - name: OTEL_EXPORTER_OTLP_ENDPOINT
    value: "http://collector.otel.svc.cluster.local:4318" # Replace with the correct cluster DNS/Host/IP etc.

  # Service identification
  - name: OTEL_SERVICE_NAME
    value: "my-kit-app"                                   # Apply an appropriate name.

Kit Arguments

/exts/omni.kit.livestream.app/primaryStream/enableOpenTelemetry (default false)

Enables streaming metrics export for the primary livestream session.

MUST be true to enable OTel for livestream extensions!

/observability/logs/emitLevel (default warn)

Minimum log level to export via OTLP. Accepts "verbose", "info", "warn", "error", or "fatal"

/observability/logs/channels/<channelNameOrPattern>

Channel-specific log level for OTel export. Overrides the global emitLevel for the named channel.

/log/channels/<channelNameOrPattern>

Channel-specific log level for stdout. Overrides the global log level for the named channel.

Note that channel names can contain patterns.

With this information we can, for example, only emit logs at the “warn” level as a baseline. Then, enable “info” level for livestream extension channels, being sure to also set enableOpenTelemetry = true. This could be done with the following arguments:

--/observability/logs/emitLevel = "warn"
--/observability/logs/channels/omni.kit.livestream.* = "info"
--/exts/omni.kit.livestream.app/primaryStream/enableOpenTelemetry=true

Important

The volume of Kit telemetry (in particular logs and traces) can be substantial!

The info and verbose log levels may produce an output volume greater than collectors can consume.

Log Channels

Per-channel overrides are useful when the global emit level is too coarse. For example, a noisy subsystem can be silenced without losing visibility into others, or a specific channel can be promoted to a higher verbosity for targeted debugging without flooding the observability backend with unrelated messages.

Channels are registered by plugins and extensions as they load at runtime. The active set depends on which extensions your application enables. An extension that is not loaded will contribute no channels, third party extensions can also register their own channels.

To determine the active set of channels, capture and review the log output of Kit applications. Channel names appear in square brackets immediately before the message text.

# `omni.rtx.materials` is the channel for this message
[omni.rtx.materials] Loading MDL material: /path/to/material.mdl

Log Channel Config

/observability/logs/emitLevel

Minimum log severity for messages forwarded to OpenTelemetry. Accepts a string ("verbose", "info", "warn", "error", "fatal") or the corresponding Carbonite integer value (-2 through 2). Independent of /log/level. If the OTel level is lower than the core level, those messages will never arrive regardless. Defaults to "warn". Reloaded at runtime if changed programmatically.

/observability/logs/channels/

Per-channel emit level overrides. Each key is a channel name pattern (* matches zero or more characters, ? matches exactly one) and the value is a severity level using the same format as /observability/logs/emitLevel. Channel settings override the base emit level; when multiple patterns match, the first takes precedence. Defaults to empty (no overrides). Reloaded at runtime if changed programmatically.

/observability/logs/adoptLoggingChannelSettings

When true, the OTel log listener reads all patterns from /log/channels/ at startup and uses them as its initial channel filters, keeping local and remote log configuration in sync without duplication. Adoption is one-time at init; settings become independent afterward. Any explicit /observability/logs/channels/ entries take precedence over adopted values. Defaults to false.

Logging channel names…

The following is an incomplete list of channels that can be controlled.

Do not rely on this list as these values will change over time and depend on the Kit app and extensions in-use.

Logging Channels#

Channel

Description

carb.profiler.gpu

GPU performance profiling and timing data

carb.progress

Progress tracking for long-running operations

lidar.lidarprofilereader

Loading and parsing lidar sensor configuration files

logger.rtx.spg

Sensor Processing Graph pipeline execution

omni.coreapi.alpha.server.CommandDispatcher

Routing and dispatching of incoming server commands

omni.coreapi.alpha.server.control-plane

Server coordination and cluster state management

omni.coreapi.alpha.server.ext

Server extension startup and shutdown

omni.coreapi.alpha.server.operations-log

Server operation events published to the message queue

omni.coreapi.alpha.server.render.WorkDispatchThread

Internal thread that assigns render jobs to workers

omni.coreapi.alpha.server.renderQuality

Render quality setting changes and adjustments

omni.coreapi.alpha.server.rpc.CreateRuntimeStage

Creating a new USD stage at runtime via RPC

omni.coreapi.alpha.server.rpc.CreateSensorSet

Creating a sensor set via RPC

omni.coreapi.alpha.server.rpc.DeleteRuntimeStage

Deleting a USD stage at runtime via RPC

omni.coreapi.alpha.server.rpc.ReadSceneValues

Reading scene data values via RPC

omni.coreapi.alpha.server.rpc.StreamSceneValues

Streaming scene data to clients via RPC

omni.coreapi.alpha.server.rpc.TriggerSensorSet

Triggering a sensor set render via RPC

omni.coreapi.alpha.server.rpc.WriteSceneValues

Writing scene data values via RPC

omni.coreapi.alpha.server.rtx

RTX render job scheduling and result handling on the server

omni.coreapi.alpha.server.test

Server-side automated test output

omni.coreapi.readthreadpool

Thread pool that reads scene data in parallel

omni.datastore

Asset caching for textures, geometry, and materials

omni.datastore.health

Health and availability of cache storage nodes

omni.graph.action

Action Graph node execution and event handling

omni.graph.core.Bundle

OmniGraph bundle data read and write operations

omni.graph.exec.unstable.passRegistry

Registration and lookup of OmniGraph execution passes

omni.hydra

Hydra scene delegate that translates USD to the renderer

omni.iray

Iray path tracer renderer

omni.kit.exec.taskMetrics

Per-task timing from the Kit application update loop

omni.population

Instanced geometry scattering across a scene

omni.rtx

General RTX renderer messages, including missing textures and file errors

omni.rtx.hydra

RTX Hydra render delegate synchronization with the scene

omni.rtx.index

Internal scene index tracking what the renderer knows about the scene

omni.rtx.materials

Material loading, compilation, and binding (MDL, MaterialX)

omni.rtx.rendering

Rendering pipeline stages: denoising, post-processing, and color management

omni.rtx.sensors

Synthetic sensor rendering for cameras, lidar, and radar

omni.rtx.xr

Extended Reality (XR/VR/AR) rendering output

omni.sensorscheduling

Scheduling and orchestration of sensor render requests

omni.sensorscheduling.debug

Debug overlay showing sensor scheduling and timing information

omni.sensors

Sensor data output and annotator generation

omni.sensors.net

Network transport for sensor output data

omni.telemetry.fabric

Scene graph memory and allocation statistics exported to OpenTelemetry

omni.telemetry.memory

Application memory usage exported to OpenTelemetry

omni.telemetry.metrics.setup

OpenTelemetry Metrics subsystem startup and configuration

omni.telemetry.metrics.stats

Renderer and GPU statistics exported as OpenTelemetry metrics

omni.telemetry.setup

OpenTelemetry subsystem startup and configuration

omni.telemetry.storage

Disk and storage usage exported to OpenTelemetry

omni.telemetry.tracing.setup

OpenTelemetry distributed tracing startup and configuration

omni.ujitso

Background texture compression and asset pre-caching pipeline

omni.usd.audio

USD audio playback and spatialization

omni.usd.multitick.config

Sensor registration and lifecycle events for multi-rate tick configurations

omni.usd.multitick.render

Per-frame rendering for sensors running at different tick rates

omni.usdresolver

Resolving USD asset paths to files on disk, Nucleus, or other backends

rtx.geometry

Geometry upload and processing on the GPU

rtx.hydra

Hydra scene traversal and synchronization with the RTX renderer

rtx.hydra.geometrystreaming

Streaming large geometry assets into the renderer on demand

rtx.scenedb

Internal database of geometry, lights, and instances visible to the renderer

usdresolver

Low-level USD asset path resolution (distinct from omni.usdresolver)