Skip to content

Commit f396165

Browse files
committed
✨ add metrics example
1 parent 30b8e7b commit f396165

File tree

9 files changed

+218
-0
lines changed

9 files changed

+218
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ Java 库、框架使用示例大全,持续更新,请勿 `fork`。
3737
- [`log4j-example`](https://github.com/biezhi/java-library-examples/blob/master/log-example/log4j-example/src/main/java/io/github/biezhi/log4j)
3838
- [`logback-example`](https://github.com/biezhi/java-library-examples/blob/master/log-example/logback-example/src/main/java/io/github/biezhi/logback)
3939
- [`slf4j-example`](https://github.com/biezhi/java-library-examples/blob/master/log-example/slf4j-example/src/main/java/io/github/biezhi/slf4j)
40+
- [`metrics-example`](https://github.com/biezhi/java-library-examples/blob/master/metrics-example)
4041
- [`mq-example`](https://github.com/biezhi/java-library-examples/blob/master/mq-example)
4142
- [`kafka-example`](https://github.com/biezhi/java-library-examples/blob/master/mq-example/kafka-example)
4243
- [`rabbitmq-example`](https://github.com/biezhi/java-library-examples/blob/master/mq-example/rabbitmq-example)

metrics-example/README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
- [Metrics 是个什么鬼 之入门教程](http://wuchong.me/blog/2015/08/01/getting-started-with-metrics/)
3+
- [Metrics介绍和Spring的集成](http://colobu.com/2014/08/08/Metrics-and-Spring-Integration/)
4+

metrics-example/pom.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>java-library-examples</artifactId>
7+
<groupId>io.github.biezhi</groupId>
8+
<version>1.0-SNAPSHOT</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>metrics-example</artifactId>
13+
14+
<dependencies>
15+
<dependency>
16+
<groupId>io.dropwizard.metrics</groupId>
17+
<artifactId>metrics-core</artifactId>
18+
<version>4.0.2</version>
19+
</dependency>
20+
</dependencies>
21+
22+
</project>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package io.github.biezhi.metrics;
2+
3+
import com.codahale.metrics.ConsoleReporter;
4+
import com.codahale.metrics.Counter;
5+
import com.codahale.metrics.MetricRegistry;
6+
7+
import java.util.Queue;
8+
import java.util.Random;
9+
import java.util.concurrent.LinkedBlockingQueue;
10+
import java.util.concurrent.TimeUnit;
11+
12+
/**
13+
* 计数器例子
14+
* <p>
15+
* Counter 就是计数器,Counter 只是用 Gauge 封装了 AtomicLong 。我们可以使用如下的方法,使得获得队列大小更加高效。
16+
*/
17+
public class CounterExample {
18+
19+
public static Queue<String> q = new LinkedBlockingQueue<String>();
20+
public static Counter pendingJobs;
21+
public static Random random = new Random();
22+
23+
public static void addJob(String job) {
24+
pendingJobs.inc();
25+
q.offer(job);
26+
}
27+
28+
public static String takeJob() {
29+
pendingJobs.dec();
30+
return q.poll();
31+
}
32+
33+
public static void main(String[] args) throws InterruptedException {
34+
MetricRegistry registry = new MetricRegistry();
35+
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();
36+
reporter.start(1, TimeUnit.SECONDS);
37+
pendingJobs = registry.counter(MetricRegistry.name(Queue.class, "pending-jobs", "size"));
38+
int num = 1;
39+
40+
while (true) {
41+
Thread.sleep(200);
42+
if (random.nextDouble() > 0.7) {
43+
String job = takeJob();
44+
System.out.println("take job : " + job);
45+
} else {
46+
String job = "Job-" + num;
47+
addJob(job);
48+
System.out.println("add job : " + job);
49+
}
50+
num++;
51+
}
52+
}
53+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package io.github.biezhi.metrics;
2+
3+
import com.codahale.metrics.ConsoleReporter;
4+
import com.codahale.metrics.Gauge;
5+
import com.codahale.metrics.MetricRegistry;
6+
7+
import java.util.LinkedList;
8+
import java.util.Queue;
9+
import java.util.concurrent.TimeUnit;
10+
11+
/**
12+
* 衡量一个待处理队列中任务的个数
13+
*/
14+
public class GaugeExample {
15+
16+
public static Queue<String> q = new LinkedList<>();
17+
18+
public static void main(String[] args) throws InterruptedException {
19+
MetricRegistry registry = new MetricRegistry();
20+
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();
21+
reporter.start(1, TimeUnit.SECONDS);
22+
registry.register(MetricRegistry.name(GaugeExample.class, "queue", "size"),
23+
(Gauge<Integer>) () -> q.size());
24+
25+
while (true) {
26+
Thread.sleep(1000);
27+
q.add("Job-xxx");
28+
}
29+
}
30+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.github.biezhi.metrics;
2+
3+
import com.codahale.metrics.ConsoleReporter;
4+
import com.codahale.metrics.ExponentiallyDecayingReservoir;
5+
import com.codahale.metrics.Histogram;
6+
import com.codahale.metrics.MetricRegistry;
7+
8+
import java.util.Random;
9+
import java.util.concurrent.TimeUnit;
10+
11+
/**
12+
* Histogram统计数据的分布情况。
13+
* <p>
14+
* 比如最小值,最大值,中间值,还有中位数,75百分位, 90百分位, 95百分位, 98百分位, 99百分位, 和 99.9百分位的值(percentiles)。
15+
*/
16+
public class HistogramExample {
17+
18+
public static Random random = new Random();
19+
20+
public static void main(String[] args) throws InterruptedException {
21+
MetricRegistry registry = new MetricRegistry();
22+
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();
23+
reporter.start(1, TimeUnit.SECONDS);
24+
Histogram histogram = new Histogram(new ExponentiallyDecayingReservoir());
25+
registry.register(MetricRegistry.name(HistogramExample.class, "request", "histogram"), histogram);
26+
27+
while (true) {
28+
Thread.sleep(1000);
29+
histogram.update(random.nextInt(100000));
30+
}
31+
}
32+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.github.biezhi.metrics;
2+
3+
import com.codahale.metrics.ConsoleReporter;
4+
import com.codahale.metrics.Meter;
5+
import com.codahale.metrics.MetricRegistry;
6+
7+
import java.util.Random;
8+
import java.util.concurrent.TimeUnit;
9+
10+
/**
11+
* Meter度量一系列事件发生的速率(rate),例如TPS。
12+
* Meters会统计最近1分钟,5分钟,15分钟,还有全部时间的速率。
13+
*/
14+
public class MeterExample {
15+
16+
public static Random random = new Random();
17+
18+
public static void request(Meter meter) {
19+
System.out.println("request");
20+
meter.mark();
21+
}
22+
23+
public static void request(Meter meter, int n) {
24+
while (n > 0) {
25+
request(meter);
26+
n--;
27+
}
28+
}
29+
30+
/**
31+
* 非常像 Unix 系统中 uptime 和 top 中的 load。
32+
*
33+
* @param args
34+
* @throws InterruptedException
35+
*/
36+
public static void main(String[] args) throws InterruptedException {
37+
MetricRegistry registry = new MetricRegistry();
38+
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();
39+
reporter.start(1, TimeUnit.SECONDS);
40+
Meter meterTps = registry.meter(MetricRegistry.name(MeterExample.class, "request", "tps"));
41+
while (true) {
42+
request(meterTps, random.nextInt(5));
43+
Thread.sleep(1000);
44+
}
45+
}
46+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package io.github.biezhi.metrics;
2+
3+
import com.codahale.metrics.ConsoleReporter;
4+
import com.codahale.metrics.MetricRegistry;
5+
import com.codahale.metrics.Timer;
6+
7+
import java.util.Random;
8+
import java.util.concurrent.TimeUnit;
9+
10+
/**
11+
* Timer其实是 Histogram 和 Meter 的结合, histogram 某部分代码/调用的耗时, meter统计TPS。
12+
*/
13+
public class TimerExample {
14+
15+
public static Random random = new Random();
16+
17+
public static void main(String[] args) throws InterruptedException {
18+
MetricRegistry registry = new MetricRegistry();
19+
ConsoleReporter reporter = ConsoleReporter.forRegistry(registry).build();
20+
reporter.start(1, TimeUnit.SECONDS);
21+
Timer timer = registry.timer(MetricRegistry.name(TimerExample.class, "get-latency"));
22+
Timer.Context ctx;
23+
while (true) {
24+
ctx = timer.time();
25+
Thread.sleep(random.nextInt(1000));
26+
ctx.stop();
27+
}
28+
}
29+
}

pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
<module>embedded-example</module>
3232
<module>compress-example</module>
3333
<module>tensorflow-example</module>
34+
<module>metrics-example</module>
3435
</modules>
3536

3637
<properties>

0 commit comments

Comments
 (0)