66#include < datasketches/datasketches/cpc/cpc_union.hpp>
77#include < sstream>
88
9+ #include < math.h>
910#include < arpa/inet.h>
1011
1112#include " dns.h"
@@ -56,8 +57,8 @@ void Metrics::merge(Metrics &other)
5657 _rateSketches.net_rateIn .merge (other._rateSketches .net_rateIn );
5758 _rateSketches.net_rateOut .merge (other._rateSketches .net_rateOut );
5859
59- _sketches->_dnsXactFromTimeMs .merge (other._sketches ->_dnsXactFromTimeMs );
60- _sketches->_dnsXactToTimeMs .merge (other._sketches ->_dnsXactToTimeMs );
60+ _sketches->_dnsXactFromTimeUs .merge (other._sketches ->_dnsXactFromTimeUs );
61+ _sketches->_dnsXactToTimeUs .merge (other._sketches ->_dnsXactToTimeUs );
6162
6263 datasketches::cpc_union merge_srcIPCard;
6364 merge_srcIPCard.update (_sketches->_net_srcIPCard );
@@ -158,31 +159,31 @@ void Metrics::newDNSPacket(pcpp::DnsLayer *dns, Direction dir, pcpp::ProtocolTyp
158159 }
159160}
160161
161- void Metrics::newDNSXact (pcpp::DnsLayer *dns, Direction dir, hr_clock::duration xact_dur )
162+ void Metrics::newDNSXact (pcpp::DnsLayer *dns, Direction dir, DnsTransaction xact )
162163{
163164 // lock for write
164165 std::unique_lock lock (_sketchMutex);
165166
166167 _DNS_xacts_total++;
167- double xactTime = (double )std::chrono::duration_cast<std::chrono::microseconds>(xact_dur). count () / 1000.0 ; // milliseconds
168+ uint64_t xactTime = (xact. totalTS . tv_sec * 1000000 ) + xact. totalTS . tv_usec ; // microseconds
168169 // dir is the direction of the last packet, meaning the reply so from a transaction perspective
169170 // we look at it from the direction of the query, so the opposite side than we have here
170171 float to90th = 0.0 ;
171172 float from90th = 0.0 ;
172173 uint64_t sample_threshold = 10 ;
173174 if (dir == toHost) {
174175 _DNS_xacts_out++;
175- _sketches->_dnsXactFromTimeMs .update (xactTime);
176+ _sketches->_dnsXactFromTimeUs .update (xactTime);
176177 // wait for N samples
177- if (_sketches->_dnsXactFromTimeMs .get_n () > sample_threshold) {
178- from90th = _sketches->_dnsXactFromTimeMs .get_quantile (0.90 );
178+ if (_sketches->_dnsXactFromTimeUs .get_n () > sample_threshold) {
179+ from90th = _sketches->_dnsXactFromTimeUs .get_quantile (0.90 );
179180 }
180181 } else if (dir == fromHost) {
181182 _DNS_xacts_in++;
182- _sketches->_dnsXactToTimeMs .update (xactTime);
183+ _sketches->_dnsXactToTimeUs .update (xactTime);
183184 // wait for N samples
184- if (_sketches->_dnsXactToTimeMs .get_n () > sample_threshold) {
185- to90th = _sketches->_dnsXactToTimeMs .get_quantile (0.90 );
185+ if (_sketches->_dnsXactToTimeUs .get_n () > sample_threshold) {
186+ to90th = _sketches->_dnsXactToTimeUs .get_quantile (0.90 );
186187 }
187188 }
188189
@@ -198,9 +199,9 @@ void Metrics::newDNSXact(pcpp::DnsLayer *dns, Direction dir, hr_clock::duration
198199 }
199200}
200201
201- void MetricsMgr::newDNSXact (pcpp::DnsLayer *dns, Direction dir, hr_clock::duration xact_dur )
202+ void MetricsMgr::newDNSXact (pcpp::DnsLayer *dns, Direction dir, DnsTransaction xact )
202203{
203- _metrics.back ()->newDNSXact (dns, dir, xact_dur );
204+ _metrics.back ()->newDNSXact (dns, dir, xact );
204205}
205206
206207void MetricsMgr::newDNSPacket (pcpp::DnsLayer *dns, Direction dir, pcpp::ProtocolType l3, pcpp::ProtocolType l4)
@@ -356,8 +357,8 @@ void MetricsMgr::newPacket(const pcpp::Packet &packet, QueryResponsePairMgr &pai
356357 auto pkt_ts = packet.getRawPacketReadOnly ()->getPacketTimeStamp ();
357358 if (pkt_ts.tv_sec - _lastShiftTS.tv_sec > MetricsMgr::PERIOD_SEC) {
358359 _periodShift ();
359- _lastShiftTS.tv_sec = packet. getRawPacketReadOnly ()-> getPacketTimeStamp () .tv_sec ;
360- pairMgr.purgeOldTransactions ();
360+ _lastShiftTS.tv_sec = pkt_ts .tv_sec ;
361+ pairMgr.purgeOldTransactions (pkt_ts );
361362 _openDnsTransactionCount = pairMgr.getOpenTransactionCount ();
362363 }
363364 switch (dir) {
@@ -389,8 +390,8 @@ void Metrics::toJSON(nlohmann::json &j, const std::string &key)
389390 j[key][" packets" ][" in" ] = _numPackets_in.load ();
390391 j[key][" packets" ][" out" ] = _numPackets_out.load ();
391392
392- j[key][" packets" ][" cardinality" ][" src_ips_in" ] = _sketches->_net_srcIPCard .get_estimate ();
393- j[key][" packets" ][" cardinality" ][" dst_ips_out" ] = _sketches->_net_dstIPCard .get_estimate ();
393+ j[key][" packets" ][" cardinality" ][" src_ips_in" ] = lround ( _sketches->_net_srcIPCard .get_estimate () );
394+ j[key][" packets" ][" cardinality" ][" dst_ips_out" ] = lround ( _sketches->_net_dstIPCard .get_estimate () );
394395
395396 const double fractions[4 ]{0.50 , 0.90 , 0.95 , 0.99 };
396397 auto quantiles = _rateSketches.net_rateIn .get_quantiles (fractions, 4 );
@@ -420,7 +421,7 @@ void Metrics::toJSON(nlohmann::json &j, const std::string &key)
420421 j[key][" dns" ][" wire_packets" ][" srvfail" ] = _DNS_SRVFAIL.load ();
421422 j[key][" dns" ][" wire_packets" ][" noerror" ] = _DNS_NOERROR.load ();
422423
423- j[key][" dns" ][" cardinality" ][" qname" ] = _sketches->_dns_qnameCard .get_estimate ();
424+ j[key][" dns" ][" cardinality" ][" qname" ] = lround ( _sketches->_dns_qnameCard .get_estimate () );
424425
425426 {
426427 j[key][" packets" ][" top_ipv4" ] = nlohmann::json::array ();
@@ -481,20 +482,20 @@ void Metrics::toJSON(nlohmann::json &j, const std::string &key)
481482 }
482483 }
483484
484- auto d_quantiles = _sketches->_dnsXactFromTimeMs .get_quantiles (fractions, 4 );
485+ auto d_quantiles = _sketches->_dnsXactFromTimeUs .get_quantiles (fractions, 4 );
485486 if (d_quantiles.size ()) {
486- j[key][" dns" ][" xact" ][" out" ][" quantiles_ms " ][" p50" ] = d_quantiles[0 ];
487- j[key][" dns" ][" xact" ][" out" ][" quantiles_ms " ][" p90" ] = d_quantiles[1 ];
488- j[key][" dns" ][" xact" ][" out" ][" quantiles_ms " ][" p95" ] = d_quantiles[2 ];
489- j[key][" dns" ][" xact" ][" out" ][" quantiles_ms " ][" p99" ] = d_quantiles[3 ];
487+ j[key][" dns" ][" xact" ][" out" ][" quantiles_us " ][" p50" ] = d_quantiles[0 ];
488+ j[key][" dns" ][" xact" ][" out" ][" quantiles_us " ][" p90" ] = d_quantiles[1 ];
489+ j[key][" dns" ][" xact" ][" out" ][" quantiles_us " ][" p95" ] = d_quantiles[2 ];
490+ j[key][" dns" ][" xact" ][" out" ][" quantiles_us " ][" p99" ] = d_quantiles[3 ];
490491 }
491492
492- d_quantiles = _sketches->_dnsXactToTimeMs .get_quantiles (fractions, 4 );
493+ d_quantiles = _sketches->_dnsXactToTimeUs .get_quantiles (fractions, 4 );
493494 if (d_quantiles.size ()) {
494- j[key][" dns" ][" xact" ][" in" ][" quantiles_ms " ][" p50" ] = d_quantiles[0 ];
495- j[key][" dns" ][" xact" ][" in" ][" quantiles_ms " ][" p90" ] = d_quantiles[1 ];
496- j[key][" dns" ][" xact" ][" in" ][" quantiles_ms " ][" p95" ] = d_quantiles[2 ];
497- j[key][" dns" ][" xact" ][" in" ][" quantiles_ms " ][" p99" ] = d_quantiles[3 ];
495+ j[key][" dns" ][" xact" ][" in" ][" quantiles_us " ][" p50" ] = d_quantiles[0 ];
496+ j[key][" dns" ][" xact" ][" in" ][" quantiles_us " ][" p90" ] = d_quantiles[1 ];
497+ j[key][" dns" ][" xact" ][" in" ][" quantiles_us " ][" p95" ] = d_quantiles[2 ];
498+ j[key][" dns" ][" xact" ][" in" ][" quantiles_us " ][" p99" ] = d_quantiles[3 ];
498499 }
499500
500501 {
0 commit comments