Skip to content

Commit 1f6d49d

Browse files
authored
fix(native): Init logger earlier without javascript side (silient errors) (#7228)
1 parent abf5a0c commit 1f6d49d

File tree

8 files changed

+69
-40
lines changed

8 files changed

+69
-40
lines changed

packages/cubejs-backend-native/Cargo.lock

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/cubejs-backend-native/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ libc = "0.2"
2828
findshlibs = "0.10.2"
2929
convert_case = "0.6.0"
3030
minijinja = { version = "1", features = ["json", "loader"] }
31+
log-reroute = "0.1"
3132
# python
3233
pyo3 = { version = "0.19", features = [], optional = true }
3334
pyo3-asyncio = { version = "0.19", features = ["tokio-runtime", "attributes"], optional = true }

packages/cubejs-backend-native/src/lib.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use std::sync::Arc;
2020
use crate::cross::CLRepr;
2121
use auth::NodeBridgeAuthService;
2222
use config::NodeConfig;
23+
use cubesql::telemetry::LocalReporter;
2324
use cubesql::{config::CubeServices, telemetry::ReportingLogger, CubeError};
2425
use log::Level;
2526
use logger::NodeBridgeLogger;
@@ -58,6 +59,15 @@ fn tokio_runtime() -> Result<&'static Runtime, CubeError> {
5859
})
5960
}
6061

