marcdel
How to test OpenTelemetry(API)?
Say I have some code like this:
require OpenTelemetry.Span
require OpenTelemetry.Tracer
def hello do
OpenTelemetry.Tracer.with_span "hello method" do
val = :world
OpenTelemetry.Span.set_attributes(result: val)
val
end
end
I’d like to be able to test:
- that a span with the name “hello method” was created
- that it had the attribute
result: :world - what the parent id was, if any
- whether it was recorded
- whether it was sampled
With Telemetry you can :telemetry.attach and give it a fake handler. Not sure what the best approach is for OpenTelemetry. Anyone have ideas?
Most Liked
marcdel
Yeah, I think that’s good advice for client apps. I didn’t know Span defined a behavior and hadn’t thought about mocking the set_attributes method, so that’s good to know!
I’m actually working on a library that defines and links spans so it’s nice to have a bit more control. A couple folks on slack pointed me toward the pid and ets exporters. The example they linked registers the pid exporter to send spans to the test process and then assert that the received span has the correct attributes.
setup do
:application.stop(:opentelemetry)
:application.set_env(:opentelemetry, :tracer, :ot_tracer_default)
:application.set_env(:opentelemetry, :processors, [
{:ot_batch_processor, %{scheduled_delay_ms: 1}}
])
:application.start(:opentelemetry)
:ot_batch_processor.set_exporter(:ot_exporter_pid, self())
:ok
end
test "records spans for Phoenix web requests" do
OpentelemetryPhoenix.setup()
:telemetry.execute(
[:phoenix, :endpoint, :start],
%{system_time: System.system_time()},
%{conn: @conn, options: []}
)
:telemetry.execute(
[:phoenix, :router_dispatch, :start],
%{system_time: System.system_time()},
%{
conn: @conn,
plug: MyStoreWeb.UserOrdersController,
plug_opts: :index,
route: "/users/{user_id}/orders",
path_params: %{"user_id" => "123"}
}
)
:telemetry.execute(
[:phoenix, :endpoint, :stop],
%{duration: 444},
%{conn: stop_conn(@conn), options: []}
)
expected_status = OpenTelemetry.status(:Ok, "Ok")
assert_receive {:span,
span(
name: "GET /users/{user_id}/orders",
attributes: list,
status: ^expected_status
)}
assert [
{"http.client_ip", "10.211.55.2"},
{"http.host", "mystore"},
{"http.method", "GET"},
{"http.scheme", "http"},
{"http.status", 200},
{"http.target", "/users/123/orders"},
{"http.user_agent",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:79.0) Gecko/20100101 Firefox/79.0"},
{"net.host.ip", "10.211.55.2"},
{"net.host.port", 4000},
{"net.peer.ip", "10.211.55.2"},
{"net.peer.port", 64291},
{"net.transport", "IP.TCP"},
{"phoenix.action", "index"},
{"phoenix.plug", "Elixir.MyStoreWeb.UserOrdersController"}
] == List.keysort(list, 0)
end
1
Popular in Questions
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
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
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set?
Thanks.
New
I would like to know what is the best IDE for elixir development?
New
Using vs code and installed ElixirLS: support and debugger.
And I got an error popped up on start up says
Failed to run ‘elixir’ comma...
New
Given a string, how can I get access to its character by index? Enum.at("my_string", 2) doesn't work.
Or rather, not char, but a substr...
New
Hi,
I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
Other popular topics
Hello, I get Persian date from my client and convert it to normal calendar like this:
def jalali_string_to_miladi_english_number(persi...
New
Manning 2016 Halloween weekend sale via Deal of the Day
Friday, October 28 - Half off all MEAPs - code WM102816LT
Saturday, October 29 ...
New
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
In the Dialyzer docs ( http://erlang.org/doc/man/dialyzer.html#requesting-or-suppressing-warnings-in-source-files ), there is a way to tu...
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
Hello everybody,
usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
Hi guys, i’m new in the Elixir world, and i have to say, that i love it!
i’m having some problem to understand anonymous functions with ...
New
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
We’ve put together this wiki for Phoenix LiveView - please feel free to add any info you feel is worth including.
What is Phoenix LiveV...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New







