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/core/List.h>
21 #include <ripple/beast/insight/CounterImpl.h>
22 #include <ripple/beast/insight/EventImpl.h>
23 #include <ripple/beast/insight/GaugeImpl.h>
24 #include <ripple/beast/insight/HookImpl.h>
25 #include <ripple/beast/insight/MeterImpl.h>
26 #include <ripple/beast/insight/StatsDCollector.h>
27 #include <ripple/beast/net/IPAddressConversion.h>
28 #include <boost/asio/ip/tcp.hpp>
29 #include <cassert>
30 #include <climits>
31 #include <deque>
32 #include <functional>
33 #include <mutex>
34 #include <optional>
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
56  do_process() = 0;
57  virtual ~StatsDMetricBase() = default;
58  StatsDMetricBase() = default;
59  StatsDMetricBase(StatsDMetricBase const&) = delete;
61  operator=(StatsDMetricBase const&) = delete;
62 };
63 
64 //------------------------------------------------------------------------------
65 
67 {
68 public:
70  HandlerType const& handler,
72 
73  ~StatsDHookImpl() override;
74 
75  void
76  do_process() override;
77 
78 private:
80  operator=(StatsDHookImpl const&);
81 
84 };
85 
86 //------------------------------------------------------------------------------
87 
89 {
90 public:
92  std::string const& name,
94 
95  ~StatsDCounterImpl() override;
96 
97  void
98  increment(CounterImpl::value_type amount) override;
99 
100  void
101  flush();
102  void
104  void
105  do_process() override;
106 
107 private:
110 
114  bool m_dirty;
115 };
116 
117 //------------------------------------------------------------------------------
118 
120 {
121 public:
123  std::string const& name,
125 
126  ~StatsDEventImpl() = default;
127 
128  void
129  notify(EventImpl::value_type const& value) override;
130 
131  void
132  do_notify(EventImpl::value_type const& value);
133  void
134  do_process();
135 
136 private:
138  operator=(StatsDEventImpl const&);
139 
142 };
143 
144 //------------------------------------------------------------------------------
145 
147 {
148 public:
150  std::string const& name,
152 
153  ~StatsDGaugeImpl() override;
154 
155  void
156  set(GaugeImpl::value_type value) override;
157  void
158  increment(GaugeImpl::difference_type amount) override;
159 
160  void
161  flush();
162  void
164  void
166  void
167  do_process() override;
168 
169 private:
171  operator=(StatsDGaugeImpl const&);
172 
177  bool m_dirty;
178 };
179 
180 //------------------------------------------------------------------------------
181 
183 {
184 public:
185  explicit StatsDMeterImpl(
186  std::string const& name,
188 
189  ~StatsDMeterImpl() override;
190 
191  void
192  increment(MeterImpl::value_type amount) override;
193 
194  void
195  flush();
196  void
198  void
199  do_process() override;
200 
201 private:
203  operator=(StatsDMeterImpl const&);
204 
208  bool m_dirty;
209 };
210 
211 //------------------------------------------------------------------------------
212 
214  : public StatsDCollector,
215  public std::enable_shared_from_this<StatsDCollectorImp>
216 {
217 private:
218  enum {
219  // max_packet_size = 484
221  };
222 
226  boost::asio::io_service m_io_service;
228  boost::asio::io_service::strand m_strand;
229  boost::asio::basic_waitable_timer<std::chrono::steady_clock> m_timer;
230  boost::asio::ip::udp::socket m_socket;
234 
235  // Must come last for order of init
237 
238  static boost::asio::ip::udp::endpoint
240  {
241  return boost::asio::ip::udp::endpoint(ep.address(), ep.port());
242  }
243 
244 public:
246  IP::Endpoint const& address,
247  std::string const& prefix,
248  Journal journal)
249  : m_journal(journal)
250  , m_address(address)
251  , m_prefix(prefix)
252  , m_work(std::ref(m_io_service))
256  , m_thread(&StatsDCollectorImp::run, this)
257  {
258  }
259 
261  {
262  boost::system::error_code ec;
263  m_timer.cancel(ec);
264 
265  m_work.reset();
266  m_thread.join();
267  }
268 
269  Hook
270  make_hook(HookImpl::HandlerType const& handler) override
271  {
272  return Hook(std::make_shared<detail::StatsDHookImpl>(
273  handler, shared_from_this()));
274  }
275 
276  Counter
277  make_counter(std::string const& name) override
278  {
279  return Counter(std::make_shared<detail::StatsDCounterImpl>(
280  name, shared_from_this()));
281  }
282 
283  Event
284  make_event(std::string const& name) override
285  {
286  return Event(std::make_shared<detail::StatsDEventImpl>(
287  name, shared_from_this()));
288  }
289 
290  Gauge
291  make_gauge(std::string const& name) override
292  {
293  return Gauge(std::make_shared<detail::StatsDGaugeImpl>(
294  name, shared_from_this()));
295  }
296 
297  Meter
298  make_meter(std::string const& name) override
299  {
300  return Meter(std::make_shared<detail::StatsDMeterImpl>(
301  name, shared_from_this()));
302  }
303 
304  //--------------------------------------------------------------------------
305 
306  void
308  {
310  metrics_.push_back(metric);
311  }
312 
313  void
315  {
317  metrics_.erase(metrics_.iterator_to(metric));
318  }
319 
320  //--------------------------------------------------------------------------
321 
322  boost::asio::io_service&
324  {
325  return m_io_service;
326  }
327 
328  std::string const&
329  prefix() const
330  {
331  return m_prefix;
332  }
333 
334  void
336  {
337  m_data.emplace_back(buffer);
338  }
339 
340  void
342  {
343  m_io_service.dispatch(m_strand.wrap(std::bind(
344  &StatsDCollectorImp::do_post_buffer, this, std::move(buffer))));
345  }
346 
347  // The keepAlive parameter makes sure the buffers sent to
348  // boost::asio::async_send do not go away until the call is finished
349  void
352  boost::system::error_code ec,
353  std::size_t)
354  {
355  if (ec == boost::asio::error::operation_aborted)
356  return;
357 
358  if (ec)
359  {
360  if (auto stream = m_journal.error())
361  stream << "async_send failed: " << ec.message();
362  return;
363  }
364  }
365 
366  void
368  {
369  (void)buffers;
370 #if BEAST_STATSDCOLLECTOR_TRACING_ENABLED
371  for (auto const& buffer : buffers)
372  {
373  std::string const s(
374  boost::asio::buffer_cast<char const*>(buffer),
375  boost::asio::buffer_size(buffer));
376  std::cerr << s;
377  }
378  std::cerr << '\n';
379 #endif
380  }
381 
382  // Send what we have
383  void
385  {
386  if (m_data.empty())
387  return;
388 
389  // Break up the array of strings into blocks
390  // that each fit into one UDP packet.
391  //
393  buffers.reserve(m_data.size());
394  std::size_t size(0);
395 
396  auto keepAlive =
397  std::make_shared<std::deque<std::string>>(std::move(m_data));
398  m_data.clear();
399 
400  for (auto const& s : *keepAlive)
401  {
402  std::size_t const length(s.size());
403  assert(!s.empty());
404  if (!buffers.empty() && (size + length) > max_packet_size)
405  {
406  log(buffers);
407  m_socket.async_send(
408  buffers,
409  std::bind(
411  this,
412  keepAlive,
413  std::placeholders::_1,
414  std::placeholders::_2));
415  buffers.clear();
416  size = 0;
417  }
418 
419  buffers.emplace_back(&s[0], length);
420  size += length;
421  }
422 
423  if (!buffers.empty())
424  {
425  log(buffers);
426  m_socket.async_send(
427  buffers,
428  std::bind(
430  this,
431  keepAlive,
432  std::placeholders::_1,
433  std::placeholders::_2));
434  }
435  }
436 
437  void
439  {
440  using namespace std::chrono_literals;
441  m_timer.expires_from_now(1s);
442  m_timer.async_wait(std::bind(
443  &StatsDCollectorImp::on_timer, this, std::placeholders::_1));
444  }
445 
446  void
447  on_timer(boost::system::error_code ec)
448  {
449  if (ec == boost::asio::error::operation_aborted)
450  return;
451 
452  if (ec)
453  {
454  if (auto stream = m_journal.error())
455  stream << "on_timer failed: " << ec.message();
456  return;
457  }
458 
460 
461  for (auto& m : metrics_)
462  m.do_process();
463 
464  send_buffers();
465 
466  set_timer();
467  }
468 
469  void
470  run()
471  {
472  boost::system::error_code ec;
473 
474  if (m_socket.connect(to_endpoint(m_address), ec))
475  {
476  if (auto stream = m_journal.error())
477  stream << "Connect failed: " << ec.message();
478  return;
479  }
480 
481  set_timer();
482 
483  m_io_service.run();
484 
485  m_socket.shutdown(boost::asio::ip::udp::socket::shutdown_send, ec);
486 
487  m_socket.close();
488 
489  m_io_service.poll();
490  }
491 };
492 
493 //------------------------------------------------------------------------------
494 
496  HandlerType const& handler,
498  : m_impl(impl), m_handler(handler)
499 {
500  m_impl->add(*this);
501 }
502 
504 {
505  m_impl->remove(*this);
506 }
507 
508 void
510 {
511  m_handler();
512 }
513 
514 //------------------------------------------------------------------------------
515 
517  std::string const& name,
519  : m_impl(impl), m_name(name), m_value(0), m_dirty(false)
520 {
521  m_impl->add(*this);
522 }
523 
525 {
526  m_impl->remove(*this);
527 }
528 
529 void
531 {
532  m_impl->get_io_service().dispatch(std::bind(
534  std::static_pointer_cast<StatsDCounterImpl>(shared_from_this()),
535  amount));
536 }
537 
538 void
540 {
541  if (m_dirty)
542  {
543  m_dirty = false;
545  ss << m_impl->prefix() << "." << m_name << ":" << m_value << "|c"
546  << "\n";
547  m_value = 0;
548  m_impl->post_buffer(ss.str());
549  }
550 }
551 
552 void
554 {
555  m_value += amount;
556  m_dirty = true;
557 }
558 
559 void
561 {
562  flush();
563 }
564 
565 //------------------------------------------------------------------------------
566 
568  std::string const& name,
570  : m_impl(impl), m_name(name)
571 {
572 }
573 
574 void
576 {
577  m_impl->get_io_service().dispatch(std::bind(
579  std::static_pointer_cast<StatsDEventImpl>(shared_from_this()),
580  value));
581 }
582 
583 void
585 {
587  ss << m_impl->prefix() << "." << m_name << ":" << value.count() << "|ms"
588  << "\n";
589  m_impl->post_buffer(ss.str());
590 }
591 
592 //------------------------------------------------------------------------------
593 
595  std::string const& name,
597  : m_impl(impl), m_name(name), m_last_value(0), m_value(0), m_dirty(false)
598 {
599  m_impl->add(*this);
600 }
601 
603 {
604  m_impl->remove(*this);
605 }
606 
607 void
609 {
610  m_impl->get_io_service().dispatch(std::bind(
612  std::static_pointer_cast<StatsDGaugeImpl>(shared_from_this()),
613  value));
614 }
615 
616 void
618 {
619  m_impl->get_io_service().dispatch(std::bind(
621  std::static_pointer_cast<StatsDGaugeImpl>(shared_from_this()),
622  amount));
623 }
624 
625 void
627 {
628  if (m_dirty)
629  {
630  m_dirty = false;
632  ss << m_impl->prefix() << "." << m_name << ":" << m_value << "|g"
633  << "\n";
634  m_impl->post_buffer(ss.str());
635  }
636 }
637 
638 void
640 {
641  m_value = value;
642 
643  if (m_value != m_last_value)
644  {
646  m_dirty = true;
647  }
648 }
649 
650 void
652 {
654 
655  if (amount > 0)
656  {
657  GaugeImpl::value_type const d(
658  static_cast<GaugeImpl::value_type>(amount));
659  value +=
662  : d;
663  }
664  else if (amount < 0)
665  {
666  GaugeImpl::value_type const d(
667  static_cast<GaugeImpl::value_type>(-amount));
668  value = (d >= value) ? 0 : value - d;
669  }
670 
671  do_set(value);
672 }
673 
674 void
676 {
677  flush();
678 }
679 
680 //------------------------------------------------------------------------------
681 
683  std::string const& name,
685  : m_impl(impl), m_name(name), m_value(0), m_dirty(false)
686 {
687  m_impl->add(*this);
688 }
689 
691 {
692  m_impl->remove(*this);
693 }
694 
695 void
697 {
698  m_impl->get_io_service().dispatch(std::bind(
700  std::static_pointer_cast<StatsDMeterImpl>(shared_from_this()),
701  amount));
702 }
703 
704 void
706 {
707  if (m_dirty)
708  {
709  m_dirty = false;
711  ss << m_impl->prefix() << "." << m_name << ":" << m_value << "|m"
712  << "\n";
713  m_value = 0;
714  m_impl->post_buffer(ss.str());
715  }
716 }
717 
718 void
720 {
721  m_value += amount;
722  m_dirty = true;
723 }
724 
725 void
727 {
728  flush();
729 }
730 
731 } // namespace detail
732 
733 //------------------------------------------------------------------------------
734 
737  IP::Endpoint const& address,
738  std::string const& prefix,
739  Journal journal)
740 {
741  return std::make_shared<detail::StatsDCollectorImp>(
742  address, prefix, journal);
743 }
744 
745 } // namespace insight
746 } // namespace beast
beast::insight::detail::StatsDMeterImpl::m_dirty
bool m_dirty
Definition: StatsDCollector.cpp:208
sstream
beast::insight::detail::StatsDCollectorImp::get_io_service
boost::asio::io_service & get_io_service()
Definition: StatsDCollector.cpp:323
beast::insight::detail::StatsDEventImpl::do_notify
void do_notify(EventImpl::value_type const &value)
Definition: StatsDCollector.cpp:584
beast::insight::detail::StatsDGaugeImpl::do_set
void do_set(GaugeImpl::value_type value)
Definition: StatsDCollector.cpp:639
beast::insight::detail::StatsDMeterImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:726
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:608
beast::insight::detail::StatsDCollectorImp::m_work
std::optional< boost::asio::io_service::work > m_work
Definition: StatsDCollector.cpp:227
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:220
beast::insight::detail::StatsDEventImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:140
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:284
beast::insight::detail::StatsDEventImpl
Definition: StatsDCollector.cpp:119
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:141
beast::insight::detail::StatsDCollectorImp::run
void run()
Definition: StatsDCollector.cpp:470
std::vector
STL class.
beast::insight::detail::StatsDGaugeImpl::StatsDGaugeImpl
StatsDGaugeImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:594
std::deque::size
T size(T... args)
beast::insight::detail::StatsDCounterImpl::~StatsDCounterImpl
~StatsDCounterImpl() override
Definition: StatsDCollector.cpp:524
beast::insight::detail::StatsDGaugeImpl
Definition: StatsDCollector.cpp:146
beast::insight::detail::StatsDCollectorImp::send_buffers
void send_buffers()
Definition: StatsDCollector.cpp:384
beast::insight::detail::StatsDCollectorImp::m_strand
boost::asio::io_service::strand m_strand
Definition: StatsDCollector.cpp:228
beast::insight::detail::StatsDHookImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:509
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:350
std::chrono::milliseconds
beast::insight::detail::StatsDHookImpl
Definition: StatsDCollector.cpp:66
beast::insight::detail::StatsDGaugeImpl::flush
void flush()
Definition: StatsDCollector.cpp:626
beast::insight::detail::StatsDHookImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:82
beast::insight::detail::StatsDCollectorImp::set_timer
void set_timer()
Definition: StatsDCollector.cpp:438
beast::IP::Endpoint::address
Address const & address() const
Returns the address portion of this endpoint.
Definition: IPEndpoint.h:76
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:232
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:213
beast::insight::detail::StatsDCollectorImp::make_gauge
Gauge make_gauge(std::string const &name) override
Create a gauge with the specified name.
Definition: StatsDCollector.cpp:291
beast::insight::MeterImpl
Definition: MeterImpl.h:31
std::optional::reset
T reset(T... args)
beast::insight::detail::StatsDCollectorImp::m_socket
boost::asio::ip::udp::socket m_socket
Definition: StatsDCollector.cpp:230
beast::insight::detail::StatsDCounterImpl::m_value
CounterImpl::value_type m_value
Definition: StatsDCollector.cpp:113
beast::insight::detail::StatsDMeterImpl
Definition: StatsDCollector.cpp:182
std::deque::clear
T clear(T... args)
beast::insight::detail::StatsDGaugeImpl::m_dirty
bool m_dirty
Definition: StatsDCollector.cpp:177
beast::insight::detail::StatsDCollectorImp::to_endpoint
static boost::asio::ip::udp::endpoint to_endpoint(IP::Endpoint const &ep)
Definition: StatsDCollector.cpp:239
beast::insight::detail::StatsDGaugeImpl::increment
void increment(GaugeImpl::difference_type amount) override
Definition: StatsDCollector.cpp:617
beast::insight::detail::StatsDEventImpl::StatsDEventImpl
StatsDEventImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:567
beast::insight::detail::StatsDCollectorImp::make_hook
Hook make_hook(HookImpl::HandlerType const &handler) override
Definition: StatsDCollector.cpp:270
beast::insight::detail::StatsDCollectorImp::m_timer
boost::asio::basic_waitable_timer< std::chrono::steady_clock > m_timer
Definition: StatsDCollector.cpp:229
beast::insight::detail::StatsDCollectorImp::m_thread
std::thread m_thread
Definition: StatsDCollector.cpp:236
beast::insight::detail::StatsDCounterImpl
Definition: StatsDCollector.cpp:88
beast::insight::detail::StatsDCollectorImp::add
void add(StatsDMetricBase &metric)
Definition: StatsDCollector.cpp:307
beast::insight::detail::StatsDMeterImpl::m_name
std::string m_name
Definition: StatsDCollector.cpp:206
beast::insight::detail::StatsDCollectorImp::remove
void remove(StatsDMetricBase &metric)
Definition: StatsDCollector.cpp:314
beast::insight::detail::StatsDMeterImpl::do_increment
void do_increment(MeterImpl::value_type amount)
Definition: StatsDCollector.cpp:719
beast::insight::detail::StatsDCollectorImp::log
void log(std::vector< boost::asio::const_buffer > const &buffers)
Definition: StatsDCollector.cpp:367
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:175
beast::insight::detail::StatsDGaugeImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:173
thread
beast::insight::detail::StatsDCollectorImp::m_journal
Journal m_journal
Definition: StatsDCollector.cpp:223
beast::insight::detail::StatsDCollectorImp::do_post_buffer
void do_post_buffer(std::string const &buffer)
Definition: StatsDCollector.cpp:335
beast::insight::detail::StatsDMeterImpl::increment
void increment(MeterImpl::value_type amount) override
Definition: StatsDCollector.cpp:696
beast::insight::detail::StatsDMeterImpl::m_value
MeterImpl::value_type m_value
Definition: StatsDCollector.cpp:207
beast::insight::detail::StatsDCounterImpl::StatsDCounterImpl
StatsDCounterImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:516
beast::insight::detail::StatsDMeterImpl::StatsDMeterImpl
StatsDMeterImpl(std::string const &name, std::shared_ptr< StatsDCollectorImp > const &impl)
Definition: StatsDCollector.cpp:682
beast::insight::detail::StatsDMetricBase::~StatsDMetricBase
virtual ~StatsDMetricBase()=default
beast::insight::detail::StatsDGaugeImpl::do_increment
void do_increment(GaugeImpl::difference_type amount)
Definition: StatsDCollector.cpp:651
beast::insight::detail::StatsDCollectorImp::metrics_
List< StatsDMetricBase > metrics_
Definition: StatsDCollector.cpp:233
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:736
beast::insight::detail::StatsDEventImpl::~StatsDEventImpl
~StatsDEventImpl()=default
std::enable_shared_from_this
beast::Journal::error
Stream error() const
Definition: Journal.h:333
beast::insight::Event
A metric for reporting event timing.
Definition: Event.h:40
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:495
beast::IP::Endpoint::port
Port port() const
Returns the port number on the endpoint.
Definition: IPEndpoint.h:62
beast::insight::detail::StatsDCollectorImp::m_prefix
std::string m_prefix
Definition: StatsDCollector.cpp:225
beast::insight::detail::StatsDCounterImpl::m_dirty
bool m_dirty
Definition: StatsDCollector.cpp:114
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:298
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
beast::insight::detail::StatsDCounterImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:560
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:174
beast::insight::Gauge
A metric for measuring an integral value.
Definition: Gauge.h:39
beast::insight::detail::StatsDMeterImpl::flush
void flush()
Definition: StatsDCollector.cpp:705
beast::insight::detail::StatsDHookImpl::~StatsDHookImpl
~StatsDHookImpl() override
Definition: StatsDCollector.cpp:503
std::deque::emplace_back
T emplace_back(T... args)
beast::insight::detail::StatsDCounterImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:111
beast::insight::detail::StatsDMeterImpl::~StatsDMeterImpl
~StatsDMeterImpl() override
Definition: StatsDCollector.cpp:690
beast::insight::detail::StatsDCounterImpl::m_name
std::string m_name
Definition: StatsDCollector.cpp:112
std
STL namespace.
beast::insight::detail::StatsDCollectorImp::m_address
IP::Endpoint m_address
Definition: StatsDCollector.cpp:224
climits
cassert
beast::insight::detail::StatsDCollectorImp::m_data
std::deque< std::string > m_data
Definition: StatsDCollector.cpp:231
beast::insight::detail::StatsDCollectorImp::prefix
std::string const & prefix() const
Definition: StatsDCollector.cpp:329
beast::insight::detail::StatsDCollectorImp::on_timer
void on_timer(boost::system::error_code ec)
Definition: StatsDCollector.cpp:447
beast::insight::EventImpl
Definition: EventImpl.h:31
std::chrono::milliseconds::count
T count(T... args)
beast::insight::detail::StatsDEventImpl::notify
void notify(EventImpl::value_type const &value) override
Definition: StatsDCollector.cpp:575
beast::insight::detail::StatsDCollectorImp::~StatsDCollectorImp
~StatsDCollectorImp() override
Definition: StatsDCollector.cpp:260
beast::insight::detail::StatsDCollectorImp::make_counter
Counter make_counter(std::string const &name) override
Create a counter with the specified name.
Definition: StatsDCollector.cpp:277
std::deque::empty
T empty(T... args)
beast::insight::detail::StatsDCounterImpl::increment
void increment(CounterImpl::value_type amount) override
Definition: StatsDCollector.cpp:530
optional
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:245
beast::IP::Endpoint
A version-independent IP address and port combination.
Definition: IPEndpoint.h:38
beast::insight::detail::StatsDMeterImpl::operator=
StatsDMeterImpl & operator=(StatsDMeterImpl const &)
beast::insight::detail::StatsDHookImpl::m_handler
HandlerType m_handler
Definition: StatsDCollector.cpp:83
beast::insight::detail::StatsDCollectorImp::post_buffer
void post_buffer(std::string &&buffer)
Definition: StatsDCollector.cpp:341
std::numeric_limits::max
T max(T... args)
beast::insight::detail::StatsDCounterImpl::flush
void flush()
Definition: StatsDCollector.cpp:539
beast::insight::detail::StatsDGaugeImpl::do_process
void do_process() override
Definition: StatsDCollector.cpp:675
beast::insight::detail::StatsDCollectorImp::m_io_service
boost::asio::io_service m_io_service
Definition: StatsDCollector.cpp:226
beast::insight::detail::StatsDCounterImpl::do_increment
void do_increment(CounterImpl::value_type amount)
Definition: StatsDCollector.cpp:553
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:602
beast::insight::detail::StatsDMeterImpl::m_impl
std::shared_ptr< StatsDCollectorImp > m_impl
Definition: StatsDCollector.cpp:205
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:176
beast
Definition: base_uint.h:641