Skip to content

Rust Client SDK

The xtrace-client crate provides an async HTTP client for interacting with the xtrace service.

Installation

toml
[dependencies]
xtrace-client = "0.0.11"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

Quick Start

rust
use xtrace_client::{Client, TraceListQuery};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let client = Client::new("http://127.0.0.1:8742/", "your-token")?;

    // Health check
    client.healthz().await?;

    // List traces
    let traces = client.list_traces(&TraceListQuery::default()).await?;
    println!("Found {} traces", traces.data.len());

    Ok(())
}

Ingest Traces

rust
use xtrace_client::{Client, BatchIngestRequest, TraceIngest, ObservationIngest};
use uuid::Uuid;
use chrono::Utc;

let client = Client::new("http://127.0.0.1:8742/", "your-token")?;

let trace_id = Uuid::new_v4();
let obs_id = Uuid::new_v4();

client.ingest_batch(&BatchIngestRequest {
    trace: Some(TraceIngest {
        id: trace_id,
        timestamp: Some(Utc::now()),
        name: Some("agent-task".into()),
        version: Some("v2.1".into()),
        session_id: Some("sess-001".into()),
        ..Default::default()
    }),
    observations: vec![ObservationIngest {
        id: obs_id,
        trace_id,
        r#type: Some("GENERATION".into()),
        name: Some("plan-step".into()),
        model: Some("gpt-4".into()),
        start_time: Some(Utc::now()),
        metadata: Some(serde_json::json!({"agent_role": "Planner"})),
        prompt_tokens: Some(150),
        completion_tokens: Some(300),
        total_tokens: Some(450),
        ..Default::default()
    }],
}).await?;

Push Metrics

rust
use xtrace_client::{Client, MetricPoint};
use std::collections::HashMap;
use chrono::Utc;

let client = Client::new("http://127.0.0.1:8742/", "your-token")?;

client.push_metrics(&[
    MetricPoint {
        name: "token_usage".into(),
        labels: HashMap::from([
            ("session_id".into(), "sess-001".into()),
            ("model_name".into(), "gpt-4".into()),
            ("agent_role".into(), "Planner".into()),
        ]),
        value: 450.0,
        timestamp: Utc::now(),
    },
]).await?;

Query Metrics

rust
use xtrace_client::{Client, MetricsQueryParams};

let client = Client::new("http://127.0.0.1:8742/", "your-token")?;

// P90 latency grouped by model
let result = client.query_metrics(&MetricsQueryParams {
    name: "latency".into(),
    agg: Some("p90".into()),
    step: Some("1h".into()),
    group_by: Some("model_name".into()),
    ..Default::default()
}).await?;

for series in &result.data {
    println!("{}: {} points", series.labels, series.values.len());
}

Query Traces

rust
use xtrace_client::{Client, TraceListQuery};

let client = Client::new("http://127.0.0.1:8742/", "your-token")?;

// Filter traces by version for trend analysis
let traces = client.list_traces(&TraceListQuery {
    version: Some("v2.1".into()),
    order_by: Some("timestamp.desc".into()),
    limit: Some(100),
    ..Default::default()
}).await?;

Daily Metrics

rust
use xtrace_client::{Client, MetricsDailyQuery};

let client = Client::new("http://127.0.0.1:8742/", "your-token")?;

// Compare daily metrics for a specific version
let daily = client.metrics_daily(&MetricsDailyQuery {
    version: Some("v2.1".into()),
    ..Default::default()
}).await?;

for item in &daily.data {
    println!("{}: {} traces, cost={}", item.date, item.count_traces, item.total_cost);
}

API Reference

Client

MethodDescription
Client::new(base_url, token)Create a new client
healthz()Health check
ingest_batch(req)Batch ingest traces and observations
list_traces(query)List traces with pagination and filters
get_trace(id)Get trace detail with observations
push_metrics(points)Write metric data points
query_metrics(params)Query time-series metrics
list_metric_names()List available metric names
metrics_daily(query)Daily aggregated metrics

Released under the MIT License.