Visão geral
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 .
Dependências necessárias
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.
Habilitar rastreamento OpenTelemetry
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.
Habilitar rastreamento na configuração do cliente
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 } )
Habilitar o rastreamento com uma variável de ambiente
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:
true1yes
Depois de definir a variável, crie seu cliente, conforme mostrado no exemplo a seguir:
client = Mongo::Client.new(['localhost:27017'], database: 'my_database')
Opções de configuração
A opção tracing aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
|---|---|---|
| Boolean | Enables or disables OpenTelemetry tracing. Default: nil |
| Inteiro | Specifies the maximum length of query text to include in span attributes. Set to 0 to excludequery text. The query text appears in the db.query.text attribute.Default: nil |
|
| 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 } )
Rastreamento de operações
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
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 |
|
Operações de índice |
|
Operações do Banco de Dados |
|
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.
Comandos de baixo nível
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:
findinsertupdatedeleteaggregatecreatedrop
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.
Atributos de extensão
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 comomongodbdb.namespace: O nome do banco de dadosdb.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
Atributos de rede
As extensões de comando incluem os seguintes atributos de rede:
server.address: Host do servidor MongoDBserver.port: Porta do servidor MongoDBnetwork.transport: Protocolo de transporte, comotcp
Atributos de conexão
As extensões de comando incluem os seguintes atributos de conexão:
db.mongodb.server_connection_id: ID de conexão atribuída ao servidordb.mongodb.driver_connection_id: ID de conexão atribuída ao driver
Atributos de sessão e transação
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)
Atributos de query
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
Atributos de erro
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.
Rastreamento de transações
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.
Error Handling
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.
Considerações de desempenho
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 dequery_text_max_lengthpara0desativa 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.
Exemplo
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
Informações adicionais
Para saber mais sobre o rastreamento OpenTelemetry com Ruby, consulte o SDK Ruby do OpenTelemetry.