-
Notifications
You must be signed in to change notification settings - Fork 2.1k
/
DefaultInteractionMetrics.java
118 lines (102 loc) · 3.21 KB
/
DefaultInteractionMetrics.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
* Copyright (c) 2011-2023 Contributors to the Eclipse Foundation
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http:https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
* which is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
*/
package io.vertx.core.net.endpoint;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.LongAdder;
/**
* Default interaction metrics.
*/
public class DefaultInteractionMetrics implements InteractionMetrics<DefaultInteractionMetric> {
private final LongAdder numberOfInflightRequests = new LongAdder();
private final LongAdder numberOfRequests = new LongAdder();
private final LongAdder numberOfFailures = new LongAdder();
private final AtomicLong minResponseTime = new AtomicLong(Long.MAX_VALUE);
private final AtomicLong maxResponseTime = new AtomicLong(0);
@Override
public DefaultInteractionMetric initiateRequest() {
numberOfInflightRequests.increment();
numberOfRequests.increment();
return new DefaultInteractionMetric();
}
@Override
public void reportFailure(DefaultInteractionMetric metric, Throwable failure) {
if (metric.failure == null) {
metric.failure = failure;
numberOfInflightRequests.decrement();
numberOfFailures.increment();
}
}
@Override
public void reportRequestBegin(DefaultInteractionMetric metric) {
metric.requestBegin = System.currentTimeMillis();
}
@Override
public void reportRequestEnd(DefaultInteractionMetric metric) {
metric.requestEnd = System.currentTimeMillis();
}
@Override
public void reportResponseBegin(DefaultInteractionMetric metric) {
metric.responseBegin = System.currentTimeMillis();
}
@Override
public void reportResponseEnd(DefaultInteractionMetric metric) {
metric.responseEnd = System.currentTimeMillis();
if (metric.failure == null) {
reportRequestMetric(metric);
numberOfInflightRequests.decrement();
}
}
private void reportRequestMetric(DefaultInteractionMetric metric) {
long responseTime = metric.responseEnd - metric.requestBegin;
while (true) {
long val = minResponseTime.get();
if (responseTime >= val || minResponseTime.compareAndSet(val, responseTime)) {
break;
}
}
while (true) {
long val = maxResponseTime.get();
if (responseTime <= val || maxResponseTime.compareAndSet(val, responseTime)) {
break;
}
}
}
/**
* @return the number of inflight requests
*/
public int numberOfInflightRequests() {
return numberOfInflightRequests.intValue();
}
/**
* @return the total number of requests
*/
public int numberOfRequests() {
return numberOfRequests.intValue();
}
/**
* @return the total number of failures
*/
public int numberOfFailures() {
return numberOfFailures.intValue();
}
/**
* @return the min response time
*/
public int minResponseTime() {
return minResponseTime.intValue();
}
/**
* @return the max response time
*/
public int maxResponseTime() {
return maxResponseTime.intValue();
}
}