Skip to content

Commit 67091c5

Browse files
only return root spans for jaeger http api (#5358)
* only return root spans for jaeger http api * fix rest api tests
1 parent 7e6d4fc commit 67091c5

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
@@ -191,6 +191,7 @@ impl JaegerService {
191191
operation_name: &'static str,
192192
request_start: Instant,
193193
index_id_patterns: Vec<String>,
194+
root_only: bool,
194195
) -> JaegerResult<SpanStream> {
195196
debug!(request=?request, "`find_traces` request");
196197

@@ -210,6 +211,7 @@ impl JaegerService {
210211
operation_name,
211212
request_start,
212213
index_id_patterns,
214+
root_only,
213215
)
214216
.await?;
215217
Ok(response)
@@ -237,6 +239,7 @@ impl JaegerService {
237239
operation_name,
238240
request_start,
239241
index_id_patterns,
242+
false,
240243
)
241244
.await?;
242245
Ok(response)
@@ -300,6 +303,7 @@ impl JaegerService {
300303
operation_name: &'static str,
301304
request_start: Instant,
302305
index_id_patterns: Vec<String>,
306+
root_only: bool,
303307
) -> Result<SpanStream, Status> {
304308
if trace_ids.is_empty() {
305309
let (_tx, rx) = mpsc::channel(1);
@@ -316,6 +320,15 @@ impl JaegerService {
316320
};
317321
query.should.push(term_query.into());
318322
}
323+
if root_only {
324+
// TODO this isn't backward compatible. We could do NOT is_root:false with a lenient
325+
// UserInputQuery once we support being lenient on missing fields
326+
let term_query = TermQuery {
327+
field: "is_root".to_string(),
328+
value: "true".to_string(),
329+
};
330+
query.must.push(term_query.into());
331+
}
319332

320333
let query_ast: QueryAst = query.into();
321334
let query_ast =
@@ -523,6 +536,9 @@ impl SpanReaderPlugin for JaegerService {
523536
"find_traces",
524537
Instant::now(),
525538
index_id_patterns,
539+
false, /* if we use true, Jaeger will display "1 Span", and display an empty trace
540+
* when clicking on the ui (but display the full trace after reloading the
541+
* page) */
526542
)
527543
.await
528544
.map(Response::new)
@@ -2160,6 +2176,7 @@ mod tests {
21602176
message: Some("An error occurred.".to_string()),
21612177
},
21622178
parent_span_id: Some(SpanId::new([3; 8])),
2179+
is_root: Some(false),
21632180
events: vec![QwEvent {
21642181
event_timestamp_nanos: 1000500003,
21652182
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
@@ -52,7 +52,7 @@ use super::{
5252
use crate::otlp::metrics::OTLP_SERVICE_METRICS;
5353
use crate::otlp::{extract_attributes, SpanId, TraceId};
5454

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

5858
const OTEL_TRACES_INDEX_CONFIG: &str = r#"
@@ -144,6 +144,10 @@ doc_mapping:
144144
input_format: hex
145145
output_format: hex
146146
indexed: false
147+
- name: is_root
148+
type: bool
149+
indexed: true
150+
stored: false
147151
- name: events
148152
type: array<json>
149153
tokenizer: raw
@@ -231,6 +235,8 @@ pub struct Span {
231235
pub span_status: SpanStatus,
232236
#[serde(skip_serializing_if = "Option::is_none")]
233237
pub parent_span_id: Option<SpanId>,
238+
#[serde(skip_serializing_if = "Option::is_none")]
239+
pub is_root: Option<bool>,
234240
#[serde(default)]
235241
#[serde(skip_serializing_if = "Vec::is_empty")]
236242
pub events: Vec<Event>,
@@ -312,6 +318,7 @@ impl Span {
312318
span_dropped_events_count: span.dropped_events_count,
313319
span_dropped_links_count: span.dropped_links_count,
314320
span_status: span.status.map(SpanStatus::from_otlp).unwrap_or_default(),
321+
is_root: Some(parent_span_id.is_none()),
315322
parent_span_id,
316323
events,
317324
event_names,
@@ -1278,6 +1285,7 @@ mod tests {
12781285
span_dropped_links_count: 0,
12791286
span_status: SpanStatus::default(),
12801287
parent_span_id: None,
1288+
is_root: Some(true),
12811289
events: Vec::new(),
12821290
event_names: Vec::new(),
12831291
links: Vec::new(),
@@ -1320,6 +1328,7 @@ mod tests {
13201328
message: None,
13211329
},
13221330
parent_span_id: Some(SpanId::new([3; 8])),
1331+
is_root: Some(false),
13231332
events: vec![Event {
13241333
event_timestamp_nanos: 1,
13251334
event_name: "event_name".to_string(),
@@ -1373,6 +1382,7 @@ mod tests {
13731382
span_dropped_links_count: 0,
13741383
span_status: SpanStatus::default(),
13751384
parent_span_id: None,
1385+
is_root: Some(true),
13761386
events: Vec::new(),
13771387
event_names: Vec::new(),
13781388
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
@@ -57,7 +57,7 @@ pub(crate) struct JaegerApi;
5757
///
5858
/// This is where all Jaeger handlers
5959
/// should be registered.
60-
/// Request are executed on the `otel traces v0_7` index.
60+
/// Request are executed on the `otel-traces-v0_*` indexes.
6161
pub(crate) fn jaeger_api_handlers(
6262
jaeger_service_opt: Option<JaegerService>,
6363
) -> impl Filter<Extract = (impl warp::Reply,), Error = Rejection> + Clone {
@@ -261,6 +261,7 @@ async fn jaeger_traces_search(
261261
"find_traces",
262262
Instant::now(),
263263
index_id_patterns,
264+
true,
264265
)
265266
.await
266267
.map_err(|error| {
@@ -353,7 +354,7 @@ mod tests {
353354
async fn test_when_jaeger_not_found() {
354355
let jaeger_api_handler = jaeger_api_handlers(None).recover(crate::rest::recover_fn_final);
355356
let resp = warp::test::request()
356-
.path("/otel-traces-v0_7/jaeger/api/services")
357+
.path("/otel-traces-v0_9/jaeger/api/services")
357358
.reply(&jaeger_api_handler)
358359
.await;
359360
assert_eq!(resp.status(), 404);
@@ -385,7 +386,7 @@ mod tests {
385386

386387
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
387388
let resp = warp::test::request()
388-
.path("/otel-traces-v0_7/jaeger/api/services")
389+
.path("/otel-traces-v0_9/jaeger/api/services")
389390
.reply(&jaeger_api_handler)
390391
.await;
391392
assert_eq!(resp.status(), 200);
@@ -421,7 +422,7 @@ mod tests {
421422
let jaeger = JaegerService::new(JaegerConfig::default(), mock_search_service);
422423
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
423424
let resp = warp::test::request()
424-
.path("/otel-traces-v0_7/jaeger/api/services/service1/operations")
425+
.path("/otel-traces-v0_9/jaeger/api/services/service1/operations")
425426
.reply(&jaeger_api_handler)
426427
.await;
427428
assert_eq!(resp.status(), 200);
@@ -469,7 +470,7 @@ mod tests {
469470
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
470471
let resp = warp::test::request()
471472
.path(
472-
"/otel-traces-v0_7/jaeger/api/traces?service=quickwit&\
473+
"/otel-traces-v0_9/jaeger/api/traces?service=quickwit&\
473474
operation=delete_splits_marked_for_deletion&minDuration=500us&maxDuration=1.2s&\
474475
tags=%7B%22tag.first%22%3A%22common%22%2C%22tag.second%22%3A%22true%22%7D&\
475476
limit=1&start=1702352106016000&end=1702373706016000&lookback=custom",
@@ -500,7 +501,7 @@ mod tests {
500501

501502
let jaeger_api_handler = jaeger_api_handlers(Some(jaeger)).recover(recover_fn);
502503
let resp = warp::test::request()
503-
.path("/otel-traces-v0_7/jaeger/api/traces/1506026ddd216249555653218dc88a6c")
504+
.path("/otel-traces-v0_9/jaeger/api/traces/1506026ddd216249555653218dc88a6c")
504505
.reply(&jaeger_api_handler)
505506
.await;
506507

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
@@ -22,7 +22,7 @@ expected:
2222
#uuid: gharchive:01HN2SDANHDN6WFAFNH7BBMQ8C
2323
- index: otel-logs-v0_7
2424
docs.count: '0'
25-
- index: otel-traces-v0_7
25+
- index: otel-traces-v0_9
2626
docs.count: '0'
2727
---
2828
method: [GET]

0 commit comments

Comments
 (0)