FAQs
How do I instrument my nodes?
Add the Trace SDK packages as normal
dependencies, then turn on env-default auto-init: LD_PRELOAD the C++ constructor
lib and set ROBOTOPS_TRACE_AUTOINIT=1 for Python, once in the launch environment.
Every node then auto-instruments with zero per-node code. Nodes outside that
environment can call RobotOps::init() / robotops.init() explicitly. The
installer sets all of this up for you.
Do I have to fork MoveIt / Nav2 / BehaviorTree.CPP to use it?
No. You keep stock upstream frameworks and add our integration packages as normal
apt/PyPI dependencies — no forks, no rebuilds. The one exception is MoveIt's
internal-async coverage, which needs a hook that isn't upstream yet; if you need it now
you install our build of that one package (robotops-trace-moveit), which is being
pushed upstream over time.
What happens to frameworks I haven't installed an integration for?
They show up as black-box spans — opaque spans in the trace with no inner detail. Missing coverage is a gap, never a failure: the SDK never crashes, blocks, or changes the behavior of uninstrumented code. You still see the call; you just don't see inside it until you add the matching integration.
Does the SDK add latency or risk to my robot?
The hot path is near-zero-cost: spans are batched and exported asynchronously off the robot's critical path, over a local Unix socket (which skips the TCP/IP stack). The ros2_control integration is RT-safe. Tracing failures are isolated and never propagate into your node code.
How does TraceHouse stitch a trace across process boundaries?
Two mechanisms:
- Actions are joined deterministically by
robot.action.goal_id(the goal UUID), emitted identically on the action client and server — so aNavigateToPoseis one trace across the boundary. - Topics / services are stitched best-effort via DDS content-correlation keys
(
ros.publisher_gid,ros.source_timestamp,ros.message.content_hash).
How does the SDK talk to the agent?
OTLP/HTTP + protobuf over a Unix domain socket by default
(unix:///run/robotops/trace.sock) — the agent's systemd RuntimeDirectory creates and
owns it, so the same-host case needs no configuration. For the containerized split (SDK
and agent in separate containers with no shared filesystem), set
ROBOTOPS_OTLP_ENDPOINT=http://agent:4318 to use TCP loopback instead.
I was using rmw_robotops (RMW_IMPLEMENTATION). What changed?
The passive rmw_robotops RMW shim is deprecated and superseded by the SDK. Remove
RMW_IMPLEMENTATION=rmw_robotops / ROBOTOPS_UNDERLYING_RMW from your launch
environment and follow the Quickstart to install the
SDK. The SDK gives deterministic intra-process traces and goal-UUID action stitching that
the content-hash shim could only approximate. See
Related Libraries.
Where is my data stored?
Traces, logs, and metrics are streamed by the agent to the TraceHouse backend
(backend.robotops.com) over gRPC and are queryable via ROSQL
backends including Parquet, ClickHouse, and TimescaleDB. While offline, data is buffered
locally in MCAP files under /var/tmp/robot_agent/buffer.
How do I get an API key?
Sign up at robotops.com and navigate to Settings → API Tokens in the dashboard. Keys are prefixed with sk_.
How do I get help?
- Email: hello@robotops.com
- Phone: 855.ROBOT.OP
- GitHub Issues: RobotOpsInc/robot_agent