Skip to content

Commit d966e97

Browse files
committed
Refactor WIT and update dependent code
Signed-off-by: Caleb Schoepp <caleb.schoepp@fermyon.com>
1 parent ea09e90 commit d966e97

File tree

6 files changed

+86
-107
lines changed

6 files changed

+86
-107
lines changed

crates/factor-observe/src/host.rs

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,20 @@ use opentelemetry::trace::Tracer;
88
use opentelemetry::Context;
99
use spin_core::async_trait;
1010
use spin_core::wasmtime::component::Resource;
11-
use spin_world::wasi::observe::traces;
11+
use spin_world::wasi::observe::tracer;
1212
use tracing_opentelemetry::OpenTelemetrySpanExt;
1313

1414
use crate::{GuestSpan, InstanceState};
1515

1616
#[async_trait]
17-
impl traces::Host for InstanceState {}
18-
19-
#[async_trait]
20-
impl traces::HostSpan for InstanceState {
17+
impl tracer::Host for InstanceState {
2118
// TODO(Caleb): Make this implicit logic make more sense (the indexmap seems wrong)
2219
// TODO(Caleb): Properly implement this
2320
async fn start(
2421
&mut self,
2522
name: String,
26-
_options: Option<traces::StartOptions>,
27-
) -> Result<Resource<traces::Span>> {
23+
_options: Option<tracer::StartOptions>,
24+
) -> Result<Resource<tracer::Span>> {
2825
let mut state = self.state.write().unwrap();
2926

3027
if state.active_spans.is_empty() {
@@ -65,19 +62,22 @@ impl traces::HostSpan for InstanceState {
6562

6663
Ok(Resource::new_own(resource_id))
6764
}
65+
}
6866

67+
#[async_trait]
68+
impl tracer::HostSpan for InstanceState {
6969
async fn span_context(
7070
&mut self,
71-
resource: Resource<traces::Span>,
72-
) -> Result<traces::SpanContext> {
71+
resource: Resource<tracer::Span>,
72+
) -> Result<tracer::SpanContext> {
7373
if let Some(guest_span) = self.state.read().unwrap().guest_spans.get(resource.rep()) {
7474
Ok(guest_span.inner.span_context().clone().into())
7575
} else {
7676
Err(anyhow!("BUG: cannot find resource in table"))
7777
}
7878
}
7979

80-
async fn is_recording(&mut self, resource: Resource<traces::Span>) -> Result<bool> {
80+
async fn is_recording(&mut self, resource: Resource<tracer::Span>) -> Result<bool> {
8181
if let Some(guest_span) = self.state.read().unwrap().guest_spans.get(resource.rep()) {
8282
Ok(guest_span.inner.is_recording())
8383
} else {
@@ -87,8 +87,8 @@ impl traces::HostSpan for InstanceState {
8787

8888
async fn set_attributes(
8989
&mut self,
90-
resource: Resource<traces::Span>,
91-
attributes: Vec<traces::KeyValue>,
90+
resource: Resource<tracer::Span>,
91+
attributes: Vec<tracer::KeyValue>,
9292
) -> Result<()> {
9393
if let Some(guest_span) = self
9494
.state
@@ -108,10 +108,10 @@ impl traces::HostSpan for InstanceState {
108108

109109
async fn add_event(
110110
&mut self,
111-
resource: Resource<traces::Span>,
111+
resource: Resource<tracer::Span>,
112112
name: String,
113-
timestamp: Option<traces::Datetime>,
114-
attributes: Option<Vec<traces::KeyValue>>,
113+
timestamp: Option<tracer::Datetime>,
114+
attributes: Option<Vec<tracer::KeyValue>>,
115115
) -> Result<()> {
116116
if let Some(guest_span) = self
117117
.state
@@ -144,8 +144,8 @@ impl traces::HostSpan for InstanceState {
144144

145145
async fn add_link(
146146
&mut self,
147-
resource: Resource<traces::Span>,
148-
link: traces::Link,
147+
resource: Resource<tracer::Span>,
148+
link: tracer::Link,
149149
) -> Result<()> {
150150
if let Some(guest_span) = self
151151
.state
@@ -166,8 +166,8 @@ impl traces::HostSpan for InstanceState {
166166

167167
async fn set_status(
168168
&mut self,
169-
resource: Resource<traces::Span>,
170-
status: traces::Status,
169+
resource: Resource<tracer::Span>,
170+
status: tracer::Status,
171171
) -> Result<()> {
172172
if let Some(guest_span) = self
173173
.state
@@ -183,7 +183,7 @@ impl traces::HostSpan for InstanceState {
183183
}
184184
}
185185

186-
async fn update_name(&mut self, resource: Resource<traces::Span>, name: String) -> Result<()> {
186+
async fn update_name(&mut self, resource: Resource<tracer::Span>, name: String) -> Result<()> {
187187
if let Some(guest_span) = self
188188
.state
189189
.write()
@@ -200,8 +200,8 @@ impl traces::HostSpan for InstanceState {
200200

201201
async fn end(
202202
&mut self,
203-
resource: Resource<traces::Span>,
204-
timestamp: Option<traces::Datetime>,
203+
resource: Resource<tracer::Span>,
204+
timestamp: Option<tracer::Datetime>,
205205
) -> Result<()> {
206206
if let Some(guest_span) = self
207207
.state
@@ -221,7 +221,7 @@ impl traces::HostSpan for InstanceState {
221221
}
222222
}
223223

224-
fn drop(&mut self, _: Resource<traces::Span>) -> Result<()> {
224+
fn drop(&mut self, _: Resource<tracer::Span>) -> Result<()> {
225225
// Dropping the resource automatically calls drop on the Span which ends itself with the current timestamp
226226
Ok(())
227227
}

crates/factor-observe/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ impl Factor for ObserveFactor {
2323
&mut self,
2424
mut ctx: spin_factors::InitContext<T, Self>,
2525
) -> anyhow::Result<()> {
26-
ctx.link_bindings(spin_world::wasi::observe::traces::add_to_linker)?;
26+
ctx.link_bindings(spin_world::wasi::observe::tracer::add_to_linker)?;
2727
Ok(())
2828
}
2929

crates/world/src/conversions.rs

Lines changed: 39 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -223,85 +223,74 @@ mod observe {
223223
use super::*;
224224
use opentelemetry::StringValue;
225225
use std::time::{Duration, SystemTime, UNIX_EPOCH};
226-
use wasi::observe::traces;
226+
use wasi::observe::tracer;
227227

228-
impl From<traces::Value> for opentelemetry::Value {
229-
fn from(value: traces::Value) -> Self {
228+
impl From<tracer::Value> for opentelemetry::Value {
229+
fn from(value: tracer::Value) -> Self {
230230
match value {
231-
traces::Value::String(v) => v.into(),
232-
traces::Value::Bool(v) => v.into(),
233-
traces::Value::Float64(v) => v.into(),
234-
traces::Value::S64(v) => v.into(),
235-
traces::Value::StringArray(v) => opentelemetry::Value::Array(
231+
tracer::Value::String(v) => v.into(),
232+
tracer::Value::Bool(v) => v.into(),
233+
tracer::Value::Float64(v) => v.into(),
234+
tracer::Value::S64(v) => v.into(),
235+
tracer::Value::StringArray(v) => opentelemetry::Value::Array(
236236
v.into_iter()
237237
.map(StringValue::from)
238238
.collect::<Vec<_>>()
239239
.into(),
240240
),
241-
traces::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()),
242-
traces::Value::Float64Array(v) => opentelemetry::Value::Array(v.into()),
243-
traces::Value::S64Array(v) => opentelemetry::Value::Array(v.into()),
241+
tracer::Value::BoolArray(v) => opentelemetry::Value::Array(v.into()),
242+
tracer::Value::Float64Array(v) => opentelemetry::Value::Array(v.into()),
243+
tracer::Value::S64Array(v) => opentelemetry::Value::Array(v.into()),
244244
}
245245
}
246246
}
247247

248-
impl From<traces::KeyValue> for opentelemetry::KeyValue {
249-
fn from(kv: traces::KeyValue) -> Self {
248+
impl From<tracer::KeyValue> for opentelemetry::KeyValue {
249+
fn from(kv: tracer::KeyValue) -> Self {
250250
opentelemetry::KeyValue::new(kv.key, kv.value)
251251
}
252252
}
253253

254-
impl From<traces::TraceFlags> for opentelemetry::trace::TraceFlags {
255-
fn from(flags: traces::TraceFlags) -> Self {
254+
impl From<tracer::TraceFlags> for opentelemetry::trace::TraceFlags {
255+
fn from(flags: tracer::TraceFlags) -> Self {
256256
Self::new(flags.as_array()[0] as u8)
257257
}
258258
}
259259

260-
impl From<opentelemetry::trace::TraceFlags> for traces::TraceFlags {
260+
impl From<opentelemetry::trace::TraceFlags> for tracer::TraceFlags {
261261
fn from(flags: opentelemetry::trace::TraceFlags) -> Self {
262262
if flags.is_sampled() {
263-
traces::TraceFlags::SAMPLED
263+
tracer::TraceFlags::SAMPLED
264264
} else {
265-
traces::TraceFlags::empty()
265+
tracer::TraceFlags::empty()
266266
}
267267
}
268268
}
269269

270-
impl From<traces::SpanContext> for opentelemetry::trace::SpanContext {
271-
fn from(sc: traces::SpanContext) -> Self {
272-
// TODO(Caleb): Check endianess
273-
let trace_id: [u8; 16] = {
274-
let mut whole: [u8; 16] = [0; 16];
275-
let (one, two) = whole.split_at_mut(8);
276-
one.copy_from_slice(&sc.trace_id.0.to_le_bytes());
277-
two.copy_from_slice(&sc.trace_id.1.to_le_bytes());
278-
whole
279-
};
280-
let trace_state = if let Ok(trace_state) =
281-
opentelemetry::trace::TraceState::from_key_value(sc.trace_state)
282-
{
283-
trace_state
284-
} else {
285-
opentelemetry::trace::TraceState::default()
286-
};
270+
impl From<tracer::SpanContext> for opentelemetry::trace::SpanContext {
271+
fn from(sc: tracer::SpanContext) -> Self {
272+
// TODO(Reviewer): Should this be try_from instead an propagate this error out of the WIT?
273+
let trace_id = opentelemetry::trace::TraceId::from_hex(&sc.trace_id)
274+
.unwrap_or(opentelemetry::trace::TraceId::INVALID);
275+
let span_id = opentelemetry::trace::SpanId::from_hex(&sc.span_id)
276+
.unwrap_or(opentelemetry::trace::SpanId::INVALID);
277+
let trace_state = opentelemetry::trace::TraceState::from_key_value(sc.trace_state)
278+
.unwrap_or_else(|_| opentelemetry::trace::TraceState::default());
287279
Self::new(
288-
opentelemetry::trace::TraceId::from_bytes(trace_id),
289-
opentelemetry::trace::SpanId::from_bytes(sc.span_id.to_le_bytes()),
280+
trace_id,
281+
span_id,
290282
sc.trace_flags.into(),
291283
sc.is_remote,
292284
trace_state,
293285
)
294286
}
295287
}
296288

297-
impl From<opentelemetry::trace::SpanContext> for traces::SpanContext {
289+
impl From<opentelemetry::trace::SpanContext> for tracer::SpanContext {
298290
fn from(sc: opentelemetry::trace::SpanContext) -> Self {
299291
Self {
300-
trace_id: {
301-
let whole = u128::from_le_bytes(sc.trace_id().to_bytes());
302-
((whole >> 64) as u64, whole as u64)
303-
},
304-
span_id: u64::from_le_bytes(sc.span_id().to_bytes()),
292+
trace_id: format!("{:x}", sc.trace_id()),
293+
span_id: format!("{:x}", sc.span_id()),
305294
trace_flags: sc.trace_flags().into(),
306295
is_remote: sc.is_remote(),
307296
trace_state: sc
@@ -317,20 +306,20 @@ mod observe {
317306
}
318307
}
319308

320-
impl From<traces::Status> for opentelemetry::trace::Status {
321-
fn from(status: traces::Status) -> Self {
309+
impl From<tracer::Status> for opentelemetry::trace::Status {
310+
fn from(status: tracer::Status) -> Self {
322311
match status {
323-
traces::Status::Unset => Self::Unset,
324-
traces::Status::Ok => Self::Ok,
325-
traces::Status::Error(s) => Self::Error {
312+
tracer::Status::Unset => Self::Unset,
313+
tracer::Status::Ok => Self::Ok,
314+
tracer::Status::Error(s) => Self::Error {
326315
description: s.into(),
327316
},
328317
}
329318
}
330319
}
331320

332-
impl From<traces::Datetime> for SystemTime {
333-
fn from(timestamp: traces::Datetime) -> Self {
321+
impl From<tracer::Datetime> for SystemTime {
322+
fn from(timestamp: tracer::Datetime) -> Self {
334323
UNIX_EPOCH
335324
+ Duration::from_secs(timestamp.seconds)
336325
+ Duration::from_nanos(timestamp.nanoseconds as u64)

tests/test-components/components/wasi-observe-tracing/src/lib.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use spin_sdk::{
1010
};
1111
use wasi::{
1212
clocks0_2_0::wall_clock::now,
13-
observe::traces::{KeyValue, Span, Value},
13+
observe::tracer::{self, KeyValue, Value},
1414
};
1515

1616
#[http_component]
@@ -26,25 +26,25 @@ fn handle(req: http::Request<()>) -> Response {
2626
}
2727

2828
fn nested_spans(_req: Request, _params: Params) -> Response {
29-
let span = Span::start("outer_func", None);
29+
let span = tracer::start("outer_func", None);
3030
inner_func();
3131
span.end(None);
3232
Response::new(200, "")
3333
}
3434

3535
fn inner_func() {
36-
let span = Span::start("inner_func", None);
36+
let span = tracer::start("inner_func", None);
3737
span.end(None);
3838
}
3939

4040
fn drop_semantics(_req: Request, _params: Params) -> Response {
41-
let _span = Span::start("drop_semantics", None);
41+
let _span = tracer::start("drop_semantics", None);
4242
Response::new(200, "")
4343
// _span will drop here and should be ended
4444
}
4545

4646
fn setting_attributes(_req: Request, _params: Params) -> Response {
47-
let span = Span::start("setting_attributes", None);
47+
let span = tracer::start("setting_attributes", None);
4848
span.set_attributes(&[KeyValue {
4949
key: "foo".to_string(),
5050
value: Value::String("bar".to_string()),
@@ -64,7 +64,7 @@ fn setting_attributes(_req: Request, _params: Params) -> Response {
6464
}
6565

6666
async fn host_guest_host(_req: Request, _params: Params) -> Response {
67-
let span = Span::start("guest", None);
67+
let span = tracer::start("guest", None);
6868

6969
let req = Request::builder()
7070
.method(Method::Get)
@@ -77,7 +77,7 @@ async fn host_guest_host(_req: Request, _params: Params) -> Response {
7777
}
7878

7979
fn events(_req: Request, _params: Params) -> Response {
80-
let span = Span::start("events", None);
80+
let span = tracer::start("events", None);
8181
span.add_event("basic-event", None, None);
8282
span.add_event(
8383
"event-with-attributes",
@@ -95,8 +95,8 @@ fn events(_req: Request, _params: Params) -> Response {
9595
}
9696

9797
fn child_outlives_parent(_req: Request, _params: Params) -> Response {
98-
let span = Span::start("parent", None);
99-
let span2 = Span::start("child", None);
98+
let span = tracer::start("parent", None);
99+
let span2 = tracer::start("child", None);
100100
span.end(None);
101101
span2.end(None);
102102
Response::new(200, "")

0 commit comments

Comments
 (0)