mirror of
https://github.com/openobserve/openobserve.git
synced 2026-11-06 08:09:24 +00:00
fix: trace's span name (#3916)
This commit is contained in:
@@ -96,10 +96,7 @@ pub(crate) fn get_folder(query: &Query<HashMap<String, String>>) -> String {
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub(crate) fn get_or_create_trace_id_and_span(
|
||||
headers: &HeaderMap,
|
||||
ep: String,
|
||||
) -> (String, Option<tracing::Span>) {
|
||||
pub(crate) fn get_or_create_trace_id(headers: &HeaderMap, span: &Option<tracing::Span>) -> String {
|
||||
let cfg = config::get_config();
|
||||
if let Some(traceparent) = headers.get("traceparent") {
|
||||
if cfg.common.tracing_enabled || cfg.common.tracing_search_enabled {
|
||||
@@ -108,16 +105,10 @@ pub(crate) fn get_or_create_trace_id_and_span(
|
||||
propagator.extract(&RequestHeaderExtractor::new(headers))
|
||||
});
|
||||
let trace_id = ctx.span().span_context().trace_id().to_string();
|
||||
|
||||
let span = if cfg.common.tracing_search_enabled {
|
||||
// Create the span and set parent context
|
||||
let span = tracing::info_span!("{ep}", ep = ep);
|
||||
if let Some(span) = span {
|
||||
span.set_parent(ctx);
|
||||
Some(span)
|
||||
} else {
|
||||
None
|
||||
};
|
||||
(trace_id, span)
|
||||
}
|
||||
trace_id
|
||||
} else {
|
||||
// manually parse trace_id
|
||||
if let Ok(traceparent_str) = traceparent.to_str() {
|
||||
@@ -128,20 +119,18 @@ pub(crate) fn get_or_create_trace_id_and_span(
|
||||
// characters or all zeros), vendors MUST ignore the traceparent.
|
||||
// https://www.w3.org/TR/trace-context/#traceparent-header
|
||||
if trace_id.len() == 32 && !trace_id.chars().all(|c| c == '0') {
|
||||
return (trace_id, None);
|
||||
return trace_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
// If parsing fails or trace_id is invalid, generate a new one
|
||||
log::warn!("Failed to parse valid trace_id from received [Traceparent] header");
|
||||
(config::ider::uuid(), None)
|
||||
config::ider::uuid()
|
||||
}
|
||||
} else if cfg.common.tracing_search_enabled {
|
||||
let span = tracing::info_span!("{ep}", ep = ep);
|
||||
let trace_id = span.context().span().span_context().trace_id().to_string();
|
||||
(trace_id, Some(span))
|
||||
} else if let Some(span) = span {
|
||||
span.context().span().span_context().trace_id().to_string()
|
||||
} else {
|
||||
(config::ider::uuid(), None)
|
||||
config::ider::uuid()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ use crate::{
|
||||
utils::{
|
||||
functions,
|
||||
http::{
|
||||
get_or_create_trace_id_and_span, get_search_type_from_request,
|
||||
get_or_create_trace_id, get_search_type_from_request,
|
||||
get_stream_type_from_request, get_use_cache_from_request,
|
||||
},
|
||||
},
|
||||
@@ -142,8 +142,15 @@ pub async fn search(
|
||||
let org_id = org_id.into_inner();
|
||||
let mut range_error = String::new();
|
||||
let cfg = get_config();
|
||||
let (trace_id, http_span) =
|
||||
get_or_create_trace_id_and_span(in_req.headers(), format!("api/{org_id}/_search"));
|
||||
let http_span = if cfg.common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/_search",
|
||||
org_id = org_id.clone()
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
let query = web::Query::<HashMap<String, String>>::from_query(in_req.query_string()).unwrap();
|
||||
let stream_type = match get_stream_type_from_request(&query) {
|
||||
@@ -548,10 +555,16 @@ pub async fn around(
|
||||
let started_at = Utc::now().timestamp_micros();
|
||||
let (org_id, stream_name) = path.into_inner();
|
||||
let cfg = get_config();
|
||||
let (trace_id, http_span) = get_or_create_trace_id_and_span(
|
||||
in_req.headers(),
|
||||
format!("/api/{org_id}/{stream_name}/_around"),
|
||||
);
|
||||
let http_span = if cfg.common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/{stream_name}/_around",
|
||||
org_id = org_id.clone(),
|
||||
stream_name = stream_name.clone()
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
let mut uses_fn = false;
|
||||
let query = web::Query::<HashMap<String, String>>::from_query(in_req.query_string()).unwrap();
|
||||
@@ -885,10 +898,16 @@ pub async fn values(
|
||||
Some(v) => v.to_str().unwrap(),
|
||||
None => "",
|
||||
};
|
||||
let (trace_id, http_span) = get_or_create_trace_id_and_span(
|
||||
in_req.headers(),
|
||||
format!("/api/{org_id}/{stream_name}/_values"),
|
||||
);
|
||||
let http_span = if config::get_config().common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/{stream_name}/_values",
|
||||
org_id = org_id.clone(),
|
||||
stream_name = stream_name.clone()
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
if fields.len() == 1
|
||||
&& DISTINCT_FIELDS.contains(&fields[0])
|
||||
@@ -1471,10 +1490,15 @@ pub async fn search_partition(
|
||||
) -> Result<HttpResponse, Error> {
|
||||
let start = std::time::Instant::now();
|
||||
let cfg = get_config();
|
||||
let (trace_id, http_span) = get_or_create_trace_id_and_span(
|
||||
in_req.headers(),
|
||||
format!("/api/{org_id}/_search_partition"),
|
||||
);
|
||||
let http_span = if cfg.common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/_search_partition",
|
||||
org_id = org_id.clone(),
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
let org_id = org_id.into_inner();
|
||||
let query = web::Query::<HashMap<String, String>>::from_query(in_req.query_string()).unwrap();
|
||||
|
||||
@@ -36,7 +36,7 @@ use crate::{
|
||||
utils::{
|
||||
functions,
|
||||
http::{
|
||||
get_or_create_trace_id_and_span, get_search_type_from_request,
|
||||
get_or_create_trace_id, get_search_type_from_request,
|
||||
get_stream_type_from_request,
|
||||
},
|
||||
},
|
||||
@@ -119,8 +119,15 @@ pub async fn search_multi(
|
||||
let org_id = org_id.into_inner();
|
||||
let cfg = get_config();
|
||||
let started_at = Utc::now().timestamp_micros();
|
||||
let (trace_id, http_span) =
|
||||
get_or_create_trace_id_and_span(in_req.headers(), format!("/api/{org_id}/_search_multi"));
|
||||
let http_span = if cfg.common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/_search_multi",
|
||||
org_id = org_id.clone()
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
let query = web::Query::<HashMap<String, String>>::from_query(in_req.query_string()).unwrap();
|
||||
let stream_type = match get_stream_type_from_request(&query) {
|
||||
@@ -419,10 +426,15 @@ pub async fn _search_partition_multi(
|
||||
) -> Result<HttpResponse, Error> {
|
||||
let start = std::time::Instant::now();
|
||||
let cfg = get_config();
|
||||
let (trace_id, http_span) = get_or_create_trace_id_and_span(
|
||||
in_req.headers(),
|
||||
format!("/api/{org_id}/_search_partition_multi"),
|
||||
);
|
||||
let http_span = if cfg.common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/_search_partition_multi",
|
||||
org_id = org_id.clone()
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
let org_id = org_id.into_inner();
|
||||
let query = web::Query::<HashMap<String, String>>::from_query(in_req.query_string()).unwrap();
|
||||
@@ -555,10 +567,16 @@ pub async fn around_multi(
|
||||
let (org_id, stream_names) = path.into_inner();
|
||||
let cfg = get_config();
|
||||
|
||||
let (trace_id, http_span) = get_or_create_trace_id_and_span(
|
||||
in_req.headers(),
|
||||
format!("/api/{org_id}/{stream_names}/_around_multi"),
|
||||
);
|
||||
let http_span = if cfg.common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/{stream_names}/_around_multi",
|
||||
org_id = org_id.clone(),
|
||||
stream_names = stream_names.clone()
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
let stream_names = base64::decode_url(&stream_names)?;
|
||||
let mut uses_fn = false;
|
||||
|
||||
@@ -24,7 +24,7 @@ use tracing::Instrument;
|
||||
use crate::{
|
||||
common::{
|
||||
meta::{self, http::HttpResponse as MetaHttpResponse},
|
||||
utils::http::get_or_create_trace_id_and_span,
|
||||
utils::http::get_or_create_trace_id,
|
||||
},
|
||||
handler::http::request::{CONTENT_TYPE_JSON, CONTENT_TYPE_PROTO},
|
||||
service::{search as SearchService, traces::otlp_http},
|
||||
@@ -129,12 +129,19 @@ pub async fn get_latest_traces(
|
||||
path: web::Path<(String, String)>,
|
||||
in_req: HttpRequest,
|
||||
) -> Result<HttpResponse, Error> {
|
||||
let cfg = get_config();
|
||||
let start = std::time::Instant::now();
|
||||
let (org_id, stream_name) = path.into_inner();
|
||||
let (trace_id, http_span) = get_or_create_trace_id_and_span(
|
||||
in_req.headers(),
|
||||
format!("/api/{org_id}/{stream_name}/traces/latest"),
|
||||
);
|
||||
let http_span = if cfg.common.tracing_search_enabled {
|
||||
Some(tracing::info_span!(
|
||||
"/api/{org_id}/{stream_name}/traces/latest",
|
||||
org_id = org_id.clone(),
|
||||
stream_name = stream_name.clone()
|
||||
))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let trace_id = get_or_create_trace_id(in_req.headers(), &http_span);
|
||||
|
||||
let query = web::Query::<HashMap<String, String>>::from_query(in_req.query_string()).unwrap();
|
||||
|
||||
@@ -204,7 +211,6 @@ pub async fn get_latest_traces(
|
||||
metrics::QUERY_PENDING_NUMS
|
||||
.with_label_values(&[&org_id])
|
||||
.inc();
|
||||
let cfg = get_config();
|
||||
// get a local search queue lock
|
||||
#[cfg(not(feature = "enterprise"))]
|
||||
let locker = SearchService::QUEUE_LOCKER.clone();
|
||||
|
||||
@@ -62,12 +62,11 @@ static RE_ONLY_FROM: Lazy<Regex> = Lazy::new(|| Regex::new(r"(?i) from[ ]+query"
|
||||
|
||||
pub static RE_HISTOGRAM: Lazy<Regex> =
|
||||
Lazy::new(|| Regex::new(r"(?i)histogram\(([^\)]*)\)").unwrap());
|
||||
static RE_MATCH_ALL: Lazy<Regex> =
|
||||
static RE_MATCH_ALL_RAW: Lazy<Regex> =
|
||||
Lazy::new(|| Regex::new(r"(?i)match_all_raw\('([^']*)'\)").unwrap());
|
||||
static RE_MATCH_ALL_IGNORE_CASE: Lazy<Regex> =
|
||||
static RE_MATCH_ALL_RAW_IGNORE_CASE: Lazy<Regex> =
|
||||
Lazy::new(|| Regex::new(r"(?i)match_all_raw_ignore_case\('([^']*)'\)").unwrap());
|
||||
static RE_MATCH_ALL_INDEXED: Lazy<Regex> =
|
||||
Lazy::new(|| Regex::new(r"(?i)match_all\('([^']*)'\)").unwrap());
|
||||
static RE_MATCH_ALL: Lazy<Regex> = Lazy::new(|| Regex::new(r"(?i)match_all\('([^']*)'\)").unwrap());
|
||||
|
||||
pub static _TS_WITH_ALIAS: Lazy<Regex> =
|
||||
Lazy::new(|| Regex::new(r"\s*\(\s*_timestamp\s*\)?\s*").unwrap());
|
||||
@@ -494,13 +493,13 @@ impl Sql {
|
||||
if !token.to_lowercase().starts_with("match_all") {
|
||||
continue;
|
||||
}
|
||||
for cap in RE_MATCH_ALL.captures_iter(token) {
|
||||
for cap in RE_MATCH_ALL_RAW.captures_iter(token) {
|
||||
fulltext.push((cap[0].to_string(), cap[1].to_string()));
|
||||
}
|
||||
for cap in RE_MATCH_ALL_IGNORE_CASE.captures_iter(token) {
|
||||
for cap in RE_MATCH_ALL_RAW_IGNORE_CASE.captures_iter(token) {
|
||||
fulltext.push((cap[0].to_string(), cap[1].to_lowercase()));
|
||||
}
|
||||
for cap in RE_MATCH_ALL_INDEXED.captures_iter(token) {
|
||||
for cap in RE_MATCH_ALL.captures_iter(token) {
|
||||
indexed_text.push((cap[0].to_string(), cap[1].to_lowercase())); // since `terms` are indexed in lowercase
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user