Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 43dcddc

Browse files
committedSep 11, 2024··
Bump OTel version to v0.23.0, break logging, implement a bit more observe
Signed-off-by: Caleb Schoepp <[email protected]>
1 parent 69b77c9 commit 43dcddc

File tree

7 files changed

+110
-174
lines changed

7 files changed

+110
-174
lines changed
 

‎Cargo.lock

+26-95
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,12 @@ anyhow = "1.0.75"
128128
conformance-tests = { git = "https://github.com/fermyon/conformance-tests", rev = "387b7f375df59e6254a7c29cf4a53507a9f46d32" }
129129
http-body-util = "0.1.0"
130130
hyper = { version = "1.0.0", features = ["full"] }
131-
opentelemetry = { version = "0.22.0", features = ["metrics", "trace", "logs"] }
132-
opentelemetry_sdk = { version = "0.22.1", features = ["rt-tokio", "logs_level_enabled"] }
131+
opentelemetry = { version = "0.23.0", features = ["metrics", "trace", "logs"] }
132+
opentelemetry_sdk = { version = "0.23.0", features = ["rt-tokio", "logs_level_enabled", "metrics"] }
133133
reqwest = { version = "0.12", features = ["stream", "blocking"] }
134134
test-environment = { git = "https://github.com/fermyon/conformance-tests", rev = "387b7f375df59e6254a7c29cf4a53507a9f46d32" }
135135
tracing = { version = "0.1", features = ["log"] }
136-
tracing-opentelemetry = { version = "0.23.0", default-features = false, features = ["metrics"] }
136+
tracing-opentelemetry = { version = "0.24.0", default-features = false, features = ["metrics"] }
137137

