Skip to content

Commit f78566b

Browse files
committed
Improve otel-smoke-test to use fake collector and also test trace propagation
Signed-off-by: Caleb Schoepp <caleb.schoepp@fermyon.com>
1 parent fbd1fd4 commit f78566b

File tree

6 files changed

+102
-73
lines changed

6 files changed

+102
-73
lines changed

crates/runtime-config/src/lib.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -389,12 +389,6 @@ impl FactorRuntimeConfigSource<ObserveFactor> for TomlRuntimeConfigSource<'_, '_
389389
}
390390
}
391391

392-
impl FactorRuntimeConfigSource<ObserveFactor> for TomlRuntimeConfigSource<'_, '_> {
393-
fn get_runtime_config(&mut self) -> anyhow::Result<Option<()>> {
394-
Ok(None)
395-
}
396-
}
397-
398392
impl RuntimeConfigSourceFinalizer for TomlRuntimeConfigSource<'_, '_> {
399393
fn finalize(&mut self) -> anyhow::Result<()> {
400394
Ok(self.toml.validate_all_keys_used()?)

tests/integration.rs

Lines changed: 53 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -155,74 +155,65 @@ mod integration_tests {
155155
Ok(())
156156
}
157157

158-
#[test]
159-
#[cfg(feature = "extern-dependencies-tests")]
160-
/// Test that basic otel tracing works
161-
fn otel_smoke_test() -> anyhow::Result<()> {
162-
use anyhow::Context;
158+
// TODO: Cleanup the fake collectors somehow
163159

164-
use crate::testcases::run_test_inited;
165-
run_test_inited(
166-
"otel-smoke-test",
167-
SpinConfig {
168-
binary_path: spin_binary(),
169-
spin_up_args: Vec::new(),
170-
app_type: SpinAppType::Http,
171-
},
172-
ServicesConfig::new(vec!["jaeger"])?,
173-
|env| {
174-
let otel_port = env
175-
.services_mut()
176-
.get_port(4318)?
177-
.context("expected a port for Jaeger")?;
178-
env.set_env_var(
179-
"OTEL_EXPORTER_OTLP_ENDPOINT",
180-
format!("http://localhost:{}", otel_port),
181-
);
182-
Ok(())
183-
},
184-
move |env| {
185-
let spin = env.runtime_mut();
186-
assert_spin_request(
187-
spin,
188-
Request::new(Method::Get, "/hello"),
189-
Response::new_with_body(200, "Hello, Fermyon!\n"),
190-
)?;
160+
#[tokio::test]
161+
// Test that basic otel tracing and context propagation works
162+
async fn otel_smoke_test() -> anyhow::Result<()> {
163+
let collector = FakeCollectorServer::start()
164+
.await
165+
.expect("fake collector server should start");
166+
let collector_endpoint = collector.endpoint().clone();
191167

192-
assert_eventually!(
193-
{
194-
let jaeger_port = env
195-
.services_mut()
196-
.get_port(16686)?
197-
.context("no jaeger port was exposed by test services")?;
198-
let url = format!("http://localhost:{jaeger_port}/api/traces?service=spin");
199-
match reqwest::blocking::get(&url).context("failed to get jaeger traces")? {
200-
resp if resp.status().is_success() => {
201-
let traces: Value =
202-
resp.json().context("failed to parse jaeger traces")?;
203-
let traces =
204-
traces.get("data").context("jaeger traces has no data")?;
205-
let traces =
206-
traces.as_array().context("jaeger traces is not an array")?;
207-
!traces.is_empty()
208-
}
209-
_resp => {
210-
eprintln!("failed to get jaeger traces:");
211-
false
212-
}
213-
}
214-
},
215-
20
216-
);
217-
Ok(())
218-
},
219-
)?;
168+
tokio::task::spawn_blocking(|| {
169+
run_test_inited(
170+
"otel-smoke-test",
171+
SpinConfig {
172+
binary_path: spin_binary(),
173+
spin_up_args: Vec::new(),
174+
app_type: SpinAppType::Http,
175+
},
176+
ServicesConfig::none(),
177+
|env| {
178+
env.set_env_var("OTEL_EXPORTER_OTLP_ENDPOINT", collector_endpoint);
179+
env.set_env_var("OTEL_EXPORTER_OTLP_TRACES_PROTOCOL", "grpc");
180+
env.set_env_var("OTEL_BSP_SCHEDULE_DELAY", "5");
181+
Ok(())
182+
},
183+
move |env| {
184+
let spin = env.runtime_mut();
185+
assert_spin_request(
186+
spin,
187+
Request::new(Method::Get, "/one"),
188+
Response::new(200),
189+
)?;
190+
191+
let mut spans: Vec<ExportedSpan>;
192+
assert_eventually!(
193+
{
194+
spans = collector.exported_spans();
195+
!spans.is_empty()
196+
},
197+
5
198+
);
199+
200+
assert_eq!(spans.len(), 5);
201+
202+
// They're all part of the same trace which implies context propagation is working
203+
assert!(spans
204+
.iter()
205+
.map(|s| s.trace_id.clone())
206+
.all(|t| t == spans[0].trace_id));
207+
208+
Ok(())
209+
},
210+
)
211+
})
212+
.await??;
220213

221214
Ok(())
222215
}
223216

224-
// TODO: Cleanup the fake collectors somehow
225-
226217
#[tokio::test]
227218
async fn wasi_observe_nested_spans() -> anyhow::Result<()> {
228219
let collector = FakeCollectorServer::start()

tests/test-components/components/Cargo.lock

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[package]
2+
name = "otel-smoke-test"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[lib]
7+
crate-type = ["cdylib"]
8+
9+
[dependencies]
10+
anyhow = "1"
11+
http = "0.2"
12+
spin-sdk = "2.2.0"
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
use spin_sdk::{
2+
http::{Method, Params, Request, Response, Router},
3+
http_component,
4+
};
5+
6+
#[http_component]
7+
fn handle(req: http::Request<()>) -> Response {
8+
let mut router = Router::new();
9+
router.get_async("/one", one);
10+
router.get_async("/two", two);
11+
router.handle(req)
12+
}
13+
14+
async fn one(_req: Request, _params: Params) -> Response {
15+
let req = Request::builder().method(Method::Get).uri("/two").build();
16+
let _res: Response = spin_sdk::http::send(req).await.unwrap();
17+
Response::new(200, "")
18+
}
19+
20+
async fn two(_req: Request, _params: Params) -> Response {
21+
Response::new(201, "")
22+
}
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
spin_version = "1"
22
authors = ["Fermyon Engineering <engineering@fermyon.com>"]
3-
description = "A simple application that returns hello and goodbye."
4-
name = "head-rust-sdk-http"
3+
description = "A simple application that tests otel."
4+
name = "otel-smoke-test"
55
trigger = { type = "http" }
66
version = "1.0.0"
77

88
[[component]]
9-
id = "hello"
10-
source = "%{source=hello-world}"
9+
id = "otel"
10+
source = "%{source=otel-smoke-test}"
11+
allowed_outbound_hosts = ["http://self"]
1112
[component.trigger]
12-
route = "/hello/..."
13+
route = "/..."

0 commit comments

Comments
 (0)