Skip to content

Commit d975bcd

Browse files
committed
Adding prometheus make checks for contract and secgrp stats
Signed-off-by: Gautam Venkataramanan <gautam.chennai@gmail.com> Change-Id: I5dd9516eedaa5fb5adbb0aa3f7151d23a82c4f19
1 parent 17c8c2b commit d975bcd

File tree

5 files changed

+169
-15
lines changed

5 files changed

+169
-15
lines changed

agent-ovs/ovs/test/ContractStatsManager_test.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,43 @@ class ContractStatsManagerFixture : public PolicyStatsManagerFixture {
6767
void verifyRoutingDomainDropStats(shared_ptr<RoutingDomain> rd,
6868
uint32_t packet_count,
6969
uint32_t byte_count);
70+
#ifdef HAVE_PROMETHEUS_SUPPORT
71+
virtual void verifyPromMetrics(shared_ptr<L24Classifier> classifier,
72+
uint32_t pkts,
73+
uint32_t bytes,
74+
bool isTx=false) override;
75+
#endif
7076
ContractStatsManager contractStatsManager;
7177
PolicyManager& policyManager;
7278
private:
7379
};
7480

81+
#ifdef HAVE_PROMETHEUS_SUPPORT
82+
void ContractStatsManagerFixture::
83+
verifyPromMetrics (shared_ptr<L24Classifier> classifier,
84+
uint32_t pkts,
85+
uint32_t bytes,
86+
bool isTx)
87+
{
88+
const std::string& s_pkts = "opflex_contract_packets{classifier=\"tenant:tenant0,"\
89+
"policy:classifier3,[etype:2048,proto:6,dport:80-85,]\""\
90+
",dst_epg=\"tenant:tenant0,policy:epg2\",src_epg=\""\
91+
"tenant:tenant0,policy:epg1\"} "\
92+
+ boost::lexical_cast<std::string>(pkts) + ".000000";
93+
const std::string& s_bytes = "opflex_contract_bytes{classifier=\"tenant:tenant0,"\
94+
"policy:classifier3,[etype:2048,proto:6,dport:80-85,]\""\
95+
",dst_epg=\"tenant:tenant0,policy:epg2\",src_epg=\""\
96+
"tenant:tenant0,policy:epg1\"} "\
97+
+ boost::lexical_cast<std::string>(bytes) + ".000000";
98+
99+
const std::string& output = BaseFixture::getOutputFromCommand(cmd);
100+
size_t pos = std::string::npos;
101+
pos = output.find(s_pkts);
102+
BOOST_CHECK_NE(pos, std::string::npos);
103+
pos = output.find(s_bytes);
104+
BOOST_CHECK_NE(pos, std::string::npos);
105+
}
106+
#endif
75107

76108
void ContractStatsManagerFixture::
77109
verifyRoutingDomainDropStats(shared_ptr<RoutingDomain> rd,
@@ -162,6 +194,7 @@ BOOST_FIXTURE_TEST_CASE(testFlowMatchStats, ContractStatsManagerFixture) {
162194
testOneFlow(integrationPortConn,classifier3,
163195
IntFlowManager::POL_TABLE_ID,
164196
1,
197+
false,
165198
&contractStatsManager,
166199
&policyManager,
167200
epg1,
@@ -253,6 +286,7 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, ContractStatsManagerFixture) {
253286
verifyFlowStats(classifier3,
254287
LAST_PACKET_COUNT,
255288
LAST_PACKET_COUNT * PACKET_SIZE,
289+
false,
256290
IntFlowManager::POL_TABLE_ID,
257291
&contractStatsManager,
258292
epg1,epg2);
@@ -288,6 +322,7 @@ BOOST_FIXTURE_TEST_CASE(testContractDelete, ContractStatsManagerFixture) {
288322
classifier3,
289323
IntFlowManager::POL_TABLE_ID,
290324
1,
325+
false,
291326
&contractStatsManager,
292327
&policyManager,
293328
epg1,
@@ -324,6 +359,7 @@ BOOST_FIXTURE_TEST_CASE(testSEpgDelete, ContractStatsManagerFixture) {
324359
classifier3,
325360
IntFlowManager::POL_TABLE_ID,
326361
1,
362+
false,
327363
&contractStatsManager,
328364
&policyManager,
329365
epg1,
@@ -358,6 +394,7 @@ BOOST_FIXTURE_TEST_CASE(testrDSEpgDelete, ContractStatsManagerFixture) {
358394
classifier3,
359395
IntFlowManager::POL_TABLE_ID,
360396
1,
397+
false,
361398
&contractStatsManager,
362399
&policyManager,
363400
epg1,

agent-ovs/ovs/test/SecGrpStatsManager_test.cpp

Lines changed: 91 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,80 @@ class SecGrpStatsManagerFixture : public PolicyStatsManagerFixture {
7070
virtual ~SecGrpStatsManagerFixture() {
7171
stop();
7272
}
73+
#ifdef HAVE_PROMETHEUS_SUPPORT
74+
virtual void verifyPromMetrics(shared_ptr<L24Classifier> classifier,
75+
uint32_t pkts,
76+
uint32_t bytes,
77+
bool isTx=false) override;
78+
#endif
7379
SecGrpStatsManager secGrpStatsManager;
7480
};
7581

82+
#ifdef HAVE_PROMETHEUS_SUPPORT
83+
void SecGrpStatsManagerFixture::
84+
verifyPromMetrics (shared_ptr<L24Classifier> classifier,
85+
uint32_t pkts,
86+
uint32_t bytes,
87+
bool isTx)
88+
{
89+
std::string s_rx_bytes, s_rx_pkts, s_tx_bytes, s_tx_pkts;
90+
if (classifier == classifier1) {
91+
s_tx_bytes = "opflex_sg_tx_bytes{classifier=\"tenant:tenant0,policy:"\
92+
"classifier1,[etype:2048,proto:6,dport:80]\"} "\
93+
+ boost::lexical_cast<std::string>(bytes) + ".000000";
94+
s_rx_bytes = "opflex_sg_rx_bytes{classifier=\"tenant:tenant0,policy:"\
95+
"classifier1,[etype:2048,proto:6,dport:80]\"} "\
96+
+ boost::lexical_cast<std::string>(bytes) + ".000000";
97+
s_tx_pkts = "opflex_sg_tx_packets{classifier=\"tenant:tenant0,policy:"\
98+
"classifier1,[etype:2048,proto:6,dport:80]\"} "\
99+
+ boost::lexical_cast<std::string>(pkts) + ".000000";
100+
s_rx_pkts = "opflex_sg_rx_packets{classifier=\"tenant:tenant0,policy:"\
101+
"classifier1,[etype:2048,proto:6,dport:80]\"} "\
102+
+ boost::lexical_cast<std::string>(pkts) + ".000000";
103+
} else if (classifier == classifier2) {
104+
s_tx_bytes = "opflex_sg_tx_bytes{classifier=\"tenant:tenant0,policy:"\
105+
"classifier2,[etype:2054,]\"} "\
106+
+ boost::lexical_cast<std::string>(bytes) + ".000000";
107+
s_rx_bytes = "opflex_sg_rx_bytes{classifier=\"tenant:tenant0,policy:"\
108+
"classifier2,[etype:2054,]\"} "\
109+
+ boost::lexical_cast<std::string>(bytes) + ".000000";
110+
s_tx_pkts = "opflex_sg_tx_packets{classifier=\"tenant:tenant0,policy:"\
111+
"classifier2,[etype:2054,]\"} "\
112+
+ boost::lexical_cast<std::string>(pkts) + ".000000";
113+
s_rx_pkts = "opflex_sg_rx_packets{classifier=\"tenant:tenant0,policy:"\
114+
"classifier2,[etype:2054,]\"} "\
115+
+ boost::lexical_cast<std::string>(pkts) + ".000000";
116+
} else {
117+
s_tx_bytes = "opflex_sg_tx_bytes{classifier=\"tenant:tenant0,policy:"\
118+
"classifier3,[etype:2048,proto:6,dport:80-85,]\"} "\
119+
+ boost::lexical_cast<std::string>(bytes) + ".000000";
120+
s_rx_bytes = "opflex_sg_rx_bytes{classifier=\"tenant:tenant0,policy:"\
121+
"classifier3,[etype:2048,proto:6,dport:80-85,]\"} "\
122+
+ boost::lexical_cast<std::string>(bytes) + ".000000";
123+
s_tx_pkts = "opflex_sg_tx_packets{classifier=\"tenant:tenant0,policy:"\
124+
"classifier3,[etype:2048,proto:6,dport:80-85,]\"} "\
125+
+ boost::lexical_cast<std::string>(pkts) + ".000000";
126+
s_rx_pkts = "opflex_sg_rx_packets{classifier=\"tenant:tenant0,policy:"\
127+
"classifier3,[etype:2048,proto:6,dport:80-85,]\"} "\
128+
+ boost::lexical_cast<std::string>(pkts) + ".000000";
129+
}
130+
131+
const std::string& output = BaseFixture::getOutputFromCommand(cmd);
132+
size_t pos = std::string::npos;
133+
if (isTx) {
134+
pos = output.find(s_tx_pkts);
135+
BOOST_CHECK_NE(pos, std::string::npos);
136+
pos = output.find(s_tx_bytes);
137+
BOOST_CHECK_NE(pos, std::string::npos);
138+
} else {
139+
pos = output.find(s_rx_pkts);
140+
BOOST_CHECK_NE(pos, std::string::npos);
141+
pos = output.find(s_rx_bytes);
142+
BOOST_CHECK_NE(pos, std::string::npos);
143+
}
144+
}
145+
#endif
146+
76147
BOOST_AUTO_TEST_SUITE(SecGrpStatsManager_test)
77148

78149
BOOST_FIXTURE_TEST_CASE(testFlowMatchStats, SecGrpStatsManagerFixture) {
@@ -86,33 +157,34 @@ BOOST_FIXTURE_TEST_CASE(testFlowMatchStats, SecGrpStatsManagerFixture) {
86157
LOG(DEBUG) << "### SecGrpClassifierCounter flow stats in start";
87158
// testing one flow only
88159
testOneFlow(accPortConn,classifier1,
89-
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,1,&secGrpStatsManager);
160+
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
161+
1, false, &secGrpStatsManager);
90162
// 2 entries in flow table now - testing second flow
91163
testOneFlow(accPortConn,classifier2,
92164
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
93-
2,
165+
2, false,
94166
&secGrpStatsManager);
95167
// changing flow table entry
96168
// Note: If the portNum is set as 2, then it clashes with classifier2
97169
// entry. So first classifier1 entry will get deleted. No new counter
98170
// objeects will get generated and verifyflowstats will fail.
99171
testOneFlow(accPortConn,classifier1,
100172
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
101-
3,
173+
3, true,
102174
&secGrpStatsManager);
103175
LOG(DEBUG) << "### SecGrpClassifierCounter flow stats out start";
104176
// same 3 steps above for OUT table
105177
testOneFlow(accPortConn,classifier1,
106178
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
107-
1,
179+
1, false,
108180
&secGrpStatsManager);
109181
testOneFlow(accPortConn,classifier2,
110182
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
111-
2,
183+
2, false,
112184
&secGrpStatsManager);
113185
testOneFlow(accPortConn,classifier1,
114186
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
115-
3,
187+
3, true,
116188
&secGrpStatsManager);
117189
LOG(DEBUG) << "### SecGrpClassifierCounter flow stats stop";
118190
secGrpStatsManager.stop();
@@ -156,9 +228,15 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
156228

157229
secGrpStatsManager.Handle(&accPortConn,
158230
OFPTYPE_FLOW_REMOVED, res_msg, &fentry);
231+
ofpbuf_delete(res_msg);
232+
233+
// Collect counts related to Rx
159234
secGrpStatsManager.on_timer(ec);
160235

161-
ofpbuf_delete(res_msg);
236+
// 2nd delete received from ovs for same flow, ideally this is a no-op.
237+
// But since on-timer is called table state's flow would have created
238+
// an entry in newCounterMap. So the flow removed message will lead
239+
// to accumulation of stats to prom metric.
162240
res_msg = makeFlowRemovedMessage_2(&accPortConn,
163241
LAST_PACKET_COUNT,
164242
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
@@ -168,6 +246,7 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
168246
secGrpStatsManager.Handle(&accPortConn,
169247
OFPTYPE_FLOW_REMOVED, res_msg, &fentry);
170248
ofpbuf_delete(res_msg);
249+
171250
res_msg =
172251
makeFlowRemovedMessage_2(&accPortConn,
173252
LAST_PACKET_COUNT,
@@ -193,6 +272,7 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
193272
// Call on_timer function to process the stats collected
194273
// and generate Genie objects for stats
195274

275+
// Collect counts relateed to Tx
196276
secGrpStatsManager.on_timer(ec);
197277

198278
// calculate expected packet count and byte count
@@ -201,11 +281,13 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
201281
verifyFlowStats(classifier3,
202282
LAST_PACKET_COUNT,
203283
LAST_PACKET_COUNT * PACKET_SIZE,
284+
true,
204285
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
205286
&secGrpStatsManager);
206287
verifyFlowStats(classifier3,
207288
LAST_PACKET_COUNT,
208289
LAST_PACKET_COUNT * PACKET_SIZE,
290+
false,
209291
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
210292
&secGrpStatsManager);
211293
LOG(DEBUG) << "### SecGrpClassifierCounter flow removed stop";
@@ -239,7 +321,8 @@ BOOST_FIXTURE_TEST_CASE(testSecGrpDelete, SecGrpStatsManagerFixture) {
239321
OFPTYPE_FLOW_STATS_REPLY, NULL);
240322
// testing one flow only
241323
testOneFlow(accPortConn,classifier1,
242-
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,1,&secGrpStatsManager);
324+
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
325+
1, false, &secGrpStatsManager);
243326
Mutator mutator(agent.getFramework(), "policyreg");
244327

245328
// Note: In UTs, deleting the sg doesnt trigger classifier delete

agent-ovs/ovs/test/ServiceStatsManager_test.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ class ServiceStatsManagerFixture : public PolicyStatsManagerFixture {
110110
bool isOld, bool isFlowStateReAdd);
111111

112112
#ifdef HAVE_PROMETHEUS_SUPPORT
113-
const string cmd = "curl --proxy \"\" --compressed --silent http://127.0.0.1:9612/metrics 2>&1;";
114113
void checkSvcTgtPromMetrics(uint64_t pkts, uint64_t bytes, const string& ip, bool isNodePort=false);
115114
void checkPodSvcPromMetrics(uint64_t pkts, uint64_t bytes);
116115
#endif

agent-ovs/ovs/test/TableDropStatsManager_test.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ class TableDropStatsManagerFixture : public PolicyStatsManagerFixture {
105105
PolicyStatsManager &statsManager);
106106

107107
#ifdef HAVE_PROMETHEUS_SUPPORT
108-
const string cmd = "curl --proxy \"\" --compressed --silent http://127.0.0.1:9612/metrics 2>&1;";
109108
void checkPrometheusCounters(uint64_t exp_packet_count,
110109
uint64_t exp_byte_count,
111110
const std::string &bridgeName,

agent-ovs/ovs/test/include/PolicyStatsManagerFixture.h

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,20 +75,42 @@ class PolicyStatsManagerFixture : public FlowManagerFixture {
7575
FlowManagerFixture (mode) {
7676
};
7777

78+
#ifdef HAVE_PROMETHEUS_SUPPORT
79+
const string cmd = "curl --proxy \"\" --compressed --silent http://127.0.0.1:9612/metrics 2>&1;";
80+
virtual void verifyPromMetrics (shared_ptr<L24Classifier> classifier,
81+
uint32_t pkts,
82+
uint32_t bytes,
83+
bool isTx=false) {
84+
}
85+
#endif
86+
87+
// New counter objects get created for every diff in flow. Prometheus
88+
// maintains an aggregatiion of all these updates. On the second update
89+
// with same values in tests, check for total value in prometheus.
7890
void verifyFlowStats(shared_ptr<L24Classifier> classifier,
79-
uint32_t packet_count,
80-
uint32_t byte_count,uint32_t table_id,
91+
uint32_t packet_count, // delta
92+
uint32_t byte_count, // delta
93+
bool isExistingMetric,
94+
uint32_t table_id,
8195
PolicyStatsManager *statsManager,
8296
shared_ptr<EpGroup> srcEpg = NULL,
8397
shared_ptr<EpGroup> dstEpg = NULL) {
98+
99+
uint32_t t_byte_count = isExistingMetric?byte_count*2:byte_count;
100+
uint32_t t_packet_count = isExistingMetric?packet_count*2:packet_count;
101+
84102
optional<shared_ptr<PolicyStatUniverse> > su =
85103
PolicyStatUniverse::resolve(agent.getFramework());
86104
if (srcEpg.get() && dstEpg.get()) {
87105
auto uuid =
88106
boost::lexical_cast<std::string>(statsManager->getAgentUUID());
89107
LOG(DEBUG) << "verifying stats for src_epg: " << srcEpg->getURI().toString()
90108
<< " dst_epg: " << dstEpg->getURI().toString()
91-
<< " classifier: " << classifier->getURI().toString();
109+
<< " classifier: " << classifier->getURI().toString()
110+
<< " delta pkt count: " << packet_count
111+
<< " delta byte count: " << byte_count
112+
<< " total pkt count: " << t_packet_count
113+
<< " total byte count: " << t_byte_count;
92114
optional<shared_ptr<L24ClassifierCounter> > myCounter =
93115
boost::make_optional<shared_ptr<L24ClassifierCounter> >(false, nullptr);
94116
WAIT_FOR_DO_ONFAIL(
@@ -107,13 +129,20 @@ class PolicyStatsManagerFixture : public FlowManagerFixture {
107129
} else {
108130
LOG(DEBUG) << "L24classifiercounter mo isnt present";
109131
});
132+
#ifdef HAVE_PROMETHEUS_SUPPORT
133+
verifyPromMetrics(classifier, t_packet_count, t_byte_count);
134+
#endif
110135
} else {
111136
auto uuid =
112137
boost::lexical_cast<std::string>(statsManager->getAgentUUID());
113138
optional<shared_ptr<SecGrpClassifierCounter> > myCounter =
114139
boost::make_optional<shared_ptr<SecGrpClassifierCounter> >(false, nullptr);
115140
LOG(DEBUG) << "verifying stats for"
116-
<< " classifier: " << classifier->getURI().toString();
141+
<< " classifier: " << classifier->getURI().toString()
142+
<< " delta pkt count: " << packet_count
143+
<< " delta byte count: " << byte_count
144+
<< " total pkt count: " << t_packet_count
145+
<< " total byte count: " << t_byte_count;
117146
WAIT_FOR_DO_ONFAIL(
118147
(myCounter && myCounter.get()
119148
&& (
@@ -150,6 +179,10 @@ class PolicyStatsManagerFixture : public FlowManagerFixture {
150179
} else {
151180
LOG(DEBUG) << "SGclassifiercounter mo isnt present";
152181
});
182+
#ifdef HAVE_PROMETHEUS_SUPPORT
183+
verifyPromMetrics(classifier, t_packet_count, t_byte_count,
184+
table_id == AccessFlowManager::SEC_GROUP_OUT_TABLE_ID);
185+
#endif
153186
}
154187
}
155188

@@ -352,7 +385,9 @@ class PolicyStatsManagerFixture : public FlowManagerFixture {
352385

353386
void testOneFlow(MockConnection& portConn,
354387
shared_ptr<L24Classifier>& classifier,uint32_t table_id,
355-
uint32_t portNum,PolicyStatsManager *statsManager,
388+
uint32_t portNum,
389+
bool isExistingMetric,
390+
PolicyStatsManager *statsManager,
356391
PolicyManager *policyManager = NULL,
357392
shared_ptr<EpGroup> srcEpg = NULL,
358393
shared_ptr<EpGroup> dstEpg = NULL) {
@@ -419,6 +454,7 @@ class PolicyStatsManagerFixture : public FlowManagerFixture {
419454
verifyFlowStats(classifier,
420455
exp_classifier_packet_count,
421456
exp_classifier_packet_count * PACKET_SIZE,
457+
isExistingMetric,
422458
table_id,statsManager,srcEpg,dstEpg);
423459

424460
LOG(DEBUG) << "FlowStatsReplyMessage verification successful";

0 commit comments

Comments
 (0)