moon add cybershang/agent-telemetry// Option 1: one-line initialization from environment variables.
// Reads OTEL_SERVICE_NAME, OTEL_STDOUT, and OTEL_EXPORTER_OTLP_ENDPOINT.
// Use ProcessUniqueRandom to avoid duplicate trace/span IDs across restarts.
let provider = @telemetry.init_from_env(
id_generator=@telemetry.ProcessUniqueRandom,
)
// Option 2: manually select an exporter.
let config = @telemetry.TelemetryConfig::new(service_name="my-agent")
let provider = @telemetry.init_telemetry(
config,
@telemetry.Otlp("http://localhost:4318"),
id_generator=@telemetry.ProcessUniqueRandom,
)
// Create a GenAI chat span.
let tracer = @telemetry.tracer("my-agent/llm")
let span = @telemetry.start_chat_span(
tracer,
provider_name="stepfun",
model="step-3.7-flash",
max_tokens=1024,
)
// ... send the request and obtain response_json ...
@telemetry.record_chat_response(span, response_json)
@telemetry.end_span_ok(span)| Scenario | Functions |
|---|---|
| General | TelemetryConfig::new, init_telemetry, init_from_env, IdGeneratorOption, tracer, start_span, end_span, end_span_ok, end_span_error |
| LLM chat | start_chat_span, record_chat_usage, record_chat_response, set_chat_http_error |
| Tool | start_tool_span, record_tool_result, set_tool_error |
| Agent turn | start_agent_turn_span, record_turn_metrics, set_turn_max_tool_turns_error |
| Variable | Description | Default |
|---|---|---|
| OTEL_SERVICE_NAME | Service name | agent-telemetry |
| OTEL_STDOUT | Use the stdout exporter when set to true | false |
| OTEL_EXPORTER_OTLP_ENDPOINT | OTLP/HTTP endpoint | http://localhost:4318 |
fn format_error(err : @error.OTelSdkError) -> String {
match err {
AlreadyShutdown => "AlreadyShutdown"
Timeout(ms) => "Timeout(\{ms}ms)"
InvalidArgument(msg) => "InvalidArgument(\{msg})"
InternalFailure(msg) => "InternalFailure(\{msg})"
ExportFailure(name, msg) => "ExportFailure(\{name}, \{msg})"
}
}
match provider.force_flush() {
Ok(_) => ()
Err(err) => @stdio.stdout.write("Telemetry flush failed: " + format_error(err) + "\n")
}
match provider.shutdown() {
Ok(_) => ()
Err(err) => @stdio.stdout.write("Telemetry shutdown failed: " + format_error(err) + "\n")
}| Option | Description |
|---|---|
| @telemetry.SdkDefault | Use the SDK default RandomIdGenerator |
| @telemetry.ProcessUniqueRandom | Generate a process-unique seed from the current timestamp and a counter, avoiding duplicate trace/span IDs across restarts |
| @telemetry.Custom(generator) | Provide your own IdGenerator |
moon test -p cybershang/agent-telemetry --target nativeasync fn init_from_env(service_name? : String, id_generator? : IdGeneratorOption) -> SdkTracerProviderasync fn init_telemetry(config : TelemetryConfig, exporter_type : ExporterType, id_generator? : IdGeneratorOption) -> SdkTracerProviderfn record_turn_metrics(span : Span, actual_turns : Int, tool_call_count : Int, output : String) -> UnitInstall
Download zip