Modificación de configuración de sondeo
Puede modificar o desactivar la configuración de sondeo por defecto o activar un sondeo personalizado para supervisar clases adicionales.
En este tema, se tratan las siguientes tareas de sondeo:
Modificación o desactivación de la configuración de sondeo por defecto
Puede modificar o desactivar los valores de sondeo predeterminados mediante el archivo ProbeConfig.acml
.
Después de aprovisionar un agente Java de APM, el archivo ProbeConfig.acml
está disponible con el directorio oracle-apm-agent/config
. Para obtener información sobre cómo acceder al archivo ProbeConfig.acml
, consulte Aprovisionamiento del agente Java de APM.
El archivo ProbeConfig.acml
permite realizar lo siguiente:
- Activar o desactivar sondeos concretos.
- Desactive la supervisión de patrones específicos de rastreos/espacios basados en información como URL, extensión de archivo, etc.
- Active la captura de etiquetas/dimensiones adicionales. Por ejemplo, captura cabeceras y parámetros específicos para el sondeo SERVLET.
- Manipular el nombre del período. Por ejemplo, manipular la URL para los sondeos SERVLET o HTTP_CLIENT.
- Capture sentencias de consulta SQL de base de datos con más de 1.000 caracteres de longitud como log de período.
Para activar o desactivar el registro de todas las sentencias de consulta SQL en el log de intervalo de jdbc, utilice el parámetro
enable_complete_sql_span_log_jdbc
. Esta función resulta útil cuando una consulta SQL larga se trunca a 1.000 caracteres. Por ejemplo, utilice:enable_complete_sql_span_log_jdbc: true
para activarlo. - Capture el nombre de usuario conectado.
Los nombres de usuario hash se capturan para las sesiones autenticadas con la intención de permitir la generación de informes sobre el número de usuarios únicos, sin exponer la información de identificación personal (PII). Sin embargo, puede ser necesario informar el nombre de usuario en formato de texto sin formato. En ese caso, vaya a la sección general y defina
track_plain_username: true
. - Capture cargas útiles.
La carga útil incluye el contenido tanto de la solicitud HTTP como de la respuesta.
Puede realizar un seguimiento del flujo completo de las solicitudes de la aplicación y enviar los datos recopilados al Explorador de rastreo para su análisis activando la carga útil.
El soporte de captura de carga útil incluye servlet, servidor JAX-RS, servicio de proxy OSB y servicio de negocio OSB.
A partir de la versión 1.16 del agente Java de APM, también están soportados los clientes Http de Apache (4.x y 5.x), el cliente Http de JDK 11+, el cliente Http del SDK de OCI (2.x y 3.x), Spring Web Client 5.x y los clientes 2.x y 3.x de OkHttp.
Activar carga útil: para activar las cargas útiles de solicitud y respuesta HTTP, defina los parámetros:
capture_request_payload
ycapture_response_payload
en el archivoProbeConfig.acml
.- Para capturar un subjuego de la carga útil, se pueden aplicar expresiones xpath/jsonpath/regex según el nombre de la operación.
- Después de activarla, las cargas útiles capturadas están disponibles como dimensiones:
RequestPayload
yResponsePayload
respectivamente. La longitud máxima predeterminada es de 1000 caracteres. - Se pueden capturar varias dimensiones de la misma carga útil especificando tag_name junto con la expresión.
- Cambie el modelado de llamadas asíncronas HttpClient.
A partir de la versión 1.16 del agente Java de APM, un único intervalo representa la solicitud saliente, el tiempo de espera y la devolución de llamada.
Para mantener el comportamiento anterior de las versiones anteriores del agente (un intervalo para la llamada saliente y otro para la devolución de llamada), modifique el parámetrohttpclient_async_one_span
en la sección HTTP_CLIENT del archivoProbeConfig.acml
y defínalo enfalse
.#Enables capturing async client invocations as a single span. No separate callback spans will be reported httpclient_async_one_span: false
El comportamiento de la configuración de sondeo por defecto se puede actualizar mediante el archivo ProbeConfig.acml
del agente Java de APM.
Para realizar cambios en la configuración predeterminada del sondeo, siga las instrucciones disponibles en el archivo ProbeConfig.acml
.
Los cambios en el archivo ProbeConfig.acml
se pueden realizar cuando se está ejecutando el servidor de aplicaciones y no es necesario reiniciarlo para que se apliquen los cambios.
A partir de la versión 1.12 del agente Java de APM, hay una operación mejorada y simplificada de la convención de nomenclatura para los sondeos de Servlet, HttpClient y OSB. Por lo tanto, la regla replace_all_patterns
para eliminar números e ID hexadecimales ya no se incluye por defecto en el archivo ProbeConfig.acml
. Esto se aplica a las secciones SERVLET, HTTP_CLIENT y OSB.
# Hex ID and numbers
-
pattern: "([a-fA-F\._\:-]*[0-9]+){2,}[a-fA-F_\:-]*([/\.])?"
replacement: "*$2"
Configuración de un sondeo personalizado
Puede configurar un sondeo personalizado para supervisar clases adicionales y obtener detalles específicos de la aplicación.
El sondeo personalizado es útil si el juego incorporado de sondeos disponibles en el archivo ProbeConfig.acml
no cumple con los requisitos de supervisión. Por ejemplo, si desea supervisar un thread en segundo plano que no se supervisa mediante los sondeos por defecto, puede configurar un sondeo personalizado para supervisarlo.
Para configurar un sondeo personalizado, haga lo siguiente:
- Configure un archivo
DirectivesConfig.acml
para especificar quéclasses
,methods
oannotations
se deben supervisar. Para obtener más información, consulte DirectivesConfig.acml File Configuration. - Agregue el archivo
DirectivesConfig.acml
al directoriooracle-apm-agent/config
.Ahora está en desuso especificar el archivoElimine el argumento anterior de la secuencia de comandos de inicio de la aplicación si ha especificado previamente el archivoDirectivesConfig.acml
utilizando lo siguiente en el script de inicio del servidor de aplicaciones:-Dcom.oracle.apm.agent.customDirectivesFile=<Path_to_DirectivesConfig.acml_file>
DirectivesConfig.acml
de esta forma. - Reinicie el servidor de aplicaciones si se especifica un nuevo archivo
DirectivesConfig.acml
.Los cambios realizados en el archivo
DirectivesConfig.acml
se aplican después de reiniciar el servidor de aplicaciones.El reinicio del servidor de aplicaciones es necesario al especificar un nuevo archivo
DirectivesConfig.acml
o suprimir el archivo.No es necesario reiniciar el servidor de aplicaciones si se realiza alguna de las siguientes acciones:- Edite
span_name
. - Agregue, edite o suprima
tags
,logs
o Variables avanzadas en un archivoDirectivesConfig.acml
existente que ya está en vigor.
- Edite
Configuración de archivos DirectivesConfig.acml
Para configurar el archivo DirectivesConfig.acml
, revise lo siguiente:
Parámetros DirectivesConfig.acml
A continuación se incluye información sobre los parámetros que puede especificar en el archivo DirectivesConfig.acml
.
Se debe especificar al menos uno de los siguientes parámetros MUST en el archivo DirectivesConfig.acml
:
class_name
class_name_regex
class_annotation
method_annotation
class_annotation_regex
method_annotation_regex
Parámetro | Descripción | Ejemplo |
---|---|---|
label |
Etiqueta única para la directiva. Este parámetro es obligatorio. |
|
class_name |
Nombre de la clase que desea supervisar. Debe especificar el nombre completo de la clase, incluido el paquete. |
|
class_name_regex |
Patrón de expresión regular (regex) para supervisar cualquier clase que coincida con él. Para el patrón de regex, en lugar de utilizar "." para el paquete, utilice "/". Por ejemplo, si desea supervisar una clase denominada Si se especifican |
|
method_name |
Nombre del método que desea supervisar. Esto no incluye los parámetros de método. Si no se especifica |
|
method_name_regex |
Patrón de regex para supervisar cualquier método que coincida con él. Si no se especifica Si se especifican |
|
class_annotation |
Nombre de clase completo de la anotación que desea supervisar. Se supervisa cualquier |
|
method_annotation |
Nombre de clase completo de la anotación que desea supervisar. Se supervisa cualquier |
|
class_annotation_regex |
Patrón de regex para supervisar cualquier anotación de clase que coincida con él. Para el patrón de regex, en lugar de utilizar "." para el paquete, utilice "/". Además, el valor debe empezar por "L" y terminar por ";". Por ejemplo, si desea supervisar una anotación denominada Si se especifican |
|
method_annotation_regex |
Patrón de regex para supervisar cualquier anotación de método que coincida con él. Para el patrón de regex, en lugar de utilizar "." para el paquete, utilice "/". Además, el valor debe empezar por "L" y terminar por ";". Por ejemplo, si desea supervisar una anotación denominada Si se especifican |
|
include_sub_classes |
Especifique si se deben supervisar las subclases de la clase de destino. Por defecto, se define en |
|
span_name |
Nombre del período creado durante la supervisión. Si no se especifica Tenga en cuenta que puede especificar un nombre para el período, como se muestra bajo la etiqueta Al especificar el parámetro |
|
tags |
Etiquetas (nombres y valores) que se van a incluir en el período. Como en el caso del parámetro Tenga en cuenta que el valor Para los valores de etiqueta, se puede especificar un tipo opcional. Puede especificar que el valor de etiqueta sea de tipo String, Boolean, Integer, Long, Float o Double mediante la sintaxis y la palabra clave adecuadas (como se muestra en el ejemplo). El tipo de valor de etiqueta por defecto será Cadena. Se utilizará si no se especifica ningún tipo o un tipo incompatible. Si se especifica un tipo incompatible para un valor de etiqueta, el tipo volverá al valor por defecto de Cadena y aparecerá un mensaje de log sobre la incompatibilidad. El valor de dimensión de periodo se puede confirmar mediante consultas con agregaciones que aprovechan los valores numéricos (si procede) en el explorador de rastreo. |
|
logs (Fin de creación) |
Logs (nombres y valores) que desea incluir en el período. Como en el caso de los parámetros Tenga en cuenta que el valor |
|
Variables de span_name, etiquetas y logs
Al especificar los parámetros span_name
, tags
y logs
, se pueden utilizar las siguientes variables para obtener información adicional:
class_name
: nombre de la clase que se está supervisando, incluyendo el paquete.short_class_name
: nombre de la clase que se está supervisando, excluyendo el paquete.method_name
: nombre del método que se está supervisando.method_descriptor
: formato de descriptor de la firma del método que se está supervisando.param#
: parámetros del método que se está supervisando, en los queparam1
indica el primer parámetro,param2
el segundo parámetro, etc.this
: objeto que se está supervisando. Tenga en cuenta que si elmethod
que se está supervisando esstatic
, la variablethis
no estará disponible.return
: valor de devolución del método que se está supervisando.Nota
La variablereturn
solo se puede utilizar para el parámetrotags
y no paraspan_name
.
Ejemplo de DirectivesConfig.acml
A continuación, se muestra un ejemplo del archivo 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}"
Según el ejemplo anterior:
- Se supervisará
com.oracle.apm.samples.servlet.OutboundTestServlet.performHttpURLConnectionCall
junto con sus subclases. - El nombre del período que se muestra en el explorador de rastreo será
OutboundTestServlet.performHttpURLConnectionCall
. - Las etiquetas
targetURL
yport
se agregarán al período y utilizarán los valores de los parámetros primero y segundo del métodoperformHttpURLConnectionCall
.
Las siguientes capturas de pantalla son un ejemplo de la página de sondeo personalizada:
Variables avanzadas para sondeo personalizado
Al utilizar un sondeo personalizado, puede configurar la sintaxis avanzada de comandos para construir variables de forma dinámica mediante el encadenamiento de métodos y la manipulación de cadenas mediante expresiones regulares. Se puede hacer referencia a estas variables avanzadas en las secciones span_name
, tags
y logs
, al igual que el resto de variables mencionadas anteriormente.
- Revise cómo configurar el sondeo personalizado. Consulte Configure a Custom Probe.
- Revise la sintaxis de la cadena de comandos. Consulte Command Chain Syntax.
- Revise los ejemplos. Consulte Ejemplos de variables avanzadas.
Sintaxis de la cadena de comandos
El símbolo de tubería "|" se utiliza para indicar la canalización del objeto de inicio al primer comando de cadena y el objeto de salida de canalización de un comando de cadena al siguiente.
Tiempo de Ejecución
Las cadenas de comandos se ejecutan antes o después de que se llame al método supervisado del sondeo personalizado. Esto se especifica mediante el tiempo de ejecución, que aparece antes de la SOI.
<execution time> ::= [before || after]
No todas las cadenas de comandos son compatibles con ambos tiempos de ejecución: cuando se utiliza return
como SOI o como parámetro en un comando de método, se debe utilizar el tiempo posterior a la ejecución. Esto se debe a que el objeto de devolución solo está disponible después de que se llame al método supervisado. Cuando se utilizan otras variables como SOI o parámetros en comandos de método, los tiempos de ejecución dependen de las cadenas a las que se hace referencia.
Por ejemplo, definamos chain1
y chain2
, donde chain2
utiliza chain1
como SOI o parámetro para un comando de método. Tenga en cuenta que chain1
se debe definir antes que chain2
si ambas cadenas utilizan el mismo tiempo de ejecución. De lo contrario, chain1
debe tener tiempo de ejecución antes y chain2
debe tener tiempo de ejecución después.
Puede encontrar más información sobre el uso de las SOI y los comandos del método en la sección siguiente Identificador de objeto de inicio.
Identificador de objeto inicial
Un identificador de objeto de inicio (SOI) puede ser objetos asociados con:
-
Palabras clave predefinidas:
this
,return
yparam#
. -
Salida de una cadena identificada por su clave.
Los tiempos de ejecución se pueden emparejar con la sintaxis de SOI.
SOI | Descripción | Posible tiempo de ejecución | Sintaxis | Ejemplo |
---|---|---|---|---|
ThisSOI | La cadena se ejecuta en el objeto especificado por class_name en el archivo DirectivesConfig.acml.
|
before o after |
<this SOI> ::= [before || after] this |
thisSOIchain: before this | method (public getAddress ()) |
ParamSOI | La cadena se ejecuta en el objeto especificado por param# en el archivo DirectivesConfig.acml.
Estos son parámetros del método que se está supervisando. |
before or after |
<param_SOI> ::= [before || after] param# |
paramSOIchain: before param1 | method (public getAddress ())
|
ReturnSOI | La cadena se ejecuta en el objeto especificado por return en el archivo DirectivesConfig.acml.
Valor de retorno del método que se está supervisando. |
after |
<return_SOI> ::= [after] return |
returnSOIchain: after return | method (public getAddress ()) |
StaticSOI | La cadena no se ha iniciado con ningún objeto. | before or after |
<static SOI> ::= [before || after] static |
staticSOIchain: before static | static method((com.test.beans.Employee)(public getLevel())) |
VariableSOI | La cadena se ejecuta en el objeto especificado por una de las variables anteriores definidas en el archivo DirectivesConfig.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"))
|
Secuencia de comandos de cadena
Una secuencia de comandos de cadena consta de uno o más comandos de cadena.
Sintaxis: <chain_command_sequence> ::= <chain_command> || <chain_command> | <chain_command_sequence>
Tipos de comandos de cadena
Sintaxis: <chain_command> ::= <method_command> || <field_command> || <regex_command>
Comando de método
Se utiliza un comando method para llamar a un método. La salida de un comando method es el objeto de retorno de ese método específico.
Un comando de método consta de visibilidad de método, nombre de método y secuencia de parámetros. Esto imita la firma del método.
La sintaxis debe ser similar a la siguiente:
<method_command> ::= method(<visibility> <java_identifier> (<parameter_sequence>))
<visibility> ::= private || public || protected || package
El valor package
se utiliza para especificar un campo o método de visibilidad de paquete privado (sin modificador).
<scalar_parameter_type> ::= int || double || float || String
<parameter> ::=<scalar_parameter_type> value || this || return || param<index> || variable-key
<parameter_sequence> ::= <parameter> || <parameter> , <parameter_sequence>
Ejemplos de comandos de método
-
Esta cadena muestra
this
como objeto de usuario. Esta cadena llama al métodogetAddress
público en la clase User. La salida de esta cadena será la representación de cadena de esta dirección de usuario.addresschain: this | method (public getAddress ())
-
Esta cadena llama al método
public setName
en el usuario y define el nombre en "John Smith". Puesto que este método set no tiene ningún valor de retorno, la salida de esta cadena será nula. Esta cadena muestra cómo utilizar parámetros escalares en comandos de método.testSetupVar: this | method(public setName(String "John", String "Smith"))
-
Esta cadena utiliza
param1
(el primer parámetro del método que se está supervisando) como parámetro para el método que estamos invocando.testParamAsParam: this | method(public incUserId(param1))
-
Esta cadena utiliza otra variable, en este caso
testParamAsParam
, como parámetro para el método.testVarAsParam: this | method(public incUserId(testParamAsParam))
-
Esta cadena llama al supermétodo explícitamente.
invokeUsingSuper: this | method(private super.overloadPrivate(String "string3", int 2222))
Comando de campo
Se utiliza un comando de campo para inspeccionar los valores de campo. La salida de un comando de campo es el objeto de ese campo específico.
Un comando de método consta de visibilidad de campo y nombre de campo.
Sintaxis: <field_command> ::= field (<visibility> <java_identifier>)
Ejemplos de comandos de campo
this
es un objeto de usuario. Aquí estamos accediendo a campos de diversa visibilidad en la clase User. La salida de cada cadena es el valor del campo respectivo.
fieldPublic: this | field(public firstName)
fieldProtected: this | field (protected lastName)
fieldPackagePrivate: this | field (package middleName)
fieldPrivate: this | field (private maidenName)
Comando de Método Estático
Se utiliza un comando de método estático para llamar a un método estático. La salida de un comando de método estático es el objeto de retorno de ese método específico.
Un comando de método consta de una clase inicial, visibilidad de método, nombre de método y secuencia de parámetros. Esto imita la firma del método.
<static_method_command> ::= static method((<starting_class>)(<visibility> <java_identifier> (<parameter_sequence>)))
La clase inicial es la clase en la que se encuentra el método estático.
- Esta cadena comienza sin ningún objeto. Esta cadena llama al método
getlevel
público en la clase Employee. La salida de esta cadena será la representación de cadena del nivel de este empleado. staticMethodPublic: static | static method((com.test.beans.Employee)(public getLevel()))
- El uso de otras visibilidades y diferentes tipos de parámetros de método son los mismos que en los ejemplos de Method Command.
Comando de campo estático
Se utiliza un comando de campo estático para inspeccionar los valores de campo estático. La salida de un comando de campo estático es el objeto de ese campo específico.
Un comando de método consta de una clase inicial, visibilidad de campo y nombre de campo.
Sintaxis:
<static_field_command> ::= static field ((<starting_class>)(<visibility> <java_identifier>))
Ejemplos de comandos de campo estático:
En el ejemplo siguiente se asume que this
es un objeto de usuario. Aquí estamos accediendo a campos de diversa visibilidad en la clase User. La salida de cada cadena es el valor del campo correspondiente.
staticFieldPublic: static field((com.test.beans.Employee)(public role))
El uso de otras visibilidades es el mismo que en los ejemplos de comando de campo.
Comando Regex
Se utiliza un comando regex para buscar y/o sustituir cadenas resultantes de la SOI, los valores de retorno de los comandos de método o los valores de campo. La salida de un comando regex es una cadena.
Un comando regex consta de la cadena regex. Opcionalmente, también puede consistir en una cadena de sustitución, junto con si se deben sustituir la primera o todas las incidencias.
Sintaxis: <regex_command> ::=regex (string [,<replace-string> [, first || all]])
Ejemplos de comandos Regex
- Después de obtener la dirección "100 Oracle Pkway, Redwood City, CA 94065", sustituya la primera "Pk" por "This" para obtener "100 Oracle Thatway, Redwood City, CA 94065".
replaceFirstChain : this | method (public getStreet()) | regex(Pk, This, first)
- Después de obtener la dirección "100 Oracle Pkway, Redwood City, CA 94065", sustituya todos los "0" por "1" para obtener "111 Oracle Pkway, Redwood City, CA 94165"
replaceAllChain: this | method (public getStreet()) | regex(0, 1, all)
Ejemplos de variables avanzadas
A continuación, se muestra un ejemplo de una cadena de comandos en el archivo 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)
Revisión de la ejecución de la cadena de variables exampleVar
:
exampleVar
empieza por el objeto de usuario especificado en "class_name". XX
-
El primer comando de cadena es un comando de método que devuelve un objeto Address. Por ejemplo: "100 Oracle Pkway, Redwood City, CA 94065".
-
El segundo comando de cadena es un comando de campo que obtiene la calle de la dirección del comando de campo anterior. Será "Oracle Pkway".
-
El comando de la tercera cadena es un comando regex que sustituye todas las instancias de "Pk" por "This" y devuelve "Oracle Thisway".
-
El último comando de cadena es un comando regex que sustituye la primera instancia de "This" por "That", que devuelve "OracleThatway".
Resultado final: al consultar las dimensiones de este período, verá una etiqueta denominada exampleVarTag con el valor "OracleThatway". Tenga en cuenta que la especificación de exampleVarTag: "${exampleVar}"
en la sección de etiquetas era necesaria para ver esta dimensión de período.
Utilice ACMLValidate para comprobar la sintaxis del archivo
Al trabajar con archivos de tipo acml
, puede utilizar la utilidad ACMLValidate para comprobar la sintaxis de los archivos acml
.
acml
:
- ProbeConfig.acml
- DirectivesConfig.acml
- CircuitBreaker.acml
La utilidad ACMLValidate
valida la sintaxis, pero no valida los valores. Está disponible a partir de la versión 1.16 del agente Java de APM.
Requisito:
JDK disponible en PATH
o defina la variable de entorno JAVA_HOME
.
Ubicación:
La utilidad ACMLValidate
se encuentra en el directorio oracle-apm-agent/bin
.
Ejecute ACMLValidate:
ACMLValidate
, utilice lo siguiente:
-
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]
===========================================================================