Macros 长生不老药:pipline的定义和基准
我有宏,可以帮助我测量延迟:Macros 长生不老药:pipline的定义和基准,macros,elixir,benchmarking,duration,Macros,Elixir,Benchmarking,Duration,我有宏,可以帮助我测量延迟: 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]], tim
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())
但是我得到了
原因:undef\n',选项:[]
错误。我做错了什么?这是正确的方法吗?我在这里把它作为一个答案
TL;DR:
标签:[端点名称]
→ <代码>标签:[取消引用(端点名称)]
您的代码没有在带引号的块内解压缩
endpoint\u name
,导致编译器尝试在带引号的块的上下文内解析endpoint\u name
幸运的是,它在编译阶段提供了警告,并且一定有类似的警告
warning: variable "endpoint_name" is unused (if the variable
is not meant to be used, prefix it with an underscore)
如果想要有一个健壮的代码,编译器警告是不可忽略的,它们是故意提供的,需要加以考虑。
标签:[endpoint\u name]
→ <代码>标签:[unquote(endpoint_name)],编译过程中应该会警告您。如果您想要一个健壮的代码,编译器警告是不能忽略的。另外,如果能看到完整的错误信息,那就太好了,请下次再发。谢谢你,Aleksei!顺便说一句,我的错误消息非常糟糕,比如:[msg:“请求处理过程中出现意外错误。处理程序:\'Elixir.App.Module\';原因:undef\n',选项:[]
我可以做些什么吗?在我的代码中有什么东西吞噬了完整的错误信息吗。我不知道这里的“请求”是什么意思,也不知道它是如何被处理的,但我会明确地将测试隔离开来,只测试这个特定的宏。直接模拟直方图
和测试仪器。仪器持续时间/2
。