use std::path::Path;
use tracing::info;
pub fn init_tracing() -> crate::utils::error::Result<()> {
#[cfg(feature = "otel")]
{
init_otel_tracing()
}
#[cfg(not(feature = "otel"))]
{
use tracing_subscriber::EnvFilter;
let env_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("ggen=info"));
tracing_subscriber::fmt()
.with_env_filter(env_filter)
.try_init()
.map_err(|e| {
crate::utils::error::Error::with_source("Failed to initialize tracing", e)
})?;
Ok(())
}
}
#[cfg(feature = "otel")]
fn init_otel_tracing() -> crate::utils::error::Result<()> {
use tracing_subscriber::EnvFilter;
let env_filter =
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("ggen=info"));
tracing_subscriber::fmt()
.with_env_filter(env_filter)
.try_init()
.map_err(|e| crate::utils::error::Error::with_source("Failed to initialize tracing", e))?;
Ok(())
}
pub fn shutdown_tracing() {
#[cfg(feature = "otel")]
{
}
}
pub struct PipelineTracer;
impl PipelineTracer {
pub fn template_span(template_path: &Path) -> tracing::Span {
tracing::info_span!(
"template_processing",
template = %template_path.display()
)
}
pub fn frontmatter_processed(front: &crate::template_types::Frontmatter) {
info!(
target = %front.to.as_deref().unwrap_or("unknown"),
"Frontmatter processed"
);
}
pub fn context_blessed(vars_count: usize) {
info!(vars_count = vars_count, "Template context blessed");
}
pub fn template_parsing_complete(template_path: &Path, content_size: usize) {
info!(
template = %template_path.display(),
content_size = content_size,
"Template parsing completed"
);
}
pub fn template_rendering_start(output_path: &Path) {
info!(
output_path = %output_path.display(),
"Starting template rendering"
);
}
pub fn template_rendering_complete(output_path: &Path, content_size: usize) {
info!(
output_path = %output_path.display(),
content_size = content_size,
"Template rendering completed"
);
}
pub fn template_start(template_path: &Path) {
info!(
template = %template_path.display(),
"Starting template processing"
);
}
pub fn rdf_loading_start(files: &[String], inline_blocks: usize) {
info!(
files_count = files.len(),
inline_blocks = inline_blocks,
"Loading RDF data"
);
}
pub fn rdf_loading_complete(triples_count: usize) {
info!(triples_count = triples_count, "RDF loading completed");
}
pub fn sparql_query(query: &str, results: Option<usize>) {
info!(
query_len = query.len(),
results_count = results.unwrap_or(0),
"SPARQL query executed"
);
}
pub fn file_injection_start(path: &Path, mode: &str) {
info!(
path = %path.display(),
mode = mode,
"Starting file injection"
);
}
pub fn file_injection_complete(path: &Path, mode: &str) {
info!(
path = %path.display(),
mode = mode,
"File injection completed"
);
}
pub fn shell_hook_start(command: &str, timing: &str) {
info!(command = command, timing = timing, "Executing shell hook");
}
pub fn shell_hook_complete(command: &str, timing: &str, exit_code: i32) {
info!(
command = command,
timing = timing,
exit_code = exit_code,
"Shell hook completed"
);
}
pub fn performance_metric(operation: &str, duration_ms: u64) {
info!(
operation = operation,
duration_ms = duration_ms,
"Performance metric recorded"
);
}
pub fn error_with_context(error: &crate::utils::error::Error, context: &str) {
tracing::error!(
error = %error,
context = context,
"Error occurred"
);
}
pub fn warning(message: &str, context: Option<&str>) {
tracing::warn!(
message = message,
context = context.unwrap_or(""),
"Warning"
);
}
pub fn backup_created(original: &Path, backup: &Path) {
info!(
original = %original.display(),
backup = %backup.display(),
"Backup created"
);
}
pub fn skip_condition(condition: &str, reason: &str) {
info!(condition = condition, reason = reason, "Template skipped");
}
pub fn dry_run(path: &Path, size: usize) {
info!(
path = %path.display(),
size = size,
"Dry run: skipping file write"
);
}
}
pub struct PerformanceTimer {
operation: String,
start: std::time::Instant,
finished: bool,
}
impl PerformanceTimer {
pub fn start(operation: &str) -> Self {
Self {
operation: operation.to_string(),
start: std::time::Instant::now(),
finished: false,
}
}
pub fn finish(mut self) {
if !self.finished {
let duration = self.start.elapsed();
PipelineTracer::performance_metric(&self.operation, duration.as_millis() as u64);
self.finished = true;
}
}
}
impl Drop for PerformanceTimer {
fn drop(&mut self) {
if !self.finished {
let duration = self.start.elapsed();
PipelineTracer::performance_metric(&self.operation, duration.as_millis() as u64);
}
}
}
#[macro_export]
macro_rules! time_operation {
($name:expr, $block:block) => {{
let _timer = $crate::tracing::PerformanceTimer::start($name);
$block
}};
}
#[macro_export]
macro_rules! trace_span {
($name:expr, $($fields:tt)*) => {
tracing::info_span!($name, $($fields)*)
};
}
pub use time_operation;
pub use trace_span;