Elixir:defmacro和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:undefn', 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)

如果想要拥有健壮的代码,编译器警告是不可忽视的,它们是故意提供的,需要考虑。

相关内容

  • 没有找到相关文章

最新更新