Acessar o pilha de execução no servidor

2 respostas
jpacheco

Bom tarde.

Pessoal estou tentando desenvolver uma classe que ira logar a pilha de execuções da aplicação quando esta roda no servidor.
Minha idéira era colocar um Filter ou um Listener(a nivel de request, ou outro caso funcionar), e logar todas as classes qu estão sendo executadas e metodos.
Com isso poderiamos fazer um log de nossa aplicação, somente nos casos onde a aplicação alcançasse um alto nivel de uso de memória.
Desta forma saberiamos quais metodos de quais classes estão contribuindo para isso.

Tentei pegando a Thread corrent mas esta não funciona, depois peguei um mapa com todos os stackTreaces, mas tabmém não logo o que necesisto.

Abaixo segue o metodo um, buscando da Thread em execução:

StackTraceElement[] stack = Thread.currentThread().getStackTrace();
		for (int i = stack.length - 1; i >= 2; i--) {
			if (!stack[i].getFileName().startsWith("LogListener") ) {
				string.append(stack[i].getFileName() + ":" + stack[i].getLineNumber() + "->" + stack[i].getClassName() + "." + stack[i].getMethodName() + "()").append("\n");
			}
		}

Não logou as classes da app que rodava, com isso peguei um mapa de todos os stackTraces e mesmo assim não funcionou.
Segue metodo 2:

for (Map.Entry<Thread, StackTraceElement[]> stacks : Thread.getAllStackTraces().entrySet()) {
			StackTraceElement[] stack = stacks.getValue();
			for (int i = stack.length - 1; i >= 2; i--) {
				if (!stack[i].getFileName().startsWith("LogListener") ) {
					string.append(stack[i].getFileName() + ":" + stack[i].getLineNumber() + "->" + stack[i].getClassName() + "." + stack[i].getMethodName() + "()").append("\n");
				}
			}				
		}

Se alguem souber como se faz ou tiver outra forma de realizar isso me seria de grande ajuda.

Desde ja agradeço.

2 Respostas

macorx

O teu servidor é multi-thread? Pelo que observei do código você está pegando a pilha de execução de uma thread em específico.

Além disso a stack que irá retornar para você são todos os métodos empilhados onde no topo estará o próprio método que está fazendo o log da pilha.

jpacheco

Sim estou utilizando JBoss.

Bom o que realmente necessito e listar as Threads do servidor e pegar as classes e metodos da Aplicação que esta instalada no servidor e as listar.

Hoje existem ferramentas que fazem o monitoramento do servidor e conseguem gerar estes logs, snapshots, porem isso fica onera a performance do servidor devido as mesmas monitorarem continuamente as aplicações no mesmo e quando uma aplicação cai, gerar um snapshot de varios MB.

Minha ideia era criar um listener ou filter bem simples que sempre ira verificar a memoria e quando esta estiver se aproximando de uma quantidade deifinida como alta, ira começar a logar as classes e metodos que estão sendo executados.

Você sabe como posso acessar as classes que estão sendo executadas pelo servidor?

Ou tem alguma outra ideia de como posso fazer isso??

Abaço

Criado 6 de maio de 2010
Ultima resposta 6 de mai. de 2010
Respostas 2
Participantes 2