Использование JAMon для мониторинга

Java Application Monitor (JAMon) является бесплатной, высокопроизводительной и потокобезопасной библиотекой для сбора статистики о работе приложения и поиска узких мест, анализа возможностей масштабирования. Можно считать количество брошенных исключений определенного типа, количество SQL запросов, количество запросов JSP страницы. В отчете выдается число вызовов, время выполнения (общее, среднее, минимальное, максимальное, среднеквадратичное отклонение), а также сведения, относящиеся к concurrency – число одновременных вызовов метода из разных потоков. К примеру, можно получить данные о захвате и удержании какого-то ресурса.
JAMon достаточно быстро работает и может использоваться в production системах (опыт показывает, что overhead пренебрежимо мал). Отчет о вызовах выдается по умолчанию в виде HTML. Есть возможность выкладывать статистику на веб сервер.

Для работы нужно добавить зависимость:

<dependency>
	<groupid>com.jamonapi</groupid>
	<artifactid>jamon</artifactid>
	<version>2.81</version>
</dependency>

Мониторинг будет производиться в классе Loop (программа достаточно упрощенная, можно даже сказать надуманная, но позволяет понять принципы использования JAMon):

package ru.dk2k.mavenExample;
 
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
import com.jamonapi.Monitor;
import com.jamonapi.MonitorFactory;
 
public class Loop {
 
	synchronized public void wait(int pause){
		try {
			Thread.sleep(pause);
		} catch (InterruptedException e){
 
		}
	}
 
	public static void main(String[] args) {
 
		Loop loop = new Loop();
 
		int randValue;
		int counter = 50;
		Random r = new Random();
 
		Monitor mon = null;
 
		String label = loop.getClass().getCanonicalName() + ".wait()"; 
		//"ru.dk2k.mavenExample.Loop.wait()";
 
		for (int i = 0; i < counter; i++) {
			try{
				mon = MonitorFactory.start(label);
 
				randValue = r.nextInt(400) + 100;
				loop.wait(randValue);
			} finally {
				mon.stop();
			}
        }
 
		System.out.println(mon);
 
		Thread task = new Thread(new StatsUpdater());
		ExecutorService executor = Executors.newFixedThreadPool(1);
		executor.submit(task);
 
        executor.shutdownNow();
	}
}

Вызов:

System.out.println(mon);

позволит увидеть статистику в виде:

JAMon Label=ru.dk2k.mavenExample.Loop.wait(), Units=ms.: 
(LastValue=327.0, Hits=50.0, Avg=305.08, Total=15254.0, 
Min=105.0, Max=491.0, Active=0.0, Avg Active=1.0, 
Max Active=1.0, First Access=Tue Oct 27 11:34:56 MSK 2015, 
Last Access=Tue Oct 27 11:35:11 MSK 2015)

Однако, можно получить и более наглядную форму. В следующем классе данные статистики будут сбрасываться в html файл:

package ru.dk2k.mavenExample;
 
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
import com.jamonapi.MonitorFactory;
 
public class StatsUpdater implements Runnable {
 
	static File statFile = new File("/home/dk/stat.html");
 
	public void run() {
        String monReport = MonitorFactory.getReport();
        BufferedWriter outBuffer = null;
        try {
            outBuffer = new BufferedWriter(new FileWriter(statFile));
            outBuffer.write(monReport);
        } catch (IOException e) {
 
        } finally {
            try 
            {
                if(outBuffer != null) {
                    outBuffer.close();
                }
            } catch (IOException e) {
 
            }
        }
    }
 
}

(поток из этого класса создается в Loop). Сброс статистики можно настроить по расписанию или нажатию кнопки в графической оболочке.

jamon
(картинка кликабельна, можно посмотреть без размытия)

В моем сброшенном файле будет только одна строка с данными о вызовах — строка с меткой ru.dk2k.mavenExample.Loop.wait(), т.к. был только один вызов вида:

mon = MonitorFactory.start(label);

(в качестве меток рекомендуется использовать уникальные строки).

В статье затронуты только базовые аспекты, если вы хотите узнать больше, читайте документацию: документация

[sc:social_networks ]
You can leave a response, or trackback from your own site.

Leave a Reply