Com o New Relic for Go, você pode monitor os segmentos específicos de uma transação em um aplicativo Go para obter mais detalhes sobre funções específicas ou blocos de código.
Meça o tempo para funções e blocos de código
Segments são as partes específicas de uma transação em um aplicativo. Por segmentos instrumentados, você pode medir o tempo gasto por funções e blocos de código, como chamadas externas, chamadas de armazenamento de dados, adição de mensagens a filas e tarefas em segundo plano.
Example: Você tem uma transação associada a um processo de checkout, que processa informações de envio e de cartão de crédito. Você poderia instrumentar seu aplicativo para dividir essa transação em duas partes: um segmento para envio e um segmento para pagamento.
Segmentos de bloco de código
Depois de instrumentar uma transação, você estará pronto para instrumentar um ou mais segmentos dessa transação.
Para instrumentalizar um bloco arbitrário de código como um segmento, use o seguinte padrão e inclua txn como o nome da variável definida para a transação:
segment := newrelic.Segment{}
segment.Name ="mySegmentName"
segment.StartTime = txn.StartSegmentNow()
// ... code you want to time here ...
segment.End()
StartSegment é um ajudante conveniente. Ele cria um segmento e o inicia:
segment := txn.StartSegment("mySegmentName")
// ... code you want to time here ...
segment.End()
Segmentos de função
Instrumentado uma função como segmento é essencialmente o mesmo que instrumentado um bloco arbitrário de código como segmento. A principal diferença é que, como uma função tem um final discreto, você pode usar a instrução defer de Go.
Para utilizar uma função como segmento, adicione o seguinte código no início da função e inclua txn como o nome da variável definida para a transação:
defer txn.StartSegment("mySegmentName").End()
Segmentos de ninho
Os segmentos podem ser aninhados. O segmento que está sendo finalizado deve ser o segmento iniciado mais recentemente.
Aqui está um exemplo de um segmento começando e terminando dentro de outro segmento:
s1 := txn.StartSegment("outerSegment")
s2 := txn.StartSegment("innerSegment")
// s2 must end before s1
s2.End()
s1.End()
Um segmento de valor zero pode ser encerrado com segurança. Portanto, o código a seguir é seguro mesmo se a condicional falhar:
var s newrelic.Segment
if recordSegment {
s.StartTime = txn.StartSegmentNow()
}
// ... code you wish to time here ...
s.End()
Segmentos do armazenamento de dados
Você pode fazer chamadas de armazenamento de dados do aplicativo Instrumento Go. Os segmentos do armazenamento de dados aparecem na tabela Transactions breakdown do APM e na guia Databases da páginaTransactionsno New Relic.
Se você estiver usando um driver MySQL, PostgreSQL ou SQLite do banco de dados, a maneira mais fácil de adicionar segmentos de armazenamento de dados é usar nossos pacotes de integração pré-construídos. Caso contrário, você poderá criar manualmente segmentos de armazenamento de dados para cada chamada de banco de dados.
Existe um pacote de integração para cada driver do banco de dados que oferecemos suporte:
Segundo, use os métodos ExecContext, QueryContext e QueryRowContext de sql.DB, sql.Conn, sql.Tx e sql.Stmt e forneça um contexto contendo a transação. Chamadas para Exec, Query e QueryRow não são instrumentadas.
Pacotes de integração de armazenamento de dados para MySQL, PostgreSQL e SQLite foram adicionados no agente Go v2.8.0 e exigem Go v1.10 ou superior.
Assim como os segmentos básicos, os segmentos do armazenamento de dados começam quando o campo StartTime é preenchido e terminam quando o método End é chamado. Para instrumentar um segmento de armazenamento de dados, coloque o seguinte no início da função que deseja monitor:
s := newrelic.DatastoreSegment{
Product: newrelic.DatastoreMySQL,
Collection:"users",
Operation:"INSERT",
ParameterizedQuery:"INSERT INTO users (name, age) VALUES ($1, $2)",
Ao instrumentar uma chamada de armazenamento de dados que abrange uma chamada de função inteira, você pode usar a instrução defer para simplificar a instrumentação:
s := newrelic.DatastoreSegment{
StartTime: txn.StartSegmentNow(),
Product: newrelic.DatastoreMySQL,
Collection:"users",
Operation:"INSERT",
ParameterizedQuery:"INSERT INTO users (name, age) VALUES ($1, $2)",
QueryParameters:map[string]interface{}{
"name":"Dracula",
"age":439,
},
Host:"mysql-server-1",
PortPathOrID:"3306",
DatabaseName:"my_database",
}
defer s.End()
Segmentos externos
Você pode fazer chamadas do aplicativo Instrumento Go para serviços externos, como serviços web, recursos na nuvem e quaisquer outras chamadas de rede. Os segmentos externos aparecem na tabela Transactions breakdown e na páginaExternal servicesno New Relic.
Existem duas maneiras de instrumentar segmentos externos:
Recomendação: Use o auxiliar StartExternalSegment, pois New Relic o utiliza para trace atividades entre seu aplicativo usando distributed tracing.
NewRoundTripper retorna um http.RoundTripper, que permite instrumentar chamadas externas sem chamar StartExternalSegment , modificando o campo Transport do seu http.Client. O RoundTripper retornado procurará um Transaction no contexto da solicitação usando FromContext.
Aqui está um exemplo de instrumentação NewRoundTripper :
Você pode chamar o aplicativo Instrumento Go que adiciona mensagens a sistemas de filas como RabbitMQ e Kafka. Os segmentos produtores de mensagens aparecem no APM Transactions breakdown no New Relic.
Só existe uma maneira de instrumentalizar os segmentos produtores de mensagens:
Assim como os segmentos básicos, os segmentos produtores de mensagens começam quando o campo StartTime é preenchido e terminam quando o método End é chamado. Para instrumentar um segmento produtor de mensagens, coloque o seguinte no início da função que deseja monitor:
Ao instrumentar uma chamada de produtor de mensagem que abrange uma chamada de função inteira, você pode usar a instrução defer para simplificar a instrumentação:
s := newrelic.MessageProducerSegment{
StartTime: txn.StartSegmentNow(),
Library:"RabbitMQ",
DestinationType: newrelic.MessageExchange,
DestinationName:"myExchange",
DestinationTemporary:false,
}
defer s.End()
// ... add message to queue
Importante
Segmentos produtores de mensagens foram adicionados no agente Go versão 2.14.0.