use quote::quote;
extern crate proc_macro;
const LOG_FILTER: &str = "RUST_LOG";
fn set_env_vars() -> proc_macro2::TokenStream {
quote! {
if std::env::var("TELEMETRY_PKG_NAME").is_err() {
std::env::set_var("TELEMETRY_PKG_NAME", fuel_telemetry::get_process_name());
}
if std::env::var("TELEMETRY_PKG_VERSION").is_err() {
std::env::set_var("TELEMETRY_PKG_VERSION", env!("CARGO_PKG_VERSION"));
}
}
}
fn start_watchers() -> proc_macro2::TokenStream {
quote! {
fuel_telemetry::telemetry_layer::set_trace_id_env_to_new_uuid();
match fuel_telemetry::process_watcher::ProcessWatcher::new() {
Ok(mut process_watcher) => {
if let Err(err) = process_watcher.start() {
let _ = fuel_telemetry::process_watcher::ProcessWatcher::log_error(&format!("Failed to start `ProcessWatcher`: {:?}", err));
if err.is_fatal() {
std::process::exit(1);
}
}
}
Err(err) => {
let _ = fuel_telemetry::process_watcher::ProcessWatcher::log_error(&format!("Failed to create `ProcessWatcher`: {:?}", err));
}
}
let mut file_watcher = fuel_telemetry::file_watcher::FileWatcher::new();
if let Err(err) = file_watcher.start() {
let _ = fuel_telemetry::file_watcher::FileWatcher::log_error(&format!("Failed to start `FileWatcher`: {:?}", err));
if err.is_fatal() {
std::process::exit(1);
}
}
let mut systeminfo_watcher = fuel_telemetry::systeminfo_watcher::SystemInfoWatcher::new();
if let Err(err) = systeminfo_watcher.start() {
let _ = fuel_telemetry::systeminfo_watcher::SystemInfoWatcher::log_error(&format!("Failed to start `SystemInfoWatcher`: {:?}", err));
if err.is_fatal() {
std::process::exit(1);
}
}
}
}
#[proc_macro]
pub fn new(_input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let env_vars = set_env_vars();
quote! {
{
#env_vars
fuel_telemetry::TelemetryLayer::__new().and_then(|(layer, guard)| {
use fuel_telemetry::__reexport_EnvFilter;
use fuel_telemetry::__reexport_Layer;
std::env::var_os(#LOG_FILTER)
.map_or_else(
|| Ok(__reexport_EnvFilter::new("info")),
|_| __reexport_EnvFilter::try_from_default_env()
.map_err(|e| fuel_telemetry::TelemetryError::InvalidEnvFilter(e.to_string()))
)
.map(|filter| (layer.inner_layer.with_filter(filter), guard))
})
}
}
.into()
}
#[proc_macro]
pub fn new_with_watchers(_input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let start_watchers = start_watchers();
quote! {
{
#start_watchers
fuel_telemetry::new!()
}
}
.into()
}
#[proc_macro]
pub fn new_with_watchers_and_init(_input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let args: Vec<String> = std::env::args().collect();
let mut crate_name = String::new();
let mut crate_type = String::new();
for window in args.windows(2) {
match window[0].as_str() {
"--crate-name" => crate_name = window[1].clone(),
"--crate-type" => crate_type = window[1].clone(),
_ => {}
}
}
if crate_type == "lib" && crate_name != "fuel_telemetry" {
return quote! {
{
compile_error!("new_with_watchers_and_init!() cannot be called within a library")
}
}
.into();
}
quote! {
{
fuel_telemetry::new_with_watchers!().map(|(layer, guard)| {
use fuel_telemetry::__reexport_SubscriberInitExt;
use fuel_telemetry::__reexport_tracing_subscriber;
use fuel_telemetry::__reexport_tracing_subscriber_SubscriberExt;
__reexport_tracing_subscriber::registry()
.with(layer)
.init();
guard
})
}
}
.into()
}