Skip to content

Commit 5df4015

Browse files
trinity-1686afmassot
authored andcommitted
only return root spans for jaeger http api (#5358)
* only return root spans for jaeger http api * fix rest api tests
1 parent 42766b8 commit 5df4015

File tree

4 files changed

+36
-8
lines changed

4 files changed

+36
-8
lines changed

quickwit/quickwit-jaeger/src/lib.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ impl JaegerService {
193193
operation_name: &'static str,
194194
request_start: Instant,
195195
index_id_patterns: Vec<String>,
196+
root_only: bool,
196197
) -> JaegerResult<SpanStream> {
197198
debug!(request=?request, "`find_traces` request");
198199

@@ -212,6 +213,7 @@ impl JaegerService {
212213
operation_name,
213214
request_start,
214215
index_id_patterns,
216+
root_only,
215217
)
216218
.await?;
217219
Ok(response)
@@ -239,6 +241,7 @@ impl JaegerService {
239241
operation_name,
240242
request_start,
241243
index_id_patterns,
244+
false,
242245
)
243246
.await?;
244247
Ok(response)
@@ -302,6 +305,7 @@ impl JaegerService {
302305
operation_name: &'static str,
303306
request_start: Instant,
304307
index_id_patterns: Vec<String>,
308+
root_only: bool,
305309
) -> Result<SpanStream, Status> {
306310
if trace_ids.is_empty() {
307311
let (_tx, rx) = mpsc::channel(1);
@@ -318,6 +322,15 @@ impl JaegerService {
318322
};
319323
query.should.push(term_query.into());
320324
}
325+
if root_only {
326+
// TODO this isn't backward compatible. We could do NOT is_root:false with a lenient
327+
// UserInputQuery once we support being lenient on missing fields
328+
let term_query = TermQuery {
329+
field: "is_root".to_string(),
330+
value: "true".to_string(),
331+
};
332+
query.must.push(term_query.into());
333+
}
321334

322335
let query_ast: QueryAst = query.into();
323336
let query_ast =
@@ -525,6 +538,9 @@ impl SpanReaderPlugin for JaegerService {
525538
"find_traces",
526539
Instant::now(),
527540
index_id_patterns,
541+
false, /* if we use true, Jaeger will display "1 Span", and display an empty trace
542+
* when clicking on the ui (but display the full trace after reloading the
543+
* page) */
528544
)
529545
.await
530546
.map(Response::new)
@@ -2162,6 +2178,7 @@ mod tests {
21622178
message: Some("An error occurred.".to_string()),
21632179
},
21642180
parent_span_id: Some(SpanId::new([3; 8])),
2181+
is_root: Some(false),
21652182
events: vec![QwEvent {
21662183
event_timestamp_nanos: 1000500003,
21672184
event_name: "event_name".to_string(),

quickwit/quickwit-opentelemetry/src/otlp/traces.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ use super::{
5151
use crate::otlp::metrics::OTLP_SERVICE_METRICS;
5252
use crate::otlp::{extract_attributes, SpanId, TraceId};
5353

54-
pub const OTEL_TRACES_INDEX_ID: &str = "otel-traces-v0_7";
54+
pub const OTEL_TRACES_INDEX_ID: &str = "otel-traces-v0_9";
5555
pub const OTEL_TRACES_INDEX_ID_PATTERN: &str = "otel-traces-v0_*";
5656

5757
const OTEL_TRACES_INDEX_CONFIG: &str = r#"
@@ -143,6 +143,10 @@ doc_mapping:
143143
input_format: hex
144144
output_format: hex
145145
indexed: false
146+
- name: is_root
147+
type: bool
148+
indexed: true
149+
stored: false
146150
- name: events
147151
type: array<json>
148152
tokenizer: raw
@@ -230,6 +234,8 @@ pub struct Span {
230234
pub span_status: SpanStatus,
231235
#[serde(skip_serializing_if = "Option::is_none")]
232236
pub parent_span_id: Option<SpanId>,
237+
#[serde(skip_serializing_if = "Option::is_none")]
238+
pub is_root: Option<bool>,
233239
#[serde(default)]
234240
#[serde(skip_serializing_if = "Vec::is_empty")]
235241
pub events: Vec<Event>,
@@ -311,6 +317,7 @@ impl Span {
311317
span_dropped_events_count: span.dropped_events_count,
312318
span_dropped_links_count: span.dropped_links_count,
313319
span_status: span.status.map(SpanStatus::from_otlp).unwrap_or_default(),
320+
is_root: Some(parent_span_id.is_none()),
314321
parent_span_id,
315322
events,
316323
event_names,
@@ -1267,6 +1274,7 @@ mod tests {
12671274
span_dropped_links_count: 0,
12681275
span_status: SpanStatus::default(),
12691276
parent_span_id: None,
1277+
is_root: Some(true),
12701278
events: Vec::new(),
12711279
event_names: Vec::new(),
12721280
links: Vec::new(),
@@ -1309,6 +1317,7 @@ mod tests {
13091317
message: None,
13101318
},
13111319
parent_span_id: Some(SpanId::new([3; 8])),
1320+
is_root: Some(false),
13121321
events: vec![Event {
13131322
event_timestamp_nanos: 1,
13141323
event_name: "event_name".to_string(),
@@ -1362,6 +1371,7 @@ mod tests {
13621371
span_dropped_links_count: 0,
13631372
span_status: SpanStatus::default(),
13641373
parent_span_id: None,
1374+
is_root: Some(true),
13651375
events: Vec::new(),
13661376
event_names: Vec::new(),
13671377
links: Vec::new(),

quickwit/quickwit-serve/src/jaeger_api/rest_handler.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ pub(crate) struct JaegerApi;
5656
///
5757
/// This is where all Jaeger handlers
5858
/// should be registered.
59-
/// Request are executed on the `otel traces v0_7` index.
59+
/// Request are executed on the `otel-traces-v0_*` indexes.
6060
pub(crate) fn jaeger_api_handlers(
6161
jaeger_service_opt: Option<JaegerService>,
6262
) -> impl Filter<Extract = (impl warp::Reply,), Error = Rejection> + Clone {
@@ -259,6 +259,7 @@ async fn jaeger_traces_search(
259259
"find_traces",
260260
Instant::now(),
261261
index_id_patterns,
262+
true,
262263
)
263264
.await
264265
.map_err(|error| {
@@ -351,7 +352,7 @@ mod tests {
351352
async fn test_when_jaeger_not_found() {
352353
let jaeger_api_handler = jaeger_api_handlers(None).recover(recover_fn);
353354
let resp = warp::test::request()
354-
.path("/otel-traces-v0_7/jaeger/api/services")
355+
.path("/otel-traces-v0_9/jaeger/api/services")
355356
.reply(&jaeger_api_handler)
356357
.await;
357358
let error_body = serde_json::from_slice::<HashMap<String, String>>(resp.body()).unwrap();
@@ -383,7 +384,7 @@ mod tests {
383384

384385
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
385386
let resp = warp::test::request()
386-
.path("/otel-traces-v0_7/jaeger/api/services")
387+
.path("/otel-traces-v0_9/jaeger/api/services")
387388
.reply(&jaeger_api_handler)
388389
.await;
389390
assert_eq!(resp.status(), 200);
@@ -419,7 +420,7 @@ mod tests {
419420
let jaeger = JaegerService::new(JaegerConfig::default(), mock_search_service);
420421
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
421422
let resp = warp::test::request()
422-
.path("/otel-traces-v0_7/jaeger/api/services/service1/operations")
423+
.path("/otel-traces-v0_9/jaeger/api/services/service1/operations")
423424
.reply(&jaeger_api_handler)
424425
.await;
425426
assert_eq!(resp.status(), 200);
@@ -467,7 +468,7 @@ mod tests {
467468
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
468469
let resp = warp::test::request()
469470
.path(
470-
"/otel-traces-v0_7/jaeger/api/traces?service=quickwit&\
471+
"/otel-traces-v0_9/jaeger/api/traces?service=quickwit&\
471472
operation=delete_splits_marked_for_deletion&minDuration=500us&maxDuration=1.2s&\
472473
tags=%7B%22tag.first%22%3A%22common%22%2C%22tag.second%22%3A%22true%22%7D&\
473474
limit=1&start=1702352106016000&end=1702373706016000&lookback=custom",
@@ -498,7 +499,7 @@ mod tests {
498499

499500
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
500501
let resp = warp::test::request()
501-
.path("/otel-traces-v0_7/jaeger/api/traces/1506026ddd216249555653218dc88a6c")
502+
.path("/otel-traces-v0_9/jaeger/api/traces/1506026ddd216249555653218dc88a6c")
502503
.reply(&jaeger_api_handler)
503504
.await;
504505

quickwit/rest-api-tests/scenarii/es_compatibility/0021-cat-indices.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ expected:
1818
#uuid: gharchive:01HN2SDANHDN6WFAFNH7BBMQ8C
1919
- index: otel-logs-v0_7
2020
docs.count: '0'
21-
- index: otel-traces-v0_7
21+
- index: otel-traces-v0_9
2222
docs.count: '0'
2323
---
2424
method: [GET]

0 commit comments

Comments
 (0)