semantic bufo search find-bufo.com
bufo

fix logfire span hierarchy with .entered()

- use .entered() on all spans to create proper parent-child relationships
- now all spans share same trace_id and properly nest under bufo_search parent
- before: all spans had parent_span_id: null (disconnected)
- after: child spans have parent_span_id pointing to bufo_search

verified locally with logfire MCP:
bufo_search (parent)
├─ voyage.embed_text
└─ turbopuffer.query

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

+18 -16
+18 -16
src/search.rs
··· 55 query: web::Json<SearchQuery>, 56 config: web::Data<Config>, 57 ) -> ActixResult<HttpResponse> { 58 - let query_text = &query.query; 59 let top_k_val = query.top_k; 60 61 let _search_span = logfire::span!( 62 "bufo_search", 63 - query = query_text, 64 top_k = top_k_val as i64 65 - ); 66 67 logfire::info!( 68 "search request received", 69 - query = query_text, 70 top_k = top_k_val as i64 71 ); 72 ··· 80 let query_embedding = { 81 let _span = logfire::span!( 82 "voyage.embed_text", 83 - query = query_text, 84 model = "voyage-3-lite" 85 - ); 86 embedding_client 87 - .embed_text(query_text) 88 .await 89 .map_err(|e| { 90 let error_msg = e.to_string(); 91 logfire::error!( 92 "embedding generation failed", 93 error = error_msg, 94 - query = query_text 95 ); 96 actix_web::error::ErrorInternalServerError(format!( 97 "failed to generate embedding: {}", ··· 102 103 logfire::info!( 104 "embedding generated", 105 - query = query_text, 106 embedding_dim = query_embedding.len() as i64 107 ); 108 ··· 116 include_attributes: Some(vec!["url".to_string(), "name".to_string(), "filename".to_string()]), 117 }; 118 119 - let namespace = &config.turbopuffer_namespace; 120 let vector_results = { 121 let _span = logfire::span!( 122 "turbopuffer.query", 123 - query = query_text, 124 top_k = top_k_val as i64, 125 - namespace = namespace 126 - ); 127 tpuf_client.query(vector_request).await.map_err(|e| { 128 let error_msg = e.to_string(); 129 logfire::error!( 130 "vector search failed", 131 error = error_msg, 132 - query = query_text, 133 top_k = top_k_val as i64 134 ); 135 actix_web::error::ErrorInternalServerError(format!( ··· 145 146 logfire::info!( 147 "vector search completed", 148 - query = query_text, 149 results_found = results_found, 150 min_dist = min_dist, 151 max_dist = max_dist ··· 194 195 logfire::info!( 196 "search completed successfully", 197 - query = query_text, 198 results_count = results_count, 199 top_result = &top_result_name, 200 top_score = top_score_val,
··· 55 query: web::Json<SearchQuery>, 56 config: web::Data<Config>, 57 ) -> ActixResult<HttpResponse> { 58 + let query_text = query.query.clone(); 59 let top_k_val = query.top_k; 60 61 let _search_span = logfire::span!( 62 "bufo_search", 63 + query = &query_text, 64 top_k = top_k_val as i64 65 + ).entered(); 66 67 logfire::info!( 68 "search request received", 69 + query = &query_text, 70 top_k = top_k_val as i64 71 ); 72 ··· 80 let query_embedding = { 81 let _span = logfire::span!( 82 "voyage.embed_text", 83 + query = &query_text, 84 model = "voyage-3-lite" 85 + ).entered(); 86 + 87 embedding_client 88 + .embed_text(&query_text) 89 .await 90 .map_err(|e| { 91 let error_msg = e.to_string(); 92 logfire::error!( 93 "embedding generation failed", 94 error = error_msg, 95 + query = &query_text 96 ); 97 actix_web::error::ErrorInternalServerError(format!( 98 "failed to generate embedding: {}", ··· 103 104 logfire::info!( 105 "embedding generated", 106 + query = &query_text, 107 embedding_dim = query_embedding.len() as i64 108 ); 109 ··· 117 include_attributes: Some(vec!["url".to_string(), "name".to_string(), "filename".to_string()]), 118 }; 119 120 + let namespace = config.turbopuffer_namespace.clone(); 121 let vector_results = { 122 let _span = logfire::span!( 123 "turbopuffer.query", 124 + query = &query_text, 125 top_k = top_k_val as i64, 126 + namespace = &namespace 127 + ).entered(); 128 + 129 tpuf_client.query(vector_request).await.map_err(|e| { 130 let error_msg = e.to_string(); 131 logfire::error!( 132 "vector search failed", 133 error = error_msg, 134 + query = &query_text, 135 top_k = top_k_val as i64 136 ); 137 actix_web::error::ErrorInternalServerError(format!( ··· 147 148 logfire::info!( 149 "vector search completed", 150 + query = &query_text, 151 results_found = results_found, 152 min_dist = min_dist, 153 max_dist = max_dist ··· 196 197 logfire::info!( 198 "search completed successfully", 199 + query = &query_text, 200 results_count = results_count, 201 top_result = &top_result_name, 202 top_score = top_score_val,