138138
wasi-common-preview1 = { version = "22.0.0", package = "wasi-common", features = [
139139
"tokio",

‎crates/factor-observe/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ indexmap = "2.2.6"
1313
once_cell = "1"
1414
opentelemetry = { workspace = true }
1515
opentelemetry_sdk = { workspace = true }
16-
opentelemetry-otlp = { version = "0.15.0", default-features=false, features = ["http-proto", "trace", "http", "reqwest-client", "metrics", "grpc-tonic"] }
1716
serde = "1.0.188"
1817
spin-app = { path = "../app" }
1918
spin-core = { path = "../core" }

‎crates/factor-observe/src/host.rs

+17-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
use std::time::Duration;
21
use std::time::SystemTime;
3-
use std::time::UNIX_EPOCH;
42

53
use anyhow::anyhow;
64
use anyhow::Result;
@@ -21,6 +19,7 @@ impl traces::Host for InstanceState {}
2119
#[async_trait]
2220
impl traces::HostSpan for InstanceState {
2321
// TODO(Caleb): Make this implicit logic make more sense (the indexmap seems wrong)
22+
// TODO(Caleb): Properly implement this
2423
async fn start(
2524
&mut self,
2625
name: String,
@@ -122,9 +121,7 @@ impl traces::HostSpan for InstanceState {
122121
.get_mut(resource.rep())
123122
{
124123
let timestamp = if let Some(timestamp) = timestamp {
125-
UNIX_EPOCH
126-
+ Duration::from_secs(timestamp.seconds)
127-
+ Duration::from_nanos(timestamp.nanoseconds as u64)
124+
timestamp.into()
128125
} else {
129126
SystemTime::now()
130127
};
@@ -148,16 +145,21 @@ impl traces::HostSpan for InstanceState {
148145
async fn add_link(
149146
&mut self,
150147
resource: Resource<traces::Span>,
151-
_link: traces::Link,
148+
link: traces::Link,
152149
) -> Result<()> {
153-
if let Some(_guest_span) = self
150+
if let Some(guest_span) = self
154151
.state
155152
.write()
156153
.unwrap()
157154
.guest_spans
158155
.get_mut(resource.rep())
159156
{
160-
todo!("update otel versions -> guest_span.inner.add_link(link.into());");
157+
guest_span.inner.add_link(
158+
// TODO(Caleb): Do I actually want to cause a trap in this case or should it be fallible?
159+
link.span_context.try_into()?,
160+
link.attributes.into_iter().map(Into::into).collect(),
161+
);
162+
Ok(())
161163
} else {
162164
Err(anyhow!("BUG: cannot find resource in table"))
163165
}
@@ -200,7 +202,7 @@ impl traces::HostSpan for InstanceState {
200202
async fn end(
201203
&mut self,
202204
resource: Resource<traces::Span>,
203-
_timestamp: Option<traces::Datetime>,
205+
timestamp: Option<traces::Datetime>,
204206
) -> Result<()> {
205207
if let Some(guest_span) = self
206208
.state
@@ -209,7 +211,11 @@ impl traces::HostSpan for InstanceState {
209211
.guest_spans
210212
.get_mut(resource.rep())
211213
{
212-
guest_span.inner.end();
214+
if let Some(timestamp) = timestamp {
215+
guest_span.inner.end_with_timestamp(timestamp.into());
216+
} else {
217+
guest_span.inner.end();
218+
}
213219
Ok(())
214220
} else {
215221
Err(anyhow!("BUG: cannot find resource in table"))
@@ -223,6 +229,6 @@ impl traces::HostSpan for InstanceState {
223229
}
224230
}
225231

226-
// TODO(Caleb): Improve debug tracing in failure cases
227232
// TODO(Caleb): Move the tests from integration.rs to here
228233
// TODO(Caleb): Write tests somewhere for all the finicky type conversion stuff
234+
// TODO(Caleb): Maybe introduce macro to reduce boilerplate of finding resource

‎crates/telemetry/Cargo.toml

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ edition = { workspace = true }
88
anyhow = { workspace = true }
99
http0 = { version = "0.2.9", package = "http" }
1010
http1 = { version = "1.0.0", package = "http" }
11+
once_cell = "1.19.0"
1112
opentelemetry = { workspace = true }
12-
opentelemetry-otlp = { version = "0.15.0", default-features = false, features = ["http-proto", "trace", "http", "reqwest-client", "metrics", "grpc-tonic", "logs"] }
13-
opentelemetry-semantic-conventions = "0.14.0"
1413
opentelemetry_sdk = { workspace = true }
14+
opentelemetry-otlp = { version = "0.16.0", default-features = false, features = ["http-proto", "trace", "http", "reqwest-client", "metrics", "grpc-tonic", "logs"] }
15+
opentelemetry-semantic-conventions = "0.14.0"
1516
terminal = { path = "../terminal" }
1617
tracing = { version = "0.1.37", features = ["log"] }
1718
tracing-appender = "0.2.2"

‎crates/telemetry/src/logs.rs

+52-51
Original file line numberDiff line numberDiff line change
@@ -26,25 +26,26 @@ pub fn handle_app_log(buf: &[u8]) {
2626

2727
/// Forward the app log to OTel.
2828
fn app_log_to_otel(buf: &[u8]) {
29-
if !otel_logs_enabled() {
30-
return;
31-
}
29+
// TODO(Caleb): Either use logging appender of build our own global logger provider storage
30+
// if !otel_logs_enabled() {
31+
// return;
32+
// }
3233

33-
let logger = global::logger_provider().logger("spin");
34-
if let Ok(s) = std::str::from_utf8(buf) {
35-
logger.emit(
36-
opentelemetry::logs::LogRecord::builder()
37-
.with_body(s.to_owned())
38-
.build(),
39-
);
40-
} else {
41-
logger.emit(
42-
opentelemetry::logs::LogRecord::builder()
43-
.with_body(escape_non_utf8_buf(buf))
44-
.with_attribute("app_log_non_utf8", true)
45-
.build(),
46-
);
47-
}
34+
// let logger = global::logger_provider().logger("spin");
35+
// if let Ok(s) = std::str::from_utf8(buf) {
36+
// logger.emit(
37+
// opentelemetry::logs::LogRecord::builder()
38+
// .with_body(s.to_owned())
39+
// .build(),
40+
// );
41+
// } else {
42+
// logger.emit(
43+
// opentelemetry::logs::LogRecord::builder()
44+
// .with_body(escape_non_utf8_buf(buf))
45+
// .with_attribute("app_log_non_utf8", true)
46+
// .build(),
47+
// );
48+
// }
4849
}
4950

5051
/// Takes a Spin application log and emits it as a tracing event. This acts as a compatibility layer
@@ -71,42 +72,42 @@ fn escape_non_utf8_buf(buf: &[u8]) -> String {
7172

7273
/// Initialize the OTel logging backend.
7374
pub(crate) fn init_otel_logging_backend(spin_version: String) -> anyhow::Result<()> {
74-
let resource = Resource::from_detectors(
75-
Duration::from_secs(5),
76-
vec![
77-
// Set service.name from env OTEL_SERVICE_NAME > env OTEL_RESOURCE_ATTRIBUTES > spin
78-
// Set service.version from Spin metadata
79-
Box::new(SpinResourceDetector::new(spin_version)),
80-
// Sets fields from env OTEL_RESOURCE_ATTRIBUTES
81-
Box::new(EnvResourceDetector::new()),
82-
// Sets telemetry.sdk{name, language, version}
83-
Box::new(TelemetryResourceDetector),
84-
],
85-
);
75+
// let resource = Resource::from_detectors(
76+
// Duration::from_secs(5),
77+
// vec![
78+
// // Set service.name from env OTEL_SERVICE_NAME > env OTEL_RESOURCE_ATTRIBUTES > spin
79+
// // Set service.version from Spin metadata
80+
// Box::new(SpinResourceDetector::new(spin_version)),
81+
// // Sets fields from env OTEL_RESOURCE_ATTRIBUTES
82+
// Box::new(EnvResourceDetector::new()),
83+
// // Sets telemetry.sdk{name, language, version}
84+
// Box::new(TelemetryResourceDetector),
85+
// ],
86+
// );
8687

87-
// This will configure the exporter based on the OTEL_EXPORTER_* environment variables. We
88-
// currently default to using the HTTP exporter but in the future we could select off of the
89-
// combination of OTEL_EXPORTER_OTLP_PROTOCOL and OTEL_EXPORTER_OTLP_LOGS_PROTOCOL to
90-
// determine whether we should use http/protobuf or grpc.
91-
let exporter_builder: LogExporterBuilder = match OtlpProtocol::logs_protocol_from_env() {
92-
OtlpProtocol::Grpc => opentelemetry_otlp::new_exporter().tonic().into(),
93-
OtlpProtocol::HttpProtobuf => opentelemetry_otlp::new_exporter().http().into(),
94-
OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"),
95-
};
88+
// // This will configure the exporter based on the OTEL_EXPORTER_* environment variables. We
89+
// // currently default to using the HTTP exporter but in the future we could select off of the
90+
// // combination of OTEL_EXPORTER_OTLP_PROTOCOL and OTEL_EXPORTER_OTLP_LOGS_PROTOCOL to
91+
// // determine whether we should use http/protobuf or grpc.
92+
// let exporter_builder: LogExporterBuilder = match OtlpProtocol::logs_protocol_from_env() {
93+
// OtlpProtocol::Grpc => opentelemetry_otlp::new_exporter().tonic().into(),
94+
// OtlpProtocol::HttpProtobuf => opentelemetry_otlp::new_exporter().http().into(),
95+
// OtlpProtocol::HttpJson => bail!("http/json OTLP protocol is not supported"),
96+
// };
9697

97-
let provider = opentelemetry_sdk::logs::LoggerProvider::builder()
98-
.with_config(opentelemetry_sdk::logs::config().with_resource(resource))
99-
.with_log_processor(
100-
BatchLogProcessor::builder(
101-
exporter_builder.build_log_exporter()?,
102-
opentelemetry_sdk::runtime::Tokio,
103-
)
104-
.with_batch_config(BatchConfigBuilder::default().build())
105-
.build(),
106-
)
107-
.build();
98+
// let provider = opentelemetry_sdk::logs::LoggerProvider::builder()
99+
// .with_config(opentelemetry_sdk::logs::config().with_resource(resource))
100+
// .with_log_processor(
101+
// BatchLogProcessor::builder(
102+
// exporter_builder.build_log_exporter()?,
103+
// opentelemetry_sdk::runtime::Tokio,
104+
// )
105+
// .with_batch_config(BatchConfigBuilder::default().build())
106+
// .build(),
107+
// )
108+
// .build();
108109

109-
global::set_logger_provider(provider);
110+
// global::set_logger_provider(provider);
110111

111112
Ok(())
112113
}

‎crates/world/src/conversions.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ mod llm {
222222
mod observe {
223223
use super::*;
224224
use opentelemetry::StringValue;
225+
use std::time::{Duration, SystemTime, UNIX_EPOCH};
225226
use wasi::observe::traces;
226227

227228
impl From<traces::Value> for opentelemetry::Value {
@@ -311,17 +312,6 @@ mod observe {
311312
}
312313
}
313314

314-
impl TryFrom<traces::Link> for opentelemetry::trace::Link {
315-
type Error = wasmtime::Error;
316-
317-
fn try_from(link: traces::Link) -> anyhow::Result<Self> {
318-
Ok(Self::new(
319-
link.span_context.try_into()?,
320-
link.attributes.into_iter().map(Into::into).collect(),
321-
))
322-
}
323-
}
324-
325315
impl From<traces::Status> for opentelemetry::trace::Status {
326316
fn from(status: traces::Status) -> Self {
327317
match status {
@@ -333,4 +323,12 @@ mod observe {
333323
}
334324
}
335325
}
326+
327+
impl From<traces::Datetime> for SystemTime {
328+
fn from(timestamp: traces::Datetime) -> Self {
329+
UNIX_EPOCH
330+
+ Duration::from_secs(timestamp.seconds)
331+
+ Duration::from_nanos(timestamp.nanoseconds as u64)
332+
}
333+
}
336334
}

0 commit comments

Comments
 (0)
Please sign in to comment.