The Agent layer is the core of LLM intelligence, including Turn execution flow, LLM calls, token management, context compression, Sub-Agent orchestration, and more. These logs help you understand the Agent’s decision-making process and resource consumption.
Event Trigger Key Fields [turnagent] llm.completeLLM call completed session_id, turn_id, model, input_tokens, output_tokens, cached_read_tokens, cached_write_tokens, reasoning_tokens, total_tokens, cost_micros[turnagent] token_callback.compression_approachingToken usage approaching compression threshold session_id, usage_ratio[turnagent] cache hit rate below thresholdCache hit rate below threshold hit_rate, thresholdllm.http.requestLLM HTTP request sent (payload log) method, url, hostllm.http.response (stream complete)LLM streaming response completed (payload log) url, total_bytes, stream_completellm.http.errorLLM request failed (payload log) url, error
Note : Each LLM call may produce two llm.complete log entries — one with full token statistics (with model) and one with incremental statistics (model is empty). When investigating token consumption, focus on the entry that includes the model.
Event Trigger Key Fields [turnagent] compact.startCompression started session_id, turn_id[turnagent] compact.completedCompression completed session_id, messages_before, messages_after, tokens_saved[turnagent] compact.reestimateRe-estimate token count session_id, old_tokens, new_tokens[turnagent] compress.completedContext compression completed session_id, turn_id, messages_compressed[turnagent] summarize.threshold_fallbackSummarization threshold fallback session_id, threshold[turnagent] summarize.llm_token_usageSummarization LLM token consumption input_tokens, output_tokens[turnagent] summarize.llm_completeSummarization LLM call completed - [turnagent] reactive_compact.startReactive compression started session_id, turn_id, reason
Event Trigger Key Fields [session_memory_extractor] extractor.startMemory extraction started session_id, message_count[session_memory_extractor] extractor.doneMemory extraction completed session_id, memory_tokens[session_memory_extractor] extractor.skip_threshold_not_metExtraction threshold not met session_id, token_count, threshold[triggerSessionMemoryExtraction] extractedMemory extraction successful session_id, memory_tokenssave_session_memory.successSession memory extracted successfully (background agent) session_id, memory_tokenssaveMemory.successUser memory saved successfully user_id, memory_id, category, importancetool.webSearch.completedWeb search completed session_id, query, result_count, providertool.webFetch.completedWeb fetch completed session_id, url, bytes, status_code, cached
Event Trigger Key Fields [turnagent] handleStreamEnd.startStream response end processing started turn_id, session_id, role, token_usage_total, markdown_finalized, thinking_finalized[turnagent] handleStreamEnd.update_token_usageUpdate token usage turn_id, session_id, input_tokens, output_tokens[turnagent] appendStreamChunk.finalizeStream chunk final merge message_id, kind (thinking/markdown), chunk_count, full_content_len, full_content_preview[turnagent] on_agent_events.startAgent event processing started session_id, turn_id[turnagent] on_agent_events.doneAgent event processing completed session_id, turn_id[turnagent] on_agent_events.interruptedAgent event processing interrupted session_id, turn_id, num_contexts
Event Trigger Key Fields [turnagent] gen_input.startLLM input generation started session_id, turn_id, checkpoint_id, item_count, is_resume[turnagent] gen_resume.calledResume parameters generated turn_id, session_id, checkpoint_id, interrupted_count, unhandled_count, newItems_count[turnagent] gen_resume.resume_paramsResume parameter details turn_id, session_id, interrupt_id, has_result[turnagent] gen_resume.resultResume result turn_id, session_id, consumed_count, has_resume_params[turnagent] normalizeMessagesForLLM.appliedMessage sequence normalized session_id, before, after
Event Trigger Key Fields [turnagent] session_manager.createdSession manager created session_id, turn_id, worker_id[turnagent] session_manager.cleanup_doneSession manager cleanup completed session_id, turn_id
Event Trigger Key Fields notificationMessage.createdNotification message created (e.g., Loop triggered) session_id, text_len[primitives.CreateMessage]Message persisted id, session, turn, role, content_type
Event Trigger Key Fields [turnagent] subAgent.createdSub-Agent created sub_agent_session_id, parent_session_id, mode[turnagent] subAgent.work_submittedSub-Agent task submitted sub_agent_session_id, turn_id[turnagent] subAgent.async.returned_immediatelyAsync Sub-Agent returned immediately sub_agent_session_id[turnagent] subAgent.resume.completedSub-Agent resume completed sub_agent_session_id[turnagent] stopSubAgent.stoppedSub-Agent stopped sub_agent_session_id[turnagent] stopSubAgent.completedSub-Agent cleanup completed sub_agent_session_id[turnagent] resumeParentAfterSubAgent.doneParent Session resume completed parent_session_id[turnagent] notifyParentAfterAsyncSubAgent.doneAsync Sub-Agent notifies parent Session parent_session_id
Event Trigger Key Fields [turnagent] createTools.doneAgent tools created session_id, tool_count[turnagent] createAgent.startAgent creation started session_id, turn_id[turnagent] createAgent.doneAgent creation completed session_id, turn_id[turnagent] createAgent.failedAgent creation failed session_id, error[turnagent] todoWriteTool.publish_updateTodo tool update published session_id, turn_id
{service="server"} | json input_tokens="input_tokens", output_tokens="output_tokens" | msg="[turnagent] llm.complete"
{service="server"} | json session_id="session_id", usage_ratio="usage_ratio" | msg="[turnagent] token_callback.compression_approaching"
{service="server"} | json session_id="session_id" | msg=~"\\[turnagent\\] (compact\\.(start|completed|reestimate)|compress\\.completed|reactive_compact\\.start)" | session_id="session-abc"
{service="server"} | json tokens_saved="tokens_saved" | msg="[turnagent] compact.completed"
{service="server"} | json session_id="session_id", memory_tokens="memory_tokens" | msg=~"\\[session_memory_extractor\\] extractor\\.(start|done)|\\[triggerSessionMemoryExtraction\\] extracted"
{service="server"} | json hit_rate="hit_rate", threshold="threshold" | msg="[turnagent] cache hit rate below threshold"
{service="server"} | json sub_agent_session_id="sub_agent_session_id" | msg=~"\\[turnagent\\] (subAgent\\.(created|work_submitted|resume\\.completed|async\\.returned_immediately)|stopSubAgent\\.(stopped|completed))"
{service="server"} | json | msg=~"\\[turnagent\\] (subAgent|stopSubAgent|resumeParentAfterSubAgent|notifyParentAfterAsyncSubAgent)\\..*(failed|error)"
{service="server"} | json session_id="session_id", error="error" | msg="[turnagent] createAgent.failed"
{service="server"} | json | msg="llm.http.error"
{service="server"} | json provider="provider", model="model" | msg="LLM initialized"
{service="server"} | msg="LLM not configured"
{service="server"} | json chunk_count="chunk_count", full_content_len="full_content_len", kind="kind" | msg="[turnagent] appendStreamChunk.finalize"
{service="server"} | json model="model", input_tokens="input_tokens", output_tokens="output_tokens", cached_read_tokens="cached_read_tokens", reasoning_tokens="reasoning_tokens", cost_micros="cost_micros" | msg="[turnagent] llm.complete" | model!=""
{service="server"} | json session_id="session_id", turn_id="turn_id", num_contexts="num_contexts" | msg="[turnagent] on_agent_events.interrupted"
{service="server"} | json session_id="session_id", before="before", after="after" | msg="[turnagent] normalizeMessagesForLLM.applied"
{service="server"} | json turn_id="turn_id", interrupt_id="interrupt_id", has_result="has_result" | msg="[turnagent] gen_resume.resume_params"
{service="server"} | json session_id="session_id", text_len="text_len" | msg="notificationMessage.created"
{service="server"} | json session_id="session_id", msg="msg" | msg=~"\\[turnagent\\] (agent\\.process|createTurn|beginTurn|turn\\.(start|end)|llm\\.complete|on_agent_events|session_manager)" | session_id="session-abc"
Metric Type Labels Purpose rtc_llm_tokens_totalCounter model, type (input/output)Total LLM token consumption rtc_llm_request_duration_secondsHistogram model, statusLLM API latency rtc_llm_http_request_totalCounter - Total LLM HTTP requests rtc_llm_http_request_duration_secondsHistogram - LLM HTTP request latency rtc_llm_http_response_tokens_totalCounter - LLM HTTP response token count
# Token consumption rate per minute
sum by (model, type) (rate(rtc_llm_tokens_total[5m]))
histogram_quantile(0.95, sum(rate(rtc_llm_request_duration_seconds_bucket[5m])) by (le, model))
sum(rate(rtc_llm_request_duration_seconds_count{status="error"}[5m])) / sum(rate(rtc_llm_request_duration_seconds_count[5m]))
In addition to structured logs and Prometheus metrics, the Agent layer automatically creates OpenTelemetry Spans for key operations, enabling you to view complete call chains in tracing backends like Grafana Tempo.
💡 All structured logs are automatically injected with trace_id and span_id (from the OpenTelemetry context), allowing you to correlate logs with Spans via Trace ID. See Common Log Query Patterns — Query by Trace ID for details.
Span Name Trigger Key Attributes tool.searchMemorysearchMemory tool call query, limit, result_counttool.saveMemorysaveMemory tool call category, importancetool.updateMemoryupdateMemory tool call memory_idtool.deleteMemorydeleteMemory tool call memory_idtool.listMemorieslistMemories tool call — tool.webSearchwebSearch tool call query, provider, result_counttool.webFetchwebFetch tool call url, cachedtool.subAgentsubAgent tool call modetool.stopSubAgentstopSubAgent tool call — tool.createGoalcreateGoal tool call — tool.todoWritetodoWrite tool call — rtcTool.<name>RTC tool calls (ls/read/write/grep/find/script, etc.) tool_namegoalWorkflow.onTurnCompleteGoal workflow turn check — loopWorkflow.onTurnCompleteLoop workflow progress check — loopWorkflow.scheduleNextLoop scheduling next execution — gorm.*All SQL operations (GORM tracing plugin) SQL statements, affected rows centrifuge-plus.*Centrifuge publish/subscribe operations channel, offset, queue
📌 OpenTelemetry tracing is enabled in production by configuring a TracerProvider. When not configured, a no-op tracer is used with zero overhead.
Alert Condition Description High LLM error rate LLM request error rate > 5% LLM service is unstable Excessive token consumption rate(rtc_llm_tokens_total[5m]) abnormally highPossible context leak Low cache hit rate cache hit rate below threshold appears frequentlyAutoCacheControl may have failed
💡 For a complete list of Prometheus metrics, Grafana dashboards, and alert rules, see Monitoring & Observability .