Merge pull request #58 from poanetwork/ferigis.57.store_system_stats_receiver
Ferigis.57.store system stats receiver
This commit is contained in:
commit
c5525e853d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
defmodule POABackend.Receivers.EthStats do
|
||||
defmodule POABackend.Receivers.Eth.Stats do
|
||||
use POABackend.Receiver
|
||||
|
||||
@moduledoc false
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue