首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对上游api调用的凤凰遥测监控

对上游api调用的凤凰遥测监控
EN

Stack Overflow用户
提问于 2020-01-29 18:17:27
回答 1查看 271关注 0票数 0

我在凤凰应用程序中有以下api客户端。

代码语言:javascript
运行
复制
defmodule SomeService do
  use HTTPoison.Base


  def process_request_url(url) do
    Application.get_env(:my_app, :some_service)[:host] <> url
  end

  def process_response_body(body) do
    if String.trim(body) != "" do
      body
      |> Poison.decode! # this could fail if the response is html
      |> Enum.map(fn({k, v}) -> {String.to_atom(k), v} end)
      |> Enum.into(%{})
    else
      body
    end
  end

  def get_some_data(customer_id, access_token) do
    path = "/customer/#{customer_id}/"
    headers = [{"Authorization", "Bearer #{access_token}"}]

    case get(path, headers) do
      {:ok, %HTTPoison.Response{body: body}} ->
        {:ok, body}
      {:error, error} -> {:error, error}
      _ -> {:error, "unknown error from upstream system"}
    end

  end

end

监视传出API调用的最佳方法是什么?

  • ,即请求路径、响应、time_taken等

我们正在使用遥测技术来监控传入的请求和ECTO查询。然而,HTTPoison似乎没有提供即时遥测事件,我们如何利用遥测技术来实现这一目标呢?

EN

Stack Overflow用户

发布于 2020-01-30 08:01:11

现在,我使用响应数据来提高遥测事件,如下所示:

代码语言:javascript
运行
复制
defmodule SomeService do
  use HTTPoison.Base


  def process_request_url(url) do
    Application.get_env(:my_app, :some_service)[:host] <> url
  end

  def process_response_body(body) do
    if String.trim(body) != "" do
      body
      |> Poison.decode! # this could fail if the response is html
      |> Enum.map(fn({k, v}) -> {String.to_atom(k), v} end)
      |> Enum.into(%{})
    else
      body
    end
  end

  def get_some_data(customer_id, access_token) do
    path = "/customer/#{customer_id}/"
    headers = [{"Authorization", "Bearer #{access_token}"}]

    case get(path, headers) do
      {:ok, %HTTPoison.Response{body: body}} ->


        :telemetry.execute(
          [:my_app, :upstream_endpoint],
          %{request_path: response.request_url, 
            status_code: response.status_code, 
            response_headers: response.headers
           },
          response
        )


        {:ok, body}
      {:error, error} -> {:error, error}
      _ -> {:error, "unknown error from upstream system"}
    end

  end

end

response对象包含需要监视的所有信息(url、状态、持续时间等),并将其记录在处理程序中。

代码语言:javascript
运行
复制
    def handle_event([:my_app, :upstream_endpoint], measurements, metadata, config) do

        summary_event = []
        |> Keyword.put(:route_url, measurements.request_path)
        |> Keyword.put(:status_code, measurements.status_code)
        |> Keyword.put(:response_headers, Enum.into(measurements.response_headers, %{}))

        Logger.info("upstream-call", summary_event)
    end

事件:my_app,:upstream_endpoint附加到应用程序启动中的处理程序。

代码语言:javascript
运行
复制
:telemetry.attach("may-app", [:my_app, :upstream_endpoint], &handle_event/4, %{})

虽然目前这是很好的工作,但是对于每个api调用,都需要紧急地引发事件,而不是非常可扩展的。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59973248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档