#![forbid(unsafe_code)]
#![warn(rust_2024_compatibility, missing_docs, missing_debug_implementations)]
#![cfg_attr(
test,
allow(
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::indexing_slicing
)
)]
pub mod audit_spool;
pub mod callsite;
pub mod codegen_helpers;
pub mod config;
pub mod config_watcher;
pub mod emit;
pub mod envelope;
pub mod filter;
pub mod forensic;
pub mod instrumented;
pub mod metric;
pub mod observer;
pub mod panic_hook;
pub mod propagator;
pub mod registry;
pub mod resource;
pub mod sampling;
pub mod scope;
pub(crate) mod self_events;
pub mod self_events_public {
pub use crate::self_events::{
emit_callsite_hash_collision_pub as emit_callsite_hash_collision,
emit_label_cardinality_high_pub as emit_label_cardinality_high,
emit_oversized_label_dropped_pub as emit_label_oversized,
emit_span_pair_orphaned_pub as emit_span_pair_orphaned,
};
}
pub mod sink;
pub mod span_trace;
#[cfg(feature = "test")]
pub mod test;
pub mod wire;
#[doc(hidden)]
#[cfg(feature = "test")]
pub mod __macro_deps {
pub use serde_json;
}
#[must_use]
pub fn cap_external_string(field: &'static str, raw: String, max_bytes: u16) -> String {
let max = max_bytes as usize;
if raw.len() <= max {
return raw;
}
let original_size = raw.len() as u64;
let mut end = max;
while end > 0 && !raw.is_char_boundary(end) {
end -= 1;
}
let mut out = String::with_capacity(end + 24);
out.push_str(&raw[..end]);
out.push_str(&format!("…<truncated:{}>", original_size));
self_events::emit_oversized_label_dropped_pub(field, original_size, out.len() as u64);
out
}
pub use callsite::ObsCallsite;
#[doc(hidden)]
pub use codegen_helpers as aux;
pub use codegen_helpers::{BuildableTo, EnumCount, FieldCapture, SpanCtx, SpanFrame};
pub use config::{EventsConfig, SamplingConfig};
pub use config_watcher::{ConfigWatcher, DEFAULT_DEBOUNCE};
pub use emit::Emit;
pub use envelope::{Envelope, EventSchema, FieldMeta, FieldRole};
pub use filter::Filter;
pub use instrumented::{Instrument, Instrumented, WithObserver};
pub use metric::{MetricEmitter, NoopMetricEmitter};
pub use obs_proto::{
ENVELOPE_FORMAT_VER,
obs::v1::{ObsBatch, ObsEnvelope},
};
pub use obs_types::{
Cardinality, Classification, FieldKind, MetricKind, SamplingReason, Severity, Tier,
};
pub use observer::{
BuildError, InMemoryHandle, InMemoryObserver, NoopObserver, Observer, StandardObserver,
StandardObserverBuilder, ThreadObserverGuard, WeakObserver, WorkerCounters, install_observer,
install_observer_arc, observer, observer_weak, with_observer_task, with_observer_task_sync,
with_observer_thread_local, with_test_observer,
};
pub use panic_hook::install_panic_hook;
pub use propagator::{
ObsTraceCtx, W3cPropagator, extract_w3c, fresh_span_id, fresh_trace_id, inject_w3c,
status_class,
};
pub use registry::{
ArrowEventSchema, ArrowField, ArrowLeafType, ArrowSchemaModel, ArrowStructBuilder,
CallsiteRecord, CallsiteSource, DecodeError, ENVELOPE_COLUMNS, EVENT_SCHEMAS,
EventSchemaErased, ObsCallsiteRegistry, OtelAttributeView, OtlpValue, SchemaRegistry,
ScrubError, ScrubbedEnvelope, callsite_id, scrub_payload,
};
pub use resource::ResourceAttrs;
pub use sampling::{SamplingDecision, decide as sample_decide};
pub use scope::{ScopeField, ScopeFrame, ScopeFrameBuilder, ScopeGuard, ScopeKind};
pub use sink::{
FanOutSink, FormatterStyle, InMemorySink, LevelSplitWriter, MakeWriter, NdjsonFileSink,
NonBlockingWriter, NoopSink, RollingFileWriter, RollingFileWriterBuilder, RollingPolicy, Sink,
StderrWriter, StdoutSink, StdoutWriter, TeeWriter, WorkerGuard,
};
pub use span_trace::SpanTrace;
#[doc(hidden)]
pub mod __private {
pub use std::sync::OnceLock;
pub use buffa;
pub use bytes::BytesMut;
pub use linkme;
pub use obs_proto::obs::v1::Severity as ProtoSeverity;
pub use obs_proto::{
__private::*,
obs::v1::{SamplingReason as ProtoSamplingReason, Tier as ProtoTier},
};
pub use obs_types::*;
pub use secrecy;
pub use serde_json;
pub use crate::{
callsite::ObsCallsite,
codegen_helpers::{BuildableTo, EnumCount, FieldCapture, SpanCtx, SpanFrame},
forensic::{ForensicLimiter, ensure_limiter, try_acquire_forensic},
registry::{EVENT_SCHEMAS, EventSchemaErased, Sealed},
scope::{ScopeField, ScopeGuard, ScopeKind},
wire::BuffaEncodeField,
};
#[must_use]
#[allow(clippy::indexing_slicing)]
pub const fn starts_with_obs(name: &str, prefix: &str) -> bool {
let n = name.as_bytes();
let p = prefix.as_bytes();
if n.len() < p.len() {
return false;
}
let mut i = 0;
while i < p.len() {
if n[i] != p[i] {
return false;
}
i += 1;
}
true
}
}