feat: events for ng

This commit is contained in:
snek 2024-11-18 10:12:48 +01:00
parent 4e899d48cf
commit 849bc934b0
No known key found for this signature in database
6 changed files with 73 additions and 19 deletions

View File

@ -209,7 +209,7 @@ zstd = "=0.12.4"
opentelemetry = "0.27.0" opentelemetry = "0.27.0"
opentelemetry-http = "0.27.0" opentelemetry-http = "0.27.0"
opentelemetry-otlp = { version = "0.27.0", features = ["logs", "http-proto", "http-json"] } opentelemetry-otlp = { version = "0.27.0", features = ["logs", "http-proto", "http-json", "populate-logs-event-name"] }
opentelemetry-semantic-conventions = { version = "0.27.0", features = ["semconv_experimental"] } opentelemetry-semantic-conventions = { version = "0.27.0", features = ["semconv_experimental"] }
opentelemetry_sdk = "0.27.0" opentelemetry_sdk = "0.27.0"

View File

@ -431,20 +431,21 @@ fn resolve_flags_and_init(
if err.kind() == clap::error::ErrorKind::DisplayVersion => if err.kind() == clap::error::ErrorKind::DisplayVersion =>
{ {
// Ignore results to avoid BrokenPipe errors. // Ignore results to avoid BrokenPipe errors.
util::logger::init(None); util::logger::init(None, None);
let _ = err.print(); let _ = err.print();
deno_runtime::exit(0); deno_runtime::exit(0);
} }
Err(err) => { Err(err) => {
util::logger::init(None); util::logger::init(None, None);
exit_for_error(AnyError::from(err)) exit_for_error(AnyError::from(err))
} }
}; };
if let Some(otel_config) = flags.otel_config() { let otel_config = flags.otel_config();
util::logger::init(flags.log_level, otel_config.as_ref());
if let Some(otel_config) = otel_config {
deno_runtime::ops::otel::init(otel_config)?; deno_runtime::ops::otel::init(otel_config)?;
} }
util::logger::init(flags.log_level);
// TODO(bartlomieju): remove in Deno v2.5 and hard error then. // TODO(bartlomieju): remove in Deno v2.5 and hard error then.
if flags.unstable_config.legacy_flag_enabled { if flags.unstable_config.legacy_flag_enabled {

View File

@ -87,17 +87,20 @@ fn main() {
let future = async move { let future = async move {
match standalone { match standalone {
Ok(Some(data)) => { Ok(Some(data)) => {
util::logger::init(
data.metadata.log_level,
data.metadata.otel_config.as_ref(),
);
if let Some(otel_config) = data.metadata.otel_config.clone() { if let Some(otel_config) = data.metadata.otel_config.clone() {
deno_runtime::ops::otel::init(otel_config)?; deno_runtime::ops::otel::init(otel_config)?;
} }
util::logger::init(data.metadata.log_level);
load_env_vars(&data.metadata.env_vars_from_env_file); load_env_vars(&data.metadata.env_vars_from_env_file);
let exit_code = standalone::run(data).await?; let exit_code = standalone::run(data).await?;
deno_runtime::exit(exit_code); deno_runtime::exit(exit_code);
} }
Ok(None) => Ok(()), Ok(None) => Ok(()),
Err(err) => { Err(err) => {
util::logger::init(None); util::logger::init(None, None);
Err(err) Err(err)
} }
} }

View File

@ -77,9 +77,14 @@ pub async fn run_script(
let worker_factory = factory.create_cli_main_worker_factory().await?; let worker_factory = factory.create_cli_main_worker_factory().await?;
let mut worker = worker_factory let mut worker = worker_factory
.create_main_worker(mode, main_module.clone()) .create_main_worker(mode, main_module.clone())
.await?; .await
.inspect_err(|e| {
deno_runtime::ops::otel::report_event("deno_boot_failure", e)
})?;
let exit_code = worker.run().await?; let exit_code = worker.run().await.inspect_err(|e| {
deno_runtime::ops::otel::report_event("deno_uncaught_exception", e)
})?;
Ok(exit_code) Ok(exit_code)
} }

View File

@ -3,22 +3,33 @@
use std::io::Write; use std::io::Write;
use super::draw_thread::DrawThread; use super::draw_thread::DrawThread;
use deno_runtime::ops::otel::OtelConfig;
use deno_runtime::ops::otel::OtelConsoleConfig;
struct CliLogger(env_logger::Logger); struct CliLogger {
logger: env_logger::Logger,
otel_console_config: OtelConsoleConfig,
}
impl CliLogger { impl CliLogger {
pub fn new(logger: env_logger::Logger) -> Self { pub fn new(
Self(logger) logger: env_logger::Logger,
otel_console_config: OtelConsoleConfig,
) -> Self {
Self {
logger,
otel_console_config,
}
} }
pub fn filter(&self) -> log::LevelFilter { pub fn filter(&self) -> log::LevelFilter {
self.0.filter() self.logger.filter()
} }
} }
impl log::Log for CliLogger { impl log::Log for CliLogger {
fn enabled(&self, metadata: &log::Metadata) -> bool { fn enabled(&self, metadata: &log::Metadata) -> bool {
self.0.enabled(metadata) self.logger.enabled(metadata)
} }
fn log(&self, record: &log::Record) { fn log(&self, record: &log::Record) {
@ -28,18 +39,28 @@ impl log::Log for CliLogger {
// could potentially block other threads that access the draw // could potentially block other threads that access the draw
// thread's state // thread's state
DrawThread::hide(); DrawThread::hide();
self.0.log(record); match self.otel_console_config {
deno_runtime::ops::otel::handle_log(record); OtelConsoleConfig::Ignore => {
self.logger.log(record);
}
OtelConsoleConfig::Capture => {
self.logger.log(record);
deno_runtime::ops::otel::handle_log(record);
}
OtelConsoleConfig::Replace => {
deno_runtime::ops::otel::handle_log(record);
}
}
DrawThread::show(); DrawThread::show();
} }
} }
fn flush(&self) { fn flush(&self) {
self.0.flush(); self.logger.flush();
} }
} }
pub fn init(maybe_level: Option<log::Level>) { pub fn init(maybe_level: Option<log::Level>, otel_config: Option<&OtelConfig>) {
let log_level = maybe_level.unwrap_or(log::Level::Info); let log_level = maybe_level.unwrap_or(log::Level::Info);
let logger = env_logger::Builder::from_env( let logger = env_logger::Builder::from_env(
env_logger::Env::new() env_logger::Env::new()
@ -93,7 +114,12 @@ pub fn init(maybe_level: Option<log::Level>) {
}) })
.build(); .build();
let cli_logger = CliLogger::new(logger); let cli_logger = CliLogger::new(
logger,
otel_config
.map(|c| c.console)
.unwrap_or(OtelConsoleConfig::Ignore),
);
let max_level = cli_logger.filter(); let max_level = cli_logger.filter();
let r = log::set_boxed_logger(Box::new(cli_logger)); let r = log::set_boxed_logger(Box::new(cli_logger));
if r.is_ok() { if r.is_ok() {

View File

@ -403,6 +403,25 @@ pub fn flush() {
} }
} }
pub fn report_event(name: &'static str, data: impl std::fmt::Display) {
let Some((_, log_processor)) = OTEL_PROCESSORS.get() else {
return;
};
let mut log_record = LogRecord::default();
log_record.set_observed_timestamp(SystemTime::now());
log_record.set_event_name(name);
log_record.set_severity_number(Severity::Trace);
log_record.set_severity_text(Severity::Trace.name());
log_record.set_body(format!("{data}").into());
log_processor.emit(
&mut log_record,
&InstrumentationScope::builder("deno").build(),
);
}
pub fn handle_log(record: &log::Record) { pub fn handle_log(record: &log::Record) {
use log::Level; use log::Level;