Ao diagnosticar problemas em produção, os dados de rastreamento padrão muitas vezes não oferecem o contexto de negócio necessário para identificar as causas raiz. Sem isso, não é possível filtrar traces por ID de pedido, ID de usuário ou código de transação. O Application Real-Time Monitoring Service (ARMS) resolve essa questão ao extrair parâmetros específicos de requisições HTTP, respostas e exceções no nível de span, sem exigir alterações no código da aplicação. Os parâmetros extraídos tornam-se atributos do span, permitindo filtrar traces, detectar erros de lógica de negócio e acionar alertas.
Casos de uso
Após configurar as regras de extração, o agente do ARMS captura os valores dos parâmetros e os grava como atributos do span. Esses atributos habilitam as seguintes capacidades:
Filtrar traces por contexto de negócio: localize todas as requisições associadas a um ID de pedido, ID de usuário ou código de transação específico na página Trace Explorer.
Detectar erros de lógica de negócio: marque spans como falhos quando o valor de um parâmetro extraído corresponder a uma regra personalizada de código de erro.
Configurar alertas: dispare notificações quando a contagem de erros baseada nos parâmetros extraídos ultrapassar os limiares definidos.
Pré-requisitos
A extração de parâmetros de negócio aplica-se exclusivamente a aplicações Java.
Antes de começar, verifique se:
-
Um agente do ARMS V4.1.0 ou posterior está instalado. Para mais informações, consulte {{XREF_0}}. O recurso não funciona em agentes anteriores à versão V4.1.0, mesmo que as regras estejam configuradas.
V4.2.0 ou posterior: é possível adicionar várias regras de correspondência de API e regras de extração de parâmetros a uma única regra de extração de parâmetros de negócio.
V4.1.0 a V4.2.0: apenas a primeira regra de correspondência tem efeito por regra.
O exemplo a seguir configura duas regras:
A primeira regra aplica-se a interfaces que começam com
/api/book, utiliza Body como origem do parâmetro e emprega a expressão OGNL#this.data.code.A segunda regra destina-se a interfaces iniciadas por
/api/stationery, usa Body como fonte de parâmetro e adota a expressão OGNL#this.responseCode.
Tipos e origens de parâmetros suportados
O agente do ARMS detecta dinamicamente alterações nas regras e extrai parâmetros com base em todas as regras ativadas. A tabela abaixo lista os tipos de parâmetros suportados, as origens e os requisitos de framework.
|
Tipo de parâmetro |
Origem do parâmetro |
Framework suportado |
Observações |
|
Requisição de servidor HTTP |
Header, Cookie, Parameter |
Tomcat 7.0.4+, Jetty 8.0.0+, Undertow 1.4.0.Final+ |
O agente do ARMS invoca o método |
|
Requisição de servidor HTTP |
Body |
Spring MVC 4.2.0+ |
A classe deve ter a anotação @Controller e o método deve ter a anotação @RequestBody. |
|
Resposta de servidor HTTP |
Header, Cookie |
Tomcat 7.0.4+, Jetty 8.0.0+, Undertow 1.4.0.Final+ |
- |
|
Resposta de servidor HTTP |
Body |
Spring MVC 4.2.0+ |
A classe precisa conter a anotação @Controller e o método requer a anotação @ResponseBody. |
|
Requisição de cliente HTTP |
Header, Parameter |
Apache HttpClient 2.0+, OkHTTP 2.2+ |
- |
|
Resposta de cliente HTTP |
Header |
Apache HttpClient 2.0+, OkHTTP 2.2+ |
- |
|
Informações de exceção |
Message |
- |
A classe deve herdar de java.lang.Exception. |
Acessar a página de regras de extração
Faça login no console do ARMS. No painel de navegação à esquerda, escolha Application Monitoring > Application List.
-
Selecione uma região na barra de navegação superior e clique na aplicação desejada.
NotaOs ícones na coluna Language indicam a linguagem de programação da aplicação: -
: Java -
: Go -
: Python - - (Hífen): aplicação monitorada via Managed Service for OpenTelemetry Na barra de navegação superior, selecione Configuration > Business Parameter Extraction Rules.
Na seção Business Parameter Extraction Rules, crie, visualize ou modifique as regras de extração da aplicação.
A lista de regras contém as seguintes colunas: Rule Name, Attribute name, Parameter extraction type, a coluna de regra de correspondência, a coluna de parâmetro extraído, Enabling Status e a coluna Actions (Edit e Delete). Acima da lista, estão disponíveis o botão New Rule, uma caixa de pesquisa por nome de regra e um filtro por tipo de extração de parâmetro. Abaixo da lista, encontram-se os botões Batch Delete e Bulk Copy to Other Applications.
Na seção Customizing Error Settings, configure regras de correspondência de códigos de erro personalizados para filtrar os valores dos parâmetros extraídos.
Ao ativar a chave Custom error code, adicione regras de correspondência: um span será marcado como erro quando o valor do atributo biz.resp.body for maior que 200 e quando o valor do atributo biz.exception exceder 0.
Criar uma regra de extração
As regras são entregues ao agente em tempo real no momento da criação e ativação. A primeira regra exige reinicialização da aplicação para entrar em vigor. As regras subsequentes passam a valer entre 1 e 2 minutos, sem necessidade de reinício.
Os parâmetros extraídos ficam registrados como atributos do span. Consulte-os na página Trace Explorer.
Os nomes dos atributos recebem o prefixo
biz.por padrão e devem ser únicos.O reporte dos dados do span depende da política de amostragem. Para garantir que dados importantes sejam reportados, ajuste essa política. Para mais detalhes, veja {{XREF_1}}.
Caso os parâmetros extraídos não apareçam no trace, verifique se a configuração da regra está correta.
Na seção Business Parameter Extraction Rules, clique em New Rule. Configure os parâmetros abaixo e clique em OK.
|
Parâmetro |
Descrição |
|
Rule Name |
Nome da regra. |
|
Attribute name |
Chave do atributo do span para o valor extraído. Formato: prefixo |
|
Parameter extraction type |
Tipo de parâmetro a ser extraído: requisição de servidor HTTP, resposta de servidor HTTP, requisição de cliente HTTP, resposta de cliente HTTP ou informações de exceção. |
|
Effective Interface |
Interfaces HTTP às quais a regra se aplica. O agente do ARMS extrai parâmetros apenas das interfaces correspondentes. Disponível somente quando Parameter extraction type estiver definido como requisição de servidor HTTP ou resposta de servidor HTTP. |
|
Exception Class Name |
Nomes das classes de exceção a serem correspondidos. O agente do ARMS extrai parâmetros apenas das exceções correspondentes. Disponível apenas quando Parameter extraction type estiver configurado como informações de exceção. |
|
Text encoding type |
Formato de codificação dos parâmetros a extrair. |
|
Enabling Status |
Define se a regra deve ser ativada. |
Regras de extração de parâmetros
Especifique as origens que contêm os parâmetros a serem extraídos e o método de extração. É possível utilizar múltiplas fontes de parâmetros e etapas de processamento. Quando houver parâmetros disponíveis em várias origens, a extração seguirá a ordem de definição das etapas. Para mais informações, consulte {{XREF_2}}.
Parameter Source: origem de onde os parâmetros serão extraídos. Ao selecionar Header, Cookie ou Parameter, insira a chave para a extração inicial. Se escolher Body ou Message, os parâmetros serão extraídos de todo o corpo ou mensagem.
-
Add parameter processing steps: defina etapas para analisar os valores dos parâmetros a partir de uma ou mais origens. A saída de cada etapa torna-se a entrada da próxima. Sem nenhuma etapa especificada, o texto JSON bruto da origem será utilizado. Para mais detalhes, veja {{XREF_3}}. Os seguintes métodos de extração são suportados:
Método
Descrição
Exemplo
OGNL
A entrada deve ser um objeto Java. Suporta expressões OGNL com notação de ponto.
#this.data.getCode()JsonPath
Requer uma string JSON na entrada. Aceita expressões JsonPath com notação de ponto.
$.data.codeRegex
Exige uma string como entrada. Utiliza grupos de captura nomeados. A substring a ser extraída deve corresponder a um grupo de captura chamado
res..*from:(?<res>[a-z]+).*
Verificar uma regra de extração
Depois que uma regra entrar em vigor, verifique na página Trace Explorer o trace relacionado. Se um atributo personalizado aparecer no span da interface correspondente, a regra estará funcionando corretamente.
-
Localize o nome do atributo correspondente à regra.
Na lista Business Parameter Extraction Rules, encontre o Attribute name da regra criada, por exemplo, aquela cujo atributo é
biz.resp.body. -
Na página Trace Explorer, adicione
attributes.$attributesNamecomo condição de filtro para consultar spans.Na área de consulta avançada, inclua a condição de filtro
attributes.biz.resp.body=211. Clique em um trace para visualizar os atributos personalizados do span.
Gerenciar regras de extração
Para ativar ou desativar uma regra, alterne a chave Enabling Status.
Para modificar ou excluir uma regra, clique em Edit ou Delete na coluna Actions.
Para remover várias regras simultaneamente, selecione-as e clique em Batch Delete abaixo da lista.
Para copiar regras para outras aplicações, selecione-as e clique em Bulk Copy to Other Applications. Na caixa de diálogo, especifique se deseja copiar as regras para todas as aplicações ou para uma específica.
Aguarde de 1 a 2 minutos para que as alterações tenham efeito.
Apenas as regras de extração são copiadas. As configurações personalizadas de erro não são incluídas.
Os nomes dos atributos precisam ser únicos. Se já existir um atributo com o mesmo nome na aplicação de destino, a regra não será copiada.
Configurar correspondência de código de erro personalizado
Quando o valor de um parâmetro extraído corresponde a uma regra de código de erro personalizado, o span é marcado como falho. Spans falhos incrementam a métrica arms_$callType_requests_error_count, que pode ser usada para alertas.
A política de amostragem não afeta a coleta de dados para códigos de erro personalizados. Spans falhos que não forem amostrados ainda assim serão contabilizados.
Para tipos de acesso a service e dimensões disponíveis, consulte {{XREF_4}}.
Criar uma regra de código de erro personalizado
Na seção Customizing Error Settings, ative a chave Custom error code.
Clique em Add matching rules.
-
Selecione uma regra de extração e configure a condição de filtro.
Após ativar a chave Custom error code, adicione regras de correspondência: um span será marcado como erro quando o valor do atributo
biz.resp.bodyfor maior que 200 e quando o valor do atributobiz.exceptionfor superior a 0. Clique em Save. A regra entra em vigor dentro de 1 a 2 minutos, sem necessidade de reiniciar a aplicação.
Verificar uma regra de código de erro personalizado
Após configurar uma regra, verifique na página Trace Explorer se há spans falhos que atendam às condições da regra.
Confirme o nome do atributo e a condição utilizados pela regra.
-
Na página Trace Explorer, filtre por spans falhos.
Na página Trace Explorer, utilize a área de filtro rápido à esquerda para filtrar spans cujo status seja de erro. A condição de consulta resultante é
serviceName="arms-custom-extraction-demoextracted" AND statusCode IN (2, 3) AND spanName="/api/v1/http_server/body". Neste exemplo, a consulta retorna 3.642 chamadas com erro, cada uma com duração de 0 ms e status de erro. Clique em um trace e verifique se o valor do atributo corresponde à condição da regra. No exemplo a seguir, o valor do atributo
biz.resp.bodyé 670, valor superior a 499 (o limiar especificado pela regra de correspondência de erro).-
Na página Overview, confirme se a contagem de erros está refletida corretamente no painel de erros.

