rippled
StatsDCollector.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of Beast: https://github.com/vinniefalco/Beast
4  Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/beast/net/IPAddressConversion.h>
21 #include <ripple/beast/insight/HookImpl.h>
22 #include <ripple/beast/insight/CounterImpl.h>
23 #include <ripple/beast/insight/EventImpl.h>
24 #include <ripple/beast/insight/GaugeImpl.h>
25 #include <ripple/beast/insight/MeterImpl.h>
26 #include <ripple/beast/insight/StatsDCollector.h>
27 #include <ripple/beast/core/List.h>
28 #include <boost/asio/ip/tcp.hpp>
29 #include <boost/optional.hpp>
30 #include <cassert>
31 #include <climits>
32 #include <deque>
33 #include <functional>
34 #include <mutex>
35 #include <set>
36 #include <sstream>
37 #include <thread>
38 
39 #ifndef BEAST_STATSDCOLLECTOR_TRACING_ENABLED
40 #define BEAST_STATSDCOLLECTOR_TRACING_ENABLED 0
41 #endif
42 
43 namespace beast {
44 namespace insight {
45 
46 namespace detail {
47 
48 class StatsDCollectorImp;
49 
50 //------------------------------------------------------------------------------
51 
52 class StatsDMetricBase : public List <StatsDMetricBase>::Node
53 {
54 public:
55  virtual void do_process () = 0;
56  virtual ~StatsDMetricBase() = default;
57  StatsDMetricBase() = default;
58  StatsDMetricBase(StatsDMetricBase const&) = delete;
60 };
61 
62 //------------------------------------------------------------------------------
63 
65  : public HookImpl
66  , public StatsDMetricBase
67 {
68 public:
70  HandlerType const& handler,
72 
73  ~StatsDHookImpl () override;
74 
75  void do_process () override;
76 
77 private:
79 
82 };
83 
84 //------------------------------------------------------------------------------
85 
87  : public CounterImpl
88  , public StatsDMetricBase
89 {
90 public:
91  StatsDCounterImpl (std::string const& name,
93 
94  ~StatsDCounterImpl () override;
95 
96  void increment (CounterImpl::value_type amount) override;
97 
98  void flush ();
100  void do_process () override;
101 
102 private:
104 
108  bool m_dirty;
109 };
110 
111 //------------------------------------------------------------------------------
112 
114  : public EventImpl
115 {
116 public:
117  StatsDEventImpl (std::string const& name,
119 
120  ~StatsDEventImpl () = default;
121 
122  void notify (EventImpl::value_type const& value) override;
123 
124  void do_notify (EventImpl::value_type const& value);
125  void do_process ();
126 
127 private:
129 
132 };
133 
134 //------------------------------------------------------------------------------
135 
137  : public GaugeImpl
138  , public StatsDMetricBase
139 {
140 public:
141  StatsDGaugeImpl (std::string const& name,
143 
144  ~StatsDGaugeImpl () override;
145 
146  void set (GaugeImpl::value_type value) override;
147  void increment (GaugeImpl::difference_type amount) override;
148 
149  void flush ();
150  void do_set (GaugeImpl::value_type value);
152  void do_process () override;
153 
154 private:
156 
161  bool m_dirty;
162 };
163 
164 //------------------------------------------------------------------------------
165 
167  : public MeterImpl
168  , public StatsDMetricBase
169 {
170 public:
171  explicit StatsDMeterImpl (std::string const& name,
173 
174  ~StatsDMeterImpl () override;
175 
176  void increment (MeterImpl::value_type amount) override;
177 
178  void flush ();
179  void do_increment (MeterImpl::value_type amount);
180  void do_process () override;
181 
182 private:
184 
188  bool m_dirty;
189 };
190 
191 //------------------------------------------------------------------------------
192 
194  : public StatsDCollector
195  , public std::enable_shared_from_this <StatsDCollectorImp>
196 {
197 private:
198  enum
199  {
200  //max_packet_size = 484
202  };
203 
207  boost::asio::io_service m_io_service;
208  boost::optional <boost::asio::io_service::work> m_work;
209  boost::asio::io_service::strand m_strand;
210  boost::asio::basic_waitable_timer<std::chrono::steady_clock> m_timer;
211  boost::asio::ip::udp::socket m_socket;
215 
216  // Must come last for order of init
218 
219  static boost::asio::ip::udp::endpoint to_endpoint (
220  IP::Endpoint const &ep)
221  {
222  return boost::asio::ip::udp::endpoint (ep.address(), ep.port());
223  }
224 
225 public:
227  IP::Endpoint const& address,
228  std::string const& prefix,
229  Journal journal)
230  : m_journal (journal)
231  , m_address (address)
232  , m_prefix (prefix)
233  , m_work (std::ref (m_io_service))
237  , m_thread (&StatsDCollectorImp::run, this)
238  {
239  }
240 
242  {
243  boost::system::error_code ec;
244  m_timer.cancel (ec);
245 
246  m_work = boost::none;
247  m_thread.join ();
248  }
249 
250  Hook make_hook (HookImpl::HandlerType const& handler) override
251  {
252  return Hook (std::make_shared <detail::StatsDHookImpl> (
253  handler, shared_from_this ()));
254  }
255 
256  Counter make_counter (std::string const& name) override
257  {
258  return Counter (std::make_shared <detail::StatsDCounterImpl> (
259  name, shared_from_this ()));
260  }
261 
262  Event make_event (std::string const& name) override
263  {
264  return Event (std::make_shared <detail::StatsDEventImpl> (
265  name, shared_from_this ()));
266  }
267 
268  Gauge make_gauge (std::string const& name) override
269  {
270  return Gauge (std::make_shared <detail::StatsDGaugeImpl> (
271  name, shared_from_this ()));
272  }
273 
274  Meter make_meter (std::string const& name) override
275  {
276  return Meter (std::make_shared <detail::StatsDMeterImpl> (
277  name, shared_from_this ()));
278  }
279 
280  //--------------------------------------------------------------------------
281 
282  void add (StatsDMetricBase& metric)
283  {
285  metrics_.push_back (metric);
286  }
287 
288  void remove (StatsDMetricBase& metric)
289  {
291  metrics_.erase (metrics_.iterator_to (metric));
292  }
293 
294  //--------------------------------------------------------------------------
295 
296  boost::asio::io_service& get_io_service ()
297  {
298  return m_io_service;
299  }
300 
301  std::string const& prefix () const
302  {
303  return m_prefix;
304  }
305 
306  void do_post_buffer (std::string const& buffer)
307  {
308  m_data.emplace_back (buffer);
309  }
310 
311  void post_buffer (std::string&& buffer)
312  {
313  m_io_service.dispatch (m_strand.wrap (std::bind (
315  std::move (buffer))));
316  }
317 
318  // The keepAlive parameter makes sure the buffers sent to
319  // boost::asio::async_send do not go away until the call is finished
321  boost::system::error_code ec, std::size_t)
322  {
323  if (ec == boost::asio::error::operation_aborted)
324  return;
325 
326  if (ec)
327  {
328  if (auto stream = m_journal.error())
329  stream << "async_send failed: " << ec.message();
330  return;
331  }
332  }
333 
335  {
336  (void)buffers;
337 #if BEAST_STATSDCOLLECTOR_TRACING_ENABLED
338  for (auto const& buffer : buffers)
339  {
340  std::string const s (boost::asio::buffer_cast <char const*> (buffer),
341  boost::asio::buffer_size (buffer));
342  std::cerr << s;
343  }
344  std::cerr << '\n';
345 #endif
346  }
347 
348  // Send what we have
349  void send_buffers ()
350  {
351  if (m_data.empty ())
352  return;
353 
354  // Break up the array of strings into blocks
355  // that each fit into one UDP packet.
356  //
358  buffers.reserve (m_data.size ());
359  std::size_t size (0);
360 
361  auto keepAlive =
362  std::make_shared<std::deque<std::string>>(std::move (m_data));
363  m_data.clear ();
364 
365  for (auto const& s : *keepAlive)
366  {
367  std::size_t const length (s.size ());
368  assert (! s.empty ());
369  if (! buffers.empty () && (size + length) > max_packet_size)
370  {
371  log (buffers);
372  m_socket.async_send (buffers, std::bind (
373  &StatsDCollectorImp::on_send, this, keepAlive,
374  std::placeholders::_1,
375  std::placeholders::_2));
376  buffers.clear ();
377  size = 0;
378  }
379 
380  buffers.emplace_back (&s[0], length);
381  size += length;
382  }
383 
384  if (! buffers.empty ())
385  {
386  log (buffers);
387  m_socket.async_send (buffers, std::bind (
388  &StatsDCollectorImp::on_send, this, keepAlive,
389  std::placeholders::_1,
390  std::placeholders::_2));
391  }
392  }
393 
394  void set_timer ()
395  {
396  using namespace std::chrono_literals;
397  m_timer.expires_from_now(1s);
398  m_timer.async_wait (std::bind (
400  std::placeholders::_1));
401  }
402 
403  void on_timer (boost::system::error_code ec)
404  {
405  if (ec == boost::asio::error::operation_aborted)
406  return;
407 
408  if (ec)
409  {
410  if (auto stream = m_journal.error())
411  stream << "on_timer failed: " << ec.message();
412  return;
413  }
414 
416 
417  for (auto& m : metrics_)
418  m.do_process();
419 
420  send_buffers ();
421 
422  set_timer ();
423  }
424 
425  void run ()
426  {
427  boost::system::error_code ec;
428 
429  if (m_socket.connect (to_endpoint (m_address), ec))
430  {
431  if (auto stream = m_journal.error())
432  stream << "Connect failed: " << ec.message();
433  return;
434  }
435 
436  set_timer ();
437 
438  m_io_service.run ();
439 
440  m_socket.shutdown (
441  boost::asio::ip::udp::socket::shutdown_send, ec);
442 
443  m_socket.close ();
444 
445  m_io_service.poll ();
446  }
447 };
448 
449 //------------------------------------------------------------------------------
450 
453  : m_impl (impl)
454  , m_handler (handler)
455 {
456  m_impl->add (*this);
457 }
458 
460 {
461  m_impl->remove (*this);
462 }
463 
465 {
466  m_handler ();
467 }
468 
469 //------------------------------------------------------------------------------
470 
473  : m_impl (impl)
474  , m_name (name)
475  , m_value (0)
476  , m_dirty (false)
477 {
478  m_impl->add (*this);
479 }
480 
482 {
483  m_impl->remove (*this);
484 }
485 
487 {
488  m_impl->get_io_service().dispatch (std::bind (
490  std::static_pointer_cast <StatsDCounterImpl> (
491  shared_from_this ()), amount));
492 }
493 
495 {
496  if (m_dirty)
497  {
498  m_dirty = false;
500  ss <<
501  m_impl->prefix() << "." <<
502  m_name << ":" <<
503  m_value << "|c" <<
504  "\n";
505  m_value = 0;
506  m_impl->post_buffer (ss.str ());
507  }
508 }
509 
511 {
512  m_value += amount;
513  m_dirty = true;
514 }
515 
517 {
518  flush ();
519 }
520 
521 //------------------------------------------------------------------------------
522 
525  : m_impl (impl)
526  , m_name (name)
527 {
528 }
529 
531 {
532  m_impl->get_io_service().dispatch (std::bind (
534  std::static_pointer_cast <StatsDEventImpl> (
535  shared_from_this ()), value));
536 }
537 
539 {
541  ss <<
542  m_impl->prefix() << "." <<
543  m_name << ":" <<
544  value.count() << "|ms" <<
545  "\n";
546  m_impl->post_buffer (ss.str ());
547 }
548 
549 //------------------------------------------------------------------------------
550 
553  : m_impl (impl)
554  , m_name (name)
555  , m_last_value (0)
556  , m_value (0)
557  , m_dirty (false)
558 {
559  m_impl->add (*this);
560 }
561 
563 {
564  m_impl->remove (*this);
565 }
566 
568 {
569  m_impl->get_io_service().dispatch (std::bind (
571  std::static_pointer_cast <StatsDGaugeImpl> (
572  shared_from_this ()), value));
573 }
574 
576 {
577  m_impl->get_io_service().dispatch (std::bind (
579  std::static_pointer_cast <StatsDGaugeImpl> (
580  shared_from_this ()), amount));
581 }
582 
584 {
585  if (m_dirty)
586  {
587  m_dirty = false;
589  ss <<
590  m_impl->prefix() << "." <<
591  m_name << ":" <<
592  m_value << "|g" <<
593  "\n";
594  m_impl->post_buffer (ss.str ());
595  }
596 }
597 
599 {
600  m_value = value;
601 
602  if (m_value != m_last_value)
603  {
605  m_dirty = true;
606  }
607 }
608 
610 {
612 
613  if (amount > 0)
614  {
615  GaugeImpl::value_type const d (
616  static_cast <GaugeImpl::value_type> (amount));
617  value +=
620  : d;
621  }
622  else if (amount < 0)
623  {
624  GaugeImpl::value_type const d (
625  static_cast <GaugeImpl::value_type> (-amount));
626  value = (d >= value) ? 0 : value - d;
627  }
628 
629  do_set (value);
630 }
631 
633 {
634  flush ();
635 }
636 
637 //------------------------------------------------------------------------------
638 
641  : m_impl (impl)
642  , m_name (name)
643  , m_value (0)
644  , m_dirty (false)
645 {
646  m_impl->add (*this);
647 }
648 
650 {
651  m_impl->remove (*this);
652 }
653 
655 {
656  m_impl->get_io_service().dispatch (std::bind (
658  std::static_pointer_cast <StatsDMeterImpl> (
659  shared_from_this ()), amount));
660 }
661 
663 {
664  if (m_dirty)
665  {
666  m_dirty = false;
668  ss <<
669  m_impl->prefix() << "." <<
670  m_name << ":" <<
671  m_value << "|m" <<
672  "\n";
673  m_value = 0;
674  m_impl->post_buffer (ss.str ());
675  }
676 }
677 
679 {
680  m_value += amount;
681  m_dirty = true;
682 }
683 
685 {
686  flush ();
687 }
688 
689 }
690 
691 //------------------------------------------------------------------------------
692 
694  IP::Endpoint const& address, std::string const& prefix, Journal journal)
695 {
696  return std::make_shared <detail::StatsDCollectorImp> (
697  address, prefix, journal);
698 }
699 
700 }
701 }
beast::insight::detail::StatsDMeterImpl::m_dirty
bool m_dirty
Definition: StatsDCollector.cpp:188
sstream
beast::insight::detail::StatsDCollectorImp::get_io_service
boost::asio::io_service & get_io_service()
Definition: StatsDCollector.cpp:296
beast::insight::detail::StatsDEventImpl::do_notify
void do_notify(EventImpl::value_type const &value)
Definition: StatsDCollector.cpp:538
beast::insight::detail::StatsDGaugeImpl::do_set
void do_set(GaugeImpl::value_type value)
Definition: StatsDCollector.cpp:598
beast::insight::detail::StatsDMeterImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:684
std::bind
T bind(T... args)
std::string
STL class.
std::shared_ptr
STL class.
beast::insight::Meter
A metric for measuring an integral value.
Definition: Meter.h:37
beast::insight::detail::StatsDGaugeImpl::set
void set(GaugeImpl::value_type value) override
Definition: StatsDCollector.cpp:567
beast::insight::Counter
A metric for measuring an integral value.
Definition: Counter.h:38
beast::insight::detail::StatsDCollectorImp::max_packet_size
@ max_packet_size
Definition: StatsDCollector.cpp:201
beast::insight::detail::StatsDEventImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:130
functional
beast::insight::HookImpl
Definition: HookImpl.h:29
beast::insight::detail::StatsDCollectorImp::make_event
Event make_event(std::string const &name) override
Create an event with the specified name.
Definition: StatsDCollector.cpp:262
beast::insight::detail::StatsDEventImpl
Definition: StatsDCollector.cpp:113
std::vector::reserve
T reserve(T... args)
beast::insight::CounterImpl
Definition: CounterImpl.h:31
beast::insight::detail::StatsDEventImpl::m_name
std::string m_name
Definition: StatsDCollector.cpp:131
beast::insight::detail::StatsDCollectorImp::run
void run()
Definition: StatsDCollector.cpp:425
std::vector
STL class.
beast::insight::detail::StatsDGaugeImpl::StatsDGaugeImpl
StatsDGaugeImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:551
std::deque::size
T size(T... args)
beast::insight::detail::StatsDCounterImpl::~StatsDCounterImpl
~StatsDCounterImpl() override
Definition: StatsDCollector.cpp:481
beast::insight::detail::StatsDGaugeImpl
Definition: StatsDCollector.cpp:136
beast::insight::detail::StatsDCollectorImp::send_buffers
void send_buffers()
Definition: StatsDCollector.cpp:349
beast::insight::detail::StatsDCollectorImp::m_strand
boost::asio::io_service::strand m_strand
Definition: StatsDCollector.cpp:209
beast::insight::detail::StatsDHookImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:464
beast::insight::detail::StatsDCollectorImp::on_send
void on_send(std::shared_ptr< std::deque< std::string >>, boost::system::error_code ec, std::size_t)
Definition: StatsDCollector.cpp:320
std::chrono::milliseconds
beast::insight::detail::StatsDHookImpl
Definition: StatsDCollector.cpp:64
beast::insight::detail::StatsDGaugeImpl::flush
void flush()
Definition: StatsDCollector.cpp:583
beast::insight::detail::StatsDHookImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:80
beast::insight::detail::StatsDCollectorImp::set_timer
void set_timer()
Definition: StatsDCollector.cpp:394
beast::IP::Endpoint::address
Address const & address() const
Returns the address portion of this endpoint.
Definition: IPEndpoint.h:67
beast::insight::detail::StatsDMetricBase::operator=
StatsDMetricBase & operator=(StatsDMetricBase const &)=delete
std::stringstream
STL class.
std::recursive_mutex
STL class.
std::lock_guard
STL class.
beast::insight::detail::StatsDMetricBase
Definition: StatsDCollector.cpp:52
beast::insight::detail::StatsDCollectorImp::metricsLock_
std::recursive_mutex metricsLock_
Definition: StatsDCollector.cpp:213
std::cerr
beast::insight::detail::StatsDMetricBase::StatsDMetricBase
StatsDMetricBase()=default
beast::insight::detail::StatsDCounterImpl::operator=
StatsDCounterImpl & operator=(StatsDCounterImpl const &)
std::function< void(void)>
beast::insight::detail::StatsDCollectorImp
Definition: StatsDCollector.cpp:193
beast::insight::detail::StatsDCollectorImp::make_gauge
Gauge make_gauge(std::string const &name) override
Create a gauge with the specified name.
Definition: StatsDCollector.cpp:268
beast::insight::MeterImpl
Definition: MeterImpl.h:31
beast::insight::detail::StatsDCollectorImp::m_socket
boost::asio::ip::udp::socket m_socket
Definition: StatsDCollector.cpp:211
beast::insight::detail::StatsDCounterImpl::m_value
CounterImpl::value_type m_value
Definition: StatsDCollector.cpp:107
beast::insight::detail::StatsDMeterImpl
Definition: StatsDCollector.cpp:166
std::deque::clear
T clear(T... args)
beast::insight::detail::StatsDGaugeImpl::m_dirty
bool m_dirty
Definition: StatsDCollector.cpp:161
beast::insight::detail::StatsDCollectorImp::to_endpoint
static boost::asio::ip::udp::endpoint to_endpoint(IP::Endpoint const &ep)
Definition: StatsDCollector.cpp:219
beast::insight::detail::StatsDGaugeImpl::increment
void increment(GaugeImpl::difference_type amount) override
Definition: StatsDCollector.cpp:575
beast::insight::detail::StatsDEventImpl::StatsDEventImpl
StatsDEventImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:523
beast::insight::detail::StatsDCollectorImp::make_hook
Hook make_hook(HookImpl::HandlerType const &handler) override
Definition: StatsDCollector.cpp:250
beast::insight::detail::StatsDCollectorImp::m_timer
boost::asio::basic_waitable_timer< std::chrono::steady_clock > m_timer
Definition: StatsDCollector.cpp:210
beast::insight::detail::StatsDCollectorImp::m_thread
std::thread m_thread
Definition: StatsDCollector.cpp:217
beast::insight::detail::StatsDCounterImpl
Definition: StatsDCollector.cpp:86
beast::insight::detail::StatsDCollectorImp::add
void add(StatsDMetricBase &metric)
Definition: StatsDCollector.cpp:282
beast::insight::detail::StatsDMeterImpl::m_name
std::string m_name
Definition: StatsDCollector.cpp:186
beast::insight::detail::StatsDCollectorImp::remove
void remove(StatsDMetricBase &metric)
Definition: StatsDCollector.cpp:288
beast::insight::detail::StatsDMeterImpl::do_increment
void do_increment(MeterImpl::value_type amount)
Definition: StatsDCollector.cpp:678
beast::insight::detail::StatsDCollectorImp::log
void log(std::vector< boost::asio::const_buffer > const &buffers)
Definition: StatsDCollector.cpp:334
std::enable_shared_from_this< StatsDCollectorImp >::shared_from_this
T shared_from_this(T... args)
beast::insight::detail::StatsDGaugeImpl::m_last_value
GaugeImpl::value_type m_last_value
Definition: StatsDCollector.cpp:159
beast::insight::detail::StatsDGaugeImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:157
thread
beast::insight::detail::StatsDCollectorImp::m_journal
Journal m_journal
Definition: StatsDCollector.cpp:204
beast::insight::detail::StatsDCollectorImp::do_post_buffer
void do_post_buffer(std::string const &buffer)
Definition: StatsDCollector.cpp:306
beast::insight::detail::StatsDMeterImpl::increment
void increment(MeterImpl::value_type amount) override
Definition: StatsDCollector.cpp:654
beast::insight::detail::StatsDMeterImpl::m_value
MeterImpl::value_type m_value
Definition: StatsDCollector.cpp:187
beast::insight::detail::StatsDCounterImpl::StatsDCounterImpl
StatsDCounterImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:471
beast::insight::detail::StatsDMeterImpl::StatsDMeterImpl
StatsDMeterImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:639
beast::insight::HookImpl::HandlerType
std::function< void(void)> HandlerType
Definition: HookImpl.h:33
beast::insight::detail::StatsDMetricBase::~StatsDMetricBase
virtual ~StatsDMetricBase()=default
beast::insight::detail::StatsDGaugeImpl::do_increment
void do_increment(GaugeImpl::difference_type amount)
Definition: StatsDCollector.cpp:609
beast::insight::detail::StatsDCollectorImp::metrics_
List< StatsDMetricBase > metrics_
Definition: StatsDCollector.cpp:214
beast::insight::StatsDCollector::New
static std::shared_ptr< StatsDCollector > New(IP::Endpoint const &address, std::string const &prefix, Journal journal)
Create a StatsD collector.
Definition: StatsDCollector.cpp:693
beast::insight::detail::StatsDEventImpl::~StatsDEventImpl
~StatsDEventImpl()=default
std::enable_shared_from_this
beast::Journal::error
Stream error() const
Definition: Journal.h:307
beast::insight::Event
A metric for reporting event timing.
Definition: Event.h:42
beast::insight::GaugeImpl
Definition: GaugeImpl.h:31
beast::insight::detail::StatsDHookImpl::StatsDHookImpl
StatsDHookImpl(HandlerType const &handler, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:451
beast::IP::Endpoint::port
Port port() const
Returns the port number on the endpoint.
Definition: IPEndpoint.h:59
beast::insight::detail::StatsDCollectorImp::m_prefix
std::string m_prefix
Definition: StatsDCollector.cpp:206
beast::insight::detail::StatsDCounterImpl::m_dirty
bool m_dirty
Definition: StatsDCollector.cpp:108
deque
beast::insight::StatsDCollector
A Collector that reports metrics to a StatsD server.
Definition: StatsDCollector.h:35
beast::insight::detail::StatsDCollectorImp::make_meter
Meter make_meter(std::string const &name) override
Create a meter with the specified name.
Definition: StatsDCollector.cpp:274
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:60
beast::insight::detail::StatsDCounterImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:516
std::int64_t
beast::insight::detail::StatsDEventImpl::do_process
void do_process()
beast::insight::detail::StatsDGaugeImpl::m_name
std::string m_name
Definition: StatsDCollector.cpp:158
beast::insight::Gauge
A metric for measuring an integral value.
Definition: Gauge.h:39
beast::insight::detail::StatsDMeterImpl::flush
void flush()
Definition: StatsDCollector.cpp:662
beast::insight::detail::StatsDHookImpl::~StatsDHookImpl
~StatsDHookImpl() override
Definition: StatsDCollector.cpp:459
std::deque::emplace_back
T emplace_back(T... args)
beast::insight::detail::StatsDCounterImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:105
beast::insight::detail::StatsDMeterImpl::~StatsDMeterImpl
~StatsDMeterImpl() override
Definition: StatsDCollector.cpp:649
beast::insight::detail::StatsDCounterImpl::m_name
std::string m_name
Definition: StatsDCollector.cpp:106
std
STL namespace.
beast::insight::detail::StatsDCollectorImp::m_address
IP::Endpoint m_address
Definition: StatsDCollector.cpp:205
climits
cassert
beast::insight::detail::StatsDCollectorImp::m_data
std::deque< std::string > m_data
Definition: StatsDCollector.cpp:212
beast::insight::detail::StatsDCollectorImp::prefix
std::string const & prefix() const
Definition: StatsDCollector.cpp:301
beast::insight::detail::StatsDCollectorImp::on_timer
void on_timer(boost::system::error_code ec)
Definition: StatsDCollector.cpp:403
beast::insight::EventImpl
Definition: EventImpl.h:31
beast::insight::detail::StatsDCollectorImp::m_work
boost::optional< boost::asio::io_service::work > m_work
Definition: StatsDCollector.cpp:208
std::chrono::milliseconds::count
T count(T... args)
beast::insight::detail::StatsDEventImpl::notify
void notify(EventImpl::value_type const &value) override
Definition: StatsDCollector.cpp:530
beast::insight::detail::StatsDCollectorImp::~StatsDCollectorImp
~StatsDCollectorImp() override
Definition: StatsDCollector.cpp:241
beast::insight::detail::StatsDCollectorImp::make_counter
Counter make_counter(std::string const &name) override
Create a counter with the specified name.
Definition: StatsDCollector.cpp:256
std::deque::empty
T empty(T... args)
beast::insight::detail::StatsDCounterImpl::increment
void increment(CounterImpl::value_type amount) override
Definition: StatsDCollector.cpp:486
mutex
std::stringstream::str
T str(T... args)
beast::insight::detail::StatsDHookImpl::operator=
StatsDHookImpl & operator=(StatsDHookImpl const &)
std::size_t
beast::insight::detail::StatsDCollectorImp::StatsDCollectorImp
StatsDCollectorImp(IP::Endpoint const &address, std::string const &prefix, Journal journal)
Definition: StatsDCollector.cpp:226
beast::IP::Endpoint
A version-independent IP address and port combination.
Definition: IPEndpoint.h:39
beast::insight::detail::StatsDMeterImpl::operator=
StatsDMeterImpl & operator=(StatsDMeterImpl const &)
beast::insight::detail::StatsDHookImpl::m_handler
HandlerType m_handler
Definition: StatsDCollector.cpp:81
beast::insight::detail::StatsDCollectorImp::post_buffer
void post_buffer(std::string &&buffer)
Definition: StatsDCollector.cpp:311
beast::insight::detail::StatsDCounterImpl::flush
void flush()
Definition: StatsDCollector.cpp:494
beast::insight::detail::StatsDGaugeImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:632
beast::insight::detail::StatsDCollectorImp::m_io_service
boost::asio::io_service m_io_service
Definition: StatsDCollector.cpp:207
beast::insight::detail::StatsDCounterImpl::do_increment
void do_increment(CounterImpl::value_type amount)
Definition: StatsDCollector.cpp:510
std::numeric_limits
beast::insight::Hook
A reference to a handler for performing polled collection.
Definition: Hook.h:31
set
beast::insight::detail::StatsDGaugeImpl::~StatsDGaugeImpl
~StatsDGaugeImpl() override
Definition: StatsDCollector.cpp:562
beast::insight::detail::StatsDMeterImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:185
std::thread::join
T join(T... args)
beast::List
Intrusive doubly linked list.
Definition: List.h:29
beast::insight::detail::StatsDMetricBase::do_process
virtual void do_process()=0
beast::insight::detail::StatsDEventImpl::operator=
StatsDEventImpl & operator=(StatsDEventImpl const &)
beast::insight::detail::StatsDGaugeImpl::operator=
StatsDGaugeImpl & operator=(StatsDGaugeImpl const &)
beast::insight::detail::StatsDGaugeImpl::m_value
GaugeImpl::value_type m_value
Definition: StatsDCollector.cpp:160
beast
Definition: base_uint.h:582