2424#include < boost/property_tree/ptree.hpp>
2525#include < boost/property_tree/json_parser.hpp>
2626
27+ #include " Monitoring/MonitoringFactory.h"
28+ using namespace o2 ::monitoring;
29+
2730using namespace AliceO2 ::roc::CommandLineUtilities;
2831using namespace AliceO2 ::roc;
2932using namespace AliceO2 ::InfoLogger;
@@ -36,7 +39,9 @@ class ProgramPacketMonitor : public Program
3639 virtual Description getDescription ()
3740 {
3841 return { " Packet Monitor" , " Return RoC packet monitoring information" ,
39- " roc-pkt-monitor --id 42:00.0\n " };
42+ " roc-pkt-monitor --id 42:00.0\n "
43+ " roc-pkt-monitor --id 42:00.0 --json\n "
44+ " roc-pkt-monitor --id 42:00.0 --monitoring\n " };
4045 }
4146
4247 virtual void addOptions (boost::program_options::options_description& options)
@@ -45,9 +50,9 @@ class ProgramPacketMonitor : public Program
4550 options.add_options ()(" json-out" ,
4651 po::bool_switch (&mOptions .jsonOut ),
4752 " Toggle json-formatted output" );
48- options.add_options ()(" csv-out " ,
49- po::bool_switch (&mOptions .csvOut ),
50- " Toggle csv-formatted output " );
53+ options.add_options ()(" monitoring " ,
54+ po::bool_switch (&mOptions .monitoring ),
55+ " Toggle monitoring metrics sending " );
5156 }
5257
5358 virtual void run (const boost::program_options::variables_map& map)
@@ -56,8 +61,9 @@ class ProgramPacketMonitor : public Program
5661 auto cardId = Options::getOptionCardId (map);
5762 auto params = Parameters::makeParameters (cardId, 2 ); // status available on BAR2
5863 auto bar2 = ChannelFactory ().getBar (params);
64+ auto card = RocPciDevice (cardId).getCardDescriptor ();
65+ auto cardType = card.cardType ;
5966
60- CardType::type cardType = bar2->getCardType ();
6167 if (cardType == CardType::type::Crorc) {
6268 std::cout << " CRORC packet monitoring not yet supported" << std::endl;
6369 return ;
@@ -68,6 +74,12 @@ class ProgramPacketMonitor : public Program
6874
6975 auto cruBar2 = std::dynamic_pointer_cast<CruBar>(bar2);
7076
77+ // Monitoring instance to send metrics
78+ std::unique_ptr<Monitoring> monitoring;
79+ if (mOptions .monitoring ) {
80+ monitoring = MonitoringFactory::Get (getMonitoringUri ());
81+ }
82+
7183 Cru::PacketMonitoringInfo packetMonitoringInfo = cruBar2->monitorPackets ();
7284
7385 /* HEADER */
@@ -78,10 +90,7 @@ class ProgramPacketMonitor : public Program
7890 auto lineFat = std::string (header.length (), ' =' ) + ' \n ' ;
7991 auto lineThin = std::string (header.length (), ' -' ) + ' \n ' ;
8092
81- if (mOptions .csvOut ) {
82- auto csvHeader = " Link ID,Accepted,Rejected,Forced\n " ;
83- std::cout << csvHeader;
84- } else if (!mOptions .jsonOut ) {
93+ if (!mOptions .jsonOut ) {
8594 table << lineFat << header << lineThin;
8695 }
8796
@@ -97,7 +106,19 @@ class ProgramPacketMonitor : public Program
97106 uint32_t rejected = linkMonitoringInfoMap.rejected ;
98107 uint32_t forced = linkMonitoringInfoMap.forced ;
99108
100- if (mOptions .jsonOut ) {
109+ if (mOptions .monitoring ) {
110+ monitoring->send (Metric{ " link" }
111+ .addValue (card.pciAddress .toString (), " pciAddress" )
112+ .addValue (card.serialId .getSerial (), " serial" )
113+ .addValue (card.serialId .getEndpoint (), " endpoint" )
114+ .addValue ((int )accepted, " accepted" )
115+ .addValue ((int )rejected, " rejected" )
116+ .addValue ((int )forced, " forced" )
117+ .addTag (tags::Key::CRU, card.sequenceId )
118+ .addTag (tags::Key::ID, globalId)
119+ .addTag (tags::Key::Type, tags::Value::CRU));
120+
121+ } else if (mOptions .jsonOut ) {
101122 pt::ptree linkNode;
102123
103124 // add kv pairs for this link
@@ -107,9 +128,6 @@ class ProgramPacketMonitor : public Program
107128 linkNode.put (" forced" , std::to_string (forced));
108129
109130 gbtLinks.add_child (std::to_string (globalId), linkNode);
110- } else if (mOptions .csvOut ) {
111- auto csvLine = std::to_string (globalId) + " ," + std::to_string (accepted) + " ," + std::to_string (rejected) + " ," + std::to_string (forced) + " \n " ;
112- std::cout << csvLine;
113131 } else {
114132 auto format = boost::format (formatRow) % globalId % accepted % rejected % forced;
115133 table << format;
@@ -120,7 +138,7 @@ class ProgramPacketMonitor : public Program
120138 root.add_child (" gbtLinks" , gbtLinks);
121139
122140 /* PRINT */
123- if (!mOptions .csvOut ) {
141+ if (!mOptions .jsonOut && ! mOptions . monitoring ) {
124142 std::cout << table.str ();
125143 }
126144
@@ -132,10 +150,7 @@ class ProgramPacketMonitor : public Program
132150 lineFat = std::string (header.length (), ' =' ) + ' \n ' ;
133151 lineThin = std::string (header.length (), ' -' ) + ' \n ' ;
134152
135- if (mOptions .csvOut ) {
136- auto csvHeader = " Wrapper,Dropped,Total Packets per second\n " ;
137- std::cout << csvHeader;
138- } else {
153+ if (!mOptions .jsonOut && !mOptions .monitoring ) {
139154 otherTable << lineFat << header << lineThin;
140155 }
141156
@@ -148,7 +163,17 @@ class ProgramPacketMonitor : public Program
148163 uint32_t dropped = wrapperMonitoringInfoMap.dropped ;
149164 uint32_t totalPacketsPerSec = wrapperMonitoringInfoMap.totalPacketsPerSec ;
150165
151- if (mOptions .jsonOut ) {
166+ if (mOptions .monitoring ) {
167+ monitoring->send (Metric{ " wrapper" }
168+ .addValue (card.pciAddress .toString (), " pciAddress" )
169+ .addValue (card.serialId .getSerial (), " serial" )
170+ .addValue (card.serialId .getEndpoint (), " endpoint" )
171+ .addValue ((int )dropped, " dropped" )
172+ .addValue ((int )totalPacketsPerSec, " totalPacketsPerSec" )
173+ .addTag (tags::Key::CRU, card.sequenceId )
174+ .addTag (tags::Key::ID, wrapper)
175+ .addTag (tags::Key::Type, tags::Value::CRU));
176+ } else if (mOptions .jsonOut ) {
152177 pt::ptree wrapperNode;
153178
154179 // add kv pairs for this wrapper
@@ -159,10 +184,7 @@ class ProgramPacketMonitor : public Program
159184 // add the wrapper node to the tree
160185 root.add_child (" wrapper" , wrapperNode);
161186 }
162- if (mOptions .csvOut ) {
163- auto csvLine = std::to_string (wrapper) + " ," + std::to_string (dropped) + " ," + std::to_string (totalPacketsPerSec) + " \n " ;
164- std::cout << csvLine;
165- } else {
187+ if (!mOptions .jsonOut && !mOptions .monitoring ) {
166188 auto format = boost::format (formatRow) % wrapper % dropped % totalPacketsPerSec;
167189 otherTable << format;
168190 }
@@ -171,7 +193,7 @@ class ProgramPacketMonitor : public Program
171193 /* BREAK + PRINT */
172194 if (mOptions .jsonOut ) {
173195 pt::write_json (std::cout, root);
174- } else if (!mOptions .csvOut ) {
196+ } else if (!mOptions .monitoring ) {
175197 auto lineFat = std::string (header.length (), ' =' ) + ' \n ' ;
176198 otherTable << lineFat;
177199 std::cout << otherTable.str ();
@@ -181,7 +203,7 @@ class ProgramPacketMonitor : public Program
181203 private:
182204 struct OptionsStruct {
183205 bool jsonOut = false ;
184- bool csvOut = false ;
206+ bool monitoring = false ;
185207 } mOptions ;
186208};
187209
0 commit comments