Skip to content

Commit 75b03fa

Browse files
committed
Get tests compiling and move processor to init and make processor batch
Signed-off-by: Caleb Schoepp <[email protected]>
1 parent 38cd9f9 commit 75b03fa

File tree

9 files changed

+572
-336
lines changed

9 files changed

+572
-336
lines changed

crates/factor-otel/src/lib.rs

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,17 @@ use opentelemetry::{
1414
};
1515
use opentelemetry_sdk::{
1616
resource::{EnvResourceDetector, TelemetryResourceDetector},
17-
trace::{SimpleSpanProcessor, SpanProcessor},
17+
runtime::Tokio,
18+
trace::{BatchSpanProcessor, SpanProcessor},
1819
Resource,
1920
};
2021
use spin_factors::{Factor, PrepareContext, RuntimeFactors, SelfInstanceBuilder};
2122
use spin_telemetry::{detector::SpinResourceDetector, env::OtlpProtocol};
2223
use tracing_opentelemetry::OpenTelemetrySpanExt;
2324

24-
#[derive(Default)]
25-
pub struct OtelFactor {}
25+
pub struct OtelFactor {
26+
processor: Arc<BatchSpanProcessor<Tokio>>,
27+
}
2628

2729
impl Factor for OtelFactor {
2830
type RuntimeConfig = ();
@@ -48,6 +50,19 @@ impl Factor for OtelFactor {
4850
&self,
4951
_: spin_factors::PrepareContext<T, Self>,
5052
) -> anyhow::Result<Self::InstanceBuilder> {
53+
Ok(InstanceState {
54+
state: Arc::new(RwLock::new(State {
55+
guest_span_contexts: Default::default(),
56+
active_spans: Default::default(),
57+
original_host_span_id: None,
58+
})),
59+
processor: self.processor.clone(),
60+
})
61+
}
62+
}
63+
64+
impl OtelFactor {
65+
pub fn new() -> anyhow::Result<Self> {
5166
// TODO: Configuring the processor should move to init
5267
// This will configure the exporter based on the OTEL_EXPORTER_* environment variables.
5368
let exporter = match OtlpProtocol::traces_protocol_from_env() {
@@ -59,40 +74,34 @@ impl Factor for OtelFactor {
5974
.build()?,
6075
OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"),
6176
};
62-
let mut processor = opentelemetry_sdk::trace::SimpleSpanProcessor::new(Box::new(exporter));
63-
// TODO: Allow guest to dynamically set resource of the processor?
77+
let mut processor = opentelemetry_sdk::trace::BatchSpanProcessor::builder(
78+
exporter,
79+
opentelemetry_sdk::runtime::Tokio,
80+
)
81+
.build();
82+
// This is a hack b/c we know the version of this crate will be the same as the version of Spin
83+
let spin_version = env!("CARGO_PKG_VERSION").to_string();
6484
processor.set_resource(&Resource::from_detectors(
6585
Duration::from_secs(5),
6686
vec![
6787
// Set service.name from env OTEL_SERVICE_NAME > env OTEL_RESOURCE_ATTRIBUTES > spin
6888
// Set service.version from Spin metadata
69-
Box::new(SpinResourceDetector::new("27.0.1 todo".to_string())),
89+
Box::new(SpinResourceDetector::new(spin_version)),
7090
// Sets fields from env OTEL_RESOURCE_ATTRIBUTES
7191
Box::new(EnvResourceDetector::new()),
7292
// Sets telemetry.sdk{name, language, version}
7393
Box::new(TelemetryResourceDetector),
7494
],
7595
));
76-
Ok(InstanceState {
77-
state: Arc::new(RwLock::new(State {
78-
guest_span_contexts: Default::default(),
79-
active_spans: Default::default(),
80-
original_host_span_id: None,
81-
})),
82-
processor,
96+
Ok(Self {
97+
processor: Arc::new(processor),
8398
})
8499
}
85100
}
86101

87-
impl OtelFactor {
88-
pub fn new() -> Self {
89-
Self::default()
90-
}
91-
}
92-
93102
pub struct InstanceState {
94103
pub(crate) state: Arc<RwLock<State>>,
95-
pub(crate) processor: SimpleSpanProcessor,
104+
pub(crate) processor: Arc<BatchSpanProcessor<Tokio>>,
96105
}
97106

98107
impl SelfInstanceBuilder for InstanceState {}

crates/runtime-factors/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl TriggerFactors {
4444
allow_transient_writes: bool,
4545
) -> anyhow::Result<Self> {
4646
Ok(Self {
47-
otel: OtelFactor::new(),
47+
otel: OtelFactor::new()?,
4848
wasi: wasi_factor(working_dir, allow_transient_writes),
4949
variables: VariablesFactor::default(),
5050
key_value: KeyValueFactor::new(),

tests/integration.rs

Lines changed: 7 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,71 +1522,6 @@ mod otel_integration_tests {
15221522
Ok(())
15231523
}
15241524

1525-
#[test]
1526-
fn wasi_otel_drop_semantics() -> anyhow::Result<()> {
1527-
let rt = tokio::runtime::Runtime::new()?;
1528-
let mut collector = rt
1529-
.block_on(FakeCollectorServer::start())
1530-
.expect("fake collector server should start");
1531-
let collector_endpoint = collector.endpoint().clone();
1532-
1533-
run_test_inited(
1534-
"wasi-otel-tracing",
1535-
SpinConfig {
1536-
binary_path: spin_binary(),
1537-
spin_up_args: Vec::new(),
1538-
app_type: SpinAppType::Http,
1539-
},
1540-
ServicesConfig::none(),
1541-
|env| {
1542-
env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint);
1543-
env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc");
1544-
env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5");
1545-
Ok(())
1546-
},
1547-
move |env| {
1548-
let spin = env.runtime_mut();
1549-
assert_spin_request(
1550-
spin,
1551-
Request::new(Method::Get, "/drop-semantics"),
1552-
Response::new(200),
1553-
)?;
1554-
1555-
let spans = rt.block_on(collector.exported_spans(3, Duration::from_secs(5)));
1556-
1557-
assert_eq!(spans.len(), 3);
1558-
1559-
let handle_request_span = spans
1560-
.iter()
1561-
.find(|s| s.name == "GET /...")
1562-
.expect("'GET /...' span should exist");
1563-
let exec_component_span = spans
1564-
.iter()
1565-
.find(|s| s.name == "execute_wasm_component wasi-otel-tracing")
1566-
.expect("'execute_wasm_component wasi-otel-tracing' span should exist");
1567-
let drop_span = spans
1568-
.iter()
1569-
.find(|s| s.name == "drop_semantics")
1570-
.expect("'drop_semantics' span should exist");
1571-
1572-
assert!(
1573-
handle_request_span.trace_id == exec_component_span.trace_id
1574-
&& exec_component_span.trace_id == drop_span.trace_id
1575-
);
1576-
assert_eq!(
1577-
exec_component_span.parent_span_id,
1578-
handle_request_span.span_id
1579-
);
1580-
assert_eq!(drop_span.parent_span_id, exec_component_span.span_id);
1581-
assert!(drop_span.end_time_unix_nano < exec_component_span.end_time_unix_nano);
1582-
1583-
Ok(())
1584-
},
1585-
)?;
1586-
1587-
Ok(())
1588-
}
1589-
15901525
#[test]
15911526
fn wasi_otel_setting_attributes() -> anyhow::Result<()> {
15921527
let rt = tokio::runtime::Runtime::new()?;
@@ -1834,63 +1769,6 @@ mod otel_integration_tests {
18341769
Ok(())
18351770
}
18361771

1837-
#[test]
1838-
fn wasi_otel_child_outlives_parent() -> anyhow::Result<()> {
1839-
let rt = tokio::runtime::Runtime::new()?;
1840-
let mut collector = rt
1841-
.block_on(FakeCollectorServer::start())
1842-
.expect("fake collector server should start");
1843-
let collector_endpoint = collector.endpoint().clone();
1844-
1845-
run_test_inited(
1846-
"wasi-otel-tracing",
1847-
SpinConfig {
1848-
binary_path: spin_binary(),
1849-
spin_up_args: Vec::new(),
1850-
app_type: SpinAppType::Http,
1851-
},
1852-
ServicesConfig::none(),
1853-
|env| {
1854-
env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", collector_endpoint);
1855-
env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc");
1856-
env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5");
1857-
Ok(())
1858-
},
1859-
move |env| {
1860-
let spin = env.runtime_mut();
1861-
assert_spin_request(
1862-
spin,
1863-
Request::new(Method::Get, "/child-outlives-parent"),
1864-
Response::new(200),
1865-
)?;
1866-
1867-
let spans = rt.block_on(collector.exported_spans(5, Duration::from_secs(5)));
1868-
1869-
assert_eq!(spans.len(), 5);
1870-
1871-
let parent_span = spans
1872-
.iter()
1873-
.find(|s| s.name == "parent")
1874-
.expect("'parent' span should exist");
1875-
let child_span = spans
1876-
.iter()
1877-
.find(|s| s.name == "child")
1878-
.expect("'child' span should exist");
1879-
let get_span = spans
1880-
.iter()
1881-
.find(|s| s.name == "GET")
1882-
.expect("'GET' span should exist");
1883-
assert_eq!(child_span.parent_span_id, parent_span.span_id);
1884-
assert_eq!(get_span.parent_span_id, child_span.span_id);
1885-
assert!(child_span.end_time_unix_nano > parent_span.end_time_unix_nano);
1886-
1887-
Ok(())
1888-
},
1889-
)?;
1890-
1891-
Ok(())
1892-
}
1893-
18941772
#[test]
18951773
fn wasi_otel_root_span() -> anyhow::Result<()> {
18961774
let rt = tokio::runtime::Runtime::new()?;
@@ -1923,38 +1801,20 @@ mod otel_integration_tests {
19231801

19241802
let spans = rt.block_on(collector.exported_spans(7, Duration::from_secs(5)));
19251803

1926-
assert_eq!(spans.len(), 7);
1804+
assert_eq!(spans.len(), 4);
19271805

1928-
let parent_span = spans
1929-
.iter()
1930-
.find(|s| s.name == "parent")
1931-
.expect("'parent' span should exist");
1932-
let request_one = spans
1933-
.iter()
1934-
.find(|s| s.name == "GET")
1935-
.expect("first 'GET' span should exist");
19361806
let root_span = spans
19371807
.iter()
19381808
.find(|s| s.name == "root")
19391809
.expect("'root' span should exist");
1940-
let request_two = spans
1941-
.iter()
1942-
.filter(|s| s.name == "GET")
1943-
.nth(1)
1944-
.expect("second 'GET' span should exist");
1945-
let request_three = spans
1810+
let request_span = spans
19461811
.iter()
1947-
.filter(|s| s.name == "GET")
1948-
.nth(2)
1949-
.expect("third 'GET' span should exist");
1950-
1951-
assert_eq!(parent_span.trace_id, request_one.trace_id);
1952-
assert_ne!(root_span.trace_id, parent_span.trace_id);
1953-
assert_eq!(root_span.trace_id, request_two.trace_id);
1954-
assert_eq!(parent_span.trace_id, request_three.trace_id);
1812+
.find(|s| s.name == "GET")
1813+
.expect("'GET' span should exist");
1814+
1815+
assert_eq!(root_span.trace_id, request_span.trace_id);
1816+
assert_eq!(root_span.span_id, request_span.parent_span_id);
19551817
assert_eq!(root_span.parent_span_id, "".to_string());
1956-
assert_eq!(request_two.parent_span_id, root_span.span_id);
1957-
assert_ne!(request_three.parent_span_id, parent_span.span_id);
19581818

19591819
Ok(())
19601820
},

0 commit comments

Comments
 (0)