Exemplos de regras de extração
Os exemplos a seguir encadeiam os métodos OGNL, JsonPath e Regex. A saída de cada etapa alimenta a próxima como entrada.
OGNL
A Object-Graph Navigation Language (OGNL) lê e define propriedades de objetos Java. Utilize-a para extrair campos de objetos anotados com @ResponseBody ou @RequestBody. O resultado é convertido em string. Caso o valor extraído seja um objeto Java, ele será serializado para uma string JSON para permitir extrações adicionais.
@RestController
@RequestMapping("/components/api/v1/mall")
public class MallController {
@RequestMapping("/product")
@ResponseBody
public ResponseBody product(@RequestBody RequestBody req) {
// Business code
}
static class RequestBody {
String requestId;
Map<String, String> queryParam;
public String getQueryJsonStr() {
return JSON.toJsonString(queryParam);
}
}
static class ResponseBody {
int code;
boolean success;
String message;
}
}
Extrair o campo requestId de RequestBody.
Extrair o campo code de ResponseBody.
Invocar um método getter para extrair o resultado de getQueryJsonStr().
Certifique-se de que o método getQueryJsonStr() exista na classe.
JsonPath
Expressões JsonPath extraem propriedades de uma string JSON.
{
"code": 200,
"message": "Query success.",
"success": true,
"data": {
"name": "John",
"age": 21
}
}
Extrair data.age dos dados JSON.
Regex
Expressões regulares correspondem a combinações de caracteres em strings. Use um grupo de captura chamado res para especificar o resultado da extração.
Por padrão, uma regex inicia a correspondência no começo da string. Para corresponder em qualquer posição, adicione .* antes e depois da expressão.
https://test.aliyun.com/v2/workitem#requestId=0c978f115b6f7&cityCode=34&env=online
Extrair o valor de cityCode da URL.
Extração em múltiplas etapas
Este exemplo encadeia OGNL, JsonPath e Regex para extrair um valor aninhado do corpo de uma resposta.
A classe a seguir contém o objeto do corpo da resposta:
class DemoResponse {
int code = 200;
boolean success = true;
String message = "text content";
String extraInfo = "{\"id\": 15, \"cityInfo\": \"from:hangzhou,to:beijing\"}";
public String getExtraInfo() {
return this.extraInfo;
}
}
Objetivo: extrair o nome da cidade indicado por "from" no subcampo cityInfo de extraInfo.
O agente do ARMS processa a extração nestas etapas:
Obter o objeto
DemoResponsedo corpo da resposta.Executar
#this.getExtraInfo()(OGNL) para obter o campoextraInfo.Executar
$.cityInfo(JsonPath) para analisarextraInfocomo JSON e obter o subcampocityInfo.Executar
^from:(?<res>[a-z]+).*(Regex) para corresponder ao grupo de captura chamadores, que retornahangzhou.Gravar
hangzhoucomo valor do atributo no span.
Etapas de extração de parâmetros
Como funcionam as etapas
As etapas de extração recuperam e analisam valores dos dados de origem. Elas formam um pipeline: a saída de cada etapa torna-se a entrada da seguinte.
Cada método exige um tipo de entrada específico. Se a entrada não corresponder, o pipeline é interrompido e o resultado atual é registrado como valor final.
|
Método de extração |
Tipo de dado de entrada |
Tipo de dado de saída |
|
OGNL |
Objeto Java |
String ou string JSON após serialização |
|
JsonPath |
String JSON |
String |
|
Regex |
String |
String |
Restrições de sintaxe
O ARMS impõe restrições de sintaxe mais rigorosas do que as versões open-source de OGNL, JsonPath e regex para manter a segurança.
|
Método |
Referência de sintaxe |
Restrições |
Exemplo válido |
|
OGNL |
Apenas notação de ponto. Métodos invocados devem começar com |
|
|
|
JsonPath |
Somente notação de ponto. Profundidade máxima de acesso: 10. |
|
|
|
Regex |
Deve incluir exatamente um grupo de captura chamado |
|
Considerações de desempenho
As etapas de extração envolvem serialização/desserialização, reflexão Java e processamento de regex — as operações mais intensivas em recursos no pipeline de extração. Para interfaces sensíveis a latência, considere estas alternativas:
Escreva parâmetros nos headers HTTP diretamente no código de negócio (caso a conformidade de segurança permita).
Utilize o OpenTelemetry SDK for Java para gravar atributos diretamente nos spans. Para mais informações, consulte {{XREF_5}}.
Sobrecarga de desempenho
A extração de parâmetros de negócio adiciona sobrecarga de CPU e memória devido à serialização/desserialização e reflexão Java. O benchmark a seguir quantifica esse impacto.
Ambiente de teste:
Especificações do Pod: 1 núcleo, 2 GB de memória
5 interfaces HTTP com 2.000 QPS cada
240 parâmetros personalizados extraídos a cada 100 chamadas: 20 expressões regex, 40 JsonPath e 40 OGNL
|
Item |
Recurso desativado (linha de base) |
Recurso ativado |
Aumento |
|
CPU |
0,230 c |
0,257 c |
+0,027 c |
|
Memória (20 minutos após inicialização) |
575 MB |
693 MB |
+118 MB |
|
Tempo de resposta |
101 ms |
101 ms |
+0 ms |
A extração envolve reflexão Java e serialização/desserialização, o que aumenta o uso de CPU e memória. Para interfaces com requisitos rígidos de latência, grave parâmetros nos headers ou utilize o OpenTelemetry SDK.
Perguntas frequentes
O que fazer se a extração de parâmetros falhar?
A causa depende da origem do parâmetro:
Body: verifique se o Spring MVC está em uso, se a classe possui a anotação @Controller e se o método tem a anotação @RequestBody ou @ResponseBody.
Response Cookie: confirme que está executando Tomcat v7.0.4-9.x ou Undertow v1.4.0.Final+. Caso contrário, utilize request Cookie.
Qual é o escopo da extração de exceções?
O agente do ARMS para Java captura apenas exceções personalizadas lançadas fora dos spans. Para extrair exceções de métodos de chamada essenciais dentro dos spans e marcá-las como erros, instrumente o método de chamada. Para mais informações, consulte {{XREF_6}}.
Como mapear anotações do Spring MVC para regras de extração?
|
Anotação |
Tipo de parâmetro |
Origem do parâmetro |
|
@RequestParam |
Requisição de servidor HTTP |
Parameter |
|
@RequestHeader |
Requisição de servidor HTTP |
Header |
|
@CookieValue |
Requisição de servidor HTTP |
Cookie |
|
@RequestBody |
Requisição de servidor HTTP |
Body |
|
@ResponseBody |
Resposta de servidor HTTP |
Body |
Como extrair tipos de parâmetros não suportados?
Utilize os SDKs do OpenTelemetry para instrumentar sua aplicação e gravar os parâmetros diretamente como atributos do span. Para mais detalhes, consulte {{XREF_7}}.
A extração suporta objetos Body com RequestBodyAdvice e ResponseBodyAdvice?
Sim. O agente do ARMS extrai parâmetros após a execução do BodyAdvice definido pelo usuário, mas antes do BodyAdvice nativo do Spring.