Introscope - Explosao de metricas SQL
Instalando um agente .Net para Introscope (solução para monitoração de performance e disponibilidade de aplicações Java e .NET que represento, comercializo e administro, como funcionario da Syrix Tecnologia ) em uma das maiores seguradoras do Brasil, me deparei com uma situacao incomum:
As instrucoes SQL foram escritas usando tanto aspas simples (') quando aspas duplas (”) para definicao de parametros da clausulas where .
Normalmente espera-se que as instrucoes utilizem aspas simples (') e caso isso nao aconteca, para cada parametro recebido por uma instrucao SQL, sera criada uma metrica no Introscope diferente. Com isso, um SELECT buscando as informacoes de um usuario em uma base SQL, ira criar uma metrica unica para cada usuario da base. Entao teremos quantas metricas quantos usuarios existirem na base e nao saberemos de fato qual a eficacia media daquela instrucao SQL e sim uma imensidao de metricas inuteis. Quanto mais metricas, mais pesado o processamento do Enterprise Manager (responsavel pela consolidacao das metricas, definicao de alarmes, apresentacao de graficos de performance e visoes de negocio, etc) e degradacao de performance da solucao.
Para essa situacao existem duas solucoes possiveis:
1- Trocar o padrao de (') para (”): A solucao mais simples para esse caso pois eh necessario apenas incluir o parametro abaixo na linha de inicializacao da VM instrumentada, no caso do Java:
-DSQLAgentNormalizeDoubleQuoteString=true
2- Definir expressoes regulares no arquivo IntroscopeAgent.profile. Esta opcao permite que voce defina regras de substituicao muito mais complexas, como por exemplo tratar queries que usam tabelas temporarias, com por exemplo:
SELECT<nowiki> *</nowiki> FROM TMP_123981398210381920912 WHERE ROW_ID =
para algo generico como:
SELECT<nowiki> *</nowiki> FROM TMP_ WHERE ROW_ID =
Para isso no arquivo .profile voce deve ter algo como :
introscope.agent.sqlagent.normalizer.extension=RegexSqlNormalizer introscope.agent.sqlagent.normalizer.regex.matchFallThrough=true introscope.agent.sqlagent.normalizer.regex.keys=key1 introscope.agent.sqlagent.normalizer.regex.key1.pattern=(TMP_)[1-9]* introscope.agent.sqlagent.normalizer.regex.key1.replaceAll=false introscope.agent.sqlagent.normalizer.regex.key1.replaceFormat=$1 introscope.agent.sqlagent.normalizer.regex.key1.caseSensitive=false
Mais informacoes nos documentos Java Agent Guide ou .NET Agent Guide disponiveis em https://support.ca.com/
Discussão