From 323ebf2569919288049498ad84f7271b4708c823 Mon Sep 17 00:00:00 2001 From: Luna Mendes Date: Mon, 11 Jun 2018 19:19:15 -0300 Subject: [PATCH] add adapter_spec to adapters, basic db stuff --- lib/adapters/elixire.ex | 16 +++++---------- lib/adapters/ping.ex | 16 +++++---------- lib/manager.ex | 44 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/lib/adapters/elixire.ex b/lib/adapters/elixire.ex index 876f6bb..ccc5d1d 100644 --- a/lib/adapters/elixire.ex +++ b/lib/adapters/elixire.ex @@ -1,18 +1,12 @@ defmodule Elstat.Adapter.Elixire do @behaviour Elstat.Adapter - use GenServer - require Logger - - def start_link(service_opts) do - GenServer.start_link(__MODULE__, service_opts, []) + def adapter_spec do + %{ + db_columns: [:status, :latency] + } end - - def init(service_opts) do - Logger.info("Elixire adapter started with #{inspect service_opts}") - {:ok, %{}} - end - + def check(args) do addr = args.base_url diff --git a/lib/adapters/ping.ex b/lib/adapters/ping.ex index 12d53e0..6d46168 100644 --- a/lib/adapters/ping.ex +++ b/lib/adapters/ping.ex @@ -1,18 +1,12 @@ defmodule Elstat.Adapter.Ping do @behaviour Elstat.Adapter - use GenServer - require Logger - - def start_link(service_opts) do - GenServer.start_link(__MODULE__, service_opts, []) + def adapter_spec do + %{ + db_columns: [:status] + } end - - def init(service_opts) do - Logger.info("Ping started with #{inspect service_opts}") - {:ok, %{}} - end - + def check(args) do {cmd_output, _} = System.cmd("ping", ["-c", "1", args.address]) alive? = not Regex.match?(~r/100(\.0)?% packet loss/, cmd_output) diff --git a/lib/manager.ex b/lib/manager.ex index 78d627d..d90cfda 100644 --- a/lib/manager.ex +++ b/lib/manager.ex @@ -73,8 +73,46 @@ defmodule Elstat.Manager do services = Application.fetch_env!(:elstat, :services) Sqlitex.with_db('elstat.db', fn(db) -> - Enum.each(services, fn service -> - + services + |> Map.keys + |> Enum.each(fn service_id -> + service = services[service_id] + adapter = service.adapter + + spec = adapter.adapter_spec + + columns = %{ + status: "status bool", + latency: "latency bigint", + } + + column_res = spec.db_columns + |> Enum.map(fn column -> + columns[column] + end) + |> Enum.join(",\n") + + timestamp_column = if Enum.count(spec.db_columns) == 0 do + "timestamp bigint" + else + "timestamp bigint," + end + + query = """ + CREATE TABLE IF NOT EXISTS #{Atom.to_string service_id} ( + #{timestamp_column} + #{column_res} + ); + """ + + Logger.debug "query for #{inspect service_id}: #{query}" + + case Sqlitex.query(db, query) do + {:ok, _} -> + Logger.info "created table for #{inspect service_id}" + {:error, _err} -> + Logger.error "error making table for #{inspect service_id}" + end end) end) @@ -91,7 +129,7 @@ defmodule Elstat.Manager do data = state.serv_state[key] desc = state.services[key].description - result = case data do + case data do {:map, data_map} -> {key, Map.put(data_map, :description, desc)} {:bool, data_bool} ->