Skip to content

Commit

Permalink
Generate derevied stats for BGP and XMPP route updates and flap counts
Browse files Browse the repository at this point in the history
o BGP and XMPP route updates are sent periodically and will last the lifetime
  of the peer
o Flap counts are also sent as separate UVE.
o Xmpp Peer flap counts which are maintained across session flips are sent
  even after xmpp peer is deleted (By walking XmppConnectionEndPoint map)

Change-Id: I90825f4367d3295042e35d13bd64291a5cd388fd
Partial-Bug: #1576437
  • Loading branch information
ananth-at-camphor-networks committed Jul 27, 2016
1 parent 6d93f5f commit 6ebe838
Show file tree
Hide file tree
Showing 28 changed files with 175 additions and 23 deletions.
1 change: 1 addition & 0 deletions src/bgp/SConscript
Expand Up @@ -27,6 +27,7 @@ env.Append(CPPPATH = [env['TOP'] + '/io'])
env.Append(CPPPATH = [env['TOP'] + '/db'])
env.Append(CPPPATH = [env['TOP'] + '/ifmap'])
env.Append(CPPPATH = [env['TOP'] + '/base/sandesh'])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])

SandeshPeerFiles = env.SandeshGenCpp('peer_info.sandesh')
SandeshPeerGenSrcs = env.ExtractCpp(SandeshPeerFiles)
Expand Down
16 changes: 16 additions & 0 deletions src/bgp/bgp_peer.cc
Expand Up @@ -654,6 +654,12 @@ BgpPeer::~BgpPeer() {
peer_info.set_name(ToUVEKey());
peer_info.set_deleted(true);
BGPPeerInfoSend(peer_info);

PeerStatsData peer_stats_data;
peer_stats_data.set_name(ToUVEKey());
peer_stats_data.set_deleted(true);
PeerStatsUve::Send(peer_stats_data, "ObjectBgpPeer");

BGP_LOG_PEER(Event, this, SandeshLevel::SYS_INFO, BGP_LOG_FLAG_ALL,
BGP_PEER_DIR_NA, "Deleted");
}
Expand Down Expand Up @@ -2571,6 +2577,11 @@ void BgpPeer::increment_flap_count() {
flap_info.set_flap_time(last_flap_);
peer_info.set_flap_info(flap_info);
BGPPeerInfoSend(peer_info);

PeerFlapData peer_flap_data;
peer_flap_data.set_name(ToUVEKey());
peer_flap_data.set_flap_info(flap_info);
PeerFlap::Send(peer_flap_data, "ObjectBgpPeer");
}

void BgpPeer::reset_flap_count() {
Expand All @@ -2582,4 +2593,9 @@ void BgpPeer::reset_flap_count() {
PeerFlapInfo flap_info;
peer_info.set_flap_info(flap_info);
BGPPeerInfoSend(peer_info);

PeerFlapData peer_flap_data;
peer_flap_data.set_name(ToUVEKey());
peer_flap_data.set_flap_info(flap_info);
PeerFlap::Send(peer_flap_data, "ObjectBgpPeer");
}
5 changes: 5 additions & 0 deletions src/bgp/bgp_server.cc
Expand Up @@ -813,6 +813,11 @@ void BgpServer::FillPeerStats(const BgpPeer *peer) const {
peer_info.set_name(peer->ToUVEKey());
peer_info.set_peer_stats_info(stats);
BGPPeerInfo::Send(peer_info);

PeerStatsData peer_stats_data;
peer_stats_data.set_name(peer->ToUVEKey());
PeerStats::FillPeerUpdateStats(peer->peer_stats(), &peer_stats_data);
PeerStatsUve::Send(peer_stats_data, "ObjectBgpPeer");
}

bool BgpServer::CollectStats(BgpRouterState *state, bool first) const {
Expand Down
33 changes: 31 additions & 2 deletions src/bgp/bgp_xmpp_channel.cc
Expand Up @@ -419,10 +419,16 @@ class BgpXmppChannel::XmppPeer : public IPeer {

virtual ~XmppPeer() {
assert(GetTotalPathCount() == 0);

XmppPeerInfoData peer_info;
peer_info.set_name(ToUVEKey());
peer_info.set_deleted(true);
parent_->XMPPPeerInfoSend(peer_info);

PeerStatsData peer_stats_data;
peer_stats_data.set_name(ToUVEKey());
peer_stats_data.set_deleted(true);
PeerStatsUve::Send(peer_stats_data, "ObjectXmppPeerInfo");
}

virtual bool MembershipPathCallback(DBTablePartBase *tpart, BgpRoute *rt,
Expand Down Expand Up @@ -2818,21 +2824,44 @@ void BgpXmppChannelManager::XmppHandleChannelEvent(XmppChannel *channel,
}
}

void BgpXmppChannelManager::FillPeerStats(const BgpXmppChannel *channel) const {
void BgpXmppChannelManager::FillPeerInfo(const BgpXmppChannel *channel) const {
PeerStatsInfo stats;
PeerStats::FillPeerDebugStats(channel->Peer()->peer_stats(), &stats);

XmppPeerInfoData peer_info;
peer_info.set_name(channel->Peer()->ToUVEKey());
peer_info.set_peer_stats_info(stats);
XMPPPeerInfo::Send(peer_info);

PeerStatsData peer_stats_data;
peer_stats_data.set_name(channel->Peer()->ToUVEKey());
PeerStats::FillPeerUpdateStats(channel->Peer()->peer_stats(),
&peer_stats_data);
PeerStatsUve::Send(peer_stats_data, "ObjectXmppPeerInfo");
}

void BgpXmppChannelManager::FillPeerStats(const XmppConnectionEndpoint *endp)
const {
if (!endp)
return;

PeerFlapInfo flap_info;
flap_info.set_flap_count(endp->flap_count());
flap_info.set_flap_time(endp->last_flap());

PeerFlapData peer_flap_data;
peer_flap_data.set_name(endp->client());
peer_flap_data.set_flap_info(flap_info);
PeerFlap::Send(peer_flap_data, "ObjectXmppPeerInfo");
}

bool BgpXmppChannelManager::CollectStats(BgpRouterState *state, bool first)
const {
CHECK_CONCURRENCY("bgp::Uve");

VisitChannels(boost::bind(&BgpXmppChannelManager::FillPeerStats, this, _1));
VisitChannels(boost::bind(&BgpXmppChannelManager::FillPeerInfo, this, _1));
xmpp_server_->VisitEndpoints(
boost::bind(&BgpXmppChannelManager::FillPeerStats, this, _1));
bool change = false;
uint32_t num_xmpp = count();
if (first || num_xmpp != state->get_num_xmpp_peer()) {
Expand Down
4 changes: 3 additions & 1 deletion src/bgp/bgp_xmpp_channel.h
Expand Up @@ -38,6 +38,7 @@ class BgpXmppChannelManager;
class BgpXmppChannelManagerMock;
class Timer;
class XmppConfigUpdater;
class XmppConnectionEndpoint;
class XmppPeerInfoData;
class XmppSession;

Expand Down Expand Up @@ -361,7 +362,8 @@ class BgpXmppChannelManager {
friend class BgpXmppChannelManagerMock;
friend class BgpXmppUnitTest;

void FillPeerStats(const BgpXmppChannel *channel) const;
void FillPeerInfo(const BgpXmppChannel *channel) const;
void FillPeerStats(const XmppConnectionEndpoint *endp) const;

XmppServer *xmpp_server_;
BgpServer *bgp_server_;
Expand Down
1 change: 1 addition & 0 deletions src/bgp/ermvpn/SConscript
Expand Up @@ -10,6 +10,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = env['TOP'])
env.Append(CPPPATH = [env['TOP'] + '/ifmap'])
env.Append(CPPPATH = [env['TOP'] + '/base/sandesh'])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])

libbgp_ermvpn = env.Library('bgp_ermvpn',
['ermvpn_route.cc', 'ermvpn_table.cc'])
Expand Down
1 change: 1 addition & 0 deletions src/bgp/ermvpn/test/SConscript
Expand Up @@ -10,6 +10,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = [env['TOP'],
env['TOP'] + '/db',
env['TOP'] + '/io',
env['TOP'] + '/tools/sandesh/library/common',
])

env.Append(LIBPATH = env['TOP'] + '/base')
Expand Down
1 change: 1 addition & 0 deletions src/bgp/evpn/test/SConscript
Expand Up @@ -38,6 +38,7 @@ env.Append(LIBPATH = env['TOP'] + '/route')
env.Append(LIBPATH = env['TOP'] + '/xmpp')
env.Append(LIBPATH = env['TOP'] + '/xml')
env.Append(LIBPATH = env['TOP'] + '/schema')
env.Append(CPPPATH = env['TOP'] + '/tools/sandesh/library/common')

env.Prepend(LIBS = [
'task_test',
Expand Down
1 change: 1 addition & 0 deletions src/bgp/extended-community/SConscript
Expand Up @@ -10,6 +10,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = [ env['TOP'] ])
env.Append(CPPPATH = [ env['TOP'] + '/db'])
env.Append(CPPPATH = [ env['TOP'] + '/io'])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])

libextended_community = env.Library('extended_community',
['default_gateway.cc',
Expand Down
1 change: 1 addition & 0 deletions src/bgp/extended-community/test/SConscript
Expand Up @@ -10,6 +10,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = [ env['TOP'] ])
env.Append(CPPPATH = [ env['TOP'] + '/db' ])
env.Append(CPPPATH = [ env['TOP'] + '/io' ])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])

env.Append(LIBPATH = env['TOP'] + '/bgp/extended-community')
env.Append(LIBPATH = env['TOP'] + '/net')
Expand Down
1 change: 1 addition & 0 deletions src/bgp/inet/test/SConscript
Expand Up @@ -12,6 +12,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = [env['TOP'],
env['TOP'] + '/db',
env['TOP'] + '/io',
env['TOP'] + '/tools/sandesh/library/common',
])

