[#57] Receiver for storing system stats

This commit is contained in:
Felipe Ripoll 2018-08-28 16:22:33 -06:00
parent 3628afe1d8
commit d23a3cf739
8 changed files with 182 additions and 7 deletions

View File

@ -28,7 +28,8 @@ config :poa_backend,
port: 8181,
ws_secret: "wssecret"
]},
{:store_eth_stats, POABackend.Receivers.EthStats, []}
{:store_eth_stats, POABackend.Receivers.Eth.Stats, []},
{:store_system_stats, POABackend.Receivers.System.Stats, []}
]
# here we define the type of metrics we accept. We will create a GenStage Producer per each type
@ -36,7 +37,8 @@ config :poa_backend,
:metrics,
[
:ethereum_metrics,
:networking_metrics
:networking_metrics,
:system_metrics
]
# here we have to define the relationship between receivers and metric types. The format is {receiver_id, [metric_type]}.
@ -45,7 +47,8 @@ config :poa_backend,
:subscriptions,
[
{:dashboard_receiver, [:ethereum_metrics, :networking_metrics]},
{:store_eth_stats, [:ethereum_metrics]}
{:store_eth_stats, [:ethereum_metrics]},
{:store_system_stats, [:system_metrics]}
]
# here we define the configuration for the Authorisation endpoint

View File

@ -20,14 +20,16 @@ config :poa_backend,
port: 8181,
ws_secret: "mywssecret"
]},
{:store_eth_stats, POABackend.Receivers.EthStats, []}
{:store_eth_stats, POABackend.Receivers.Eth.Stats, []},
{:store_system_stats, POABackend.Receivers.System.Stats, []}
]
# here we define the type of metrics we accept. We will create a GenStage Producer per each type
config :poa_backend,
:metrics,
[
:ethereum_metrics
:ethereum_metrics,
:system_metrics
]
# here we have to define the relationship between receivers and metric types. The format is {receiver_id, [metric_type]}.
@ -36,7 +38,8 @@ config :poa_backend,
:subscriptions,
[
{:dashboard_receiver, [:ethereum_metrics]},
{:store_eth_stats, [:ethereum_metrics]}
{:store_eth_stats, [:ethereum_metrics]},
{:store_system_stats, [:system_metrics]}
]
# here we define the configuration for the Authorisation endpoint

View File

@ -1,4 +1,4 @@
defmodule POABackend.Receivers.EthStats do
defmodule POABackend.Receivers.Eth.Stats do
use POABackend.Receiver
@moduledoc false

View File

@ -0,0 +1,54 @@
defmodule POABackend.Receivers.Models.SystemStats do
use Ecto.Schema
@moduledoc false
@primary_key false
schema "system_stats" do
field :date, :naive_datetime, primary_key: true
field :agent_id, :string, primary_key: true
field :cpu_load, :float
field :disk_usage, :integer
field :memory_usage, :float
end
@type t :: %__MODULE__{
date: NaiveDateTime.t,
agent_id: String.t,
cpu_load: Float.t,
disk_usage: Float.t,
memory_usage: Float.t
}
@spec new() :: __MODULE__.t
def new do
%__MODULE__{}
end
@spec date(__MODULE__.t, NaiveDateTime.t) :: __MODULE__.t
def date(eth_stats, date) do
%__MODULE__{eth_stats | date: date}
end
@spec agent_id(__MODULE__.t, String.t) :: __MODULE__.t
def agent_id(eth_stats, agent_id) do
%__MODULE__{eth_stats | agent_id: agent_id}
end
@spec cpu_load(__MODULE__.t, Float.t) :: __MODULE__.t
def cpu_load(eth_stats, cpu_load) do
%__MODULE__{eth_stats | cpu_load: cpu_load}
end
@spec disk_usage(__MODULE__.t, Float.t) :: __MODULE__.t
def disk_usage(eth_stats, disk_usage) do
%__MODULE__{eth_stats | disk_usage: disk_usage}
end
@spec memory_usage(__MODULE__.t, Float.t) :: __MODULE__.t
def memory_usage(eth_stats, memory_usage) do
%__MODULE__{eth_stats | memory_usage: memory_usage}
end
end

View File

@ -0,0 +1,50 @@
defmodule POABackend.Receivers.System.Stats do
use POABackend.Receiver
@moduledoc false
alias POABackend.Protocol.Message
alias POABackend.Receivers.Models.SystemStats
alias POABackend.Receivers.Repo
def init_receiver(_args) do
{:ok, :no_state}
end
def metrics_received([%Message{agent_id: agent_id, data: %{"type" => "statistics", "body" => stats}}], _from, state) do
:ok = save_data(stats, agent_id)
{:ok, state}
end
def metrics_received(_metrics, _from, state) do
{:ok, state}
end
def handle_message(_message, state) do
{:ok, state}
end
def handle_inactive(_agent_id, state) do
{:ok, state}
end
def terminate(_state) do
:ok
end
defp save_data(%{"cpu_load" => cpu_load, "disk_usage" => disk_usage, "memory_usage" => memory_usage}, agent_id) do
SystemStats.new()
|> SystemStats.date(NaiveDateTime.utc_now())
|> SystemStats.agent_id(agent_id)
|> SystemStats.cpu_load(cpu_load)
|> SystemStats.disk_usage(disk_usage)
|> SystemStats.memory_usage(memory_usage)
|> Repo.insert()
:ok
end
defp save_data(_data, _agent_id) do
:ok
end
end

View File

@ -0,0 +1,13 @@
defmodule POABackend.Receivers.Repo.Migrations.CreateSystemStats do
use Ecto.Migration
def change do
create table(:system_stats, primary_key: false) do
add :date, :naive_datetime, primary_key: true
add :agent_id, :string, primary_key: true
add :cpu_load, :float
add :disk_usage, :integer
add :memory_usage, :float
end
end
end

View File

@ -6,6 +6,7 @@ defmodule POABackend.Ancillary.Utils do
:mnesia.clear_table(:banned_tokens)
truncate(POABackend.Receivers.Models.EthStats)
truncate(POABackend.Receivers.Models.SystemStats)
end
defp truncate(schema) do

View File

@ -0,0 +1,51 @@
defmodule Receivers.SystemStatsTest do
use ExUnit.Case
alias POABackend.Protocol.Message
alias POABackend.Ancillary.Utils
alias POABackend.Receivers.Repo
alias POABackend.Receivers.Models.SystemStats
setup do
Utils.clear_db()
on_exit fn ->
Utils.clear_db()
end
[]
end
test "storing stats" do
assert [] == Repo.all(SystemStats)
POABackend.Metric.add(:system_metrics, [raw_stats()])
# this will create an entry in the DB
Process.sleep(5000)
[stats] = Repo.all(SystemStats)
assert "agent_id1" == stats.agent_id
assert 9.1234 == stats.cpu_load
assert 75 == stats.disk_usage
assert 10.1234 == stats.memory_usage
end
defp raw_stats do
stats = %{
"cpu_load" => 9.1234,
"disk_usage" => 75,
"memory_usage" => 10.1234
}
%Message{
agent_id: "agent_id1",
data: %{
"type" => "statistics",
"body" => stats
}
}
end
end