Elixir:管道的 defmacro 和基准测试
Elixir: defmacro and benchmark of pipline
我有宏可以帮助我测量延迟:
defmacro instrument_duration(endpoint_name, block) do
quote do
{time, value} = :timer.tc(fn -> unquote(block) end)
Histogram.observe(
[name: :endpoint_duration_seconds, labels: [endpoint_name]],
time
)
value
end
end
下面是使用它的代码:
response =
Instrumenter.instrument_duration(id,
do_handle(params, context)
|> prepare_response())
但是我收到 Reason:undef\n', options: []
错误。我在这里做错了什么?这是正确的方法吗?
我要把这个作为答案放在这里。
TL;DR: labels: [endpoint_name]
→ labels: [unquote(endpoint_name)]
您的代码没有取消引用块内的 endpoint_name
,导致编译器在引用块的上下文中尝试解析 endpoint_name
失败。
幸运的是,elixir在编译阶段提供了警告,而且一定有点像
warning: variable "endpoint_name" is unused (if the variable
is not meant to be used, prefix it with an underscore)
如果想要拥有健壮的代码,就不能忽略编译器警告,它们是有意提供的,需要加以考虑。
我有宏可以帮助我测量延迟:
defmacro instrument_duration(endpoint_name, block) do
quote do
{time, value} = :timer.tc(fn -> unquote(block) end)
Histogram.observe(
[name: :endpoint_duration_seconds, labels: [endpoint_name]],
time
)
value
end
end
下面是使用它的代码:
response =
Instrumenter.instrument_duration(id,
do_handle(params, context)
|> prepare_response())
但是我收到 Reason:undef\n', options: []
错误。我在这里做错了什么?这是正确的方法吗?
我要把这个作为答案放在这里。
TL;DR: labels: [endpoint_name]
→ labels: [unquote(endpoint_name)]
您的代码没有取消引用块内的 endpoint_name
,导致编译器在引用块的上下文中尝试解析 endpoint_name
失败。
幸运的是,elixir在编译阶段提供了警告,而且一定有点像
warning: variable "endpoint_name" is unused (if the variable
is not meant to be used, prefix it with an underscore)
如果想要拥有健壮的代码,就不能忽略编译器警告,它们是有意提供的,需要加以考虑。