nathanl
Oban Met generating JSON encoding error: (Protocol.UndefinedError) protocol JSON.Encoder not implemented
I see this error locally when running my application. mix deps shows versions:
- oban 2.19.1
- oban_met 0.1.11
- oban_pro 1.5.0
- oban_web 2.10.2
- telemetry 1.3.0
- telemetry_metrics 1.1.0
- telemetry_poller 1.1.0
[error] GenServer {Oban.Registry, {Oban, Oban.Met.Listener}} terminating
** (Protocol.UndefinedError) protocol JSON.Encoder not implemented for type Oban.Met.Values.Gauge (a struct), the protocol must be explicitly implemented.
If you have a struct, you can derive the implementation specifying which fields should be encoded to JSON:
@derive {JSON.Encoder, only: [....]}
defstruct ...
It is also possible to encode all fields, although this should be used carefully to avoid accidentally leaking private information when new fields are added:
@derive JSON.Encoder
defstruct ...
Finally, if you don't own the struct you want to encode to JSON, you may use Protocol.derive/3 placed outside of any module:
Protocol.derive(JSON.Encoder, NameOfTheStruct, only: [...])
Protocol.derive(JSON.Encoder, NameOfTheStruct). This protocol is implemented for the following type(s): Atom, BitString, Date, DateTime, Decimal, Duration, Float, Integer, List, Map, NaiveDateTime, Oban.Pro.Producer, Oban.Pro.Producer.Meta.GlobalLimit, Oban.Pro.Producer.Meta.GlobalLimit.Partition, Oban.Pro.Producer.Meta.RateLimit, Oban.Pro.Producer.Meta.RateLimit.Partition, Time
Got value:
%Oban.Met.Values.Gauge{data: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
(elixir 1.18.2) lib/json.ex:1: JSON.Encoder.impl_for!/1
(elixir 1.18.2) lib/json.ex:109: JSON.Encoder.encode/2
(elixir 1.18.2) src/elixir_json.erl:323: :elixir_json."-do_encode_map/2-lc$^0/1-0-"/2
(elixir 1.18.2) src/elixir_json.erl:323: :elixir_json.do_encode_map/2
(elixir 1.18.2) src/elixir_json.erl:308: :elixir_json.do_encode_list/2
(elixir 1.18.2) src/elixir_json.erl:323: :elixir_json."-do_encode_map/2-lc$^0/1-0-"/2
(elixir 1.18.2) src/elixir_json.erl:323: :elixir_json."-do_encode_map/2-lc$^0/1-0-"/2
(elixir 1.18.2) src/elixir_json.erl:323: :elixir_json.do_encode_map/2
(oban 2.19.1) lib/oban/notifier.ex:307: Oban.Notifier.encode/1
(elixir 1.18.2) lib/enum.ex:1714: Enum."-map/2-lists^map/1-1-"/2
(oban 2.19.1) lib/oban/notifier.ex:202: anonymous fn/4 in Oban.Notifier.notify/3
(telemetry 1.3.0) /Users/me/code/myapp/deps/telemetry/src/telemetry.erl:324: :telemetry.span/3
(oban_met 0.1.11) lib/oban/met/listener.ex:82: Oban.Met.Listener.handle_info/2
(stdlib 6.2) gen_server.erl:2345: :gen_server.try_handle_info/3
(stdlib 6.2) gen_server.erl:2433: :gen_server.handle_msg/6
(stdlib 6.2) proc_lib.erl:329: :proc_lib.init_p_do_apply/3
Last message: :report
Most Liked
sorentwo
Oban Core Team
Is there a workaround for this?
You can use oban_met v1.0 with override: true to force it. There aren’t any API changes between v0.1.11 and v1.0.0 and oban_web can use it just fine.
2
sorentwo
Oban Core Team
Oban added a transparent switch between Jason and JSON, which must also be respected by the other packages. In this case, oban_met is behind a version.
Upgrading oban_web (Changelog — Oban Web v2.12.5) and oban_met (Changelog — Oban Met v1.0.1) to the latest versions will fix the issue:
{:oban_web, "~> 2.11"},
{:oban_met, "~> 1.0"}
1
Popular in Questions
I want to try my hand at web scraping. What tools/libraries do I need to use. I’m hoping to turn this into something professional so don’...
New
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
15:22:35.803 [error] gen_event {lager_file_backend...
New
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
The Elixir Typespec docs show the following syntax for keyword lists in typespecs:
# ...
| [key: type] # keyword lists...
New
Hello, how can I check the Phoenix version ?
Thanks !
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this:
...
New
Hi! May someone helps me, please!
I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
Hi there,
I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
Other popular topics
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible.
total = 10
while total != 0
...
New
Hello all!
I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
Hi,
I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: )
Hello all, this is ...
New
In templates/appointment/index.html.eex:
<%= for appointment <- @appointments do %>
<tr>
<td><%= appoi...
New
Hello guys,
I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
I am trying to run a deploy with docker and I successfully runned with this command:
docker build -t romenigld/blog-prod .
but when I t...
New
Hi everyone,
I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
Hi there,
I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #code-sync
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








