Added support for rx error stats on Linux.

Updates issue 28
This commit is contained in:
Srivats P. 2012-02-08 22:14:20 +05:30
parent 8ef427b0fd
commit 88cb294567
7 changed files with 48 additions and 5 deletions

View File

@ -166,6 +166,11 @@ QVariant PortStatsModel::data(const QModelIndex &index, int role) const
case e_STAT_BYTES_SENT_NIC: case e_STAT_BYTES_SENT_NIC:
return stats.tx_bytes_nic(); return stats.tx_bytes_nic();
#endif #endif
case e_STAT_RX_DROPS : return quint64(stats.rx_drops());
case e_STAT_RX_ERRORS: return quint64(stats.rx_errors());
case e_STAT_RX_FIFO_ERRORS: return quint64(stats.rx_fifo_errors());
case e_STAT_RX_FRAME_ERRORS: return quint64(stats.rx_frame_errors());
default: default:
qWarning("%s: Unhandled stats id %d\n", __FUNCTION__, qWarning("%s: Unhandled stats id %d\n", __FUNCTION__,
index.row()); index.row());

View File

@ -53,7 +53,13 @@ typedef enum {
e_STAT_BYTES_SENT_NIC, e_STAT_BYTES_SENT_NIC,
#endif #endif
e_STATISTICS_END = e_STAT_BYTE_RECV_RATE, // Rx Errors
e_STAT_RX_DROPS,
e_STAT_RX_ERRORS,
e_STAT_RX_FIFO_ERRORS,
e_STAT_RX_FRAME_ERRORS,
e_STATISTICS_END = e_STAT_RX_FRAME_ERRORS,
e_STAT_MAX e_STAT_MAX
} PortStat; } PortStat;
@ -77,6 +83,10 @@ static QStringList PortStatName = (QStringList()
<< "Bytes Received (NIC)" << "Bytes Received (NIC)"
<< "Bytes Sent (NIC)" << "Bytes Sent (NIC)"
#endif #endif
<< "Receive Drops"
<< "Receive Errors"
<< "Receive Fifo Errors"
<< "Receive Frame Errors"
); );
static QStringList LinkStateName = (QStringList() static QStringList LinkStateName = (QStringList()

View File

@ -214,6 +214,11 @@ message PortStats {
optional uint64 tx_bytes_nic = 24; optional uint64 tx_bytes_nic = 24;
optional uint64 tx_pps = 25; optional uint64 tx_pps = 25;
optional uint64 tx_bps = 26; optional uint64 tx_bps = 26;
optional uint64 rx_drops = 100;
optional uint64 rx_errors = 101;
optional uint64 rx_fifo_errors = 102;
optional uint64 rx_frame_errors = 103;
} }
message PortStatsList { message PortStatsList {

View File

@ -551,4 +551,9 @@ void AbstractPort::stats(PortStats *stats)
stats->txBytes = stats_.txBytes - epochStats_.txBytes; stats->txBytes = stats_.txBytes - epochStats_.txBytes;
stats->txPps = stats_.txPps; stats->txPps = stats_.txPps;
stats->txBps = stats_.txBps; stats->txBps = stats_.txBps;
stats->rxDrops = stats_.rxDrops - epochStats_.rxDrops;
stats->rxErrors = stats_.rxErrors - epochStats_.rxErrors;
stats->rxFifoErrors = stats_.rxFifoErrors - epochStats_.rxFifoErrors;
stats->rxFrameErrors = stats_.rxFrameErrors - epochStats_.rxFrameErrors;
} }

View File

@ -38,6 +38,11 @@ public:
quint64 rxPps; quint64 rxPps;
quint64 rxBps; quint64 rxBps;
quint64 rxDrops;
quint64 rxErrors;
quint64 rxFifoErrors;
quint64 rxFrameErrors;
quint64 txPkts; quint64 txPkts;
quint64 txBytes; quint64 txBytes;
quint64 txPps; quint64 txPps;

View File

@ -132,8 +132,8 @@ void LinuxPort::StatsMonitor::run()
char *p, *end; char *p, *end;
int count, index; int count, index;
const char* fmtopt[] = { const char* fmtopt[] = {
"%llu%llu%u%u%u%u%u%u%llu%llu%u%u%u%u%u%u\n", "%llu%llu%llu%llu%llu%llu%u%u%llu%llu%u%u%u%u%u%u\n",
"%llu%llu%u%u%u%u%n%n%llu%llu%u%u%u%u%u%n\n", "%llu%llu%llu%llu%llu%llu%n%n%llu%llu%u%u%u%u%u%n\n",
}; };
const char *fmt; const char *fmt;
struct ifreq ifr; struct ifreq ifr;
@ -299,6 +299,7 @@ void LinuxPort::StatsMonitor::run()
{ {
uint dummy; uint dummy;
quint64 rxBytes, rxPkts; quint64 rxBytes, rxPkts;
quint64 rxErrors, rxDrops, rxFifo, rxFrame;
quint64 txBytes, txPkts; quint64 txBytes, txPkts;
// Skip interface name - we assume the number and order of ports // Skip interface name - we assume the number and order of ports
@ -315,8 +316,10 @@ void LinuxPort::StatsMonitor::run()
p++; p++;
sscanf(p, fmt, sscanf(p, fmt,
&rxBytes, &rxPkts, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &rxBytes, &rxPkts, &rxErrors, &rxDrops, &rxFifo, &rxFrame,
&txBytes, &txPkts, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy); &dummy, &dummy,
&txBytes, &txPkts, &dummy, &dummy, &dummy, &dummy, &dummy,
&dummy);
if (index < count) if (index < count)
{ {
@ -331,6 +334,11 @@ void LinuxPort::StatsMonitor::run()
stats->txBps = (txBytes - stats->txBytes)/kRefreshFreq_; stats->txBps = (txBytes - stats->txBytes)/kRefreshFreq_;
stats->txPkts = txPkts; stats->txPkts = txPkts;
stats->txBytes = txBytes; stats->txBytes = txBytes;
stats->rxDrops = rxDrops;
stats->rxErrors = rxErrors;
stats->rxFifoErrors = rxFifo;
stats->rxFrameErrors = rxFrame;
} }
} }

View File

@ -441,6 +441,11 @@ void MyService::getStats(::google::protobuf::RpcController* /*controller*/,
s->set_tx_bytes(stats.txBytes); s->set_tx_bytes(stats.txBytes);
s->set_tx_pps(stats.txPps); s->set_tx_pps(stats.txPps);
s->set_tx_bps(stats.txBps); s->set_tx_bps(stats.txBps);
s->set_rx_drops(stats.rxDrops);
s->set_rx_errors(stats.rxErrors);
s->set_rx_fifo_errors(stats.rxFifoErrors);
s->set_rx_frame_errors(stats.rxFrameErrors);
} }
done->Run(); done->Run();