env.Append(LIBPATH = env['TOP'] + '/base')
Expand Down
1 change: 1 addition & 0 deletions src/bgp/inet6/test/SConscript
Expand Up @@ -12,6 +12,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = [env['TOP'],
env['TOP'] + '/db',
env['TOP'] + '/io',
env['TOP'] + '/tools/sandesh/library/common',
])

env.Append(LIBPATH = env['TOP'] + '/base')
Expand Down
1 change: 1 addition & 0 deletions src/bgp/inet6vpn/test/SConscript
Expand Up @@ -10,6 +10,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = [env['TOP'],
env['TOP'] + '/db',
env['TOP'] + '/io',
env['TOP'] + '/tools/sandesh/library/common',
])

env.Append(LIBPATH = env['TOP'] + '/base')
Expand Down
1 change: 1 addition & 0 deletions src/bgp/l3vpn/test/SConscript
Expand Up @@ -12,6 +12,7 @@ env = BuildEnv.Clone()
env.Append(CPPPATH = [env['TOP'],
env['TOP'] + '/db',
env['TOP'] + '/io',
env['TOP'] + '/tools/sandesh/library/common',
])

env.Append(LIBPATH = env['TOP'] + '/base')
Expand Down
40 changes: 40 additions & 0 deletions src/bgp/peer_info.sandesh
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
*/
include "sandesh/library/common/derived_stats_results.sandesh"

