API Reference
All types and exports
Main Exports
import {
// Builder
Builder,
AfterlogError,
normalize,
extractTraceId,
// Types
WideEvent,
BaseWideEvent,
HttpWideEvent,
WideEventError,
Lifecycle,
TimingStats,
State,
Finalized,
// Singleton
afterlog,
Afterlog,
AfterlogNotConfiguredError,
SingletonConfig,
// Sampling
SamplingEngine,
errorRule,
createLatencyRule,
createRandomRule,
createConsistentRule,
SamplingDecision,
SamplingRule,
SamplingConfig,
LatencyConfig,
ConsistentConfig,
// Adapters
AdapterManager,
createConsoleAdapter,
ConsoleAdapterOptions,
LoggerAdapter,
AdapterMetrics,
EmitHook,
ErrorHook,
} from "afterlog"Singleton
afterlog.configure()
afterlog.configure(config: SingletonConfig<T>): voidConfigure the global instance. Call once at startup.
afterlog.createBuilder()
afterlog.createBuilder(init?: Init): Builder<T>Create a builder for a request.
afterlog.finalize()
afterlog.finalize(builder: Builder<T>): Promise<void>Finalize builder and emit if sampled.
afterlog.flush()
afterlog.flush(): Promise<void>Flush buffered events.
afterlog.destroy()
afterlog.destroy(): Promise<void>Clean up resources.
afterlog.isHealthy()
afterlog.isHealthy(): Promise<boolean>Check if adapters are working.
afterlog.getMetrics()
afterlog.getMetrics(): AdapterMetrics | nullGet adapter metrics.
Types
WideEvent
interface WideEvent extends HttpWideEvent {
[key: string]: unknown
}BaseWideEvent
interface BaseWideEvent {
readonly request_id: UUID
readonly trace_id: UUID
readonly timestamp: string
readonly service?: string
readonly version?: string
readonly region?: string
readonly deployment_id?: string
readonly environment?: string
}HttpWideEvent
interface HttpWideEvent extends BaseWideEvent {
http_method?: string
path?: string
query?: Record<string, string>
http_status_code?: number
request_duration_ms?: number
request_outcome?: "success" | "error" | "timeout" | "cancelled"
request_bytes?: number
response_bytes?: number
error?: WideEventError
timings?: Record<string, number>
}WideEventError
interface WideEventError {
type: string
message: string
code?: string | null
stack?: string | null
retriable?: boolean
context?: Record<string, unknown>
}SingletonConfig
interface SingletonConfig<T extends BaseWideEvent> {
adapter: LoggerAdapter<T>
sampling?: SamplingConfig
service: string
version?: string
region?: string
deployment_id?: string
environment?: string
clock?: Clock
timeout_ms?: number
}Clock
interface Clock {
now(): number
elapsed(start: number): number
}Enricher
type Enricher<T extends BaseWideEvent> = (
event: Partial<T>,
meta: Map<string, unknown>,
) => Partial<T> | voidConfig
interface Config<T extends BaseWideEvent> {
service?: string
version?: string
region?: string
deployment_id?: string
environment?: string
clock?: Clock
enrichers?: Enricher<T>[]
timeout_ms?: number
}Init
interface Init {
request_id?: UUID
trace_id?: UUID
parent_span_id?: string
method?: string
path?: string
headers?: Record<string, string>
}Lifecycle
type Lifecycle = "created" | "building" | "finalizing" | "emitted" | "dropped"TimingStats
interface TimingStats {
count: number
total_ms: number
min_ms: number
max_ms: number
avg_ms: number
}State
interface State<T extends BaseWideEvent> {
readonly id: UUID
lifecycle: Lifecycle
readonly startTime: number
readonly base: { ... }
context: Partial<T>
timers: Map<string, number>
timings: Map<string, TimingStats>
errors: NormalizedError[]
meta: Map<string, unknown>
}Finalized
type Finalized<T extends BaseWideEvent> = Readonly<
T & {
readonly duration_ms: number
readonly outcome: "success" | "error" | "timeout" | "cancelled"
}
>NormalizedError
interface NormalizedError extends WideEventError {
original: unknown
}LoggerAdapter
interface LoggerAdapter<T extends BaseWideEvent> {
emit(event: Finalized<T>): void | Promise<void>
flush?(): Promise<void>
destroy?(): Promise<void>
isHealthy?(): boolean | Promise<boolean>
}AdapterMetrics
interface AdapterMetrics {
eventsEmitted: number
eventsFailed: number
bytesEmitted: number
lastEmitTime: Date | null
lastErrorTime: Date | null
averageEmitDurationMs: number
}EmitHook
type EmitHook<T extends BaseWideEvent> = (event: Finalized<T>) => void | Promise<void>ErrorHook
type ErrorHook<T extends BaseWideEvent> = (
error: Error,
event?: Finalized<T>,
) => void | Promise<void>SamplingDecision
interface SamplingDecision {
sampled: boolean
rate: number
reason: string
metadata?: Record<string, unknown>
}SamplingRule
interface SamplingRule<T extends BaseWideEvent> {
readonly name: string
readonly priority: number
evaluate(event: T): SamplingDecision | undefined
}SamplingConfig
interface SamplingConfig<T extends BaseWideEvent> {
rules: SamplingRule<T>[]
defaultRate?: number
addSamplingMetadata?: boolean
}LatencyConfig
interface LatencyConfig {
alwaysSampleAbove?: number
thresholds?: Array<{ durationMs: number; rate: number }>
}ConsistentConfig
interface ConsistentConfig {
rate: number
hashField?: string
}ConsoleAdapterOptions
interface ConsoleAdapterOptions {
method?: "log" | "info" | "warn" | "error" | "debug"
pretty?: boolean
includeTimestamp?: boolean
}UUID
type UUID = string & { readonly __brand: unique symbol }