diff options
Diffstat (limited to 'lib/ex_prometheus_io/query.ex')
-rw-r--r-- | lib/ex_prometheus_io/query.ex | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/ex_prometheus_io/query.ex b/lib/ex_prometheus_io/query.ex new file mode 100644 index 0000000..2bba7bd --- /dev/null +++ b/lib/ex_prometheus_io/query.ex @@ -0,0 +1,56 @@ +defmodule ExPrometheusIo.Query do + + def fetch_query(query_str, query_ref, owner) do + "query=#{query_str}" <> "&time=#{:os.system_time(:seconds)}" + |> fetch_json("query") + |> Poison.decode + |> send_results(query_ref, owner) + end + + def fetch_range(query_str, start_ts, end_ts, step, query_ref, owner) do + "query=#{query_str}" + <> "&start=#{start_ts}" + <> "&end=#{end_ts}" + <> "&step=#{step}" + |> fetch_json("query_range") + |> Poison.decode + |> send_results(query_ref, owner) + end + + def fetch_series(matches, query_ref, owner) do + matches + |> Enum.map(fn(match) -> "match[]=#{match}" end) + |> Enum.join("&") + |> fetch_json("series") + |> Poison.decode + |> send_results(query_ref, owner) + end + + defp fetch_json(query_str, query_type) do + {:ok, {_, _, body}} = :httpc.request( + "http://" + <> prometheus_host + <> "/api/v1/#{query_type}?" + <> query_str + |> String.to_char_list()) + body + end + + defp send_results({:error, :invalid} = results, query_ref, owner) do + send(owner, {:prometheus_results, query_ref, results}) + end + + defp send_results( + {:ok, %{"status" => "success", "data" => results}}, query_ref, owner) do + send(owner, {:prometheus_results, query_ref, results}) + end + + defp send_results({:ok, %{"error" => message}}, query_ref, owner) do + send(owner, {:prometheus_results, query_ref, {:error, message}}) + end + + defp prometheus_host do + Application.fetch_env!(:ex_prometheus_io, :hostname) + end + +end |