Docs Menu
Docs Home
/ /

Seguimiento con OpenTelemetry

En esta guía, aprenderá a utilizar el seguimiento de OpenTelemetry con el controlador Ruby. OpenTelemetry es un marco de observabilidad de código abierto que proporciona una forma estandarizada de instrumentar, generar, recopilar y exportar datos de telemetría.

El controlador Ruby admite el seguimiento de OpenTelemetry para ayudarle a comprender el rendimiento y el comportamiento de sus operaciones de MongoDB. Al habilitar el seguimiento, el controlador crea intervalos que representan operaciones como consultas, actualizaciones y transacciones. Estos intervalos incluyen atributos que siguen las convenciones semánticas de MongoDB.

Para usar el rastreo de OpenTelemetry, debe instalar el SDK Ruby de OpenTelemetry y un exportador. Para instalarlos en su aplicación, agregue las siguientes gemas a su Gemfile:

gem 'opentelemetry-sdk'
gem 'opentelemetry-exporter-otlp' # or your preferred exporter

Si habilita el seguimiento pero la biblioteca OpenTelemetry no está cargada, el controlador registra una advertencia y deshabilita automáticamente el seguimiento.

Puede habilitar el seguimiento de OpenTelemetry especificando la opción tracing al crear un cliente o configurando una variable de entorno.

Nota

Si no configura el seguimiento en la configuración del cliente o mediante la variable de entorno, el seguimiento se deshabilita de manera predeterminada.

Para habilitar el seguimiento al crear un cliente, pase la opción tracing con enabled establecido en true, como se muestra en el siguiente ejemplo:

client = Mongo::Client.new(['localhost:27017'],
database: 'my_database',
tracing: {
enabled: true
}
)

Para habilitar el seguimiento mediante una variable de entorno, configure la variable de entorno OTEL_RUBY_INSTRUMENTATION_MONGODB_ENABLED antes de crear un cliente, como se muestra en el siguiente ejemplo:

export OTEL_RUBY_INSTRUMENTATION_MONGODB_ENABLED=true

Puede utilizar cualquiera de los siguientes valores en la variable de entorno para habilitar el seguimiento:

  • true

  • 1

  • yes

Después de configurar la variable, cree su cliente, como se muestra en el siguiente ejemplo:

client = Mongo::Client.new(['localhost:27017'],
database: 'my_database')

La opción tracing acepta los siguientes parámetros:

Parameter
Tipo
Descripción

:enabled

Booleano

Enables or disables OpenTelemetry tracing.

Default: nil

:query_text_max_length

entero

Specifies the maximum length of query text to
include in span attributes. Set to 0 to exclude
query text. The query text appears in the
db.query.text attribute.

Default: nil

:tracer

OpenTelemetry::Trace::Tracer

Specifies a custom OpenTelemetry tracer instance.

Default: Uses the default tracer from the
global tracer provider

El siguiente ejemplo muestra cómo configurar todas las opciones de seguimiento disponibles:

client = Mongo::Client.new(['localhost:27017'],
database: 'my_database',
tracing: {
enabled: true,
query_text_max_length: 1024,
tracer: my_custom_tracer
}
)

El controlador Ruby crea intervalos de OpenTelemetry tanto para operaciones de alto nivel como para comandos de bajo nivel. Las siguientes secciones describen los intervalos creados y los atributos incluidos.

Las operaciones de alto nivel son los métodos que se invocan directamente en colecciones y bases de datos. El controlador crea intervalos para las siguientes operaciones:

Tipo de operación
Operaciones

Operaciones de cobranza

find, insert_one, insert_many, update_one, update_many, delete_one, delete_many, find_one_and_update, find_one_and_delete, find_one_and_replace, replace_one, count_documents, estimated_document_count, distinct, aggregate

Operaciones de índice

create_index, create_indexes, drop_index, drop_all_indexes, list_indexes

Operaciones de base de datos

list_collections, create_collection, drop_collection, list_databases

Los nombres de intervalo para operaciones de alto nivel utilizan el formato {operation_name}.{collection_name}. Por ejemplo, find.users, insertOne.orders o aggregate.products.

Los comandos de bajo nivel son los comandos que se envían al servidor MongoDB mediante el protocolo de conexión. A continuación, se muestran algunos ejemplos de comandos de bajo nivel para los que el controlador crea intervalos:

  • find

  • insert

  • update

  • delete

  • aggregate

  • create

  • drop

