2025-06-05 16:04:25 -04:00
# Gemini CLI Observability Guide
2025-06-23 18:25:49 -04:00
Telemetry provides data about Gemini CLI's performance, health, and usage. By enabling it, you can monitor operations, debug issues, and optimize tool usage through traces, metrics, and structured logs.
2025-06-05 16:04:25 -04:00
2025-06-23 20:56:57 -07:00
Gemini CLI's telemetry system is built on the * * [OpenTelemetry] (OTEL)** standard, allowing you to send data to any compatible backend.
2025-06-05 16:04:25 -04:00
[OpenTelemetry]: https://opentelemetry.io/
2025-06-23 18:25:49 -04:00
## Enabling telemetry
2025-06-13 20:28:18 -07:00
2025-06-23 20:56:57 -07:00
You can enable telemetry in multiple ways. Configuration is primarily managed via the [`.gemini/settings.json` file ](./cli/configuration.md ) and environment variables, but CLI flags can override these settings for a specific session.
2025-06-13 20:28:18 -07:00
2025-06-23 18:25:49 -04:00
### Order of precedence
2025-06-23 01:10:26 -04:00
2025-06-23 18:25:49 -04:00
The following lists the precedence for applying telemetry settings, with items listed higher having greater precedence:
2025-06-23 01:10:26 -04:00
2025-06-23 18:25:49 -04:00
1. **CLI flags (for `gemini` command): **
- `--telemetry` / `--no-telemetry` : Overrides `telemetry.enabled` .
2025-06-15 00:47:32 -04:00
- `--telemetry-target <local|gcp>` : Overrides `telemetry.target` .
- `--telemetry-otlp-endpoint <URL>` : Overrides `telemetry.otlpEndpoint` .
- `--telemetry-log-prompts` / `--no-telemetry-log-prompts` : Overrides `telemetry.logPrompts` .
2025-07-23 17:48:24 -04:00
- `--telemetry-outfile <path>` : Redirects telemetry output to a file. See [Exporting to a file ](#exporting-to-a-file ).
2025-06-23 01:10:26 -04:00
2025-06-23 18:25:49 -04:00
1. **Environment variables: **
- `OTEL_EXPORTER_OTLP_ENDPOINT` : Overrides `telemetry.otlpEndpoint` .
2025-06-23 01:10:26 -04:00
2025-06-23 18:25:49 -04:00
1. **Workspace settings file (`.gemini/settings.json`): ** Values from the `telemetry` object in this project-specific file.
2025-06-23 01:10:26 -04:00
2025-06-23 18:25:49 -04:00
1. **User settings file (`~/.gemini/settings.json`): ** Values from the `telemetry` object in this global user file.
2025-06-23 01:10:26 -04:00
1. **Defaults: ** applied if not set by any of the above.
2025-06-15 00:47:32 -04:00
- `telemetry.enabled` : `false`
- `telemetry.target` : `local`
- `telemetry.otlpEndpoint` : `http://localhost:4317`
- `telemetry.logPrompts` : `true`
**For the `npm run telemetry -- --target=<gcp|local>` script: **
The `--target` argument to this script _ only _ overrides the `telemetry.target` for the duration and purpose of that script (i.e., choosing which collector to start). It does not permanently change your `settings.json` . The script will first look at `settings.json` for a `telemetry.target` to use as its default.
2025-06-23 01:10:26 -04:00
### Example settings
2025-06-23 18:25:49 -04:00
The following code can be added to your workspace (`.gemini/settings.json` ) or user (`~/.gemini/settings.json` ) settings to enable telemetry and send the output to Google Cloud:
2025-06-05 16:04:25 -04:00
``` json
{
2025-06-15 00:47:32 -04:00
"telemetry" : {
"enabled" : true ,
"target" : "gcp"
} ,
2025-06-10 20:28:24 +00:00
"sandbox" : false
2025-06-05 16:04:25 -04:00
}
```
2025-07-23 17:48:24 -04:00
### Exporting to a file
You can export all telemetry data to a file for local inspection.
To enable file export, use the `--telemetry-outfile` flag with a path to your desired output file. This must be run using `--telemetry-target=local` .
``` bash
2025-08-08 10:17:19 +09:00
# Set your desired output file path
TELEMETRY_FILE = ".gemini/telemetry.log"
# Run Gemini CLI with local telemetry
# NOTE: --telemetry-otlp-endpoint="" is required to override the default
# OTLP exporter and ensure telemetry is written to the local file.
gemini --telemetry \
--telemetry-target= local \
--telemetry-otlp-endpoint= "" \
--telemetry-outfile= " $TELEMETRY_FILE " \
--prompt "What is OpenTelemetry?"
2025-07-23 17:48:24 -04:00
```
2025-06-13 10:27:22 -07:00
## Running an OTEL Collector
2025-06-05 16:04:25 -04:00
2025-06-13 10:27:22 -07:00
An OTEL Collector is a service that receives, processes, and exports telemetry data.
2025-08-15 18:10:21 -07:00
The CLI can send data using either the OTLP/gRPC or OTLP/HTTP protocol.
You can specify which protocol to use via the `--telemetry-otlp-protocol` flag
or the `telemetry.otlpProtocol` setting in your `settings.json` file. See the
[configuration docs ](./cli/configuration.md#--telemetry-otlp-protocol ) for more
details.
2025-06-05 16:04:25 -04:00
Learn more about OTEL exporter standard configuration in [documentation][otel-config-docs].
[otel-config-docs]: https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/
2025-06-13 20:28:18 -07:00
### Local
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
Use the `npm run telemetry -- --target=local` command to automate the process of setting up a local telemetry pipeline, including configuring the necessary settings in your `.gemini/settings.json` file. The underlying script installs `otelcol-contrib` (the OpenTelemetry Collector) and `jaeger` (The Jaeger UI for viewing traces). To use it:
2025-06-13 18:08:03 -07:00
2025-06-23 18:25:49 -04:00
1. **Run the command ** :
2025-06-15 00:47:32 -04:00
Execute the command from the root of the repository:
2025-06-13 18:08:03 -07:00
```bash
2025-06-15 00:47:32 -04:00
npm run telemetry -- --target=local
2025-06-13 18:08:03 -07:00
` ``
The script will:
- Download Jaeger and OTEL if needed.
- Start a local Jaeger instance.
2025-06-23 18:25:49 -04:00
- Start an OTEL collector configured to receive data from Gemini CLI.
2025-06-13 18:08:03 -07:00
- Automatically enable telemetry in your workspace settings.
- On exit, disable telemetry.
2025-06-23 18:25:49 -04:00
1. **View traces**:
2025-06-13 18:08:03 -07:00
Open your web browser and navigate to **http://localhost:16686** to access the Jaeger UI. Here you can inspect detailed traces of Gemini CLI operations.
2025-06-23 18:25:49 -04:00
1. **Inspect logs and metrics**:
2025-06-29 06:53:49 +05:30
The script redirects the OTEL collector output (which includes logs and metrics) to ` ~/.gemini/tmp/<projectHash>/otel/collector.log`. The script will provide links to view and a command to tail your telemetry data (traces, metrics, logs) locally.
2025-06-23 01:10:26 -04:00
2025-06-23 18:25:49 -04:00
1. **Stop the services**:
2025-06-13 18:08:03 -07:00
Press ` Ctrl+C` in the terminal where the script is running to stop the OTEL Collector and Jaeger services.
2025-06-05 16:04:25 -04:00
### Google Cloud
2025-06-23 18:25:49 -04:00
Use the ` npm run telemetry -- --target=gcp` command to automate setting up a local OpenTelemetry collector that forwards data to your Google Cloud project, including configuring the necessary settings in your ` .gemini/settings.json` file. The underlying script installs ` otelcol-contrib`. To use it:
2025-06-13 10:27:22 -07:00
2025-06-13 20:28:18 -07:00
1. **Prerequisites**:
2025-06-23 18:25:49 -04:00
- Have a Google Cloud project ID.
2025-06-14 07:49:21 -07:00
- Export the ` GOOGLE_CLOUD_PROJECT` environment variable to make it available to the OTEL collector.
` ``bash
2025-06-15 21:12:57 -04:00
export OTLP_GOOGLE_CLOUD_PROJECT="your-project-id"
2025-06-14 07:49:21 -07:00
` ``
2025-06-13 20:28:18 -07:00
- Authenticate with Google Cloud (e.g., run ` gcloud auth application-default login` or ensure ` GOOGLE_APPLICATION_CREDENTIALS` is set).
2025-06-23 18:25:49 -04:00
- Ensure your Google Cloud account/service account has the necessary IAM roles: "Cloud Trace Agent", "Monitoring Metric Writer", and "Logs Writer".
2025-06-13 10:27:22 -07:00
2025-06-23 18:25:49 -04:00
1. **Run the command**:
2025-06-15 00:47:32 -04:00
Execute the command from the root of the repository:
2025-06-13 10:27:22 -07:00
` ``bash
2025-06-15 00:47:32 -04:00
npm run telemetry -- --target=gcp
2025-06-13 10:27:22 -07:00
` ``
2025-06-10 23:46:51 +00:00
2025-06-13 20:28:18 -07:00
The script will:
- Download the ` otelcol-contrib` binary if needed.
2025-06-23 18:25:49 -04:00
- Start an OTEL collector configured to receive data from Gemini CLI and export it to your specified Google Cloud project.
2025-06-13 20:28:18 -07:00
- Automatically enable telemetry and disable sandbox mode in your workspace settings (` .gemini/settings.json`).
- Provide direct links to view traces, metrics, and logs in your Google Cloud Console.
- On exit (Ctrl+C), it will attempt to restore your original telemetry and sandbox settings.
2025-06-10 23:46:51 +00:00
2025-06-23 01:10:26 -04:00
1. **Run Gemini CLI:**
2025-06-23 18:25:49 -04:00
In a separate terminal, run your Gemini CLI commands. This generates telemetry data that the collector captures.
2025-06-14 07:49:21 -07:00
2025-06-23 18:25:49 -04:00
1. **View telemetry in Google Cloud**:
2025-06-13 20:28:18 -07:00
Use the links provided by the script to navigate to the Google Cloud Console and view your traces, metrics, and logs.
2025-06-10 23:46:51 +00:00
2025-06-23 18:25:49 -04:00
1. **Inspect local collector logs**:
The script redirects the local OTEL collector output to ` ~/.gemini/tmp/<projectHash>/otel/collector-gcp.log`. The script provides links to view and command to tail your collector logs locally.
2025-06-13 10:27:22 -07:00
2025-06-23 18:25:49 -04:00
1. **Stop the service**:
2025-06-13 20:28:18 -07:00
Press ` Ctrl+C` in the terminal where the script is running to stop the OTEL Collector.
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
## Logs and metric reference
2025-06-05 16:04:25 -04:00
2025-06-25 03:53:03 +00:00
The following section describes the structure of logs and metrics generated for Gemini CLI.
2025-06-23 18:25:49 -04:00
- A ` sessionId` is included as a common attribute on all logs and metrics.
2025-06-11 16:50:24 +00:00
2025-06-05 16:04:25 -04:00
### Logs
2025-06-23 18:25:49 -04:00
Logs are timestamped records of specific events. The following events are logged for Gemini CLI:
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
- ` gemini_cli.config`: This event occurs once at startup with the CLI's configuration.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` model` (string)
2025-06-11 20:15:44 +00:00
- ` embedding_model` (string)
2025-06-05 16:04:25 -04:00
- ` sandbox_enabled` (boolean)
- ` core_tools_enabled` (string)
- ` approval_mode` (string)
2025-06-11 20:15:44 +00:00
- ` api_key_enabled` (boolean)
2025-06-05 16:04:25 -04:00
- ` vertex_ai_enabled` (boolean)
2025-06-11 20:15:44 +00:00
- ` code_assist_enabled` (boolean)
2025-06-15 00:47:32 -04:00
- ` log_prompts_enabled` (boolean)
2025-06-05 16:04:25 -04:00
- ` file_filtering_respect_git_ignore` (boolean)
2025-06-11 20:15:44 +00:00
- ` debug_mode` (boolean)
- ` mcp_servers` (string)
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
- ` gemini_cli.user_prompt`: This event occurs when a user submits a prompt.
2025-06-05 16:04:25 -04:00
- **Attributes**:
2025-06-11 21:43:00 -04:00
- ` prompt_length`
2025-06-23 18:25:49 -04:00
- ` prompt` (this attribute is excluded if ` log_prompts_enabled` is configured to be ` false`)
2025-07-11 22:17:46 +05:30
- ` auth_type`
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
- ` gemini_cli.tool_call`: This event occurs for each function call.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` function_name`
- ` function_args`
- ` duration_ms`
- ` success` (boolean)
2025-08-08 10:08:07 +05:30
- ` decision` (string: "accept", "reject", "auto_accept", or "modify", if applicable)
2025-06-23 18:25:49 -04:00
- ` error` (if applicable)
- ` error_type` (if applicable)
2025-08-08 10:08:07 +05:30
- ` metadata` (if applicable, dictionary of string -> any)
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
- ` gemini_cli.api_request`: This event occurs when making a request to Gemini API.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` model`
2025-06-23 18:25:49 -04:00
- ` request_text` (if applicable)
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
- ` gemini_cli.api_error`: This event occurs if the API request fails.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` model`
- ` error`
- ` error_type`
- ` status_code`
- ` duration_ms`
2025-07-11 22:17:46 +05:30
- ` auth_type`
2025-06-05 16:04:25 -04:00
2025-06-23 18:25:49 -04:00
- ` gemini_cli.api_response`: This event occurs upon receiving a response from Gemini API.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` model`
- ` status_code`
- ` duration_ms`
- ` error` (optional)
2025-06-12 19:36:51 -04:00
- ` input_token_count`
2025-06-11 17:47:21 +00:00
- ` output_token_count`
- ` cached_content_token_count`
- ` thoughts_token_count`
- ` tool_token_count`
2025-06-23 18:25:49 -04:00
- ` response_text` (if applicable)
2025-07-11 22:17:46 +05:30
- ` auth_type`
2025-06-05 16:04:25 -04:00
2025-08-24 19:11:41 -07:00
- ` gemini_cli.malformed_json_response`: This event occurs when a ` generateJson` response from Gemini API cannot be parsed as a json.
- **Attributes**:
- ` model`
2025-07-12 02:40:25 +05:30
- ` gemini_cli.flash_fallback`: This event occurs when Gemini CLI switches to flash as fallback.
- **Attributes**:
- ` auth_type`
2025-07-29 16:20:37 -04:00
- ` gemini_cli.slash_command`: This event occurs when a user executes a slash command.
- **Attributes**:
- ` command` (string)
- ` subcommand` (string, if applicable)
2025-06-05 16:04:25 -04:00
### Metrics
2025-06-23 18:25:49 -04:00
Metrics are numerical measurements of behavior over time. The following metrics are collected for Gemini CLI:
2025-06-05 16:04:25 -04:00
2025-06-11 05:22:13 +00:00
- ` gemini_cli.session.count` (Counter, Int): Incremented once per CLI startup.
2025-06-05 16:04:25 -04:00
2025-06-11 05:22:13 +00:00
- ` gemini_cli.tool.call.count` (Counter, Int): Counts tool calls.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` function_name`
- ` success` (boolean)
2025-06-23 18:25:49 -04:00
- ` decision` (string: "accept", "reject", or "modify", if applicable)
2025-08-19 10:55:47 +05:30
- ` tool_type` (string: "mcp", or "native", if applicable)
2025-06-05 16:04:25 -04:00
2025-06-11 05:22:13 +00:00
- ` gemini_cli.tool.call.latency` (Histogram, ms): Measures tool call latency.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` function_name`
2025-06-23 18:25:49 -04:00
- ` decision` (string: "accept", "reject", or "modify", if applicable)
2025-06-05 16:04:25 -04:00
2025-06-11 05:22:13 +00:00
- ` gemini_cli.api.request.count` (Counter, Int): Counts all API requests.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` model`
- ` status_code`
2025-06-23 18:25:49 -04:00
- ` error_type` (if applicable)
2025-06-05 16:04:25 -04:00
2025-06-11 05:22:13 +00:00
- ` gemini_cli.api.request.latency` (Histogram, ms): Measures API request latency.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` model`
2025-06-11 06:56:53 +00:00
- ` gemini_cli.token.usage` (Counter, Int): Counts the number of tokens used.
2025-06-05 16:04:25 -04:00
- **Attributes**:
- ` model`
2025-06-11 06:56:53 +00:00
- ` type` (string: "input", "output", "thought", "cache", or "tool")
2025-06-15 16:24:53 -04:00
- ` gemini_cli.file.operation.count` (Counter, Int): Counts file operations.
- **Attributes**:
- ` operation` (string: "create", "read", "update"): The type of file operation.
2025-06-23 18:25:49 -04:00
- ` lines` (Int, if applicable): Number of lines in the file.
- ` mimetype` (string, if applicable): Mimetype of the file.
- ` extension` (string, if applicable): File extension of the file.
2025-08-08 10:08:07 +05:30
- ` ai_added_lines` (Int, if applicable): Number of lines added/changed by AI.
- ` ai_removed_lines` (Int, if applicable): Number of lines removed/changed by AI.
- ` user_added_lines` (Int, if applicable): Number of lines added/changed by user in AI proposed changes.
- ` user_removed_lines` (Int, if applicable): Number of lines removed/changed by user in AI proposed changes.
2025-08-22 17:47:32 +05:30
- ` programming_language` (string, if applicable): The programming language of the file.
2025-08-18 15:59:13 -04:00
- ` gemini_cli.chat_compression` (Counter, Int): Counts chat compression operations
- **Attributes**:
- ` tokens_before`: (Int): Number of tokens in context prior to compression
- ` tokens_after`: (Int): Number of tokens in context after compression