Skip to main content

ROSQL

The open source query language that natively speaks robot

A SQL-like language purpose-built for ROS2 telemetry — query traces, logs, and metrics with first-class support for nodes, actions, topics, and message causality, stored via OpenTelemetry.

Try it — pick a query and hit Run

Loading editor…

Querying sample ROS2 telemetry data from fixture files

Available as a library, CLI, gRPC server, and WASM package.

One query. Every format you need.

Results are unified across signal types — tables for SQL consumers, structured objects for programmatic processing, chart-ready data for visualization, and causality graphs for message tracing.

ROSQL QueryYour robot's language
Robot TelemetryPostgreSQL · MySQL · DuckDB
Tabular rowsFor SQL consumers & data tools
Structured objectsFor programmatic processing
Chart-ready dataFeed directly into dashboards
Causality graphsTrace message propagation

Why ROSQL?

Robot observability is hard. ROS2 systems generate a firehose of traces, logs, and sensor data across dozens of nodes, but general-purpose query languages have no awareness of topics, action graphs, or message causality. ROSQL closes that gap: write queries in the language of your robot, not your database.

Robotics-native syntax

First-class support for ROS2 nodes, actions, topics, and ParentSpanId-based message causality. No glue code.

Cross-signal correlation

DURING() correlates events across traces, logs, metrics, and topics in a single query — something SQL has no primitive for.

Unified results

Results are returned as structured objects ready for tables, charts, further programmatic processing, or graph visualization.

Causality graphs

MESSAGE JOURNEY walks the parent_span_id chain recursively — see exactly how a message propagated through your robot's nodes.

One query, multiple signals

Find every navigation failure that happened while the battery was critically low. One sentence. One query. No JOINs.

Cross-signal correlation
SELECT trace_id, span_name_col, service_name, duration, status_code, span_attributes
FROM traces
WHERE status = 'ERROR' AND action_name = '/navigate_to_pose'
DURING(
FROM topics WHERE topic_name = '/battery_state'
AND fields['percentage'] < 15
)
SINCE 6 hours ago

Architecture

ROS2 System │ │ ros.node, ros.action.*, ros.topic │ ParentSpanId (OTel attributes) ▼ Robot Ops Agent or OTel Collector │ │ OTLP gRPC ▼ Datastore (PostgreSQL, MySQL, DuckDB …) │ │ OTel standard schema ▼ rosql (parse + compile + execute) │ ▼ Query results
LibraryEmbed in Rust apps. Parse + execute against any driver.
CLI + gRPCrosql query / compile / parse — pipe into scripts.
WASMParse and validate in the browser. No server needed.

Driver support

BackendFeature flagStatus
PostgreSQL / TimescaleDBpostgres✅ v0.1
MySQL / MariaDBmysql✅ v0.1
DuckDB (embedded)duckdb✅ v0.3
AWS Athenaathena📋 Planned
Google BigQuerybigquery📋 Planned

Driver docs →

Quick start

Requires the Rust toolchain.

Install the CLI
cargo install rosql --features server,postgres
Run your first query
rosql query "FROM traces WHERE status = 'ERROR' SINCE 1 hour ago" \
--backend postgres \
--url postgresql://user:pass@localhost:5432/telemetry

Need fleet-scale telemetry?

ROSQL is created and used by Robot Ops, Inc. to power the Robot Ops observability platform — managed ingestion, storage, and dashboards with lifecycle anchors, fleet-wide anomaly detection, and ClickHouse performance.

Explore Robot Ops →