in fboss/agent/hw/HwPortFb303Stats.cpp [194:357]
void HwPortFb303Stats::updateStats(
const HwPortStats& curPortStats,
const std::chrono::seconds& retrievedAt) {
timeRetrieved_ = retrievedAt;
updateStat(timeRetrieved_, kInBytes(), *curPortStats.inBytes_());
updateStat(timeRetrieved_, kInUnicastPkts(), *curPortStats.inUnicastPkts_());
updateStat(
timeRetrieved_, kInMulticastPkts(), *curPortStats.inMulticastPkts_());
updateStat(
timeRetrieved_, kInBroadcastPkts(), *curPortStats.inBroadcastPkts_());
updateStat(timeRetrieved_, kInDiscardsRaw(), *curPortStats.inDiscardsRaw_());
updateStat(timeRetrieved_, kInDiscards(), *curPortStats.inDiscards_());
updateStat(timeRetrieved_, kInErrors(), *curPortStats.inErrors_());
updateStat(timeRetrieved_, kInPause(), *curPortStats.inPause_());
updateStat(
timeRetrieved_, kInIpv4HdrErrors(), *curPortStats.inIpv4HdrErrors_());
updateStat(
timeRetrieved_, kInIpv6HdrErrors(), *curPortStats.inIpv6HdrErrors_());
updateStat(
timeRetrieved_, kInDstNullDiscards(), *curPortStats.inDstNullDiscards_());
// Egress Stats
updateStat(timeRetrieved_, kOutBytes(), *curPortStats.outBytes_());
updateStat(
timeRetrieved_, kOutUnicastPkts(), *curPortStats.outUnicastPkts_());
updateStat(
timeRetrieved_, kOutMulticastPkts(), *curPortStats.outMulticastPkts_());
updateStat(
timeRetrieved_, kOutBroadcastPkts(), *curPortStats.outBroadcastPkts_());
updateStat(timeRetrieved_, kOutDiscards(), *curPortStats.outDiscards_());
updateStat(timeRetrieved_, kOutErrors(), *curPortStats.outErrors_());
updateStat(timeRetrieved_, kOutPause(), *curPortStats.outPause_());
updateStat(
timeRetrieved_,
kOutCongestionDiscards(),
*curPortStats.outCongestionDiscardPkts_());
updateStat(
timeRetrieved_,
kWredDroppedPackets(),
*curPortStats.wredDroppedPackets_());
updateStat(timeRetrieved_, kOutEcnCounter(), *curPortStats.outEcnCounter_());
updateStat(
timeRetrieved_, kFecCorrectable(), *curPortStats.fecCorrectableErrors());
updateStat(
timeRetrieved_,
kFecUncorrectable(),
*curPortStats.fecUncorrectableErrors());
updateStat(
timeRetrieved_,
kInLabelMissDiscards(),
*curPortStats.inLabelMissDiscards_());
// Update queue stats
auto updateQueueStat = [this](
folly::StringPiece statKey,
int queueId,
const std::map<int16_t, int64_t>& queueStats) {
auto qitr = queueStats.find(queueId);
CHECK(qitr != queueStats.end())
<< "Missing stat: " << statKey
<< " for queue: :" << queueId2Name_[queueId];
updateStat(timeRetrieved_, statKey, queueId, qitr->second);
};
for (const auto& queueIdAndName : queueId2Name_) {
updateQueueStat(
kOutCongestionDiscardsBytes(),
queueIdAndName.first,
*curPortStats.queueOutDiscardBytes_());
updateQueueStat(
kOutCongestionDiscards(),
queueIdAndName.first,
*curPortStats.queueOutDiscardPackets_());
updateQueueStat(
kOutBytes(), queueIdAndName.first, *curPortStats.queueOutBytes_());
updateQueueStat(
kOutPkts(), queueIdAndName.first, *curPortStats.queueOutPackets_());
}
if (curPortStats.queueWatermarkBytes_()->size()) {
updateQueueWatermarkStats(*curPortStats.queueWatermarkBytes_());
}
// Macsec stats
if (curPortStats.macsecStats()) {
if (!macsecStatsInited_) {
reinitMacsecStats(std::nullopt);
}
auto updateMacsecPortStats = [this](auto& macsecPortStats, bool ingress) {
updateStat(
timeRetrieved_,
ingress ? kInPreMacsecDropPkts() : kOutPreMacsecDropPkts(),
*macsecPortStats.preMacsecDropPkts());
updateStat(
timeRetrieved_,
ingress ? kInMacsecDataPkts() : kOutMacsecDataPkts(),
*macsecPortStats.dataPkts());
updateStat(
timeRetrieved_,
ingress ? kInMacsecControlPkts() : kOutMacsecControlPkts(),
*macsecPortStats.controlPkts());
updateStat(
timeRetrieved_,
ingress ? kInMacsecDecryptedBytes() : kOutMacsecEncryptedBytes(),
*macsecPortStats.octetsEncrypted());
if (ingress) {
updateStat(
timeRetrieved_,
kInMacsecBadOrNoTagDroppedPkts(),
*macsecPortStats.inBadOrNoMacsecTagDroppedPkts());
updateStat(
timeRetrieved_,
kInMacsecNoSciDroppedPkts(),
*macsecPortStats.inNoSciDroppedPkts());
updateStat(
timeRetrieved_,
kInMacsecUnknownSciPkts(),
*macsecPortStats.inUnknownSciPkts());
updateStat(
timeRetrieved_,
kInMacsecOverrunDroppedPkts(),
*macsecPortStats.inOverrunDroppedPkts());
updateStat(
timeRetrieved_,
kInMacsecDelayedPkts(),
*macsecPortStats.inDelayedPkts());
updateStat(
timeRetrieved_,
kInMacsecLateDroppedPkts(),
*macsecPortStats.inLateDroppedPkts());
updateStat(
timeRetrieved_,
kInMacsecNotValidDroppedPkts(),
*macsecPortStats.inNotValidDroppedPkts());
updateStat(
timeRetrieved_,
kInMacsecInvalidPkts(),
*macsecPortStats.inInvalidPkts());
updateStat(
timeRetrieved_,
kInMacsecNoSADroppedPkts(),
*macsecPortStats.inNoSaDroppedPkts());
updateStat(
timeRetrieved_,
kInMacsecUnusedSAPkts(),
*macsecPortStats.inUnusedSaPkts());
updateStat(
timeRetrieved_,
kInMacsecUntaggedPkts(),
*macsecPortStats.noMacsecTagPkts());
} else {
updateStat(
timeRetrieved_,
kOutMacsecUntaggedPkts(),
*macsecPortStats.noMacsecTagPkts());
updateStat(
timeRetrieved_,
kOutMacsecTooLongDroppedPkts(),
*macsecPortStats.outTooLongDroppedPkts());
}
};
updateMacsecPortStats(
*curPortStats.macsecStats()->ingressPortStats(), true);
updateMacsecPortStats(
*curPortStats.macsecStats()->egressPortStats(), false);
}
portStats_ = curPortStats;
}