aboutsummaryrefslogtreecommitdiff
path: root/lib/ex_prometheus_io/query.ex
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ex_prometheus_io/query.ex')
-rw-r--r--lib/ex_prometheus_io/query.ex56
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