30
30
import java .util .ArrayList ;
31
31
import java .util .Collections ;
32
32
import java .util .List ;
33
+ import java .util .Optional ;
33
34
import java .util .concurrent .CompletableFuture ;
34
- import org .hyperledger .besu .metrics .noop .NoOpMetricsSystem ;
35
35
import org .hyperledger .besu .plugin .services .MetricsSystem ;
36
36
import org .hyperledger .besu .plugin .services .metrics .LabelledGauge ;
37
37
import org .junit .jupiter .api .Assertions ;
38
38
import org .junit .jupiter .api .Test ;
39
39
import tech .pegasys .teku .infrastructure .async .SafeFuture ;
40
+ import tech .pegasys .teku .infrastructure .metrics .StubLabelledGauge ;
41
+ import tech .pegasys .teku .infrastructure .metrics .StubMetricsSystem ;
40
42
import tech .pegasys .teku .infrastructure .metrics .TekuMetricCategory ;
41
43
import tech .pegasys .teku .networking .p2p .mock .MockNodeId ;
42
44
import tech .pegasys .teku .networking .p2p .peer .Peer ;
@@ -46,10 +48,11 @@ public class PeerManagerTest {
46
48
47
49
private final ReputationManager reputationManager = mock (ReputationManager .class );
48
50
private final Network network = mock (Network .class );
51
+ final StubMetricsSystem metricsSystem = new StubMetricsSystem ();
49
52
50
53
private final PeerManager peerManager =
51
54
new PeerManager (
52
- new NoOpMetricsSystem () ,
55
+ metricsSystem ,
53
56
reputationManager ,
54
57
Collections .emptyList (),
55
58
Collections .emptyList (),
@@ -78,11 +81,15 @@ public void subscribeConnect_singleListener() {
78
81
@ Test
79
82
public void shouldCreatePeerTypeMetrics () {
80
83
final MetricsSystem metricsSystem = mock (MetricsSystem .class );
81
- final LabelledGauge gauge = mock (LabelledGauge .class );
84
+ final LabelledGauge peerClientLabelledGauge = mock (LabelledGauge .class );
85
+ final LabelledGauge peerDirectionLabelledGauge = mock (LabelledGauge .class );
82
86
83
87
when (metricsSystem .createLabelledGauge (
84
- eq (TekuMetricCategory .LIBP2P ), eq ("connected_peers_current" ), any (), any ()))
85
- .thenReturn (gauge );
88
+ eq (TekuMetricCategory .LIBP2P ), eq ("connected_peers_current" ), any (), eq ("client" )))
89
+ .thenReturn (peerClientLabelledGauge );
90
+ when (metricsSystem .createLabelledGauge (
91
+ eq (TekuMetricCategory .LIBP2P ), eq ("peers_direction_current" ), any (), eq ("direction" )))
92
+ .thenReturn (peerDirectionLabelledGauge );
86
93
new PeerManager (
87
94
metricsSystem ,
88
95
reputationManager ,
@@ -91,8 +98,10 @@ public void shouldCreatePeerTypeMetrics() {
91
98
peerId -> 0.0 );
92
99
93
100
for (PeerClientType type : PeerClientType .values ()) {
94
- verify (gauge ).labels (any (), eq (type .getDisplayName ()));
101
+ verify (peerClientLabelledGauge ).labels (any (), eq (type .getDisplayName ()));
95
102
}
103
+ verify (peerDirectionLabelledGauge ).labels (any (), eq ("inbound" ));
104
+ verify (peerDirectionLabelledGauge ).labels (any (), eq ("outbound" ));
96
105
}
97
106
98
107
@ Test
@@ -163,4 +172,44 @@ public void shouldReportSuccessfulConnectionsToReputationManager() {
163
172
verify (reputationManager ).reportInitiatedConnectionSuccessful (peerAddress );
164
173
verify (reputationManager , never ()).reportInitiatedConnectionFailed (peerAddress );
165
174
}
175
+
176
+ @ Test
177
+ public void testPeerDirectionMetric () {
178
+ // Sanity check
179
+ validatePeerMetrics (0 , 0 );
180
+
181
+ // Add a peer
182
+ final Peer outboundPeer1 = createPeerWithDirection (1 , true );
183
+ peerManager .onConnectedPeer (outboundPeer1 );
184
+ validatePeerMetrics (1 , 0 );
185
+
186
+ // Add another peer
187
+ final Peer inboundPeer1 = createPeerWithDirection (2 , false );
188
+ peerManager .onConnectedPeer (inboundPeer1 );
189
+ validatePeerMetrics (1 , 1 );
190
+
191
+ // Disconnect a peer
192
+ peerManager .onDisconnectedPeer (outboundPeer1 , Optional .empty (), true );
193
+ validatePeerMetrics (0 , 1 );
194
+
195
+ // Add another peer
196
+ final Peer inboundPeer2 = createPeerWithDirection (3 , false );
197
+ peerManager .onConnectedPeer (inboundPeer2 );
198
+ validatePeerMetrics (0 , 2 );
199
+ }
200
+
201
+ private void validatePeerMetrics (final double expectedOutbound , final double expectedInbound ) {
202
+ final StubLabelledGauge labelledGauge =
203
+ metricsSystem .getLabelledGauge (TekuMetricCategory .LIBP2P , "peers_direction_current" );
204
+ assertThat (labelledGauge .getValue ("inbound" )).hasValue (expectedInbound );
205
+ assertThat (labelledGauge .getValue ("outbound" )).hasValue (expectedOutbound );
206
+ }
207
+
208
+ private Peer createPeerWithDirection (final int id , final boolean outbound ) {
209
+ final Peer peer = mock (Peer .class );
210
+ when (peer .getId ()).thenReturn (new MockNodeId (id ));
211
+ when (peer .connectionInitiatedLocally ()).thenReturn (outbound );
212
+ when (peer .connectionInitiatedRemotely ()).thenReturn (!outbound );
213
+ return peer ;
214
+ }
166
215
}
0 commit comments