DropWizard Metrics poskytují sadu nástrojů pro měření chování kritických komponent aplikací v produkčním prostředí.
Oficiální stránky
projektu jsou http://metrics.dropwizard.io/
- Rychlý úvod je dostupný na http://metrics.dropwizard.io/3.2.0/getting-started.html
- Kompletní manuál pak na http://metrics.dropwizard.io/3.2.0/manual/index.html
Import do projektu
Do projektu je potřeba přidat Maven závislost na metrics-core.
<dependencies>
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
</dependency>
</dependencies>
Metriky pod pokličkou
Základní knihovna pro
DropWizard Metrics je metrics-core, která poskytuje:
- MetricRegistry (výchozí třída pro zavedení metrik)
- 5 typů metrik
- Gauges
- Counters
- Histograms
- Meters
- Timers
- reporty metrik přes JMX, konzoli, CSV soubory nebo SLF4J logování
Metric Registries
Výchozím bodem pro
zavedení metrik do projektu je třída MetricRegistry obsahující kolekci všech
metrik, které je možno v aplikaci použít. Zpravidla stačí vytvořit jednu
instanci MetricRegistry na aplikaci, ale je možné použít i více instancí, pokud
chceme organizovat metriky do samostatných skupin.
Vytvoření instance
třídy MetricRegistry je jednoduché
final MetricRegistry metrics = new MetricRegistry();
Není problém vytvořit
instanci i jako statickou proměnnou.
Všechny třídy
jednotlivých metrik jsou thread-safe.
Metric Names
Každá metrika je
asociována s MetricRegistry a má jedinečný název v rámci tohoto registru. Názvy
metrik se zapisují tečkovou notací, např. cz.cca.example.Queue.size.
Pokud potřebujeme rozlišit dvě různé instance cz.cca.example.Queue, je možno
jim dát nějaký konkrétnější název, např. cz.cca.example.Queue.requests.size
a cz.cca.example.Queue.responses.size.
Třída MetricRegistry
poskytuje sadu pomocných statických metod pro snadné vytváření názvů metrik:
MetricRegistry.name(Queue.class,
"requests", "size")
MetricRegistry.name(Queue.class,
"responses", "size")
které automaticky
vytvoří požadované názvy s tečkovou notací. Nejprve sestaví přes tečkovou
notaci plný název třídy (např. cz.cca.example.Queue) a dále připojí
requests.size resp. responses.size.
Typy metrik
Gauges
Gauge je nejjednodušší
typ metriky. Pouze vrací nějakou hodnotu. Např. pokud potřebujeme sledovat
nějakou hodnotu aplikace (třeba délku fronty), můžeme ji zaregistrovat pomocí
Gauge instance, která tuto hodnotu vrací.
Ukázka použití
Chceme sledovat
velikost paměti (cache) ve třídě cz.cca.example.SessionStore.
registry.register(name(SessionStore.class,
"cache"), new Gauge<Integer>() {
@Override
public Integer getValue() {
return cache.getEvictionsCount();
}
});
Tímto se vytvoří nová metrika Gauge pojmenovaná
cz.cca.example.SessionStore.cahe, která vrací aktuální velikost obsazení cache.
Ukázkový příklad
package cz.cca.dropwizard;
import com.codahale.metrics.*;
import java.util.*;
import java.util.concurrent.*;
public class ExampleGauge {
static final
MetricRegistry metrics = new MetricRegistry();
public
static void main(String[] args) {
final
Queue queue = new LinkedList<String>();
//
Zaregistrování Gauge pro vracení délky fronty
metrics.register(MetricRegistry.name(ExampleGauge.class,
"queue", "size"),
new Gauge<Integer>() {
@Override
public Integer getValue() {
return queue.size();
}
});
//
Spustíme sledování metrik (výpis do konzole)
startReport(metrics);
waitSec(2); // Chvilku počkáme, aby se stihl vypsat počáteční stav fronty
// Do
fronty přidáme dvě hodnoty
queue.add("A");
queue.add("B");
waitSec(1); // Chvilku počkáme, aby se stihl vypsat koncový stav fronty
}
static void
startReport(MetricRegistry metrics) {
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
}
static void
waitSec(final int seconds) {
try {
Thread.sleep(seconds * 1000);
}
catch(InterruptedException e) {}
}
}
Výstupem příkladu bude
10.3.17 7:39:55 ================================================================
-- Gauges
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleGauge.queue.size
value = 0
10.3.17 7:39:56 ================================================================
-- Gauges
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleGauge.queue.size
value = 2
Z výpisu je vidět velikost fronty v jednotlivých okamžicích, nejprve
prázdná fronta, pak fronta s dvěma prvky. V reálné aplikaci je takto možno
sledovat např. nějakou cache po celou dobu běhu aplikace.
Poznámka na okraj
Místo anonymní vnitřní třídy (jak je ukázáno níže)
// Zaregistrování Gauge pro vracení délky fronty
metrics.register(MetricRegistry.name(ExampleGauge.class,
"queue", "size"),
new
Gauge<Integer>() {
@Override
public Integer getValue() {
return queue.size();
}
});
je možné totéž zapsat pomocí lambda výrazu a ušetřit tak pár řádek
kódu :-)
metrics.register(MetricRegistry.name(ExampleGauge.class,
"queue", "size"), (Gauge<Integer>) () ->
queue.size());
Counters
Counter je jednoduché
počítadlo poskytující metody pro inkrementaci (zvýšení hodnoty) a dekrementaci
(snížení hodnoty). Možno použít např. pro efektivnější způsob měření úloh
čekajících ve frontě.
Ukázka použití
Chceme sledovat frontu
požadavků, do metody pro vložení požadavku do fronty přidáme inkrementaci
metriky, do metody pro odebrání prvku z fronty přidáme dekrementaci metriky.
private final Counter pendingJobs =
metrics.counter(MetricRegistry.name(QueueManager.class,
"pending-jobs"));
public void addJob(Job job) {
// Přidání
prvku do fronty
pendingJobs.inc();
queue.offer(job);
}
public Job takeJob() {
// Odebrání
prvku z fronty
pendingJobs.dec();
return
queue.take();
}
Metody inc() a dec()
lze volat i s parametrem, který říká, o kolik se má
inkrementovat/dekrementovat.
pendingJobs.inc(5);
pendingJobs.dec(5);
Ukázkový příklad
package cz.cca.dropwizard;
import com.codahale.metrics.*;
import java.util.*;
import java.util.concurrent.*;
public class ExampleCounter {
private
static final MetricRegistry metrics = new MetricRegistry();
private
static final Counter pendingJobs =
metrics.counter(MetricRegistry.name(ExampleCounter.class,
"pending-jobs"));
private
static Queue queue = new LinkedList<String>();
public
static void addJob(String job) {
//
Přidání prvku do fronty
pendingJobs.inc();
queue.add(job);
}
public
static String takeJob() {
//
Odebrání prvku z fronty
pendingJobs.dec();
return
(String) queue.remove();
}
public
static void main(String[] args) {
startReport(metrics);
waitSec(2);
//
Vložení 10ti prvků do fronty
for (int
i = 0; i < 10; i++) {
addJob("Job" + i);
}
waitSec(1);
//
Vložení 5ti prvků do fronty
for (int
i = 0; i < 5; i++) {
addJob("Job" + i);
}
waitSec(1);
//
Odebrání 10ti prvků z fronty
for (int
i = 0; i < 10; i++) {
takeJob();
}
waitSec(1);
}
static void
startReport(MetricRegistry metrics) {
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
}
static void
waitSec(final int seconds) {
try {
Thread.sleep(seconds * 1000);
}
catch(InterruptedException e) {}
}
}
Výstup bude následující
10.3.17 9:33:51
================================================================
-- Counters --------------------------------------------------------------------
cz.cca.dropwizard.ExampleCounter.pending-jobs
count = 0
10.3.17 9:33:52
================================================================
-- Counters --------------------------------------------------------------------
cz.cca.dropwizard.ExampleCounter.pending-jobs
count = 10
10.3.17 9:33:53
================================================================
-- Counters --------------------------------------------------------------------
cz.cca.dropwizard.ExampleCounter.pending-jobs
count = 15
10.3.17 9:33:54
================================================================
-- Counters --------------------------------------------------------------------
cz.cca.dropwizard.ExampleCounter.pending-jobs
count = 5
Metrika ukazuje
obsazení fronty ve sledovaných okamžicích.
Histograms
Histogram umožňuje
měřit statistické rozdělení hodnot v nějakém proudu dat. Kromě minima, maxima,
průměru atd. měří i medián, 75., 90., 95., 98. a 99.9. percentil.
Ukázka použití
Následující ukázka
měří velikost odpovědi v bytech.
private final Histogram responseSizes =
metrics.histogram(MetricRegistry.name(RequestHandler.class,
"response-sizes"));
public void handleRequest(Request request, Response
response) {
// ...
responseSizes.update(response.getContent().length);
}
Ukázkový příklad
package cz.cca.dropwizard;
import com.codahale.metrics.*;
import java.util.concurrent.TimeUnit;
public class ExampleHistogram {
private
static final MetricRegistry metrics = new MetricRegistry();
private
static final Histogram histogram =
metrics.histogram(MetricRegistry.name(ExampleHistogram.class, "histogram"));
public
static void main(String[] args) {
startReport(metrics);
waitSec(2);
int[][]
pole = { {5, 18, 6, 27, 64, 15}, {2, 3, 93, 45, 23, 20}, {80, 50, 66, 24, 77,
61} };
for (int
i = 0; i < pole.length; i++) {
for
(int j = 0; j < pole[i].length; j++) {
histogram.update(pole[i][j]);
waitSec(1);
}
}
}
static void
startReport(MetricRegistry metrics) {
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
}
static void
waitSec(final int seconds) {
try {
Thread.sleep(seconds * 1000);
}
catch(InterruptedException e) {}
}
}
Výpis může vypadat následovně
10.3.17 12:14:12 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 0
min = 0
max = 0
mean = 0,00
stddev = 0,00
median = 0,00
75% <= 0,00
95% <= 0,00
98% <= 0,00
99% <= 0,00
99.9% <= 0,00
10.3.17 12:14:13 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 1
min = 5
max = 5
mean = 5,00
stddev = 0,00
median = 5,00
75% <= 5,00
95% <= 5,00
98% <= 5,00
99% <= 5,00
99.9% <= 5,00
10.3.17 12:14:14 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 2
min = 5
max = 18
mean = 11,55
stddev = 6,50
median = 18,00
75% <= 18,00
95% <= 18,00
98% <= 18,00
99% <= 18,00
99.9% <= 18,00
10.3.17 12:14:15 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 3
min = 5
max = 18
mean = 9,67
stddev = 5,90
median = 6,00
75% <= 18,00
95% <= 18,00
98% <= 18,00
99% <= 18,00
99.9% <= 18,00
10.3.17 12:14:16 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 4
min = 5
max = 27
mean = 14,10
stddev = 9,11
median = 18,00
75% <= 27,00
95% <= 27,00
98% <= 27,00
99% <= 27,00
99.9% <= 27,00
10.3.17 12:14:17
===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 5
min = 5
max = 64
mean = 24,38
stddev = 21,75
median = 18,00
75% <= 27,00
95% <= 64,00
98% <= 64,00
99% <= 64,00
99.9% <= 64,00
10.3.17 12:14:18 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 6
min = 5
max = 64
mean = 22,76
stddev = 20,10
median = 18,00
75% <= 27,00
95% <= 64,00
98% <= 64,00
99% <= 64,00
99.9% <= 64,00
10.3.17 12:14:19
===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 7
min = 2
max = 64
mean = 19,66
stddev = 19,96
median = 15,00
75% <= 27,00
95% <= 64,00
98% <= 64,00
99% <= 64,00
99.9% <= 64,00
10.3.17 12:14:20
===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 8
min = 2
max = 64
mean = 17,47
stddev = 19,43
median = 6,00
75% <= 18,00
95% <= 64,00
98% <= 64,00
99% <= 64,00
99.9% <= 64,00
10.3.17 12:14:21 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 9
min = 2
max = 93
mean = 26,37
stddev = 30,44
median = 15,00
75% <= 27,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:22
===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 10
min = 2
max = 93
mean = 28,36
stddev = 29,34
median = 18,00
75% <= 45,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:23
===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 11
min = 2
max
= 93
mean = 27,84
stddev = 27,91
median = 18,00
75% <= 45,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:24 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 12
min = 2
max = 93
mean = 27,13
stddev = 26,71
median = 20,00
75% <= 45,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:25
===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 13
min = 2
max
= 93
mean = 31,57
stddev = 29,47
median = 20,00
75% <= 45,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:26 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 14
min = 2
max = 93
mean = 33,02
stddev = 28,72
median = 23,00
75% <= 50,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:27 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 15
min = 2
max = 93
mean = 35,46
stddev = 28,96
median = 23,00
75% <= 64,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:28
===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 16
min = 2
max
= 93
mean = 34,66
stddev = 28,08
median = 24,00
75% <= 64,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:29 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 17
min = 2
max = 93
mean = 37,46
stddev = 29,11
median = 24,00
75% <= 66,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
10.3.17 12:14:30 ===============================================================
-- Histograms
------------------------------------------------------------------
cz.cca.dropwizard.ExampleHistogram.histogram
count = 18
min = 2
max = 93
mean = 38,94
stddev = 28,75
median = 27,00
75% <= 64,00
95% <= 93,00
98% <= 93,00
99% <= 93,00
99.9% <= 93,00
Meters
Tato metrika měří
rychlost událostí v čase (např. počet požadavků za jednu sekundu). Kromě
průměrného počtu požadavků lze také sledovat klouzavé průměry za 1 minutu / 5
minut / 15 minut, což může být mnohdy zajímavější údaj než celkový proměr za
celou dobu běhu (protože z klouzavých průměrů je možno vyčíst chování/zátěž
aplikace v posledních minutách a získat tak aktuálnější pohled).
Ukázka použití
final Meter meterRequests =
registry.meter(name(WebProxy.class, "get-requests",
"requests"));
meterRequests.mark();
meterRequests.mark(requests.size());
Metrika poskytuje
metodu mark(), kterou se započítá požadavek do metriky. Je možno volat i s
číselným parametrem (podle potřeby).
Ukázkový příklad
package cz.cca.dropwizard;
import com.codahale.metrics.*;
import java.util.concurrent.*;
public class ExampleMeter {
static final
MetricRegistry metrics = new MetricRegistry();
public
static void main(String args[]) {
//
Spuštění reportů do konzole
startReport();
Meter
requests = metrics.meter("requests");
int[]
reqeustsCount = { 20, 13, 69 };
for (int
i = 0; i < reqeustsCount.length; i++) {
requests.mark(reqeustsCount[i]);
waitSec();
}
}
static void
startReport() {
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
}
static void
waitSec() {
try {
Thread.sleep(1*1000);
}
catch(InterruptedException e) {}
}
}
Výstup bude vypadat následovně
10.3.17 15:34:00
===============================================================
-- Meters
----------------------------------------------------------------------
requests
count = 20
mean
rate = 19,33 events/second
1-minute
rate = 0,00 events/second
5-minute
rate = 0,00 events/second
15-minute
rate = 0,00 events/second
10.3.17 15:34:01
===============================================================
-- Meters
----------------------------------------------------------------------
requests
count = 33
mean
rate = 16,54 events/second
1-minute rate = 0,00 events/second
5-minute
rate = 0,00 events/second
15-minute
rate = 0,00 events/second
10.3.17 15:34:02
===============================================================
-- Meters ----------------------------------------------------------------------
requests
count = 102
mean
rate = 34,05 events/second
1-minute
rate = 0,00 events/second
5-minute
rate = 0,00 events/second
15-minute
rate = 0,00 events/second
Každou vteřinu se
započte určitý počet požadavků, metrika zobrazuje celkový počet požadavků,
kolik je průměrně požadavků za vteřinu a klouzavé průměry (ty nejsou s ohledem
na krátkou dobu běhu spočteny).
Timers
Timer je v podstatě
kombinace histogramu trvání nějaké akce a měřiče počtu volání akce za časový
údaj (tj. metriky Histogram a Meter, ale nenahrazuje je!).
Ukázka použití
private final Timer responses =
metrics.timer(MetricRegistry.name(RequestHandler.class,
"responses"));
public String handleRequest(Request request, Response
response) {
final
Timer.Context context = responses.time();
try {
//
Nějaké zpracování požadavku...
return
"OK";
}
finally {
context.stop();
}
}
Ukázkový příklad
V ukázkovém příkladu
je v cyklu volána nějaká akce, ve které je aplikován Timer pro započítání,
kolikrát byla akce volána, s jakou periodou, jak dlouho akce trvala.
package cz.cca.dropwizard;
import com.codahale.metrics.*;
import java.util.concurrent.*;
public class ExampleTimer {
private
static final MetricRegistry metrics = new MetricRegistry();
private
static final Timer timer =
metrics.timer(MetricRegistry.name(ExampleTimer.class, "timer"));
public
static void main(String[] args) {
startReport(metrics);
int[]
delay = { 2, 1, 3, 4, 1 };
for (int
i = 0; i < delay.length; i++) {
doWork(delay[i]);
}
waitSec(1);
}
public
static void doWork(int delay) {
final
Timer.Context context = timer.time();
// Touto
prodlevou je simulována doba zpracování požadavku
waitSec(delay);
context.stop();
}
static void
startReport(MetricRegistry metrics) {
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
}
static void
waitSec(final int seconds) {
try {
Thread.sleep(seconds * 1000);
}
catch(InterruptedException e) {}
}
}
Výstup bude vypadat
následovně
10.3.17 13:16:24
===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 0
mean
rate = 0,00 calls/second
1-minute
rate = 0,00 calls/second
5-minute
rate = 0,00 calls/second
15-minute
rate = 0,00 calls/second
min = 0,00 milliseconds
max = 0,00 milliseconds
mean = 0,00 milliseconds
stddev = 0,00 milliseconds
median = 0,00 milliseconds
75% <= 0,00 milliseconds
95% <= 0,00 milliseconds
98% <= 0,00 milliseconds
99% <= 0,00 milliseconds
99.9% <= 0,00 milliseconds
10.3.17 13:16:25 ===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 1
mean
rate = 0,00 calls/second
1-minute rate
= 0,00 calls/second
5-minute
rate = 0,00 calls/second
15-minute
rate = 0,00 calls/second
min = 0,00 milliseconds
max = 0,00 milliseconds
mean = 0,00 milliseconds
stddev = 0,00 milliseconds
median = 0,00 milliseconds
75% <= 0,00 milliseconds
95% <= 0,00 milliseconds
98% <= 0,00 milliseconds
99% <= 0,00 milliseconds
99.9% <= 0,00 milliseconds
10.3.17 13:16:26 ===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 1
mean
rate = 0,33 calls/second
1-minute
rate = 0,00 calls/second
5-minute
rate = 0,00 calls/second
15-minute
rate = 0,00 calls/second
min = 2000,02 milliseconds
max = 2000,02 milliseconds
mean = 2000,02 milliseconds
stddev = 0,00 milliseconds
median = 2000,02 milliseconds
75% <= 2000,02 milliseconds
95% <= 2000,02 milliseconds
98% <= 2000,02 milliseconds
99% <= 2000,02 milliseconds
99.9% <= 2000,02 milliseconds
10.3.17 13:16:27
===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 2
mean
rate = 0,49 calls/second
1-minute
rate = 0,00 calls/second
5-minute
rate = 0,00 calls/second
15-minute
rate = 0,00 calls/second
min = 1000,19 milliseconds
max = 2000,02 milliseconds
mean = 1496,36 milliseconds
stddev = 499,90 milliseconds
median = 1000,19 milliseconds
75% <= 2000,02 milliseconds
95% <= 2000,02 milliseconds
98% <= 2000,02 milliseconds
99% <= 2000,02 milliseconds
99.9% <= 2000,02 milliseconds
10.3.17 13:16:28
===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 2
mean
rate = 0,40 calls/second
1-minute
rate = 0,40 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 2000,02 milliseconds
mean = 1496,36 milliseconds
stddev = 499,90 milliseconds
median = 1000,19 milliseconds
75% <= 2000,02 milliseconds
95% <= 2000,02 milliseconds
98% <= 2000,02 milliseconds
99% <= 2000,02 milliseconds
99.9% <= 2000,02 milliseconds
10.3.17 13:16:29
===============================================================
-- Timers ----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 2
mean
rate = 0,33 calls/second
1-minute
rate = 0,40 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 2000,02 milliseconds
mean = 1496,36 milliseconds
stddev = 499,90 milliseconds
median = 1000,19 milliseconds
75% <= 2000,02 milliseconds
95% <= 2000,02 milliseconds
98% <= 2000,02 milliseconds
99% <= 2000,02 milliseconds
99.9% <= 2000,02 milliseconds
10.3.17 13:16:30 ===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 3
mean
rate = 0,42 calls/second
1-minute
rate = 0,40 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 3000,27 milliseconds
mean = 2015,35 milliseconds
stddev = 821,48 milliseconds
median = 2000,02 milliseconds
75% <= 3000,27 milliseconds
95% <= 3000,27 milliseconds
98% <= 3000,27 milliseconds
99% <= 3000,27 milliseconds
99.9% <= 3000,27 milliseconds
10.3.17 13:16:31
===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 3
mean
rate = 0,37 calls/second
1-minute
rate = 0,40 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 3000,27 milliseconds
mean = 2015,35 milliseconds
stddev
= 821,48 milliseconds
median = 2000,02 milliseconds
75% <= 3000,27 milliseconds
95% <= 3000,27 milliseconds
98% <= 3000,27 milliseconds
99% <= 3000,27 milliseconds
99.9% <= 3000,27 milliseconds
10.3.17 13:16:32
===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 3
mean
rate = 0,33 calls/second
1-minute
rate = 0,40 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 3000,27 milliseconds
mean
= 2015,35 milliseconds
stddev = 821,48 milliseconds
median = 2000,02 milliseconds
75% <= 3000,27 milliseconds
95% <= 3000,27 milliseconds
98% <= 3000,27 milliseconds
99% <= 3000,27 milliseconds
99.9% <= 3000,27 milliseconds
10.3.17 13:16:33
===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 3
mean
rate = 0,30 calls/second
1-minute
rate = 0,38 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 3000,27 milliseconds
mean = 2015,35 milliseconds
stddev = 821,48 milliseconds
median = 2000,02 milliseconds
75% <= 3000,27 milliseconds
95% <= 3000,27 milliseconds
98% <= 3000,27 milliseconds
99% <= 3000,27 milliseconds
99.9% <= 3000,27 milliseconds
10.3.17 13:16:34
===============================================================
-- Timers ----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 4
mean
rate = 0,36 calls/second
1-minute
rate = 0,38 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 4000,64 milliseconds
mean = 2547,74 milliseconds
stddev = 1125,78 milliseconds
median = 3000,27 milliseconds
75% <= 4000,64 milliseconds
95% <= 4000,64 milliseconds
98% <= 4000,64 milliseconds
99% <= 4000,64 milliseconds
99.9% <= 4000,64 milliseconds
10.3.17 13:16:35
===============================================================
-- Timers
----------------------------------------------------------------------
cz.cca.dropwizard.ExampleTimer.timer
count = 5
mean
rate = 0,41 calls/second
1-minute
rate = 0,38 calls/second
5-minute
rate = 0,40 calls/second
15-minute
rate = 0,40 calls/second
min = 1000,19 milliseconds
max = 4000,64 milliseconds
mean = 2216,76 milliseconds
stddev = 1182,63 milliseconds
median = 2000,02 milliseconds
75% <= 3000,27 milliseconds
95% <= 4000,64 milliseconds
98% <= 4000,64 milliseconds
99% <= 4000,64 milliseconds
99.9% <= 4000,64 milliseconds
Z výpisu je např.
vidět, že akce byla zavolána 5x, nejkratší doba trvání byla 1 [s], nejdelší
doba trvání byla 4 [s], průměrná doba trvání 2,2 [s], průměrně volána 0,4 x za
vteřinu, atd.
Typy reportů
Měřené metriky lze
exportovat různými způsoby použitím vhodného reporteru (JMX, Console, CSV,
SLF4J, ...).
JMX
S JmxReporter lze
vystavit metriky jako JMX MBeans. Metriky lze pak prohlížet např. přes VisualVM
nebo JConsole.
final JmxReporter reporter =
JmxReporter.forRegistry(registry).build();
reporter.start();
Aby bylo možné reporty zobrazovat ve VisualVM, je potřeba nainstalovat
plugin VisualVM-MBeans. To lze udělat přes menu Tools - Plugins. Dále vybrat
záložku Available Plugins a na ní zaškrtnout VisualVM-MBeans (viz https://visualvm.java.net/mbeans_tab.html).
Po instalaci pluginu ve VisualVM přibude záložka MBeans, ve které lze
zobrazit mimo jiné i sledovanou metriku.
Console
ConsoleReporter (jak
už název napovídá) vypisuje všechny registrované metriky v pravidelných intervalech
do konzole. Lze nastavit periodu vypisování.
final ConsoleReporter reporter =
ConsoleReporter.forRegistry(registry)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.MINUTES); // Report každou
minutu
CSV
Rovněž je možné
vypisovat reporty do CSV souboru.
final CsvReporter reporter =
CsvReporter.forRegistry(registry)
.formatFor(Locale.US)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build(new File("c:/temp/data/"));
reporter.start(1, TimeUnit.MINUTES); // Report každou
minutu
Vznikne CSV soubor, jehož název odpovídá zvolenému pojmenování dané
metriky, tj. např. cz.cca.dropwizard.ExampleTimer.timer.csv.
Obsah souboru může vypadat následovně:
t,count,max,mean,min,stddev,p50,p75,p95,p98,p99,p999,mean_rate,m1_rate,m5_rate,m15_rate,rate_unit,duration_unit
1489385125,0,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,calls/second,milliseconds
1489385126,1,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,calls/second,milliseconds
1489385127,1,2000.069790,2000.069790,2000.069790,0.000000,2000.069790,2000.069790,2000.069790,2000.069790,2000.069790,2000.069790,0.330471,0.000000,0.000000,0.000000,calls/second,milliseconds
1489385128,2,2000.069790,1496.486751,1000.401087,499.820294,1000.401087,2000.069790,2000.069790,2000.069790,2000.069790,2000.069790,0.496665,0.000000,0.000000,0.000000,calls/second,milliseconds
1489385129,2,2000.069790,1496.486751,1000.401087,499.820294,1000.401087,2000.069790,2000.069790,2000.069790,2000.069790,2000.069790,0.397866,0.400000,0.400000,0.400000,calls/second,milliseconds
1489385130,2,2000.069790,1496.486751,1000.401087,499.820294,1000.401087,2000.069790,2000.069790,2000.069790,2000.069790,2000.069790,0.331849,0.400000,0.400000,0.400000,calls/second,milliseconds
1489385131,3,3000.798068,2015.615413,1000.401087,821.611470,2000.069790,3000.798068,3000.798068,3000.798068,3000.798068,3000.798068,0.426933,0.400000,0.400000,0.400000,calls/second,milliseconds
1489385132,3,3000.798068,2015.615413,1000.401087,821.611470,2000.069790,3000.798068,3000.798068,3000.798068,3000.798068,3000.798068,0.373794,0.400000,0.400000,0.400000,calls/second,milliseconds
1489385133,3,3000.798068,2015.615413,1000.401087,821.611470,2000.069790,3000.798068,3000.798068,3000.798068,3000.798068,3000.798068,0.332395,0.400000,0.400000,0.400000,calls/second,milliseconds
1489385134,3,3000.798068,2015.615413,1000.401087,821.611470,2000.069790,3000.798068,3000.798068,3000.798068,3000.798068,3000.798068,0.299224,0.384009,0.396694,0.398892,calls/second,milliseconds
1489385135,4,4000.068969,2547.781812,1000.401087,1125.556948,3000.798068,4000.068969,4000.068969,4000.068969,4000.068969,4000.068969,0.362779,0.384009,0.396694,0.398892,calls/second,milliseconds
1489385136,5,4000.068969,2216.593549,999.976189,1182.679305,2000.069790,3000.798068,4000.068969,4000.068969,4000.068969,4000.068969,0.415778,0.384009,0.396694,0.398892,calls/second,milliseconds
Zobrazení v Excelu:
SLF4J
Další možností je
vypisovat metriky do logu přes SLF4J logger.
final Slf4jReporter reporter =
Slf4jReporter.forRegistry(registry)
.outputTo(LoggerFactory.getLogger("cz.cca.example.metrics"))
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.MINUTES); // Report každou minutu
Další možnosti reportů
Existují i další
možnosti reportů, např.:
- MetricsServlet (který poskytuje metriky jako objekt JSON)
- GangliaReporter (umožňuje přenos metrik na servery Ganglia)
- GraphiteReporter (umožňuje přenos metrik na servery Graphite)
Další možnosti reportů
a integrace metrik do jiných systémů poskytují knihovny třetích stran (http://metrics.dropwizard.io/3.1.0/manual/third-party/).
Přístup k hodnotám metrik
Kromě toho, že je
možné jednotlivé metriky vypisovat pomocí reportů, je rovněž možné pracovat
přímo s jednotlivými hodnotami v aplikaci. Každá metrika poskytuje metody pro
jejich získání.
Například hodnoty metriky Meter (viz níže)
-- Meters ----------------------------------------------------------------------
meter
count = 33
mean
rate = 16,58 events/second
1-minute
rate = 0,00 events/second
5-minute
rate = 0,00 events/second
15-minute
rate = 0,00 events/second
můžeme získat voláním
následujících funkcí
System.out.println("count = " +
meter.getCount());
System.out.println("mean rate = " +
meter.getMeanRate());
System.out.println("1-minute rate = " +
meter.getOneMinuteRate());
System.out.println("5-minute rate = " +
meter.getFiveMinuteRate());
System.out.println("15-minute rate = " +
meter.getFifteenMinuteRate());
Stejným způsobem lze získat jakékoliv hodnoty všech poskytovaných metrik a
dále je zpracovávat/vypisovat/vykreslovat z nich grafy apod. Vracené hodnoty
jsou samozřejmě proměnlivé v čase.
Autor článku: Ondřej Čabrada, CCA Group a.s.
Autor článku: Ondřej Čabrada, CCA Group a.s.
Žádné komentáře:
Okomentovat