-
Notifications
You must be signed in to change notification settings - Fork 756
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ONOS-1440: Implements port statistics feature, which polls port stati…
…stics of all devices every 10 seconds. Also, implemented a simple portstats ONOS CLI command to show the statistics. Change-Id: I57e046ae2c2463a58b478d3a5b523422cde71ba2
- Loading branch information
1 parent
ee7a3ce
commit 538108b
Showing
16 changed files
with
837 additions
and
4 deletions.
There are no files selected for viewing
51 changes: 51 additions & 0 deletions
51
cli/src/main/java/org/onosproject/cli/net/DevicePortStatsCommand.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
package org.onosproject.cli.net; | ||
|
||
/* | ||
* Copyright 2015 Open Networking Laboratory | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
import org.apache.karaf.shell.commands.Command; | ||
import org.onosproject.cli.AbstractShellCommand; | ||
import org.onosproject.net.DeviceId; | ||
import org.onosproject.net.device.DeviceService; | ||
import org.onosproject.net.device.PortStatistics; | ||
|
||
/** | ||
* Lists port statistic of all ports in the system. | ||
*/ | ||
@Command(scope = "onos", name = "portstats", | ||
description = "Lists statistics of all ports in the system") | ||
public class DevicePortStatsCommand extends AbstractShellCommand { | ||
|
||
private static final String FORMAT = | ||
" port=%s, pktRx=%s, pktTx=%s, bytesRx=%s, bytesTx=%s, pktRxDrp=%s, pktTxDrp=%s, Dur=%s"; | ||
|
||
@Override | ||
protected void execute() { | ||
DeviceService deviceService = get(DeviceService.class); | ||
|
||
deviceService.getDevices().forEach(d -> | ||
printPortStats(d.id(), deviceService.getPortStatistics(d.id())) | ||
); | ||
} | ||
|
||
private void printPortStats(DeviceId deviceId, Iterable<PortStatistics> portStats) { | ||
print("deviceId=%s", deviceId); | ||
for (PortStatistics stat : portStats) { | ||
print(FORMAT, stat.port(), stat.packetsReceived(), stat.packetsSent(), stat.bytesReceived(), | ||
stat.bytesSent(), stat.packetsRxDropped(), stat.packetsTxDropped(), stat.durationSec()); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
330 changes: 330 additions & 0 deletions
330
core/api/src/main/java/org/onosproject/net/device/DefaultPortStatistics.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,330 @@ | ||
/* | ||
* Copyright 2015 Open Networking Laboratory | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
package org.onosproject.net.device; | ||
|
||
import org.onosproject.net.DeviceId; | ||
|
||
/** | ||
* Default implementation of immutable port statistics. | ||
*/ | ||
public final class DefaultPortStatistics implements PortStatistics { | ||
|
||
private final DeviceId deviceId; | ||
private final int port; | ||
private final long packetsReceived; | ||
private final long packetsSent; | ||
private final long bytesReceived; | ||
private final long bytesSent; | ||
private final long packetsRxDropped; | ||
private final long packetsTxDropped; | ||
private final long packetsRxErrors; | ||
private final long packetsTxErrors; | ||
private final long durationSec; | ||
private final long durationNano; | ||
|
||
private DefaultPortStatistics(DeviceId deviceId, | ||
int port, | ||
long packetsReceived, | ||
long packetsSent, | ||
long bytesReceived, | ||
long bytesSent, | ||
long packetsRxDropped, | ||
long packetsTxDropped, | ||
long packetsRxErrors, | ||
long packetsTxErrors, | ||
long durationSec, | ||
long durationNano) { | ||
this.deviceId = deviceId; | ||
this.port = port; | ||
this.packetsReceived = packetsReceived; | ||
this.packetsSent = packetsSent; | ||
this.bytesReceived = bytesReceived; | ||
this.bytesSent = bytesSent; | ||
this.packetsRxDropped = packetsRxDropped; | ||
this.packetsTxDropped = packetsTxDropped; | ||
this.packetsRxErrors = packetsRxErrors; | ||
this.packetsTxErrors = packetsTxErrors; | ||
this.durationSec = durationSec; | ||
this.durationNano = durationNano; | ||
} | ||
|
||
/** | ||
* Creates a builder for DefaultPortStatistics object. | ||
* | ||
* @return builder object for DefaultPortStatistics object | ||
*/ | ||
public static DefaultPortStatistics.Builder builder() { | ||
return new Builder(); | ||
} | ||
|
||
@Override | ||
public int port() { | ||
return this.port; | ||
} | ||
|
||
@Override | ||
public long packetsReceived() { | ||
return this.packetsReceived; | ||
} | ||
|
||
@Override | ||
public long packetsSent() { | ||
return this.packetsSent; | ||
} | ||
|
||
@Override | ||
public long bytesReceived() { | ||
return this.bytesReceived; | ||
} | ||
|
||
@Override | ||
public long bytesSent() { | ||
return this.bytesSent; | ||
} | ||
|
||
@Override | ||
public long packetsRxDropped() { | ||
return this.packetsRxDropped; | ||
} | ||
|
||
@Override | ||
public long packetsTxDropped() { | ||
return this.packetsTxDropped; | ||
} | ||
|
||
@Override | ||
public long packetsRxErrors() { | ||
return this.packetsRxErrors; | ||
} | ||
|
||
@Override | ||
public long packetsTxErrors() { | ||
return this.packetsTxErrors; | ||
} | ||
|
||
@Override | ||
public long durationSec() { | ||
return this.durationSec; | ||
} | ||
|
||
@Override | ||
public long durationNano() { | ||
return this.durationNano; | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
StringBuilder sb = new StringBuilder("device: " + deviceId + ", "); | ||
|
||
sb.append("port: " + this.port + ", "); | ||
sb.append("pktRx: " + this.packetsReceived + ", "); | ||
sb.append("pktTx: " + this.packetsSent + ", "); | ||
sb.append("byteRx: " + this.bytesReceived + ", "); | ||
sb.append("byteTx: " + this.bytesSent + ", "); | ||
sb.append("pktRxErr: " + this.packetsRxErrors + ", "); | ||
sb.append("pktTxErr: " + this.packetsTxErrors + ", "); | ||
sb.append("pktRxDrp: " + this.packetsRxDropped + ", "); | ||
sb.append("pktTxDrp: " + this.packetsTxDropped); | ||
|
||
return sb.toString(); | ||
} | ||
|
||
public static final class Builder { | ||
|
||
DeviceId deviceId; | ||
int port; | ||
long packetsReceived; | ||
long packetsSent; | ||
long bytesReceived; | ||
long bytesSent; | ||
long packetsRxDropped; | ||
long packetsTxDropped; | ||
long packetsRxErrors; | ||
long packetsTxErrors; | ||
long durationSec; | ||
long durationNano; | ||
|
||
private Builder() { | ||
|
||
} | ||
|
||
/** | ||
* Sets port number. | ||
* | ||
* @param port port number | ||
* @return builder object | ||
*/ | ||
public Builder setPort(int port) { | ||
this.port = port; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the device identifier. | ||
* | ||
* @param deviceId device identifier | ||
* @return builder object | ||
*/ | ||
public Builder setDeviceId(DeviceId deviceId) { | ||
this.deviceId = deviceId; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of packet received. | ||
* | ||
* @param packets number of packets received | ||
* @return builder object | ||
*/ | ||
public Builder setPacketsReceived(long packets) { | ||
packetsReceived = packets; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of packets sent. | ||
* | ||
* @param packets number of packets sent | ||
* @return builder object | ||
*/ | ||
public Builder setPacketsSent(long packets) { | ||
packetsSent = packets; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of received bytes. | ||
* | ||
* @param bytes number of received bytes. | ||
* @return builder object | ||
*/ | ||
public Builder setBytesReceived(long bytes) { | ||
bytesReceived = bytes; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of sent bytes. | ||
* | ||
* @param bytes number of sent bytes | ||
* @return builder object | ||
*/ | ||
public Builder setBytesSent(long bytes) { | ||
bytesSent = bytes; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of packets dropped by RX. | ||
* | ||
* @param packets number of packets dropped by RX | ||
* @return builder object | ||
*/ | ||
public Builder setPacketsRxDropped(long packets) { | ||
packetsRxDropped = packets; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of packets dropped by TX. | ||
* | ||
* @param packets | ||
* @return builder object | ||
*/ | ||
public Builder setPacketsTxDropped(long packets) { | ||
packetsTxDropped = packets; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of receive errors. | ||
* | ||
* @param packets number of receive errors | ||
* @return builder object | ||
*/ | ||
public Builder setPacketsRxErrors(long packets) { | ||
packetsRxErrors = packets; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the number of transmit errors. | ||
* | ||
* @param packets number of transmit errors | ||
* @return builder object | ||
*/ | ||
public Builder setPacketsTxErrors(long packets) { | ||
packetsTxErrors = packets; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the time port has been alive in seconds. | ||
* | ||
* @param sec time port has been alive in seconds | ||
* @return builder object | ||
*/ | ||
public Builder setDurationSec(long sec) { | ||
durationSec = sec; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Sets the time port has been alive in nano seconds. | ||
* | ||
* @param nano time port has been alive in nano seconds | ||
* @return builder object | ||
*/ | ||
public Builder setDurationNano(long nano) { | ||
durationNano = nano; | ||
|
||
return this; | ||
} | ||
|
||
/** | ||
* Creates a PortStatistics object. | ||
* | ||
* @return DefaultPortStatistics object | ||
*/ | ||
public DefaultPortStatistics build() { | ||
return new DefaultPortStatistics( | ||
deviceId, | ||
port, | ||
packetsReceived, | ||
packetsSent, | ||
bytesReceived, | ||
bytesSent, | ||
packetsRxDropped, | ||
packetsTxDropped, | ||
packetsRxErrors, | ||
packetsTxErrors, | ||
durationSec, | ||
durationNano); | ||
} | ||
|
||
} | ||
} |
Oops, something went wrong.