Copy as Markdown[Open in ChatGPT](https://chatgpt.com/?q=Read%20https%3A%2F%2Fcoralogix.com%2Fdocs%2Fintegrations%2Fai-observability%2Fgemini.md%20and%20help%20me%20with%20my%20question%20about%20this%20Coralogix%20documentation%20page.)[Open in Claude](https://claude.ai/new?q=Read%20https%3A%2F%2Fcoralogix.com%2Fdocs%2Fintegrations%2Fai-observability%2Fgemini.md%20and%20help%20me%20with%20my%20question%20about%20this%20Coralogix%20documentation%20page.)

# Gemini

Coralogix's AI Observability integrations provide deep visibility into applications that rely on Google Gemini models. With a dedicated integration for the Google Generative AI SDK, Coralogix delivers consolidated insight into synchronous, streaming, and async calls, enabling teams to monitor performance, cost, and reliability across every Gemini workload.

## Overview[​](#overview "Direct link to Overview")

This library offers customized [OpenTelemetry instrumentation](https://github.com/open-telemetry/opentelemetry-python-contrib/) for [Google Gemini](https://ai.google.dev/), optimized to support large language model (LLM) application development with streamlined integration, detailed production tracing, and effective debugging capabilities.

## Supported operations[​](#supported-operations "Direct link to Supported operations")

* **Text generation**: `client.models.generate_content()` and `generate_content_stream()` (sync and async).
* **Embeddings**: `client.models.embed_content()` (sync and async).

## Requirements[​](#requirements "Direct link to Requirements")

* Python 3.10–3.13.
* Coralogix [API keys](https://coralogix.com/docs/docs/user-guides/account-management/api-keys/api-keys/.md).

## Installation[​](#installation "Direct link to Installation")

Run the following command.

```
pip install "llm-tracekit-gemini"
```

## Authentication[​](#authentication "Direct link to Authentication")

Authentication data is passed during OTel Span Exporter definition:

1. Choose the
   <!-- -->
   ingress.:443
   <!-- -->
   endpoint that corresponds to your Coralogix [domain](https://coralogix.com/docs/docs/user-guides/account-management/account-settings/coralogix-domain/.md) using the domain selector at the top of the page.
2. Use your [customized API key](https://coralogix.com/docs/docs/user-guides/account-management/api-keys/api-keys/.md) in the authorization request header.
3. Provide the [application and subsystem names](https://coralogix.com/docs/docs/user-guides/account-management/account-settings/application-and-subsystem-names/.md).

```
from llm_tracekit.gemini import setup_export_to_coralogix



setup_export_to_coralogix(

    coralogix_token=<your_coralogix_token>,

    coralogix_endpoint="ingress.eu2.coralogix.com:443",

    service_name="ai-service",

    application_name="ai-application",

    subsystem_name="ai-subsystem",

    capture_content=True,

)
```

Note

All of the authentication parameters can also be provided through environment variables (`CX_TOKEN`, `CX_ENDPOINT`, etc.).

## Usage[​](#usage "Direct link to Usage")

This section describes how to set up instrumentation for Google Gemini.

### Set up tracing[​](#set-up-tracing "Direct link to Set up tracing")

**Automatic**

Use the `setup_export_to_coralogix` function to set up tracing and export traces to Coralogix. See the code snippet in the [Authentication](#authentication) section.

**Manual**

Alternatively, you can set up tracing manually.

```
from opentelemetry import trace

from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter

from opentelemetry.sdk.resources import SERVICE_NAME, Resource

from opentelemetry.sdk.trace import TracerProvider

from opentelemetry.sdk.trace.export import SimpleSpanProcessor



tracer_provider = TracerProvider(

    resource=Resource.create({SERVICE_NAME: "ai-service"}),

)

exporter = OTLPSpanExporter()

span_processor = SimpleSpanProcessor(exporter)

tracer_provider.add_span_processor(span_processor)

trace.set_tracer_provider(tracer_provider)
```

### Instrument[​](#instrument "Direct link to Instrument")

To instrument all clients, call the `instrument` method.

```
from llm_tracekit.gemini import GeminiInstrumentor



GeminiInstrumentor().instrument()
```

### Uninstrument[​](#uninstrument "Direct link to Uninstrument")

To uninstrument clients, call the `uninstrument` method.

```
GeminiInstrumentor().uninstrument()
```

### Full example: text generation[​](#full-example-text-generation "Direct link to Full example: text generation")

```
from google import genai

from llm_tracekit.gemini import GeminiInstrumentor, setup_export_to_coralogix



# Optional: Configure sending spans to Coralogix

# Reads Coralogix connection details from the following environment variables:

# - CX_TOKEN

# - CX_ENDPOINT

setup_export_to_coralogix(

    service_name="ai-service",

    application_name="ai-application",

    subsystem_name="ai-subsystem",

    capture_content=True,

)



# Activate instrumentation

GeminiInstrumentor().instrument()



# Gemini usage example

client = genai.Client()

response = client.models.generate_content(

    model="gemini-2.0-flash",

    contents=[{"role": "user", "parts": [{"text": "Write a short poem on open telemetry."}]}],

)
```

### Full example: embeddings[​](#full-example-embeddings "Direct link to Full example: embeddings")

```
from google import genai

from google.genai import types

from llm_tracekit.gemini import GeminiInstrumentor, setup_export_to_coralogix



setup_export_to_coralogix(

    service_name="ai-service",

    application_name="ai-application",

    subsystem_name="ai-subsystem",

    capture_content=True,

)



GeminiInstrumentor().instrument()



client = genai.Client()



# Single content embedding

response = client.models.embed_content(

    model="gemini-embedding-001",

    contents="What is machine learning?",

)

print(f"Embedding dimensions: {len(response.embeddings[0].values)}")



# Batch embedding

response = client.models.embed_content(

    model="gemini-embedding-001",

    contents=["First text", "Second text", "Third text"],

)

print(f"Number of embeddings: {len(response.embeddings)}")



# With dimensionality reduction

response = client.models.embed_content(

    model="gemini-embedding-001",

    contents="What is quantum computing?",

    config=types.EmbedContentConfig(output_dimensionality=256),

)

print(f"Reduced dimensions: {len(response.embeddings[0].values)}")
```

### Enable message content capture[​](#enable-message-content-capture "Direct link to Enable message content capture")

By default, message content — prompt contents, completions, function arguments, and return values — is not captured. To capture message content as span attributes:

* Pass `capture_content=True` when calling `setup_export_to_coralogix`.
* Set the environment variable `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` to `true`.

Most Coralogix AI evaluations require message contents to function properly, so enabling message capture is strongly recommended.

## Semantic conventions[​](#semantic-conventions "Direct link to Semantic conventions")

### Text generation attributes[​](#text-generation-attributes "Direct link to Text generation attributes")

| Attribute                                                                            | Type   | Description                                                                               | Example                                                                     |
| ------------------------------------------------------------------------------------ | ------ | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `gen_ai.prompt.<message_number>.role`                                                | string | Role of message author for user message `<message_number>`                                | `system`, `user`, `assistant`, `tool`                                       |
| `gen_ai.prompt.<message_number>.content`                                             | string | Contents of user message `<message_number>`                                               | `What's the weather in Paris?`                                              |
| `gen_ai.prompt.<message_number>.tool_calls.<tool_call_number>.id`                    | string | ID of tool call in user message `<message_number>`                                        | `call_O8NOz8VlxosSASEsOY7LDUcP`                                             |
| `gen_ai.prompt.<message_number>.tool_calls.<tool_call_number>.type`                  | string | Type of tool call in user message `<message_number>`                                      | `function`                                                                  |
| `gen_ai.prompt.<message_number>.tool_calls.<tool_call_number>.function.name`         | string | The name of the function used in tool call within user message `<message_number>`         | `get_current_weather`                                                       |
| `gen_ai.prompt.<message_number>.tool_calls.<tool_call_number>.function.arguments`    | string | Arguments passed to the function used in tool call within user message `<message_number>` | `{"location": "Seattle, WA"}`                                               |
| `gen_ai.prompt.<message_number>.tool_call_id`                                        | string | Tool call ID in user message `<message_number>`                                           | `call_mszuSIzqtI65i1wAUOE8w5H4`                                             |
| `gen_ai.completion.<choice_number>.role`                                             | string | Role of message author for choice `<choice_number>` in model response                     | `assistant`                                                                 |
| `gen_ai.completion.<choice_number>.finish_reason`                                    | string | Finish reason for choice `<choice_number>` in model response                              | `stop`, `tool_calls`, `error`                                               |
| `gen_ai.completion.<choice_number>.content`                                          | string | Contents of choice `<choice_number>` in model response                                    | `The weather in Paris is rainy and overcast, with temperatures around 57°F` |
| `gen_ai.completion.<choice_number>.tool_calls.<tool_call_number>.id`                 | string | ID of tool call in choice `<choice_number>`                                               | `call_O8NOz8VlxosSASEsOY7LDUcP`                                             |
| `gen_ai.completion.<choice_number>.tool_calls.<tool_call_number>.type`               | string | Type of tool call in choice `<choice_number>`                                             | `function`                                                                  |
| `gen_ai.completion.<choice_number>.tool_calls.<tool_call_number>.function.name`      | string | The name of the function used in tool call within choice `<choice_number>`                | `get_current_weather`                                                       |
| `gen_ai.completion.<choice_number>.tool_calls.<tool_call_number>.function.arguments` | string | Arguments passed to the function used in tool call within choice `<choice_number>`        | `{"location": "Seattle, WA"}`                                               |
| `gen_ai.request.tools.<tool_number>.type`                                            | string | Type of tool definition advertised to the model                                           | `function`                                                                  |
| `gen_ai.request.tools.<tool_number>.function.name`                                   | string | Name of the tool/function exposed to the model                                            | `get_current_weather`                                                       |
| `gen_ai.request.tools.<tool_number>.function.description`                            | string | Description of the tool/function                                                          | `Get the current weather in a given location`                               |
| `gen_ai.request.tools.<tool_number>.function.parameters`                             | string | JSON schema describing the tool/function parameters passed with the request               | `{"type": "object", "properties": {"city": {"type": "string"}}}`            |

### Embeddings attributes[​](#embeddings-attributes "Direct link to Embeddings attributes")

| Attribute                           | Type  | Description                                                   | Example           |
| ----------------------------------- | ----- | ------------------------------------------------------------- | ----------------- |
| `gen_ai.embeddings.dimension.count` | int   | Requested output dimensionality                               | `256`             |
| `gen_ai.embeddings.<n>.vector`      | array | The embedding vector values (when content capture is enabled) | `[0.1, 0.2, ...]` |

## Next steps[​](#next-steps "Direct link to Next steps")

Once your integration is set up, explore the [AI Center Overview](https://coralogix.com/docs/docs/user-guides/ai/monitor/.md) to monitor performance, costs, quality issues, and security across all your AI applications — and to set up [Guardrails](https://coralogix.com/docs/docs/user-guides/ai/guardrails/.md) for real-time policy enforcement.
