mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
feat: events for ng
This commit is contained in:
parent
4e899d48cf
commit
849bc934b0
6 changed files with 73 additions and 19 deletions
|
@ -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"
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue