Packages
gen_metrics_bench
0.1.0
An Elixir GenMetrics benchmarking tool for GenServer and GenStage applications.
Current section
Files
Jump to
Current section
Files
lib/cluster.ex
defmodule GenMetricsBench.Cluster do
alias GenMetrics.GenServer.Cluster
alias GenMetricsBench.GenServer.Server
alias GenMetricsBench.Utils.Runtime
@moduledoc """
GenMetricsBench harness for GenServer Clusters.
This module provides a simple benchmark harness to
load a simple GenServer with flexible message sizes
and load volume.
Using 'no_metrics/0` a benchmark can be run with GenMetrics
data collection and reporting entirely disabled. This provides
a baseline benchmark reading against which you can compare
benchmarks run with GenMetrics activated.
The following benchmarks can be run with various flavours
of GenMetrics activated:
- `summary_metrics/0'
- `statistical_metrics/0`
- `statsd_metrics/0`
- `datadog_metrics/0`
"""
# GenServer operations: :call, :cast, :info
@benchmark_operation :info
@default_benchmark_load 10_000
@doc """
Run benchmark with all metrics gathering disabled.
"""
def no_metrics do
{simulator, sim_msg, sim_load} = build_benchmark()
{:ok, pid} = Server.start_link(sim_load)
do_run(pid, {simulator, sim_msg, sim_load})
end
@doc """
Run benchmark with in-memory summary metrics gathering enabled.
"""
def summary_metrics do
{simulator, sim_msg, sim_load} = build_benchmark()
{:ok, pid} = Server.start_link(sim_load)
cluster = %Cluster{name: "bench_summary_metrics", servers: [Server]}
{:ok, _mid} = GenMetrics.monitor_cluster(cluster)
do_run(pid, {simulator, sim_msg, sim_load})
end
@doc """
Run benchmark with in-memory statistical metrics gathering enabled.
"""
def statistical_metrics do
{simulator, sim_msg, sim_load} = build_benchmark()
{:ok, pid} = Server.start_link(sim_load)
cluster = %Cluster{name: "bench_statistical_metrics",
servers: [Server], opts: [statistics: true]}
{:ok, _mid} = GenMetrics.monitor_cluster(cluster)
do_run(pid, {simulator, sim_msg, sim_load})
end
@doc """
Run benchmark with `statsd` statistical metrics gathering enabled.
"""
def statsd_metrics do
{simulator, sim_msg, sim_load} = build_benchmark()
{:ok, pid} = Server.start_link(sim_load)
cluster = %Cluster{name: "bench_statsd_metrics",
servers: [Server], opts: [statistics: :statsd]}
{:ok, _mid} = GenMetrics.monitor_cluster(cluster)
do_run(pid, {simulator, sim_msg, sim_load})
end
@doc """
Run benchmark with `datadog` statistical metrics gathering enabled.
"""
def datadog_metrics do
{simulator, sim_msg, sim_load} = build_benchmark()
{:ok, pid} = Server.start_link(sim_load)
cluster = %Cluster{name: "bench_datadog_metrics",
servers: [Server], opts: [statistics: :datadog]}
{:ok, _mid} = GenMetrics.monitor_cluster(cluster)
do_run(pid, {simulator, sim_msg, sim_load})
end
defp build_benchmark do
simulator = Runtime.cluster_simulator
sim_msg = simulator.gen_msg
sim_load = Application.get_env(:gen_metrics_bench,
:benchmark_load, @default_benchmark_load)
{simulator, sim_msg, sim_load}
end
defp do_run(pid, {_, sim_msg, sim_load}) do
for _ <- 1..sim_load do
case @benchmark_operation do
:info -> Kernel.send(pid, sim_msg)
_ -> apply(GenServer, @benchmark_operation, [pid, sim_msg])
end
end
:ok
end
end