Skip to content

Collect detailed Erlang VM metrics and send to arbitrary, pluggable backends (StatsD and Graphite backends included).

License

Notifications You must be signed in to change notification settings

xandkar/beam_stats

Repository files navigation

Build Status

beam_stats

Periodically collects and pushes VM metrics to arbitrary consumer processes, which, in-turn, can do whatever they want with the given data (such as serialize and forward to some time series storage). Includes, off by default, example implementations of consumers for:

  • StatsD (beam_stats_consumer_statsd)
  • Graphite (beam_stats_consumer_graphite)
  • CSV file (beam_stats_consumer_csv)

Essentially like folsomite, but different. Different in the following ways:

  • More-general: consumers other than graphite can be defined
  • More-focused: only concerned with VM metrics, while folsomite ships off everything from folsom (in addition to VM metrics)
  • Easier-(for me!)-to-reason-about implementation:
    • Well-defined metrics-to-binary conversions, as opposed to the nearly-arbitrary term-to-string conversions used in folsomite
    • Spec'd, tested and Dialyzed
  • More detailed stats:
    • per-process. As much process ancestry is collected as possible, then anonymous processes are aggregated to their youngest-known, named predecessor - this aggregation keeps the useful breadcrumbs, while reducing the number of unique names from exploding, which avoids the associated problems:
      1. not very useful when there're lots of short-lived processes
      2. exploading disk space usage in Whisper
    • per-ETS-table
    • and more ... see records defined in include directory

For an example of using pre-process stats to track-down memory leaks, here's a screenshot of the SSL connection process memory usage growth drop after upgrade from 17.5 to 18.1 (back in 2015): SSL memory leak going away

Adding consumers

At app config time

{env,
  [ {production_interval , 30000}
  , {consumers,
      [ {beam_stats_consumer_statsd,
          [ {consumption_interval , 60000}
          , {dst_host             , "localhost"}
          , {dst_port             , 8125}
          , {src_port             , 8124}
          , {num_msgs_per_packet  , 10}

          % If you want to name your node something other than what
          % erlang:node() returns:
          , {static_node_name     , <<"unicorn_at_rainbow">>}
          ]}
      , {beam_stats_consumer_graphite,
          [ {consumption_interval , 60000}
          , {host                 , "localhost"}
          , {port                 , 2003}
          , {timeout              , 5000}
          ]}
      , {beam_stats_consumer_csv,
          [ {consumption_interval , 60000}
          , {path                 , "beam_stats.csv"}
          ]}
      , {some_custom_consumer_module,
          [ {some_custom_option_a, "abc"}
          , {some_custom_option_b, 123}
          ]}

      ]}
  ]}

Dynamically

beam_stats_consumer:add(consumer_module, ConsumerOptions).

Removing consumers

Not yet implemented.

About

Collect detailed Erlang VM metrics and send to arbitrary, pluggable backends (StatsD and Graphite backends included).

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published