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