Menu Docs
Página inicial do Docs
/ /

Rastreie com OpenTelemetry

Neste guia, você aprenderá como usar o rastreamento OpenTelemetry com o driver Ruby. OpenTelemetry é uma estrutura de observabilidade de código aberto que fornece uma maneira padronizada de instrumentar, gerar, coletar e exportar dados de telemetria.

O driver Ruby suporta rastreamento OpenTelemetry para ajudá-lo a entender o desempenho e o comportamento de suas operações do MongoDB . Quando você habilita o rastreamento, o driver cria spans que representam operações como queries, atualizações e transações. Esses spans incluem atributos que seguem as convenções semânticas do MongoDB .

Para usar o rastreamento OpenTelemetry, você deve instalar o OpenTelemetry Ruby SDK e um exportador. Para instalá-los em seu aplicação, adicione as seguintes gems a seu Gemfile:

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

Se você ativar o rastreamento, mas a biblioteca OpenTelemetry não for carregada, o driver registrará um aviso e desativará o rastreamento automaticamente.

Você pode ativar o rastreamento OpenTelemetry especificando a opção tracing ao criar um cliente ou definindo uma variável de ambiente.

Observação

Se você não definir o rastreamento na configuração do cliente ou usando a variável de ambiente, o rastreamento será desabilitado por padrão.

Para ativar o rastreamento ao criar um cliente, passe a opção tracing com enabled definido como true, conforme mostrado no exemplo a seguir:

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

Para ativar o rastreamento usando uma variável de ambiente, defina a variável de ambiente OTEL_RUBY_INSTRUMENTATION_MONGODB_ENABLED antes de criar um cliente, conforme mostrado no exemplo a seguir:

export OTEL_RUBY_INSTRUMENTATION_MONGODB_ENABLED=true

Você pode usar qualquer um dos seguintes valores na variável de ambiente para habilitar o rastreamento:

  • true

  • 1

  • yes

Depois de definir a variável, crie seu cliente, conforme mostrado no exemplo a seguir:

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

A opção tracing aceita os seguintes parâmetros:

Parâmetro
Tipo
Descrição

:enabled

Boolean

Enables or disables OpenTelemetry tracing.

Default: nil

:query_text_max_length

Inteiro

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

O exemplo a seguir mostra como configurar todas as opções de rastreamento disponíveis:

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

O driver Ruby cria vãos OpenTelemetry para operações de alto nível e comandos de baixo nível. As seções a seguir descrevem as extensões criadas e os atributos incluídos.

Operações de alto nível são os métodos que você chama diretamente em coleções e bancos de dados. O driver cria spans para as seguintes operações:

Tipo de operação
operações

Operações de collection

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

Operações de índice

create_index, create_indexes, drop_index, drop_all_indexes, list_indexes

Operações do Banco de Dados

list_collections, create_collection, drop_collection, list_databases

Os nomes de extensão para operações de alto nível usam o formato {operation_name}.{collection_name}. Por exemplo, find.users, insertOne.orders ou aggregate.products.

Os comandos de baixo nível são os comandos reais enviados para o servidor MongoDB pelo protocolo de conexão. A seguir, listamos alguns exemplos de comandos de baixo nível para os quais o driver cria spans:

  • find

  • insert

  • update

  • delete

  • aggregate

  • create

  • drop

Os nomes de extensão para comandos de baixo nível usam o formato {command_name}. Por exemplo, find, insert ou update.

Os intervalos de comando estão aninhados sob seus intervalos de operação correspondentes.

O driver segue as convenções semânticas do MongoDB e inclui atributos de extensão que fornecem contexto sobre cada operação.

Todos os spans incluem os seguintes atributos:

  • db.system.name: Sempre definido como mongodb

  • db.namespace: O nome do banco de dados

  • db.collection.name: O nome da collection (quando aplicável)

  • db.command.name: O nome do comando MongoDB (o comando abrange apenas)

  • db.query.summary: Um resumo de alto nível da estrutura da query

As extensões de comando incluem os seguintes atributos de rede:

  • server.address: Host do servidor MongoDB

  • server.port: Porta do servidor MongoDB

  • network.transport: Protocolo de transporte, como tcp

As extensões de comando incluem os seguintes atributos de conexão:

  • db.mongodb.server_connection_id: ID de conexão atribuída ao servidor

  • db.mongodb.driver_connection_id: ID de conexão atribuída ao driver

Quando você usa sessões ou transações, os spans incluem os seguintes atributos:

  • db.mongodb.lsid: ID da sessão lógica (ao usar sessões)

  • db.mongodb.txn_number: Número da transação (quando em uma transação)

  • db.mongodb.cursor_id: ID do cursor (para operações que retornam cursores)

Quando você configura o query_text_max_length com um valor maior que 0, as extensões incluem o seguinte atributo:

  • db.query.text: O texto da query completo, truncado para o comprimento máximo especificado

Quando as operações falham, o driver registra os detalhes da exceção com o mecanismo de registro de exceções do OpenTelemetry e define o status da extensão como ERROR. Para falhas de operação MongoDB , o atributo db.response.status_code contém o código de erro.

O driver cria uma extensão de transação especial que engloba todas as operações dentro de uma transação explícita. O exemplo a seguir demonstra o rastreamento de transações:

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

O exemplo anterior produz uma hierarquia de extensão semelhante à seguinte estrutura:

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

Observação

As sessões implícitas não criam períodos de transação.

Quando as operações falham, o driver registra exceções no intervalo usando o mecanismo de registro de exceções do OpenTelemetry. O status da extensão é então definido como ERROR.

Para falhas de operação MongoDB , o atributo db.response.status_code contém o código de erro.

Os erros não impedem que o condutor aumente a exceção para a sua aplicação.

Considere as seguintes implicações de desempenho ao usar o rastreamento OpenTelemetry:

  • Ao ativar o rastreamento, o driver incorre em sobrecarga mínima para a criação de extensão e a coleta de atributos.

  • A captura de texto da query (db.query.text) tem uma sobrecarga adicional e você deve usá-la cuidadosamente na produção. A definição de query_text_max_length para 0 desativa a captura de texto da query para melhor desempenho.

  • Quando você desabilita o rastreamento, não há impacto no desempenho porque o recurso é completamente ignorado.

O exemplo a seguir mostra como configurar o rastreamento OpenTelemetry para um aplicação 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 saber mais sobre o rastreamento OpenTelemetry com Ruby, consulte o SDK Ruby do OpenTelemetry.

Próximo

C