Modificar Definições de Sondagem
Você pode modificar ou desativar as definições de sondagem padrão ou ativar uma sondagem personalizada para monitorar classes adicionais.
As seguintes tarefas de sondagem são abordadas neste tópico:
Modificar ou Desativar Definições de Sondagem Padrão
Você pode modificar ou desativar as definições de sondagem padrão usando o arquivo ProbeConfig.acml
.
Depois que você provisionar um agente Java do APM, o arquivo ProbeConfig.acml
ficará disponível no diretório oracle-apm-agent/config
. Para obter informações sobre como acessar o arquivo ProbeConfig.acml
, consulte Provisionar o Agente Java do APM.
O arquivo ProbeConfig.acml
permite fazer o seguinte:
- Ativar ou desativar determinadas investigações.
- Desative o monitoramento de padrões específicos de rastreamento/spans com base em informações como URL, extensão de arquivo etc.
- Ative a captura de tags/dimensões adicionais. Por exemplo, capturar cabeçalhos e parâmetros específicos para a investigação SERVLET.
- Manipule o nome do intervalo. Por exemplo, manipulando o URL para investigações SERVLET ou HTTP_CLIENT.
- Capture instruções de consulta SQL de BD com mais de 1.000 caracteres como log de intervalo.
Para ativar ou desativar o registro em log de todas as instruções de consulta sql no log de extensão jdbc, use o parâmetro
enable_complete_sql_span_log_jdbc
. Esse recurso é útil quando uma consulta sql longa é truncada em 1.000 caracteres. Por exemplo, use:enable_complete_sql_span_log_jdbc: true
para ativá-lo. - Capture o nome de usuário conectado.
Os nomes de usuário hash são capturados para as sessões autenticadas com a intenção de permitir a geração de relatórios sobre o número de usuários exclusivos, sem expor informações de identificação pessoal (PII). No entanto, pode ser necessário relatar o nome de usuário em formato de texto simples. Nesse caso, vá para a seção geral e defina
track_plain_username: true
. - Capturar payloads.
O payload inclui o conteúdo da solicitação e da resposta HTTP.
Você pode rastrear o fluxo completo das solicitações do aplicativo e enviar os dados coletados ao Trace Explorer para análise, ativando o payload.
O suporte à captura de carga útil inclui Servlet, JAX-RS Server, OSB Proxy Service e OSB Business Service.
Começando com o agente Java do APM versão 1.16, Apache Http Clients (4.x e 5.x), JDK 11+ Http Client, OCI SDK Http Client (2.x e 3.x), Spring Web Client 5.x e OkHttp Clients 2.x e 3.x também são suportados.
Ativar payload: Para ativar payloads de Solicitação e Resposta HTTP, defina os parâmetros:
capture_request_payload
ecapture_response_payload
no arquivoProbeConfig.acml
.- Para capturar um subconjunto do payload, as expressões xpath/jsonpath/regex podem ser aplicadas com base no nome da operação.
- Depois de ativá-lo, os payloads capturados ficam disponíveis como dimensões:
RequestPayload
eResponsePayload
, respectivamente. O tamanho máximo padrão é de 1000 caracteres. - É possível capturar várias dimensões do mesmo payload especificando tag_name junto com a expressão.
- Altere a modelagem de chamadas assíncronas HttpClient.
A partir do agente Java do APM versão 1.16, um único intervalo representa a solicitação de saída, o tempo de espera e o callback.
Para manter o comportamento anterior das versões anteriores do agente (um intervalo para a chamada de saída e um segundo para o callback), modifique o parâmetrohttpclient_async_one_span
na seção HTTP_CLIENT no arquivoProbeConfig.acml
e defina-o comofalse
.#Enables capturing async client invocations as a single span. No separate callback spans will be reported httpclient_async_one_span: false
O comportamento das definições de sondagem padrão pode ser atualizado usando o arquivo ProbeConfig.acml
do agente Java do APM.
Para fazer alterações nas definições de investigação padrão, siga as instruções disponíveis no arquivo ProbeConfig.acml
.
As alterações no arquivo ProbeConfig.acml
podem ser feitas quando o servidor de aplicativos está em execução, e o servidor de aplicativos não precisa ser reinicializado para que as alterações tenham efeito.
A partir da versão 1.12 do agente Java do APM, há uma operação aprimorada e simplificada da convenção de nomenclatura para sondagens Servlet, HttpClient e OSB. Portanto, a regra replace_all_patterns
para remover o ID Hex e os números não é mais incluída por padrão no arquivo ProbeConfig.acml
. Isso se aplica às seções SERVLET, HTTP_CLIENT e OSB.
# Hex ID and numbers
-
pattern: "([a-fA-F\._\:-]*[0-9]+){2,}[a-fA-F_\:-]*([/\.])?"
replacement: "*$2"
Configurar uma Sondagem Personalizada
Você pode configurar uma sondagem personalizada para monitorar classes adicionais e obter detalhes específicos do aplicativo.
A sondagem personalizada será útil se o conjunto incorporado de sondagens disponíveis no arquivo ProbeConfig.acml
não atender aos requisitos de monitoramento. Por exemplo, se quiser monitorar um thread de segundo plano que não é monitorado usando as sondagens padrão, você poderá configurar uma sondagem personalizada para monitorá-lo.
Para configurar uma investigação personalizada, siga este procedimento:
- Configure um arquivo
DirectivesConfig.acml
para especificar quaisclasses
,methods
ouannotations
devem ser monitorados. Para obter mais informações, consulte Configuração do Arquivo DirectctivesConfig.acml. - Adicione o arquivo
DirectivesConfig.acml
ao diretóriooracle-apm-agent/config
.Agora está obsoleto para especificar o arquivoRemova o argumento acima do script de inicialização do aplicativo se você tiver especificado o arquivoDirectivesConfig.acml
usando o seguinte no script de inicialização do servidor de aplicativos:-Dcom.oracle.apm.agent.customDirectivesFile=<Path_to_DirectivesConfig.acml_file>
DirectivesConfig.acml
dessa forma anteriormente. - Reinicie o servidor de aplicativos se um novo arquivo
DirectivesConfig.acml
for especificado.As alterações no arquivo
DirectivesConfig.acml
entram em vigor depois que você reinicia o servidor de aplicativos.A reinicialização do servidor de aplicativos é necessária ao especificar um novo arquivo
DirectivesConfig.acml
ou ao excluir o arquivo.A reinicialização do servidor de aplicativos não será necessária se você fizer o seguinte:- Edite o
span_name
. - Adicione, edite ou exclua
tags
,logs
ou Variáveis Avançadas em um arquivoDirectivesConfig.acml
existente que já esteja em vigor.
- Edite o
Configuração do Arquivo DirectivasConfig.acml
Para configurar o arquivo DirectivesConfig.acml
, analise o seguinte:
Parâmetros DirectorConfig.acml
Veja aqui as informações sobre os parâmetros que você pode especificar no arquivo DirectivesConfig.acml
.
Pelo menos um dos parâmetros a seguir DEVE ser especificado no arquivo DirectivesConfig.acml
:
class_name
class_name_regex
class_annotation
method_annotation
class_annotation_regex
method_annotation_regex
Parâmetro | Descrição | Exemplo |
---|---|---|
label |
Um label exclusivo para a diretiva. Este é um parâmetro obrigatório. |
|
class_name |
O nome da classe que você deseja monitorar. É necessário especificar o nome completo da classe, incluindo o pacote. |
|
class_name_regex |
Um padrão de expressão regular (regex) para monitorar qualquer classe que corresponda a ele. Para o padrão regex, em vez de usar "." para o pacote, use "/". Por exemplo, se você quiser monitorar uma classe chamada Se |
|
method_name |
O nome do método que você deseja monitorar. Não inclui parâmetros de método. Se |
|
method_name_regex |
Um padrão regex para monitorar qualquer método que corresponda a ele. Se Se |
|
class_annotation |
O nome completo da classe da anotação que você deseja monitorar. Qualquer |
|
method_annotation |
O nome completo da classe da anotação que você deseja monitorar. Qualquer |
|
class_annotation_regex |
Um padrão regex para monitorar qualquer anotação de classe que corresponda a ele. Para o padrão regex, em vez de usar "." para o pacote, use "/". Além disso, o valor deve começar com "L" e terminar com ";". Por exemplo, se você quiser monitorar uma anotação chamada Se |
|
method_annotation_regex |
Um padrão regex para monitorar qualquer anotação de método que corresponda a ele. Para o padrão regex, em vez de usar "." para o pacote, use "/". Além disso, o valor deve começar com "L" e terminar com ";". Por exemplo, se você quiser monitorar uma anotação chamada Se |
|
include_sub_classes |
Especifique se as subclasses da classe de destino devem ser monitoradas. Por padrão, esse valor é definido como |
|
span_name |
O nome do intervalo criado durante o monitoramento. Se Observe que você pode especificar um nome para o intervalo, conforme mostrado no label Ao especificar o parâmetro |
|
tags |
As tags (nomes e valores) a serem incluídas no intervalo. Como no caso do parâmetro Observe que as Para valores de tag, um tipo opcional pode ser especificado. Você pode especificar o valor da tag para ser do tipo String, Booliano, Inteiro, Longo, Flutuante ou Duplo usando a sintaxe e a palavra-chave apropriadas (conforme mostrado no exemplo). O tipo de valor de tag padrão será String. Será usado se nenhum tipo ou um tipo incompatível for especificado. Se um tipo incompatível for especificado para um valor de tag, o tipo será revertido para o padrão de String e haverá uma mensagem de log sobre a incompatibilidade. O valor da dimensão de intervalo pode ser confirmado por meio de consultas com agregações que aproveitam valores numéricos (se aplicável) no Trace Explorer. |
|
logs |
Os logs (nomes e valores) que você deseja incluir no intervalo. Como no caso dos parâmetros Observe que o |
|
span_name, tags e logs de Variáveis
Ao especificar os parâmetros span_name
, tags
e logs
, as seguintes variáveis podem ser usadas para obter informações adicionais:
class_name
: Nome da classe que está sendo monitorada, incluindo o pacote.short_class_name
: Nome da classe que está sendo monitorada, excluindo o pacote.method_name
: Nome do método que está sendo monitorado.method_descriptor
: Formato do descritor da assinatura do método que está sendo monitorado.param#
: Parâmetros do método que está sendo monitorado, em queparam1
denota o primeiro parâmetro,param2
o segundo parâmetro, e assim por diante.this
: Objeto que está sendo monitorado. Observe que se omethod
que está sendo monitorado forstatic
, a variávelthis
não estará disponível.return
: Valor de retorno do método que está sendo monitorado.Observação
A variávelreturn
só pode ser usada para o parâmetrotags
e não paraspan_name
.
DirectorConfig.acml - Exemplo
Veja um exemplo do arquivo DirectivesConfig.acml
:
Test:
class_name: "com.oracle.apm.samples.servlet.OutboundTestServlet"
method_name: "performHttpURLConnectionCall"
include_sub_classes: true
span_name: "${short_class_name}.${method_name}"
tags:
targetURL: "${param2}"
port: "${param1}"
Com base no exemplo acima:
com.oracle.apm.samples.servlet.OutboundTestServlet.performHttpURLConnectionCall
será monitorado, junto com suas subclasses.- O nome do intervalo exibido no Trace Explorer será
OutboundTestServlet.performHttpURLConnectionCall
. - As tags
targetURL
eport
serão adicionadas ao intervalo e usarão os valores do primeiro e segundo parâmetros do métodoperformHttpURLConnectionCall
.
As capturas de tela a seguir são um exemplo da página de sondagem personalizada:
Variáveis avançadas para sondagem personalizada
Ao usar sondagem personalizada, você pode configurar a sintaxe de comando avançada para construir dinamicamente variáveis usando encadeamento de método e manipulação de string por meio de expressões regulares. Essas variáveis avançadas podem ser referenciadas nas seções span_name
, tags
e logs
, assim como as outras variáveis mencionadas acima.
- Reveja como configurar a investigação personalizada. Consulte Configurar uma Sondagem Personalizada.
- Reveja a sintaxe da cadeia de comandos. Consulte Sintaxe da Cadeia de Comandos.
- Revise os exemplos. Consulte Exemplos de Variáveis Avançadas.
Sintaxe da Cadeia de Comandos
O símbolo de pipe "|" é usado para significar o encanamento do objeto inicial para o primeiro comando de cadeia e o objeto de saída de encanamento de um comando de cadeia para o próximo.
Tempo de Execução
As cadeias de comandos são executadas antes ou depois que o método monitorado da Sondagem Personalizada é chamado. Isso é especificado pelo tempo de execução, que aparece antes do SOI.
<execution time> ::= [before || after]
Nem todas as Cadeias de Comandos são compatíveis com os dois tempos de execução: quando return
é usado como SOI ou como um parâmetro em um comando de método, o tempo após a execução deve ser usado. Isso ocorre porque o objeto de retorno só está disponível depois que o método monitorado é chamado. Quando outras variáveis são usadas como SOIs ou parâmetros nos comandos de método, os tempos de execução são dependentes das cadeias referenciadas.
Por exemplo, vamos definir chain1
e chain2
, em que chain2
usa chain1
como SOI ou parâmetro para um comando de método. Observe que chain1
deve ser definido antes de chain2
se ambas as cadeias usarem o mesmo tempo de execução. Caso contrário, chain1
deverá ter um tempo de execução antes e chain2
deverá ter um tempo de execução depois.
Mais informações sobre o uso de SOIs e os comandos de método podem ser encontradas na seção abaixo Iniciando o Identificador de Objeto.
Identificador do Objeto Inicial
Um Identificador de Objeto Inicial (SOI) pode ser objeto associado a:
-
Palavras-chave predefinidas:
this
,return
eparam#
. -
Saída de uma cadeia identificada por sua chave.
Os tempos de execução podem ser pareados com a sintaxe SOI.
SOI | Descrição | Possível Tempo de Execução | sintaxe | Exemplo |
---|---|---|---|---|
ThisSOI | A cadeia é executada no objeto especificado por class_name no arquivo DirectorConfig.acml.
|
before ou after |
<this SOI> ::= [before || after] this |
thisSOIchain: before this | method (public getAddress ()) |
ParamSOI | A cadeia é executada no objeto especificado por param# no arquivo DirectorConfig.acml.
Esses são parâmetros do método que está sendo monitorado. |
before or after |
<param_SOI> ::= [before || after] param# |
paramSOIchain: before param1 | method (public getAddress ())
|
ReturnSOI | A cadeia é executada no objeto especificado por return no arquivo DirectorConfig.acml.
Esse é o valor de retorno do método que está sendo monitorado. |
after |
<return_SOI> ::= [after] return |
returnSOIchain: after return | method (public getAddress ()) |
StaticSOI | A cadeia não é iniciada com nenhum objeto. | before or after |
<static SOI> ::= [before || after] static |
staticSOIchain: before static | static method((com.test.beans.Employee)(public getLevel())) |
VariableSOI | A cadeia é executada no objeto especificado por uma das variáveis acima definidas no arquivo DirecctionConfig.acml. | before or after |
<variable_SOI> ::= [before || after] variable-key |
var1: this | method (public setNewAddress (string "Variable Street", string "Redwood City", string "California", int 94065, string "US"))
|
Sequência do Comando de Cadeia
Uma sequência de comandos de cadeia consiste em um ou mais comandos de cadeia.
Sintaxe: <chain_command_sequence> ::= <chain_command> || <chain_command> | <chain_command_sequence>
Tipos de Comando de Cadeia
Sintaxe: <chain_command> ::= <method_command> || <field_command> || <regex_command>
Comando de Método
Um comando de método é usado para chamar um método. A saída de um comando de método é o objeto de retorno desse método específico.
Um comando de método consiste na visibilidade do método, no nome do método e na sequência do parâmetro. Isso imita a assinatura do método.
A sintaxe deve se parecer com:
<method_command> ::= method(<visibility> <java_identifier> (<parameter_sequence>))
<visibility> ::= private || public || protected || package
O valor package
é usado para especificar um método ou campo de visibilidade (sem modificador) privado do pacote.
<scalar_parameter_type> ::= int || double || float || String
<parameter> ::=<scalar_parameter_type> value || this || return || param<index> || variable-key
<parameter_sequence> ::= <parameter> || <parameter> , <parameter_sequence>
Exemplos de Comando de Método
-
Esta cadeia mostra
this
como objeto Usuário. Essa cadeia chama o método públicogetAddress
na classe Usuário. A saída desta cadeia será a representação de string do endereço deste Usuário.addresschain: this | method (public getAddress ())
-
Essa cadeia chama o método
public setName
no Usuário e define o nome como "John Smith". Como esse método set não tem valor de retorno, a saída dessa cadeia será nula. Essa cadeia demonstra como usar parâmetros escalares em comandos de método.testSetupVar: this | method(public setName(String "John", String "Smith"))
-
Essa cadeia usa
param1
(o primeiro parâmetro do método que está sendo monitorado) como um parâmetro do método que estamos chamando.testParamAsParam: this | method(public incUserId(param1))
-
Essa cadeia usa outra variável, nesse caso,
testParamAsParam
, como um parâmetro para o método.testVarAsParam: this | method(public incUserId(testParamAsParam))
-
Essa cadeia chama o supermétodo explicitamente.
invokeUsingSuper: this | method(private super.overloadPrivate(String "string3", int 2222))
Comando de Campo
Um comando de campo é usado para inspecionar valores de campo. A saída de um comando de campo é o objeto nesse campo específico.
Um comando de método consiste na visibilidade do campo e no nome do campo.
Sintaxe: <field_command> ::= field (<visibility> <java_identifier>)
Exemplos de comando de campo
this
seja um Objeto do usuário. Aqui estamos acessando campos de várias visibilidade na classe User. A saída de cada cadeia é o valor do respectivo campo.
fieldPublic: this | field(public firstName)
fieldProtected: this | field (protected lastName)
fieldPackagePrivate: this | field (package middleName)
fieldPrivate: this | field (private maidenName)
Comando do Método Estático
Um comando de método estático é usado para chamar um método estático. A saída de um comando de método estático é o objeto de retorno desse método específico.
Um comando de método consiste em uma classe inicial, visibilidade do método, nome do método e sequência de parâmetros. Isso imita a assinatura do método.
<static_method_command> ::= static method((<starting_class>)(<visibility> <java_identifier> (<parameter_sequence>)))
A classe inicial é a classe na qual o método estático é encontrado.
- Esta cadeia começa sem objeto. Essa cadeia chama o método público
getlevel
na classe Funcionário. A saída dessa cadeia será a representação de string do nível deste Funcionário. staticMethodPublic: static | static method((com.test.beans.Employee)(public getLevel()))
- O uso de outras visibilidades e diferentes tipos de parâmetros de método são os mesmos que nos exemplos de Comando de Método.
Comando de Campo Estático
Um comando de campo estático é usado para inspecionar valores de campo estáticos. A saída de um comando de campo estático é o objeto nesse campo específico.
Um comando de método consiste em uma classe inicial, visibilidade de campo e nome de campo.
Sintaxe:
<static_field_command> ::= static field ((<starting_class>)(<visibility> <java_identifier>))
Exemplos de comando de campo estático:
O exemplo abaixo pressupõe que this
seja um Objeto do usuário. Aqui estamos acessando campos de várias visibilidade na classe Usuário. A saída de cada cadeia é o valor do respectivo campo.
staticFieldPublic: static field((com.test.beans.Employee)(public role))
O uso de outras visibilidades é o mesmo que nos exemplos de Comando de Campo.
Comando Regex
Um comando regex é usado para localizar e/ou substituir strings resultantes do SOI, retornar valores dos comandos de método ou dos valores de campo. A saída de um comando regex é uma string.
Um comando regex consiste na string regex. Opcionalmente, ele também pode consistir em uma string substituta, além de se a primeira ou todas as ocorrências devem ser substituídas.
Sintaxe: <regex_command> ::=regex (string [,<replace-string> [, first || all]])
Exemplos de Comando Regex
- Após obter o endereço "100 Oracle Pkway, Redwood City, CA 94065", substitua a primeira "Pk" por "This" para obter "100 Oracle Thatway, Redwood City, CA 94065
replaceFirstChain : this | method (public getStreet()) | regex(Pk, This, first)
- Após obter o endereço "100 Oracle Pkway, Redwood City, CA 94065", substitua todos os "0"s por "1" para obter "111 Oracle Pkway, Redwood City, CA 94165"
replaceAllChain: this | method (public getStreet()) | regex(0, 1, all)
Exemplos de Variáveis Avançadas
Este é um exemplo de uma cadeia de comandos no arquivo DirectivesConfig.acml
.
test: class_name: "com.test.beans.User"
method_name: "incAge"
span_name: "${short_class_name}.${method_name}"
tags:
t: "${this}"
params: "${param1}"
r: "${return}"
exampleVarTag: "${exampleVar}"
variables:
exampleVar: before this | method (public getAddress ()) | field(private street) | regex(Pk,This, all) | regex(This, That, first)
Revisão da Execução da Cadeia Variável exampleVar
:
exampleVar
começa com o objeto Usuário especificado em "class_name". XX
-
O primeiro comando de cadeia é um comando de método que retorna um objeto Address. Por exemplo: "100 Oracle Pkway, Redwood City, CA 94065."
-
O segundo comando de cadeia é um comando de campo que obtém a rua do endereço do comando de campo anterior. Isso será "Oracle Pkway".
-
O terceiro comando de cadeia é um comando regex que substitui todas as instâncias de "Pk" por "This" e retorna "Oracle Thisway".
-
O último comando de cadeia é um comando regex que substitui a primeira instância de "Isso" por "Isso", retornando "OracleThatway".
Resultado Final: Ao observar Dimensões desse intervalo, você vê uma tag chamada exampleVarTag com o valor "OracleThatway". Observe que a especificação de exampleVarTag: "${exampleVar}"
na seção de tags foi necessária para ver essa dimensão de intervalo.
Use ACMLValidate para Verificar a Sintaxe do Arquivo
Ao trabalhar com arquivos do tipo acml
, você pode usar o utilitário ACMLValidate para verificar a sintaxe dos arquivos acml
.
acml
:
- ProbeConfig.acml
- DirectivesConfig.acml
- CircuitBreaker.acml
O utilitário ACMLValidate
valida a sintaxe, mas não valida os valores. Ele está disponível a partir do agente Java do APM versão 1.16.
Pré-requisitos:
JDK disponível no PATH
ou defina a variável de ambiente JAVA_HOME
.
Localização:
O utilitário ACMLValidate
está localizado no diretório oracle-apm-agent/bin
.
Execute ACMLValidate:
ACMLValidate
, use o seguinte:
-
Para Windows:
ACMLValidate.bat
-
Para Linux:
ACMLValidate.sh
ACMLValidate.[bat|sh] <path to the acml file>
oracle-apm-agent/bin % sh ACMLvalidate.sh ../config/1.16.0.560/ProbeConfig.acml
===============================================================================
Testing file: ../config/1.16.0.560/ProbeConfig.acml
ACML Validation Result: PASSED
===============================================================================
oracle-apm-agent/bin % sh ACMLvalidate.sh ../config/1.16.0.560/ProbeConfig.acml
===========================================================================
Testing file: ../config/1.16.0.560/ProbeConfig.acml
ACML Validation Result: FAILED
Exception: Failed to parse line [5][ SERVLET: true]
Caused by: Tab detected in the following line. Please replace '\t' with spaces: [ \tSERVLET: true]
===========================================================================