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 失败。

幸运的是,在编译阶段提供了警告,而且一定有点像

warning: variable "endpoint_name" is unused (if the variable
         is not meant to be used, prefix it with an underscore)

如果想要拥有健壮的代码,就不能忽略编译器警告,它们是有意提供的,需要加以考虑。