Documentation

Attributes Best Practices

Best practices for creating effective attributes in your AI applications

Follow these best practices to create meaningful, well-organized attributes that provide valuable context and metadata for your traces and spans.

🎯 Consistent Naming

Hierarchical Naming

# Good: Consistent and descriptive
"customer.id" = "cust_123"
"customer.tier" = "premium"
"customer.region" = "us-west"
 
# Bad: Inconsistent and unclear
"cust_id" = "cust_123"
"tier" = "premium"
"region" = "us-west"

Use Consistent Prefixes

# System attributes
"system.duration_ms" = 1800
"system.status" = "success"
"system.version" = "1.2.3"
 
# Business attributes
"business.operation" = "customer_support"
"business.priority" = "high"
"business.feature" = "chatbot"
 
# Performance attributes
"perf.latency_ms" = 1800
"perf.throughput_rps" = 5.2
"perf.cpu_usage" = 0.75

📊 Logical Grouping

# Group related attributes together
span.set_attributes({
    # Customer context
    "customer.id": customer_id,
    "customer.tier": customer_tier,
    "customer.region": customer_region,
    
    # Query context
    "query.type": query_type,
    "query.priority": query_priority,
    "query.language": query_language,
    
    # AI context
    "ai.model": model_name,
    "ai.provider": provider,
    "ai.temperature": temperature
})

Use Meaningful Values

# Good: Descriptive and meaningful
"query.type" = "technical_support"
"customer.tier" = "premium"
"ai.model" = "gpt-4"
 
# Bad: Generic or unclear
"query.type" = "type1"
"customer.tier" = "tier2"
"ai.model" = "model1"

🎪 Performance Considerations

Essential Attributes Only

# Good: Essential attributes only
span.set_attributes({
    "customer.id": customer_id,
    "query.type": query_type,
    "ai.model": model_name
})
 
# Bad: Too many attributes
span.set_attributes({
    "customer.id": customer_id,
    "customer.name": customer_name,
    "customer.email": customer_email,
    "customer.phone": customer_phone,
    "customer.address": customer_address,
    # ... 50 more attributes
})

Use Conditional Attributes

# Add attributes based on conditions
if customer_tier == "premium":
    span.set_attribute("customer.priority", "high")
    span.set_attribute("ai.model", "gpt-4")
else:
    span.set_attribute("customer.priority", "normal")
    span.set_attribute("ai.model", "gpt-3.5-turbo")

🔄 Dynamic Attributes

Runtime Attributes

with trace_operation("process-query") as span:
    # Add attributes as the operation progresses
    span.set_attribute("query.length", len(query))
    
    # Process the query
    result = process_query(query)
    
    # Add result attributes
    span.set_attribute("result.length", len(result))
    span.set_attribute("result.confidence", result.confidence)
    
    # Add performance attributes
    span.set_attribute("processing.time_ms", time.time() - start_time)

Conditional Attributes

with trace_operation("ai-completion") as span:
    # Add base attributes
    span.set_attributes({
        "ai.model": model_name,
        "ai.temperature": temperature,
        "query.length": len(query)
    })
    
    # Add conditional attributes based on results
    if response.finish_reason == "stop":
        span.set_attribute("ai.completion_reason", "normal")
    elif response.finish_reason == "length":
        span.set_attribute("ai.completion_reason", "max_tokens")
        span.set_attribute("ai.truncated", True)
    
    # Add cost attributes
    if hasattr(response, 'usage'):
        span.set_attributes({
            "ai.prompt_tokens": response.usage.prompt_tokens,
            "ai.completion_tokens": response.usage.completion_tokens,
            "ai.total_tokens": response.usage.total_tokens
        })

📈 Attribute Types

String Attributes

span.set_attributes({
    "customer.id": "cust_123",
    "query.type": "technical_support",
    "ai.model": "gpt-4",
    "ai.provider": "openai"
})

Numeric Attributes

span.set_attributes({
    "query.length": 45,
    "ai.temperature": 0.7,
    "ai.max_tokens": 1000,
    "performance.latency_ms": 1800
})

