docs/cli/telemetry.md
Observability is the key to turning experimental AI into reliable software. Gemini CLI provides built-in support for OpenTelemetry, transforming every agent interaction into a rich stream of logs, metrics, and traces. This three-pillar approach gives you the high-fidelity visibility needed to understand agent behavior, optimize performance, and ensure reliability across your entire workflow.
Whether you are debugging a complex tool interaction locally or monitoring enterprise-wide usage in the cloud, Gemini CLI's observability system provides the actionable intelligence needed to move from "black box" AI to predictable, high-performance systems.
Gemini CLI integrates with OpenTelemetry, a vendor-neutral, industry-standard observability framework.
The observability system provides:
You control telemetry behavior through the .gemini/settings.json file.
Environment variables can override these settings.
| Setting | Environment Variable | Description | Values | Default |
|---|---|---|---|---|
enabled | GEMINI_TELEMETRY_ENABLED | Enable or disable telemetry | true/false | false |
traces | GEMINI_TELEMETRY_TRACES_ENABLED | Enable detailed attribute tracing | true/false | false |
target | GEMINI_TELEMETRY_TARGET | Where to send telemetry data | "gcp"/"local" | "local" |
otlpEndpoint | GEMINI_TELEMETRY_OTLP_ENDPOINT | OTLP collector endpoint | URL string | http://localhost:4317 |
otlpProtocol | GEMINI_TELEMETRY_OTLP_PROTOCOL | OTLP transport protocol | "grpc"/"http" | "grpc" |
outfile | GEMINI_TELEMETRY_OUTFILE | Save telemetry to file (overrides otlpEndpoint) | file path | - |
logPrompts | GEMINI_TELEMETRY_LOG_PROMPTS | Include prompts in telemetry logs | true/false | true |
useCollector | GEMINI_TELEMETRY_USE_COLLECTOR | Use external OTLP collector (advanced) | true/false | false |
useCliAuth | GEMINI_TELEMETRY_USE_CLI_AUTH | Use CLI credentials for telemetry (GCP target only) | true/false | false |
| - | GEMINI_CLI_SURFACE | Optional custom label for traffic reporting | string | - |
Note on boolean environment variables: For boolean settings like enabled,
setting the environment variable to true or 1 enables the feature.
For detailed configuration information, see the Configuration guide.
You can export telemetry data directly to Google Cloud Trace, Cloud Monitoring, and Cloud Logging.
You must complete several setup steps before enabling Google Cloud telemetry.
Set your Google Cloud project ID:
To send telemetry to a separate project:
macOS/Linux
export OTLP_GOOGLE_CLOUD_PROJECT="your-telemetry-project-id"
Windows (PowerShell)
$env:OTLP_GOOGLE_CLOUD_PROJECT="your-telemetry-project-id"
To send telemetry to the same project as inference:
macOS/Linux
export GOOGLE_CLOUD_PROJECT="your-project-id"
Windows (PowerShell)
$env:GOOGLE_CLOUD_PROJECT="your-project-id"
Authenticate with Google Cloud using one of these methods:
gcloud authentication.
For user accounts:
gcloud auth application-default login
For service accounts:
macOS/Linux
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account.json"
Windows (PowerShell)
$env:GOOGLE_APPLICATION_CREDENTIALS="C:\path\to\your\service-account.json"
Method B: CLI Auth (Direct export only): Simplest method for local
users. Gemini CLI uses the same OAuth credentials you used for login. To
enable this, set useCliAuth: true in your .gemini/settings.json:
{
"telemetry": {
"enabled": true,
"target": "gcp",
"useCliAuth": true
}
}
[!NOTE] This setting requires Direct export (in-process exporters) and cannot be used when
useCollectoristrue. If both are enabled, telemetry will be disabled.
Ensure your account or service account has these IAM roles:
Enable the required Google Cloud APIs:
gcloud services enable \
cloudtrace.googleapis.com \
monitoring.googleapis.com \
logging.googleapis.com \
--project="$OTLP_GOOGLE_CLOUD_PROJECT"
We recommend using direct export to send telemetry directly to Google Cloud services.
.gemini/settings.json:
{
"telemetry": {
"enabled": true,
"target": "gcp"
}
}
After you enable telemetry and run Gemini CLI, you can view your data in the Google Cloud Console.
For detailed information on how to use these tools, see the following official Google Cloud documentation:
Gemini CLI provides a pre-configured Google Cloud Monitoring dashboard to visualize your telemetry.
Find this dashboard under Google Cloud Monitoring Dashboard Templates as "Gemini CLI Monitoring".
To learn more, see Instant insights: Gemini CLI’s pre-configured monitoring dashboards.
You can capture telemetry data locally for development and debugging. We recommend using file-based output for local development.
.gemini/settings.json:
{
"telemetry": {
"enabled": true,
"target": "local",
"outfile": ".gemini/telemetry.log"
}
}
.gemini/telemetry.log.For advanced local telemetry setups (such as Jaeger or Genkit), see the Local development guide.
Gemini CLI includes identifiers in its User-Agent header to help you
differentiate and report on API traffic from different environments (for
example, identifying calls from Gemini Code Assist versus a standard terminal).
Most integrated environments are identified automatically without additional
configuration. The identifier is included as a prefix to the User-Agent and as
a "surface" tag in the parenthetical metadata.
| Environment | User-Agent Prefix | Surface Tag |
|---|---|---|
| Gemini Code Assist (Agent Mode) | GeminiCLI-a2a-server | vscode |
| Zed (via ACP) | GeminiCLI-acp-zed | zed |
| XCode (via ACP) | GeminiCLI-acp-xcode | xcode |
| IntelliJ IDEA (via ACP) | GeminiCLI-acp-intellijidea | jetbrains |
| Standard Terminal | GeminiCLI | terminal |
Example User-Agent:
GeminiCLI-a2a-server/0.34.0/gemini-pro (linux; x64; vscode)
You can provide a custom identifier for your own scripts or automation by
setting the GEMINI_CLI_SURFACE environment variable. This is useful for
tracking specific internal tools or distribution channels in your GCP logs.
macOS/Linux
export GEMINI_CLI_SURFACE="my-custom-tool"
Windows (PowerShell)
$env:GEMINI_CLI_SURFACE="my-custom-tool"
When set, the value appears at the end of the User-Agent parenthetical:
GeminiCLI/0.34.0/gemini-pro (linux; x64; my-custom-tool)
This section describes the structure of logs, metrics, and traces generated by Gemini CLI.
Gemini CLI includes session.id, installation.id, active_approval_mode, and
user.email (when authenticated) as common attributes on all data.
Logs provide timestamped records of specific events. Gemini CLI logs events across several categories.
Session logs capture startup configuration and prompt submissions.
gemini_cli.configEmitted at startup with the CLI configuration.
<details> <summary>Attributes</summary>model (string)embedding_model (string)sandbox_enabled (boolean)core_tools_enabled (string)approval_mode (string)api_key_enabled (boolean)vertex_ai_enabled (boolean)log_user_prompts_enabled (boolean)file_filtering_respect_git_ignore (boolean)debug_mode (boolean)mcp_servers (string)mcp_servers_count (int)mcp_tools (string)mcp_tools_count (int)output_format (string)extensions (string)extension_ids (string)extensions_count (int)auth_type (string)worktree_active (boolean)github_workflow_name (string, optional)github_repository_hash (string, optional)github_event_name (string, optional)github_pr_number (string, optional)github_issue_number (string, optional)github_custom_tracking_id (string, optional)gemini_cli.user_promptEmitted when you submit a prompt.
<details> <summary>Attributes</summary>prompt_length (int)prompt_id (string)prompt (string; excluded if telemetry.logPrompts is false)auth_type (string)These logs track changes to and usage of different approval modes.
approval_mode_switchLogs when you change the approval mode.
<details> <summary>Attributes</summary>from_mode (string)to_mode (string)approval_mode_durationRecords time spent in an approval mode.
<details> <summary>Attributes</summary>mode (string)duration_ms (int)plan_executionLogs when you execute a plan and switch from plan mode to active execution.
<details> <summary>Attributes</summary>approval_mode (string)Tool logs capture executions, truncation, and edit behavior.
gemini_cli.tool_callEmitted for each tool (function) call.
<details> <summary>Attributes</summary>function_name (string)function_args (string)duration_ms (int)success (boolean)decision (string: "accept", "reject", "auto_accept", or "modify")error (string, optional)error_type (string, optional)prompt_id (string)tool_type (string: "native" or "mcp")mcp_server_name (string, optional)extension_name (string, optional)extension_id (string, optional)content_length (int, optional)start_time (number, optional)end_time (number, optional)metadata (object, optional), which may include:
model_added_lines (number)model_removed_lines (number)user_added_lines (number)user_removed_lines (number)ask_user (object)gemini_cli.tool_output_truncatedLogs when tool output is truncated.
<details> <summary>Attributes</summary>tool_name (string)original_content_length (int)truncated_content_length (int)threshold (int)lines (int)prompt_id (string)gemini_cli.edit_strategyRecords the chosen edit strategy.
<details> <summary>Attributes</summary>strategy (string)gemini_cli.edit_correctionRecords the result of an edit correction.
<details> <summary>Attributes</summary>correction (string: "success" or "failure")gen_ai.client.inference.operation.detailsProvides detailed GenAI operation data aligned with OpenTelemetry conventions.
<details> <summary>Attributes</summary>gen_ai.request.model (string)gen_ai.provider.name (string)gen_ai.operation.name (string)gen_ai.input.messages (json string)gen_ai.output.messages (json string)gen_ai.response.finish_reasons (array of strings)gen_ai.usage.input_tokens (int)gen_ai.usage.output_tokens (int)gen_ai.request.temperature (float)gen_ai.request.top_p (float)gen_ai.request.top_k (int)gen_ai.request.max_tokens (int)gen_ai.system_instructions (json string)server.address (string)server.port (int)File logs track operations performed by tools.
gemini_cli.file_operationEmitted for each file creation, read, or update.
<details> <summary>Attributes</summary>tool_name (string)operation (string: "create", "read", or "update")lines (int, optional)mimetype (string, optional)extension (string, optional)programming_language (string, optional)API logs capture requests, responses, and errors from Gemini API.
gemini_cli.api_requestRequest sent to Gemini API.
<details> <summary>Attributes</summary>model (string)prompt_id (string)role (string: "user", "model", or "system")request_text (string, optional)gemini_cli.api_responseResponse received from Gemini API.
<details> <summary>Attributes</summary>model (string)status_code (int or string)duration_ms (int)input_token_count (int)output_token_count (int)cached_content_token_count (int)thoughts_token_count (int)tool_token_count (int)total_token_count (int)prompt_id (string)auth_type (string)finish_reasons (array of strings)response_text (string, optional)gemini_cli.api_errorLogs when an API request fails.
<details> <summary>Attributes</summary>error.message (string)model_name (string)duration (int)prompt_id (string)auth_type (string)error_type (string, optional)status_code (int or string, optional)role (string, optional)gemini_cli.malformed_json_responseLogs when a JSON response cannot be parsed.
<details> <summary>Attributes</summary>model (string)These logs track how Gemini CLI selects and routes requests to models.
gemini_cli.slash_commandLogs slash command execution.
<details> <summary>Attributes</summary>command (string)subcommand (string, optional)status (string: "success" or "error")gemini_cli.slash_command.modelLogs model selection via slash command.
<details> <summary>Attributes</summary>model_name (string)gemini_cli.model_routingRecords model router decisions and reasoning.
<details> <summary>Attributes</summary>decision_model (string)decision_source (string)routing_latency_ms (int)reasoning (string, optional)failed (boolean)error_message (string, optional)approval_mode (string)These logs track chat context compression and streaming chunk errors.
gemini_cli.chat_compressionLogs chat context compression events.
<details> <summary>Attributes</summary>tokens_before (int)tokens_after (int)gemini_cli.chat.invalid_chunkLogs invalid chunks received in a stream.
<details> <summary>Attributes</summary>error_message (string, optional)gemini_cli.chat.content_retryLogs retries due to content errors.
<details> <summary>Attributes</summary>attempt_number (int)error_type (string)retry_delay_ms (int)model (string)gemini_cli.chat.content_retry_failureLogs when all content retries fail.
<details> <summary>Attributes</summary>total_attempts (int)final_error_type (string)total_duration_ms (int, optional)model (string)gemini_cli.conversation_finishedLogs when a conversation session ends.
<details> <summary>Attributes</summary>approvalMode (string)turnCount (int)Resilience logs record fallback mechanisms and recovery attempts.
gemini_cli.flash_fallbackLogs switch to a flash model fallback.
<details> <summary>Attributes</summary>auth_type (string)gemini_cli.ripgrep_fallbackLogs fallback to standard grep.
<details> <summary>Attributes</summary>error (string, optional)gemini_cli.web_fetch_fallback_attemptLogs web-fetch fallback attempts.
<details> <summary>Attributes</summary>reason (string: "private_ip" or "primary_failed")gemini_cli.agent.recovery_attemptLogs attempts to recover from agent errors.
<details> <summary>Attributes</summary>agent_name (string)attempt_number (int)success (boolean)error_type (string, optional)Extension logs track lifecycle events and settings changes.
gemini_cli.extension_installLogs when you install an extension.
<details> <summary>Attributes</summary>extension_name (string)extension_version (string)extension_source (string)status (string)gemini_cli.extension_uninstallLogs when you uninstall an extension.
<details> <summary>Attributes</summary>extension_name (string)status (string)gemini_cli.extension_enableLogs when you enable an extension.
<details> <summary>Attributes</summary>extension_name (string)setting_scope (string)gemini_cli.extension_disableLogs when you disable an extension.
<details> <summary>Attributes</summary>extension_name (string)setting_scope (string)Agent logs track the lifecycle of agent executions.
gemini_cli.agent.startLogs when an agent run begins.
<details> <summary>Attributes</summary>agent_id (string)agent_name (string)gemini_cli.agent.finishLogs when an agent run completes.
<details> <summary>Attributes</summary>agent_id (string)agent_name (string)duration_ms (int)turn_count (int)terminate_reason (string)IDE logs capture connectivity events for the IDE companion.
gemini_cli.ide_connectionLogs IDE companion connections.
<details> <summary>Attributes</summary>connection_type (string)UI logs track terminal rendering issues.
kitty_sequence_overflowLogs terminal control sequence overflows.
<details> <summary>Attributes</summary>sequence_length (int)truncated_sequence (string)gemini_cli.rewindLogs when the conversation state is rewound.
<details> <summary>Attributes</summary>outcome (string)gemini_cli.conseca.verdictLogs security verdicts from ConSeca.
<details> <summary>Attributes</summary>verdict (string)decision (string: "accept", "reject", or "modify")reason (string, optional)tool_name (string, optional)gemini_cli.hook_callLogs execution of lifecycle hooks.
<details> <summary>Attributes</summary>hook_name (string)hook_type (string)duration_ms (int)success (boolean)gemini_cli.tool_output_maskingLogs when tool output is masked for privacy.
<details> <summary>Attributes</summary>tokens_before (int)tokens_after (int)masked_count (int)total_prunable_tokens (int)gemini_cli.keychain.availabilityLogs keychain availability checks.
<details> <summary>Attributes</summary>available (boolean)gemini_cli.startup_statsLogs detailed startup performance statistics.
<details> <summary>Attributes</summary>phases (json array of startup phases)os_platform (string)os_release (string)is_docker (boolean)Metrics provide numerical measurements of behavior over time.
Gemini CLI exports several custom metrics.
gemini_cli.session.countIncremented once per CLI startup.
Tracks onboarding flow from authentication to the user
gemini_cli.onboarding.start (Counter, Int): Incremented when the
authentication flow begins.
gemini_cli.onboarding.success (Counter, Int): Incremented when the user
onboarding flow completes successfully.
user_tier (string)gemini_cli.tool.call.countCounts tool calls.
<details> <summary>Attributes</summary>function_name (string)success (boolean)decision (string: "accept", "reject", "modify", or "auto_accept")tool_type (string: "mcp" or "native")gemini_cli.tool.call.latencyMeasures tool call latency (in ms).
<details> <summary>Attributes</summary>function_name (string)gemini_cli.api.request.countCounts all API requests.
<details> <summary>Attributes</summary>model (string)status_code (int or string)error_type (string, optional)gemini_cli.api.request.latencyMeasures API request latency (in ms).
<details> <summary>Attributes</summary>model (string)gemini_cli.token.usageCounts input, output, thought, cache, and tool tokens.
<details> <summary>Attributes</summary>model (string)type (string: "input", "output", "thought", "cache", or "tool")gemini_cli.file.operation.countCounts file operations.
<details> <summary>Attributes</summary>operation (string: "create", "read", or "update")lines (int, optional)mimetype (string, optional)extension (string, optional)programming_language (string, optional)gemini_cli.lines.changedCounts added or removed lines.
<details> <summary>Attributes</summary>function_name (string, optional)type (string: "added" or "removed")gemini_cli.chat_compressionCounts compression operations.
<details> <summary>Attributes</summary>tokens_before (int)tokens_after (int)gemini_cli.chat.invalid_chunk.countCounts invalid stream chunks.
gemini_cli.chat.content_retry.countCounts content error retries.
gemini_cli.chat.content_retry_failure.countCounts requests where all retries failed.
gemini_cli.slash_command.model.call_countCounts model selections.
<details> <summary>Attributes</summary>slash_command.model.model_name (string)gemini_cli.model_routing.latencyMeasures routing decision latency.
<details> <summary>Attributes</summary>routing.decision_model (string)routing.decision_source (string)routing.approval_mode (string)gemini_cli.model_routing.failure.countCounts routing failures.
<details> <summary>Attributes</summary>routing.decision_source (string)routing.error_message (string)routing.approval_mode (string)gemini_cli.agent.run.countCounts agent runs.
<details> <summary>Attributes</summary>agent_name (string)terminate_reason (string)gemini_cli.agent.durationMeasures agent run duration.
<details> <summary>Attributes</summary>agent_name (string)gemini_cli.agent.turnsCounts turns per agent run.
<details> <summary>Attributes</summary>agent_name (string)gemini_cli.plan.execution.countCounts plan executions.
<details> <summary>Attributes</summary>approval_mode (string)gemini_cli.ui.flicker.countCounts terminal flicker events.
Gemini CLI provides detailed performance metrics for advanced monitoring.
gemini_cli.startup.durationMeasures startup time by phase.
<details> <summary>Attributes</summary>phase (string)details (map, optional)gemini_cli.memory.usageMeasures heap and RSS memory.
<details> <summary>Attributes</summary>memory_type (string: "heap_used", "heap_total", "external", "rss")component (string, optional)gemini_cli.cpu.usageMeasures CPU usage percentage.
<details> <summary>Attributes</summary>component (string, optional)gemini_cli.tool.queue.depthMeasures tool execution queue depth.
gemini_cli.tool.execution.breakdownBreaks down tool time by phase.
<details> <summary>Attributes</summary>function_name (string)phase (string: "validation", "preparation", "execution",
"result_processing")These metrics follow standard OpenTelemetry GenAI semantic conventions.
gen_ai.client.token.usage: Counts tokens used per operation.gen_ai.client.operation.duration: Measures operation duration in seconds.Traces provide an "under-the-hood" view of agent and backend operations. Use traces to debug tool interactions and optimize performance.
<!-- prettier-ignore -->[!NOTE] Detailed trace attributes (like full prompts and tool outputs) are disabled by default to minimize overhead. You must explicitly set
telemetry.tracestotrue(or setGEMINI_TELEMETRY_TRACES_ENABLED=true) to capture them.
Every trace captures rich metadata via standard span attributes.
<details open> <summary>Standard span attributes</summary>gen_ai.operation.name: High-level operation (for example, tool_call,
llm_call, user_prompt, system_prompt, agent_call, or
schedule_tool_calls).gen_ai.agent.name: Set to gemini-cli.gen_ai.agent.description: The service agent description.gen_ai.input.messages: Input data or metadata.gen_ai.output.messages: Output data or results.gen_ai.request.model: Request model name.gen_ai.response.model: Response model name.gen_ai.prompt.name: The prompt name.gen_ai.tool.name: Executed tool name.gen_ai.tool.call_id: Unique ID for the tool call.gen_ai.tool.description: Tool description.gen_ai.tool.definitions: Tool definitions in JSON format.gen_ai.usage.input_tokens: Number of input tokens.gen_ai.usage.output_tokens: Number of output tokens.gen_ai.system_instructions: System instructions in JSON format.gen_ai.conversation.id: The CLI session ID.For more details on semantic conventions for events, see the OpenTelemetry documentation.