我有一个宏,它应该可以帮助我测量延迟:
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)
如果想要拥有健壮的代码,编译器警告是不可忽视的,它们是故意提供的,需要考虑。