On Fri, Nov 4, 2022 at 9:29 PM Mat Trudel <m...@geeky.net> wrote:

> Hey Austin!
>
> I realize that making all of the relevant calls to Erlang directly is
> possible (I might even say straightforward), but the problem is that it's
> not *discoverable*. The intent here is to 'pave the golden path' and help
> make the existence and usage of perf_counter clear & straightforward for
> folks, and to do so in the first place they're likely to look (namely
> alongside the other `*_time` functions in `System`).
>
> I'm a pretty experienced and extremely curious guy who's been doing this
> for quite a while, and if `perf_counter` is news to me, it's likely news
> to a lot of other people as well. The intent of this proposal isn't to make
> things *possible*, it's to make them *discoverable*.
>

Fair enough and a good reason. When I was looking at implementing Telemetry
(because this was a good opportunity to dig deep to determine how to adopt
it for our main application), I looked at how many common packages were
using it and no one was calling `System.monotonic_type` or
`System.system_time`, despite the inlining.

You’re right that `:os.perf_counter` is news to me, too, but I’m not sure
how or whether *for my use case* it would be better to use that or
monotonic time, especially as everyone else is using monotonic time. For
the very low level stuff that you’re doing with Thousand Island…the
difference might be worth it.


> Also, neat context-driven start_span / stop_span model! I've been thinking
> about something similar for my upcoming telemetry work in Bandit and it's
> encouraging to see prior art for the idea!
>

I’m not going to claim credit for the model—they are basically the models
that `Plug.Telemetry` and `:telemetry.span` use, and similar (in many ways)
to what `Télemetria` and `Sybil` do, just honed razor fine for the cases
that I felt were worth supporting. I’m also deeply grateful to the Absinthe
tests for seeing how tests should be written for using Telemetry.

I think that for the next *major* version (a while from now), I’m going to
be shifting it into two or more *different* packages so that there’s a core
Erlang version (so that the functionality is available for all Beam users)
and then there are utility packages for Elixir packages. In the interim,
I’m adding the Telemetry support and will later be adding a `Req` plug-in.

-a

On Friday, November 4, 2022 at 7:05:50 p.m. UTC-4 halos...@gmail.com wrote:
>
>> I just implemented some telemetry in a library that should be usable in
>> hot paths (but likely has more expensive costs than the telemetry path) and
>> I didn’t use any of the Elixir wrappers to the Erlang module functions, but
>> called them directly.
>>
>> https://github.com/KineticCafe/app_identity/pull/3
>>
>> Do we need this?
>>
>> -a
>>
>> On Fri, Nov 4, 2022 at 4:49 PM Mat Trudel <m...@geeky.net> wrote:
>>
>>> Using tools such as telemetry in a performant manner requires access to
>>> some sort of low cost timing primitive to be able to calculate intervals.
>>> The community seems to use a mixture of `System.system_time/0` and/or
>>> `System.monotinic_time/0` to accomplish this, though neither of these are
>>> built specifically for purpose, and neither are terribly performant on
>>> super hot paths [1].
>>>
>>> As it turns out, Erlang provides a tool for exactly this purpose, though
>>> Elixir doesn't expose it natively. That tool is `:os.perf_counter/1`:
>>> https://www.erlang.org/doc/man/os.html#perf_counter-1
>>>
>>> It would be good to have first-class access to this in Elixir.
>>> Therefore, it is proposed to add the following to System:
>>>
>>> * Add `System.perf_counter/0` & `System.perf_counter/1` as thin wrappers
>>> around `:os.perf_counter`, in the same manner as is currently done for
>>> `System.system_time` et al
>>>
>>> * Add support for `perf_counter` to `System.convert_time_unit/3`. This
>>> is already supported in the underlying `:erlang.convert_time_unit/3`, it's
>>> just a matter of adding a clause to the private `normalize_time_unit`
>>> function.
>>>
>>> Combined, these will allow for *significantly* faster interval
>>> calculation, which should help speed up all sorts of hot telemetry paths.
>>>
>>> In practice, `perf_counter` is about twice as fast as `system_time`. A
>>> quick comparison (run on an M1 MacBook Air running 1.14/OTP 25.1):
>>>
>>> ```
>>> Mix.install([{:benchee, "~> 1.0", only: :dev}])
>>>
>>> Benchee.run(%{
>>>   system_time: &System.system_time/0,
>>>   monotonic_time: &System.monotonic_time/0,
>>>   perf_counter: &:os.perf_counter/0
>>> })
>>>
>>> Name                     ips        average  deviation         median
>>>       99th %
>>> perf_counter         54.03 M       18.51 ns   ±439.35%       18.33 ns
>>>     20.01 ns
>>> monotonic_time       28.10 M       35.58 ns  ±2758.64%       33.30 ns
>>>     41.70 ns
>>> system_time          23.44 M       42.67 ns  ±8964.02%       37.50 ns
>>>     45.90 ns
>>>
>>> Comparison:
>>> perf_counter         54.03 M
>>> monotonic_time       28.10 M - 1.92x slower +17.08 ns
>>> system_time          23.44 M - 2.31x slower +24.16 ns
>>> ```
>>>
>>> If folks are onboard I can get this implemented immediately.
>>>
>>> m.
>>>
>>> [1] https://github.com/mtrudel/thousand_island/issues/1, among others
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "elixir-lang-core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to elixir-lang-co...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/elixir-lang-core/9d4111e5-4799-4781-bbf1-43dae14dcb94n%40googlegroups.com
>>> <https://groups.google.com/d/msgid/elixir-lang-core/9d4111e5-4799-4781-bbf1-43dae14dcb94n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>
>>
>> --
>> Austin Ziegler • halos...@gmail.com • aus...@halostatue.ca
>> http://www.halostatue.ca/http://twitter.com/halostatue
>>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to elixir-lang-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/e9f7df4a-5ee1-4ca3-8111-c9d221ebff75n%40googlegroups.com
> <https://groups.google.com/d/msgid/elixir-lang-core/e9f7df4a-5ee1-4ca3-8111-c9d221ebff75n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>


-- 
Austin Ziegler • halosta...@gmail.com • aus...@halostatue.ca
http://www.halostatue.ca/http://twitter.com/halostatue

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAJ4ekQuhyCnHjBLHOs3XenxtzAegzya6ysQxKn589xE7E_SOrQ%40mail.gmail.com.

Reply via email to