Quick Reference
For OTEL,
gen_ai.conversation.id follows the OpenTelemetry GenAI semantic conventions. The legacy langwatch.thread.id attribute is also supported.SDK Examples
For detailed SDK-specific tutorials, see:- TypeScript: Capturing Metadata · Tracking Conversations · Full example
- Python: Capturing Metadata · Tracking Conversations · Full example
Raw OpenTelemetry
If you’re using vanilla OpenTelemetry without the LangWatch SDK:REST API
Send traces directly via HTTP. See REST API for full details.Reserved vs Custom Fields
In the REST APImetadata object:
Timings
Beyond metadata, spans carry timing information that powers the latency views: the Duration column, the Time to First Token (TTFT) column, and the latency analytics.
Most streaming instrumentations report TTFT automatically. To set it manually, or to understand how it rolls up to the trace level, see the dedicated tutorials:
- Python: Tracking Time to First Token
- TypeScript: Tracking Time to First Token
Best Practices
Always set user_id
Required for user-level analytics and filtering by specific users.
Use thread_id for conversations
Groups related messages together. Essential for chatbots and multi-turn interactions.
Labels for categorization
Use consistent labels like
production, staging, support for filtering.Custom metadata for context
Add any relevant context: feature flags, A/B variants, request sources.
What You Get
Once traces include metadata:- Filter by user: Find all traces for a specific user
- View conversations: See all messages in a thread grouped together
- Filter by labels: Quickly filter to specific categories
- Search custom fields: Find traces by any custom metadata value
- User analytics: View per-user metrics and patterns