struct PeerProtoStats {
1: u64 total;
Expand Down Expand Up @@ -69,3 +70,42 @@ struct PeerStatsInfo {
7: optional PeerRxErrorStats rx_error_stats;
8: optional PeerRxRouteStats rx_route_stats;
}

struct PeerStatsData {
1: string name (key="");
2: optional bool deleted;
3: optional PeerUpdateStats rx_update_stats(metric="agg",tags="");
4: optional PeerUpdateStats tx_update_stats(metric="agg",tags="");
5: optional derived_stats_results.AnomalyResult rx_update_stats_ewm (stats="rx_update_stats.total:DSAnomaly:EWM:0.2");
6: optional derived_stats_results.AnomalyResult tx_update_stats_ewm (stats="tx_update_stats.total:DSAnomaly:EWM:0.2");
}

uve sandesh PeerStatsUve {
1: PeerStatsData data;
}

typedef u64 flap_u64

struct flap_u64_P_ {
1: optional flap_u64 value;
2: optional flap_u64 staging;
}

struct PeerFlapData {
1: string name (key=""); // Control-node-ip:Agent-ip
2: optional bool deleted;
3: optional PeerFlapInfo flap_info (metric="agg");
4: optional flap_u64_P_ flap_10m
(stats="1-flap_info.flap_count:DSSum:");
5: optional flap_u64_P_ flap_1h
(stats="6-flap_info.flap_count:DSSum:",hidden="yes");
} (period="600")

/**
* @description: Peer specific information
* @severity: DEBUG
* @cause: Normal operation
*/
uve sandesh PeerFlap {
1: PeerFlapData data;
}
41 changes: 29 additions & 12 deletions src/bgp/peer_stats.cc
Expand Up @@ -40,7 +40,30 @@ void PeerStats::FillRxRouteStats(const IPeerDebugStats::RxRouteStats &src,
dest->primary_path_count = src.primary_path_count;
}

void PeerStats::FillPeerDebugStats(const IPeerDebugStats *peer_state,
void PeerStats::FillPeerUpdateStats(const IPeerDebugStats *peer_stats,
PeerUpdateStats *rt_stats_rx,
PeerUpdateStats *rt_stats_tx) {

IPeerDebugStats::UpdateStats update_stats_rx;
peer_stats->GetRxRouteUpdateStats(&update_stats_rx);
FillRouteUpdateStats(update_stats_rx, rt_stats_rx);

IPeerDebugStats::UpdateStats update_stats_tx;
peer_stats->GetTxRouteUpdateStats(&update_stats_tx);
FillRouteUpdateStats(update_stats_tx, rt_stats_tx);
}

void PeerStats::FillPeerUpdateStats(const IPeerDebugStats *peer_stats,
PeerStatsData *peer_stats_data) {
PeerUpdateStats stats_rx;
PeerUpdateStats stats_tx;

FillPeerUpdateStats(peer_stats, &stats_rx, &stats_tx);
peer_stats_data->set_rx_update_stats(stats_rx);
peer_stats_data->set_tx_update_stats(stats_tx);
}

void PeerStats::FillPeerDebugStats(const IPeerDebugStats *peer_stats,
PeerStatsInfo *stats) {
PeerProtoStats proto_stats_tx;
PeerProtoStats proto_stats_rx;
Expand All @@ -50,27 +73,21 @@ void PeerStats::FillPeerDebugStats(const IPeerDebugStats *peer_state,
PeerRxRouteStats dest_route_stats_rx;

IPeerDebugStats::ProtoStats stats_rx;
peer_state->GetRxProtoStats(&stats_rx);
peer_stats->GetRxProtoStats(&stats_rx);
FillProtoStats(stats_rx, &proto_stats_rx);

IPeerDebugStats::ProtoStats stats_tx;
peer_state->GetTxProtoStats(&stats_tx);
peer_stats->GetTxProtoStats(&stats_tx);
FillProtoStats(stats_tx, &proto_stats_tx);

IPeerDebugStats::UpdateStats update_stats_rx;
peer_state->GetRxRouteUpdateStats(&update_stats_rx);
FillRouteUpdateStats(update_stats_rx, &rt_stats_rx);

IPeerDebugStats::UpdateStats update_stats_tx;
peer_state->GetTxRouteUpdateStats(&update_stats_tx);
FillRouteUpdateStats(update_stats_tx, &rt_stats_tx);
FillPeerUpdateStats(peer_stats, &rt_stats_rx, &rt_stats_tx);

IPeerDebugStats::RxErrorStats src_error_stats_rx;
peer_state->GetRxErrorStats(&src_error_stats_rx);
peer_stats->GetRxErrorStats(&src_error_stats_rx);
FillRxErrorStats(src_error_stats_rx, &dest_error_stats_rx);

IPeerDebugStats::RxRouteStats src_route_stats_rx;
peer_state->GetRxRouteStats(&src_route_stats_rx);
peer_stats->GetRxRouteStats(&src_route_stats_rx);
FillRxRouteStats(src_route_stats_rx, &dest_route_stats_rx);

stats->set_rx_proto_stats(proto_stats_rx);
Expand Down
7 changes: 6 additions & 1 deletion src/bgp/peer_stats.h
Expand Up @@ -11,8 +11,10 @@

class PeerStats {
public:
static void FillPeerDebugStats(const IPeerDebugStats *peer_state,
static void FillPeerDebugStats(const IPeerDebugStats *peer_stats,
PeerStatsInfo *stats);
static void FillPeerUpdateStats(const IPeerDebugStats *peer_stats,
PeerStatsData *peer_stats_data);

private:
static void FillProtoStats(const IPeerDebugStats::ProtoStats &stats,
Expand All @@ -23,6 +25,9 @@ class PeerStats {
PeerRxErrorStats *dest);
static void FillRxRouteStats(const IPeerDebugStats::RxRouteStats &src,
PeerRxRouteStats *dest);
static void FillPeerUpdateStats(const IPeerDebugStats *peer_stats,
PeerUpdateStats *rt_stats_rx,
PeerUpdateStats *rt_stats_tx);
};

#endif // SRC_BGP_PEER_STATS_H_
1 change: 1 addition & 0 deletions src/bgp/routing-instance/SConscript
Expand Up @@ -13,6 +13,7 @@ env.Append(CPPPATH = [env['TOP'] + '/db'])
env.Append(CPPPATH = [env['TOP'] + '/io'])
env.Append(CPPPATH = [env['TOP'] + '/ifmap'])
env.Append(CPPPATH = [env['TOP'] + '/base/sandesh'])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])

# Generate the source files
SandeshGenFiles = env.SandeshGenCpp('routing_instance_analytics.sandesh')
Expand Down
1 change: 1 addition & 0 deletions src/bgp/routing-policy/SConscript
Expand Up @@ -13,6 +13,7 @@ env.Append(CPPPATH = [env['TOP'] + '/db'])
env.Append(CPPPATH = [env['TOP'] + '/io'])
env.Append(CPPPATH = [env['TOP'] + '/ifmap'])
env.Append(CPPPATH = [env['TOP'] + '/base/sandesh'])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])

# Generate the source files
SandeshGenFiles = env.SandeshGenCpp('routing_policy.sandesh')
Expand Down
1 change: 1 addition & 0 deletions src/bgp/test/SConscript
Expand Up @@ -14,6 +14,7 @@ env.Append(CPPPATH = [env['TOP'],
env['TOP'] + '/bgp',
env['TOP'] + '/db',
env['TOP'] + '/io',
env['TOP'] + '/tools/sandesh/library/common',
env['TOP'] + '/xmpp'
])
env.Append(LIBPATH = ['#/' + Dir('..').path,
Expand Down
1 change: 1 addition & 0 deletions src/control-node/SConscript
Expand Up @@ -17,6 +17,7 @@ env.Append(CPPPATH = [env['TOP'] + '/base/sandesh'])
env.Append(CPPPATH = [env['TOP'] + '/db'])
env.Append(CPPPATH = [env['TOP'] + '/ifmap'])
env.Append(CPPPATH = [env['TOP'] + '/bgp'])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])
ControlNodeSandeshGenFiles = env.SandeshGenCpp('sandesh/control_node.sandesh')
ControlNodeSandeshGenSrcs = env.ExtractCpp(ControlNodeSandeshGenFiles)

Expand Down
3 changes: 2 additions & 1 deletion src/control-node/test/SConscript
Expand Up @@ -9,7 +9,8 @@ import sys
env = BuildEnv.Clone()
env.Prepend(CPPPATH = [env['TOP'],
env['TOP'] + '/db',
env['TOP'] + '/io'
env['TOP'] + '/io',
env['TOP'] + '/tools/sandesh/library/common'
])

libcontrol_test = env.Library('control_test',
Expand Down
1 change: 1 addition & 0 deletions src/xmpp/SConscript
Expand Up @@ -63,6 +63,7 @@ xmpp_include = '#/' + Dir('.').path
env.Append(CPPPATH=xmpp_include)
env.Append(CPPPATH = [env['TOP'] + '/bgp'])
env.Append(CPPPATH = [env['TOP'] + '/io'])
env.Append(CPPPATH = [env['TOP'] + '/tools/sandesh/library/common'])

xmppd = env.Program(target = 'xmppd',
source = ['main.cc'])
Expand Down

0 comments on commit 6ebe838

Please sign in to comment.