Los nombres de intervalo para comandos de bajo nivel usan el formato {command_name}. Por ejemplo, find, insert o update.

Los intervalos de comandos se anidan debajo de sus intervalos de operaciones correspondientes.

El controlador sigue las convenciones semánticas de MongoDB e incluye atributos span que proporcionan contexto sobre cada operación.

Todos los tramos incluyen los siguientes atributos:

  • db.system.name:Siempre configurado en mongodb

  • db.namespace:El nombre de la base de datos

  • db.collection.name:El nombre de la colección (cuando corresponda)

  • db.command.name:El nombre del comando MongoDB (solo abarca el comando)

  • db.query.summary:Un resumen de alto nivel de la estructura de la consulta

Los intervalos de comandos incluyen los siguientes atributos de red:

  • server.address: Host del servidor MongoDB

  • server.port: Puerto del servidor MongoDB

  • network.transport:Protocolo de transporte como tcp

Los intervalos de comandos incluyen los siguientes atributos de conexión:

  • db.mongodb.server_connection_id: ID de conexión asignado por el servidor

  • db.mongodb.driver_connection_id: ID de conexión asignado por el controlador

Cuando se utilizan sesiones o transacciones, los intervalos incluyen los siguientes atributos:

  • db.mongodb.lsid:ID de sesión lógica (cuando se utilizan sesiones)

  • db.mongodb.txn_number: Número de transacción (cuando se trata de una transacción)

  • db.mongodb.cursor_id:ID del cursor (para operaciones que devuelven cursores)

Cuando configura query_text_max_length con un valor mayor que 0, los intervalos incluyen el siguiente atributo:

  • db.query.text:El texto completo de la consulta, truncado a la longitud máxima especificada

Cuando fallan las operaciones, el controlador registra los detalles de la excepción con el mecanismo de registro de excepciones de OpenTelemetry y establece el estado del intervalo en ERROR. En caso de fallos en las operaciones de MongoDB, el atributo db.response.status_code contiene el código de error.

El controlador crea un intervalo de transacciones especial que abarca todas las operaciones dentro de una transacción explícita. El siguiente ejemplo muestra el seguimiento de transacciones:

session = client.start_session
session.with_transaction do
collection.insert_one({ name: 'Alice' }, session: session)
collection.update_one(
{ name: 'Bob' },
{ '$set' => { age: 30 } },
session: session
)
end

El ejemplo anterior produce una jerarquía de tramos similar a la siguiente estructura:

transaction
└── insertOne.users
└── insert (command)
└── updateOne.users
└── update (command)

Nota

Las sesiones implícitas no crean intervalos de transacciones.

Cuando las operaciones fallan, el controlador registra las excepciones en el intervalo mediante el mecanismo de registro de excepciones de OpenTelemetry. El estado del intervalo se establece entonces en ERROR.

En caso de fallas en la operación de MongoDB, el atributo db.response.status_code contiene el código de error.

Los errores no impiden que el controlador genere la excepción en su aplicación.

Tenga en cuenta las siguientes implicaciones de rendimiento cuando utilice el seguimiento de OpenTelemetry:

  • Cuando habilita el seguimiento, el controlador incurre en una sobrecarga mínima para la creación de intervalos y la recopilación de atributos.

  • La captura de texto de consulta (db.query.text) implica una sobrecarga adicional y se recomienda usarla con precaución en producción. Al establecer query_text_max_length en 0, se deshabilita la captura de texto de consulta para un mejor rendimiento.

  • Al deshabilitar el seguimiento, no hay impacto en el rendimiento porque la función se omite por completo.

El siguiente ejemplo muestra cómo configurar el seguimiento de OpenTelemetry para una aplicación MongoDB:

require 'mongo'
require 'opentelemetry/sdk'
# Configure OpenTelemetry
OpenTelemetry::SDK.configure do |c|
c.service_name = 'my-app'
end
# Create MongoDB client with tracing enabled
client = Mongo::Client.new(['localhost:27017'],
database: 'test',
tracing: {
enabled: true,
query_text_max_length: 1024
}
)
# Use the client normally - operations are traced
collection = client[:users]
collection.insert_one({ name: 'Alice', age: 30 })
collection.find({ age: { '$gte': 25 } }).to_a

Para obtener más información sobre el seguimiento de OpenTelemetry con Ruby, consulte el SDK de OpenTelemetry Ruby.

Next

C

En esta página