Tracing
Tracing — Actor observability, trace context, and performance telemetry.
Provides class methods for controlling trace capture, setting application-level trace context, querying aggregate stats, analyzing performance bottlenecks, and checking actor/VM health. All methods are class-side — Tracing has no instances.
Trace context (setContext:/context/clearContext) propagates automatically across actor boundaries, so workflow IDs and request metadata flow through actor call chains without manual threading.
Aggregate stats (call counts, durations) are always-on with negligible overhead (~150ns/call). Detailed trace events require explicit enable/disable.
Examples
// Set application-level trace context
Tracing setContext: #{#workflowId => "wf-123"}
// => nil
Tracing context
// => _
// Always-on aggregates — no setup needed
Tracing stats
// => _
// Enable trace capture for detailed events
Tracing enable
// => nil
Tracing isEnabled
// => true
// Query traces
Tracing traces
// => _
// Analysis
Tracing slowMethods: 5
// => _
// Clean up
Tracing clearContext
// => nil
Tracing disable
// => nil
Tracing clear
// => nil
Methods
- class » setContext: ctx
- class » context
- class » clearContext
- class » enable
- class » disable
- class » isEnabled
- class » clear
- class » traces
- class » tracesFor: actor
- class » tracesFor: actor selector: sel
- class » stats
- class » statsFor: actor
- class » slowMethods: limit
- class » hotMethods: limit
- class » errorMethods: limit
- class » bottlenecks: limit
- class » healthFor: actor
- class » systemHealth
- class » maxEvents
- class » maxEvents: size
Class Methods
Set application-level trace context that propagates across actor calls. Merges with any existing context. Use for workflow correlation IDs, request IDs, or any application-level metadata you want in traces and logs.
Examples
Tracing setContext: #{#workflowId => "wf-123", #workflowType => "OrderWorkflow"}
// => nil
Get the current application-level trace context. Returns an empty dictionary when no context has been set.
Examples
Tracing context
// => _
Clear the application-level trace context. Removes all trace context keys from the process and logger metadata.
Examples
Tracing clearContext
// => nil
Start capturing trace events (aggregates are always on).
Examples
Tracing enable
// => nil
Stop capturing trace events.
Examples
Tracing disable
// => nil
Check whether trace capture is active.
Examples
Tracing isEnabled
// => _
Clear all trace events and aggregate stats.
Examples
Tracing clear
// => nil
All captured trace events (up to buffer limit), newest first. Returns [] when not enabled.
Examples
Tracing traces
// => _
Trace events for a specific actor.
Examples
// Tracing tracesFor: myCounter
// => _
Trace events for a specific actor + method.
Examples
// Tracing tracesFor: myCounter selector: #increment
// => _
Per-actor, per-method aggregate stats (always available, even without tracing).
Examples
Tracing stats
// => _
Aggregate stats for a specific actor. Returns #{} for unknown actors.
Examples
// Tracing statsFor: myCounter
// => _
Top N methods by average duration (descending).
Examples
Tracing slowMethods: 10
// => _
Top N methods by call count (descending).
Examples
Tracing hotMethods: 10
// => _
Top N methods by error + timeout rate (descending).
Examples
Tracing errorMethods: 5
// => _
Top N actors by message queue length — live snapshot.
Examples
Tracing bottlenecks: 5
// => _
Live process info: queue depth, memory, reductions, status. Returns status=dead for dead actors.
Examples
// Tracing healthFor: myCounter
// => _
VM overview: scheduler count, memory breakdown, process count, run queue lengths.
Examples
Tracing systemHealth
// => _
Current ring buffer capacity.
Examples
Tracing maxEvents
// => _
Set ring buffer capacity.
Examples
Tracing maxEvents: 50000
// => nil
Inherited Methods
From Object
Return the class of the receiver.
Examples
42 class // => Integer
"hello" class // => String
Test if the receiver is nil. Returns false for all objects except nil.
Examples
42 isNil // => false
nil isNil // => true
Test if the receiver is not nil. Returns true for all objects except nil.
Examples
42 notNil // => true
nil notNil // => false
If the receiver is nil, evaluate nilBlock. Otherwise return self.
Examples
42 ifNil: [0] // => 42
nil ifNil: [0] // => 0
If the receiver is not nil, evaluate notNilBlock with self.
Examples
42 ifNotNil: [:v | v + 1] // => 43
nil ifNotNil: [:v | v + 1] // => nil
If nil, evaluate nilBlock; otherwise evaluate notNilBlock with self.
Examples
42 ifNil: [0] ifNotNil: [:v | v + 1] // => 43
nil ifNil: [0] ifNotNil: [:v | v + 1] // => 0
If not nil, evaluate notNilBlock with self; otherwise evaluate nilBlock.
Examples
42 ifNotNil: [:v | v + 1] ifNil: [0] // => 43
nil ifNotNil: [:v | v + 1] ifNil: [0] // => 0
Return a developer-readable string representation.
Default implementation returns "a ClassName". Subclasses such as
Integer, String, and List override this to return richer output.
Examples
42 printString // => "42"
Return a user-facing string representation for display purposes.
Default implementation delegates to printString. Subclasses such as
String and Symbol override this to return a more readable form without
developer annotations (e.g. no surrounding quotes or # prefix).
Examples
42 displayString // => "42"
Inspect the receiver.
Examples
42 inspect // => "42"
Return the receiver itself. Useful for cascading side effects.
Examples
42 yourself // => 42
Return a hash value for the receiver.
Examples
42 hash
Test if the receiver responds to the given selector.
Examples
42 respondsTo: #abs // => true
Return the names of fields.
Examples
42 fieldNames // => #()
Return the value of the named field.
Examples
object fieldAt: #name
Set the value of the named field (returns new state).
Examples
object fieldAt: #name put: "Alice"
Send a unary message dynamically.
Examples
42 perform: #abs // => 42
Send a message dynamically with arguments.
Examples
3 perform: #max: withArguments: #(5) // => 5
Raise an error indicating this method must be overridden by a subclass.
Examples
self subclassResponsibility
Raise an error indicating this method has not yet been implemented.
Use this for work-in-progress stubs. Distinct from subclassResponsibility,
which signals an interface contract violation.
Examples
self notImplemented
Send aValue to the current transcript without a trailing newline.
Nil-safe: does nothing when no transcript is set (batch compile, tests).
Examples
42 show: "value: "
Send aValue to the current transcript followed by a newline.
Nil-safe: does nothing when no transcript is set (batch compile, tests).
Examples
42 showCr: "hello world"
Test if the receiver is an instance of aClass or any of its subclasses.
Examples
42 isKindOf: Integer // => true
42 isKindOf: Object // => true
#foo isKindOf: Symbol // => true
#foo isKindOf: String // => false
Raise an error with the given message.
Examples
self error: "something went wrong"
From ProtoObject
Test value equality (Erlang ==).
Examples
42 == 42 // => true
"abc" == "abc" // => true
Test value inequality (negation of ==).
Examples
1 /= 2 // => true
42 /= 42 // => false
Return the class of the receiver.
Examples
42 class // => Integer
"hello" class // => String
Handle messages the receiver does not understand. Override for custom dispatch.
Examples
42 unknownMessage // => ERROR: does_not_understand
Send a message dynamically with an arguments list.
Examples
42 perform: #abs withArguments: #() // => 42
Execute a class method in the caller's process, bypassing gen_server dispatch.
The caller takes responsibility for knowing the method does not mutate class state. Useful for long-running class methods that would otherwise block the class object's gen_server.
Limitations: only resolves methods defined directly on the target class
module (does not walk the superclass chain). Class variables and self
are not available to the method (nil and #{} are passed).
Examples
MyClass performLocally: #run:ctx: withArguments: #(input, ctx)
Send a message dynamically with an arguments list and explicit timeout.
The timeout (in milliseconds or #infinity) applies to the gen_server:call
when the receiver is an actor. For value types, timeout is ignored.
Examples
actor perform: #query withArguments: #(sql) timeout: 30000