OpenDDS  Snapshot(2023/04/28-20:55)
TransportStatistics.h
Go to the documentation of this file.
1 /*
2  *
3  *
4  * Distributed under the OpenDDS License.
5  * See: http://www.opendds.org/license.html
6  */
7 
8 #ifndef OPENDDS_DCPS_TRANSPORT_FRAMEWORK_TRANSPORTSTATISTICS_H
9 #define OPENDDS_DCPS_TRANSPORT_FRAMEWORK_TRANSPORTSTATISTICS_H
10 
13 
14 #include <dds/OpenddsDcpsExtC.h>
15 
17 
18 namespace OpenDDS {
19 namespace DCPS {
20 
24  bool relay;
25 
27  MessageCountKind a_kind,
28  bool a_relay)
29  : address(a_address)
30  , kind(a_kind)
31  , relay(a_relay)
32  {}
33 
34  bool operator<(const InternalMessageCountKey& other) const
35  {
36  if (address != other.address) {
37  return address < other.address;
38  }
39  return kind < other.kind;
40  }
41 };
42 
44 public:
46  : send_count_(0)
47  , send_bytes_(0)
48  , send_fail_count_(0)
49  , send_fail_bytes_(0)
50  , recv_count_(0)
51  , recv_bytes_(0)
52  {}
53 
54  void send(ssize_t bytes)
55  {
56  ++send_count_;
57  send_bytes_ += bytes;
58  }
59  size_t send_count() const { return send_count_; }
60  ssize_t send_bytes() const { return send_bytes_; }
61 
62  void send_fail(ssize_t bytes)
63  {
64  ++send_fail_count_;
65  send_fail_bytes_ += bytes;
66  }
67  size_t send_fail_count() const { return send_fail_count_; }
68  ssize_t send_fail_bytes() const { return send_fail_bytes_; }
69 
70  void recv(ssize_t bytes)
71  {
72  ++recv_count_;
73  recv_bytes_ += bytes;
74  }
75  size_t recv_count() const { return recv_count_; }
76  ssize_t recv_bytes() const { return recv_bytes_; }
77 
78 private:
79  size_t send_count_;
83  size_t recv_count_;
85 };
86 
90  MessageCountMap message_count;
91  typedef OPENDDS_MAP(GUID_t, CORBA::ULong) GuidCountMap;
92  GuidCountMap writer_resend_count;
93  GuidCountMap reader_nack_count;
94 
95  explicit InternalTransportStatistics(const OPENDDS_STRING& a_transport)
96  : transport(a_transport)
97  {}
98 
99  void clear()
100  {
101  message_count.clear();
102  writer_resend_count.clear();
103  reader_nack_count.clear();
104  }
105 };
106 
108 {
109  const ACE_CDR::ULong idx = grow(seq) - 1;
110  TransportStatistics& stats = seq[idx];
111  stats.transport = istats.transport.c_str();
112  for (InternalTransportStatistics::MessageCountMap::const_iterator pos = istats.message_count.begin(),
113  limit = istats.message_count.end(); pos != limit; ++pos) {
114  MessageCount mc;
115  address_to_locator(mc.locator, pos->first.address.to_addr());
116  mc.kind = pos->first.kind;
117  mc.relay = pos->first.relay;
118  mc.send_count = static_cast<ACE_CDR::ULong>(pos->second.send_count());
119  mc.send_bytes = static_cast<ACE_CDR::ULong>(pos->second.send_bytes());
120  mc.send_fail_count = static_cast<ACE_CDR::ULong>(pos->second.send_fail_count());
121  mc.send_fail_bytes = static_cast<ACE_CDR::ULong>(pos->second.send_fail_bytes());
122  mc.recv_count = static_cast<ACE_CDR::ULong>(pos->second.recv_count());
123  mc.recv_bytes = static_cast<ACE_CDR::ULong>(pos->second.recv_bytes());
124  push_back(stats.message_count, mc);
125  }
126  for (InternalTransportStatistics::GuidCountMap::const_iterator pos = istats.writer_resend_count.begin(),
127  limit = istats.writer_resend_count.end(); pos != limit; ++pos) {
128  const GuidCount gc = { pos->first, pos->second };
129  push_back(stats.writer_resend_count, gc);
130  }
131  for (InternalTransportStatistics::GuidCountMap::const_iterator pos = istats.reader_nack_count.begin(),
132  limit = istats.reader_nack_count.end(); pos != limit; ++pos) {
133  const GuidCount gc = { pos->first, pos->second };
134  push_back(stats.reader_nack_count, gc);
135  }
136 }
137 
138 } // namespace DCPS
139 } // namespace OpenDDS
140 
142 
143 #endif /* OPENDDS_DCPS_TRANSPORTSTATISTICS_H */
int ssize_t
OpenDDS_Dcps_Export void address_to_locator(Locator_t &locator, const ACE_INET_Addr &addr)
#define OPENDDS_STRING
ACE_CDR::ULong ULong
sequence< TransportStatistics > TransportStatisticsSequence
key MessageCountKind kind
Seq::size_type grow(Seq &seq)
Definition: Util.h:151
ACE_UINT32 ULong
void append(TransportStatisticsSequence &seq, const InternalTransportStatistics &istats)
void push_back(Seq &seq, const typename Seq::value_type &val)
std::vector-style push_back() for CORBA Sequences
Definition: Util.h:138
InternalTransportStatistics(const OPENDDS_STRING &a_transport)
bool operator<(const InternalMessageCountKey &other) const
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
InternalMessageCountKey(const NetworkAddress &a_address, MessageCountKind a_kind, bool a_relay)
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
typedef OPENDDS_MAP(OPENDDS_STRING, OPENDDS_STRING) ValueMap
Helper types and functions for config file parsing.
DDS::OctetArray16 address