Boolean Attributes

span.set_attributes({
    "customer.is_premium": True,
    "query.is_urgent": False,
    "ai.fallback_used": False,
    "performance.cache_hit": True
})

Array Attributes

span.set_attributes({
    "query.keywords": ["support", "login", "error"],
    "ai.models_tried": ["gpt-4", "gpt-3.5-turbo"],
    "performance.regions": ["us-west", "us-east"]
})

Object Attributes

span.set_attributes({
    "customer.profile": {
        "id": "cust_123",
        "tier": "premium",
        "region": "us-west",
        "signup_date": "2024-01-01"
    },
    "ai.config": {
        "model": "gpt-4",
        "temperature": 0.7,
        "max_tokens": 1000
    }
})

🔍 Business Context

Include Business Metrics

span.set_attributes({
    "business.operation": "customer_support",
    "business.priority": "high",
    "business.customer_tier": "premium",
    "business.region": "us-west",
    "business.feature": "chatbot",
    "business.cost_center": "support_team"
})

Track Business Outcomes

span.set_attributes({
    "business.outcome.satisfaction": 4.5,
    "business.outcome.resolution_time_minutes": 15,
    "business.outcome.escalation_required": False,
    "business.outcome.follow_up_needed": True
})

🎯 AI-Specific Attributes

Model Configuration

span.set_attributes({
    "ai.model": "gpt-4",
    "ai.provider": "openai",
    "ai.temperature": 0.7,
    "ai.max_tokens": 1000,
    "ai.top_p": 0.9,
    "ai.frequency_penalty": 0.0,
    "ai.presence_penalty": 0.0
})

Usage and Cost

span.set_attributes({
    "ai.prompt_tokens": 150,
    "ai.completion_tokens": 200,
    "ai.total_tokens": 350,
    "ai.cost_usd": 0.0023,
    "ai.cost_per_token": 0.0000066
})

Response Quality

span.set_attributes({
    "ai.finish_reason": "stop",
    "ai.response_length": 200,
    "ai.confidence_score": 0.85,
    "ai.quality_rating": "high"
})

🛠️ Debugging Support

Include Debug Information

span.set_attributes({
    "debug.trace_id": trace_id,
    "debug.span_id": span_id,
    "debug.timestamp": time.time(),
    "debug.version": "1.2.3",
    "debug.environment": "production"
})

Trace Correlation

# Use consistent correlation IDs
correlation_id = generate_correlation_id()
span.set_attribute("correlation.id", correlation_id)
 
# Pass correlation ID to external services
external_service_call(correlation_id=correlation_id)

Searchable Attributes

# Make attributes searchable with consistent naming
span.set_attributes({
    "customer.tier": "premium",  # Searchable: customer.tier:premium
    "query.type": "technical_support",  # Searchable: query.type:technical_support
    "ai.model": "gpt-4",  # Searchable: ai.model:gpt-4
    "performance.latency_ms": 1800  # Searchable: performance.latency_ms:>1000
})

Aggregation-Friendly Attributes

# Use consistent naming for aggregation
span.set_attributes({
    "ai.model": "gpt-4",  # Group by: ai.model
    "customer.tier": "premium",  # Group by: customer.tier
    "performance.latency_ms": 1800,  # Aggregate: performance.latency_ms
    "ai.cost_usd": 0.0023  # Aggregate: ai.cost_usd
})

🚀 Next Steps

Now that you understand attribute best practices, explore these related concepts:


Well-organized attributes provide the context and metadata that make your traces meaningful. By following these best practices, you'll create attributes that enable powerful analysis and debugging.

Exclusive Early Access

Get Early Access to Noveum.ai Platform

Be the first one to get notified when we open Noveum Platform to more users. All users get access to Observability suite for free, early users get free eval jobs and premium support for the first year.

Sign up now. We send access to new batch every week.

Early access members receive premium onboarding support and influence our product roadmap. Limited spots available.