Skip to content

Commit 364cb49

Browse files
JuArceJulian Ventura
andauthored
fix(telemetry): handle json decoding errors (#1280)
Co-authored-by: Julian Ventura <[email protected]>
1 parent 8164a8f commit 364cb49

File tree

3 files changed

+33
-15
lines changed

3 files changed

+33
-15
lines changed

telemetry_api/lib/telemetry_api/operators.ex

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,37 @@ defmodule TelemetryApi.Operators do
7373
"""
7474
def fetch_all_operators() do
7575
with {:ok, operators} <- OperatorStateRetriever.get_operators() do
76-
Enum.map(operators, fn op_data ->
77-
with {:ok, full_operator_data} <- add_operator_metadata(op_data) do
78-
case Repo.get(Operator, op_data.address) do
79-
nil -> %Operator{}
80-
operator -> operator
81-
end
82-
|> Operator.changeset(full_operator_data)
83-
|> Repo.insert_or_update()
76+
# Construct tuple {%Operator{}, op_data}
77+
operators = Enum.map(operators, fn op_data ->
78+
{Repo.get(Operator, op_data.address), op_data}
79+
end)
80+
81+
# Filter operators already stored on db and those that are new
82+
#TODO: We actually don't need to add the %Operator{} here, we could do it just before the merge
83+
new_operators = Enum.filter(operators, fn {op, _} -> is_nil(op) end)
84+
|> Enum.map(fn {_, data} -> {%Operator{}, data} end)
85+
old_operators = Enum.filter(operators, fn {op, _} -> not is_nil(op) end)
86+
87+
# Fetch metadata for new operators
88+
new_operators = Enum.map(new_operators, fn {op, op_data} ->
89+
case add_operator_metadata(op_data) do
90+
{:ok, data} -> {:ok, {op, data}}
91+
{:error, msg} -> {:error, msg}
8492
end
8593
end)
86-
|> TelemetryApi.Utils.check_list_status("Error fetching operators metadata")
87-
end
94+
# Filter status ok and map to {op, op_data}
95+
|> Enum.filter(fn {status, _} -> status == :ok end)
96+
|> Enum.map(fn {_, data} -> data end)
97+
98+
# Merge both lists
99+
operators = (new_operators ++ old_operators)
100+
101+
# Insert in db
102+
Enum.map(operators, fn {op, op_data} ->
103+
Operator.changeset(op, op_data) |> Repo.insert_or_update()
104+
end)
105+
end
106+
:ok
88107
end
89108

90109
# Adds operator metadata to received operator.

telemetry_api/lib/telemetry_api/periodic/operator_fetcher.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ defmodule TelemetryApi.Periodic.OperatorFetcher do
4141

4242
defp fetch_operators_info() do
4343
case Operators.fetch_all_operators() do
44-
{:ok, _} -> :ok
44+
:ok -> :ok
4545
{:error, message} -> IO.inspect("Couldn't fetch operators: #{IO.inspect(message)}")
4646
end
4747
end

telemetry_api/lib/telemetry_api/utils.ex

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ defmodule TelemetryApi.Utils do
1515
{:error, message}
1616
"""
1717
def fetch_json_data(url) do
18-
case HTTPoison.get(url) do
19-
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
20-
{:ok, Jason.decode!(body)}
21-
18+
with {:ok, %HTTPoison.Response{status_code: 200, body: body}} <- HTTPoison.get(url) do
19+
Jason.decode(body)
20+
else
2221
{:ok, %HTTPoison.Response{status_code: status_code}} ->
2322
{:error, "Request failed with status #{status_code}"}
2423

0 commit comments

Comments
 (0)