62+
fn create_logger(log_level: log::Level) -> SimpleLogger {
63+
SimpleLogger::new()
64+
.with_level(Level::Error.to_level_filter())
65+
.with_module_level("cubesql", log_level.to_level_filter())
66+
.with_module_level("cubejs_native", log_level.to_level_filter())
67+
.with_module_level("datafusion", Level::Warn.to_level_filter())
68+
.with_module_level("pg_srv", Level::Warn.to_level_filter())
69+
}
70+
6171
fn setup_logger(mut cx: FunctionContext) -> JsResult<JsUndefined> {
6272
let options = cx.argument::<JsObject>(0)?;
6373
let cube_logger = options
@@ -80,15 +90,10 @@ fn setup_logger(mut cx: FunctionContext) -> JsResult<JsUndefined> {
8090
Level::Trace
8191
};
8292

83-
let logger = SimpleLogger::new()
84-
.with_level(Level::Error.to_level_filter())
85-
.with_module_level("cubesql", log_level.to_level_filter())
86-
.with_module_level("cubejs_native", log_level.to_level_filter())
87-
.with_module_level("datafusion", Level::Warn.to_level_filter())
88-
.with_module_level("pg_srv", Level::Warn.to_level_filter());
93+
let logger = create_logger(log_level);
94+
log_reroute::reroute_boxed(Box::new(logger));
8995

9096
ReportingLogger::init(
91-
Box::new(logger),
9297
Box::new(NodeBridgeLogger::new(cx.channel(), cube_logger)),
9398
log_level.to_level_filter(),
9499
)
@@ -222,6 +227,18 @@ fn debug_js_to_clrepr_to_js(mut cx: FunctionContext) -> JsResult<JsValue> {
222227

223228
#[neon::main]
224229
fn main(mut cx: ModuleContext) -> NeonResult<()> {
230+
// We use log_rerouter to swap logger, because we init logger from js side in api-gateway
231+
log_reroute::init().unwrap();
232+
233+
let logger = Box::new(create_logger(Level::Error));
234+
log_reroute::reroute_boxed(logger);
235+
236+
ReportingLogger::init(
237+
Box::new(LocalReporter::new()),
238+
Level::Error.to_level_filter(),
239+
)
240+
.unwrap();
241+
225242
cx.export_function("setupLogger", setup_logger)?;
226243
cx.export_function("registerInterface", register_interface)?;
227244
cx.export_function("shutdownInterface", shutdown_interface)?;

rust/cubesql/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/cubesql/cubesql/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ documentation = "https://cube.dev/docs"
99
homepage = "https://cube.dev"
1010

1111
[dependencies]
12+
arc-swap = "1"
1213
datafusion = { git = 'https://github.com/cube-js/arrow-datafusion.git', rev = "be967a63967f23bdd946a45925d07af0a11dcc39", default-features = false, features = ["regex_expressions", "unicode_expressions"] }
1314
anyhow = "1.0"
1415
thiserror = "1.0"

rust/cubesql/cubesql/e2e/main.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,9 @@ fn main() {
4343
.with_module_level("datafusion", Level::Warn.to_level_filter())
4444
.with_module_level("pg_srv", Level::Warn.to_level_filter());
4545

46-
ReportingLogger::init(
47-
Box::new(logger),
48-
Box::new(LocalReporter::new()),
49-
log_level.to_level_filter(),
50-
)
51-
.unwrap();
46+
log::set_boxed_logger(Box::new(logger)).unwrap();
47+
48+
ReportingLogger::init(Box::new(LocalReporter::new()), log_level.to_level_filter()).unwrap();
5249

5350
rt.block_on(async {
5451
let mut runner = TestsRunner::new();

rust/cubesql/cubesql/src/bin/cubesqld.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,8 @@ fn main() {
3131

3232
// console_subscriber::init();
3333

34-
ReportingLogger::init(
35-
Box::new(logger),
36-
Box::new(LocalReporter::new()),
37-
log_level.to_level_filter(),
38-
)
39-
.unwrap();
34+
log::set_boxed_logger(Box::new(logger)).unwrap();
35+
ReportingLogger::init(Box::new(LocalReporter::new()), log_level.to_level_filter()).unwrap();
4036

4137
let config = Config::default();
4238

rust/cubesql/cubesql/src/telemetry/mod.rs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
use crate::{sql::SessionState, CubeError};
2-
use log::{Level, LevelFilter, Log};
3-
use std::{
4-
collections::HashMap,
5-
fmt::Debug,
6-
sync::{Arc, RwLock},
7-
};
2+
use arc_swap::ArcSwap;
3+
use log::{Level, LevelFilter};
4+
use std::{collections::HashMap, fmt::Debug, sync::Arc};
85

96
lazy_static! {
10-
static ref REPORTER: RwLock<Box<dyn LogReporter>> = RwLock::new(Box::new(LocalReporter::new()));
7+
static ref REPORTER: ArcSwap<Box<dyn LogReporter>> =
8+
ArcSwap::from_pointee(Box::new(LocalReporter::new()));
119
}
1210

1311
pub trait LogReporter: Send + Sync + Debug {
@@ -37,23 +35,18 @@ impl LogReporter for LocalReporter {
3735
pub struct ReportingLogger {}
3836

3937
impl ReportingLogger {
40-
pub fn init(
41-
logger: Box<dyn Log>,
42-
reporter: Box<dyn LogReporter>,
43-
max_level: LevelFilter,
44-
) -> Result<(), CubeError> {
45-
let mut guard = REPORTER
46-
.write()
47-
.expect("failed to unlock REPORTER for writing");
48-
*guard = reporter;
49-
50-
log::set_boxed_logger(logger)?;
38+
pub fn init(reporter: Box<dyn LogReporter>, max_level: LevelFilter) -> Result<(), CubeError> {
39+
REPORTER.swap(Arc::new(reporter));
5140
log::set_max_level(max_level);
5241

5342
Ok(())
5443
}
5544
}
5645

46+
pub fn set_reporter(reporter: Box<dyn LogReporter>) {
47+
REPORTER.swap(Arc::new(reporter));
48+
}
49+
5750
pub trait ContextLogger: Send + Sync + Debug {
5851
fn error(&self, message: &str, props: Option<HashMap<String, String>>);
5952
}
@@ -93,9 +86,7 @@ impl ContextLogger for SessionLogger {
9386
}
9487

9588
fn report(event: String, properties: HashMap<String, String>, level: Level) -> bool {
96-
let guard = REPORTER
97-
.read()
98-
.expect("failed to unlock REPORTER for reading");
89+
let guard = REPORTER.load();
9990
if !guard.is_active() {
10091
return false;
10192
}

0 commit comments

Comments
 (0)