--- title: "SQL Commenter" type: docs weight: 10 description: > Propagate application context into database query logs by prepending SQLCommenter-format comments to executed SQL statements. --- [SQLCommenter](https://google.github.io/sqlcommenter/) is an open-source convention that propagates application context into the database by prepending a structured comment to every SQL statement before it is executed. The comment is stripped before query planning, so it has no effect on results — but it shows up verbatim in database query logs and slow-query logs, letting you correlate a specific SQL statement back to the MCP client, LLM tool invocation, model, user, agent, and distributed trace that triggered it. This closes the observability gap between the application-level traces emitted by Toolbox and the database-level logs emitted by your underlying database engine. ## Enabling SQL Commenter SQL Commenter is opt-in and disabled by default. Enable it on a per-source basis by setting the `sqlCommenter` field to `true` in a source's configuration file: ```yaml sources: - name: my-pg-source type: postgres # ... sqlCommenter: true ``` If you are exporting telemetry using OpenTelemetry, the `traceparent` attribute embedded in the SQL comment will automatically be part of the same distributed trace exported by Toolbox: ```bash ./toolbox --telemetry-otlp="127.0.0.1:4553" ``` ## Supported Sources SQL Commenter is supported on the following database sources: * `alloydb-postgres` * `cloud-sql-postgres` * `cloud-sql-mysql` * `postgres` * `mysql` * `sqlite` ## Comment Format When enabled, Toolbox prepends a SQLCommenter-format comment to every SQL statement executed against a supported source. Keys are sorted alphabetically, values are URL-encoded, and pairs are joined by commas inside a `/* … */` block. For example: ```sql /*client='toolbox-langchain-python%2Fv0.1.0',client.model='gemini-2.5-flash',db.system.name='postgresql',server='genai-toolbox%2F1.1.0',tool.name='search_user',traceparent='00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01'*/ SELECT * FROM users WHERE id = $1; ``` ## Attributes | **Attribute** | **Source** | **Description** | |---------------------|--------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------| | `traceparent` | Active OpenTelemetry span context. | W3C Trace Context header tying the SQL statement to the distributed trace for this invocation. | | `server` | Toolbox build (`genai-toolbox/`). | Identifies the Toolbox server name and version that issued the query. | | `tool.name` | The tool being invoked. | The tool whose execution triggered the SQL. | | `db.system.name` | The database engine (e.g. `postgresql`, `mysql`, `sqlite`). | Identifies the database backend. | | `client` | MCP client `params._meta["dev.mcp-toolbox/telemetry"]["client.name"]` and/or `["client.version"]` (joined by `/`). | Identifies the ADK or application that initiated the MCP request. | | `client.model` | MCP client `params._meta["dev.mcp-toolbox/telemetry"]["client.model"]`. | The LLM model that produced the tool call. | | `client.user.id` | MCP client `params._meta["dev.mcp-toolbox/telemetry"]["client.user.id"]`. | End-user identifier supplied by the client. | | `client.agent.id` | MCP client `params._meta["dev.mcp-toolbox/telemetry"]["client.agent.id"]`. | Agent identifier supplied by the client. | Client-supplied attributes (`client`, `client.model`, `client.user.id`, `client.agent.id`) are populated from the MCP request's `params._meta["dev.mcp-toolbox/telemetry"]` field. Attributes that are not provided by the client or not applicable in the current context are omitted from the comment. ## Populating Client Attributes from SDKs Toolbox SDKs that support the `dev.mcp-toolbox/telemetry` meta field will populate `client.*` attributes automatically. With the Python SDK, you can attach per-tool attributes such as model name, user ID, and agent ID using `TelemetryAttributes`. See [Per-call Telemetry Attributes](../../connect-to/toolbox-sdks/python-sdk/core/#per-call-telemetry-attributes) for details. {{< notice tip >}} The comment is plain text in your database logs. To follow a slow query back to its trace, take the `traceparent` value and search your tracing backend for the matching trace ID (the second segment of the W3C `traceparent`). {{< /notice >}}