feat: expose OTEL trace context as env vars in job execution (#8277)

This commit is contained in:
Ruben Fiszel
2026-03-09 16:12:39 +00:00
committed by GitHub
parent 825df2161e
commit 93f75ada5e
3 changed files with 36 additions and 5 deletions
+3 -1
View File
@@ -618,6 +618,7 @@ async fn run<'a>(
.env("BASE_INTERNAL_URL", base_internal_url)
.envs(envs)
.envs(reserved_variables)
.envs(crate::get_otel_context_envs(&job.id))
.args(vec![
"--config",
"run.config.proto",
@@ -675,7 +676,8 @@ async fn run<'a>(
.env("HOME", &*JAVA_HOME_DIR)
.env("BASE_INTERNAL_URL", base_internal_url)
.envs(envs)
.envs(reserved_variables);
.envs(reserved_variables)
.envs(crate::get_otel_context_envs(&job.id));
if metadata(TRUST_STORE_PATH.clone()).await.is_ok() {
cmd.args(&[
&format!("-Djavax.net.ssl.trustStore={}", *TRUST_STORE_PATH),
+3 -1
View File
@@ -22,7 +22,7 @@ use crate::{
get_reserved_variables, read_result, start_child_process, MaybeLock, OccupancyMetrics,
},
handle_child::handle_child,
COMPOSER_CACHE_DIR, COMPOSER_PATH, is_sandboxing_enabled, DISABLE_NUSER, NSJAIL_PATH, PHP_PATH,
is_sandboxing_enabled, COMPOSER_CACHE_DIR, COMPOSER_PATH, DISABLE_NUSER, NSJAIL_PATH, PHP_PATH,
};
use windmill_common::client::AuthedClient;
@@ -316,6 +316,7 @@ try {{
.env_clear()
.envs(envs)
.envs(reserved_variables)
.envs(crate::get_otel_context_envs(&job.id))
.env("COMPOSER_HOME", &*COMPOSER_CACHE_DIR)
.env("BASE_INTERNAL_URL", base_internal_url)
.args(args)
@@ -332,6 +333,7 @@ try {{
.env_clear()
.envs(envs)
.envs(reserved_variables)
.envs(crate::get_otel_context_envs(&job.id))
.env("COMPOSER_HOME", &*COMPOSER_CACHE_DIR)
.env("BASE_INTERNAL_URL", base_internal_url)
.stdin(Stdio::null())
+30 -3
View File
@@ -740,6 +740,24 @@ pub async fn is_otel_tracing_proxy_enabled_for_lang(lang: &ScriptLang) -> bool {
}
}
/// Get OTEL trace context environment variables for a job (TRACEPARENT, OTEL_TRACE_ID, OTEL_SPAN_ID).
/// Returns an empty vec when OTEL tracing is not enabled or on non-enterprise builds.
pub fn get_otel_context_envs(job_id: &uuid::Uuid) -> Vec<(&'static str, String)> {
#[cfg(all(feature = "private", feature = "enterprise"))]
if windmill_common::OTEL_TRACING_ENABLED.load(std::sync::atomic::Ordering::Relaxed) {
let trace_id = format!("{:032x}", job_id.as_u128());
let span_id = format!("{:016x}", job_id.as_u64_pair().1);
let traceparent = format!("00-{}-{}-01", trace_id, span_id);
return vec![
("TRACEPARENT", traceparent),
("OTEL_TRACE_ID", trace_id),
("OTEL_SPAN_ID", span_id),
];
}
let _ = job_id;
vec![]
}
/// Get proxy environment variables for job execution for a specific language.
/// When OTEL tracing proxy is enabled for this language, routes all traffic through the proxy.
/// Otherwise, uses the standard HTTP_PROXY/HTTPS_PROXY from environment.
@@ -749,12 +767,21 @@ pub async fn get_proxy_envs_for_lang(
w_id: &str,
conn: &Connection,
) -> anyhow::Result<Vec<(&'static str, String)>> {
#[allow(unused_mut)]
let mut envs;
#[cfg(all(feature = "private", feature = "enterprise"))]
if is_otel_tracing_proxy_enabled_for_lang(lang).await {
return get_otel_tracing_proxy_envs(job_id, w_id, conn).await;
envs = get_otel_tracing_proxy_envs(job_id, w_id, conn).await?;
} else {
envs = PROXY_ENVS.clone();
}
let _ = (lang, job_id, w_id, conn);
Ok(PROXY_ENVS.clone())
#[cfg(not(all(feature = "private", feature = "enterprise")))]
{
let _ = (lang, w_id, conn);
envs = PROXY_ENVS.clone();
}
envs.extend(get_otel_context_envs(job_id));
Ok(envs)
}
#[cfg(all(feature = "private", feature = "enterprise"))]