risingwave_jni_core/tracing_slf4j.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
// Copyright 2024 RisingWave Labs
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use std::borrow::Cow;
use jni::objects::JString;
use jni::sys::{jboolean, jint};
use tracing::Level;
use crate::{execute_and_catch, EnvParam};
const TARGET: &str = "risingwave_connector_node";
#[no_mangle]
pub(crate) extern "system" fn Java_com_risingwave_java_binding_Binding_tracingSlf4jEvent(
env: EnvParam<'_>,
thread_name: JString<'_>,
class_name: JString<'_>,
level: jint,
message: JString<'_>,
) {
execute_and_catch(env, move |env| {
let thread_name = env.get_string(&thread_name)?;
let thread_name: Cow<'_, str> = (&thread_name).into();
let class_name = env.get_string(&class_name)?;
let class_name: Cow<'_, str> = (&class_name).into();
let message = env.get_string(&message)?;
let message: Cow<'_, str> = (&message).into();
macro_rules! event {
($lvl:expr) => {
tracing::event!(
target: TARGET,
$lvl,
thread = &*thread_name,
class = &*class_name,
"{message}",
)
};
}
// See `com.risingwave.tracing.TracingSlf4jImpl`.
match level {
0 => event!(Level::ERROR),
1 => event!(Level::WARN),
2 => event!(Level::INFO),
3 => event!(Level::DEBUG),
4 => event!(Level::TRACE),
_ => unreachable!(),
}
Ok(())
})
}
#[no_mangle]
pub(crate) extern "system" fn Java_com_risingwave_java_binding_Binding_tracingSlf4jEventEnabled(
env: EnvParam<'_>,
level: jint,
) -> jboolean {
execute_and_catch(env, move |_env| {
// Currently we only support `StaticDirective` in `tracing-subscriber`, so
// filtering by fields like `thread` and `class` is not supported.
// TODO: should we support dynamic `Directive`?
macro_rules! event_enabled {
($lvl:expr) => {
tracing::event_enabled!(
target: TARGET,
$lvl,
)
};
}
// See `com.risingwave.tracing.TracingSlf4jImpl`.
let enabled = match level {
0 => event_enabled!(Level::ERROR),
1 => event_enabled!(Level::WARN),
2 => event_enabled!(Level::INFO),
3 => event_enabled!(Level::DEBUG),
4 => event_enabled!(Level::TRACE),
_ => unreachable!(),
};
Ok(enabled)
})
.into()
}