简体   繁体   English

如何在 Elixir 中使用 OpenTelemetry 中的“otel_resource_detector”

[英]How to use `otel_resource_detector` from OpenTelemetry in Elixir

I'm an Erlang/Elixir noob and I'm doing a research on how to use the otel_resource_detector in Elixir. I've managed to get this working in Erlang some time ago, but I'm struggling to get things right in Elixir. This is what I have in Erlang:我是 Erlang/Elixir 新手,我正在研究如何在 Elixir 中使用otel_resource_detector 。前段时间我设法在 Erlang 中使它工作,但我正在努力在 Elixir 中做正确的事情。这是我在 Erlang 中所拥有的:

-module(extra_metadata).
-behaviour(otel_resource_detector).
-export([get_resource/1]).

get_resource(_) ->
    Resource1 = otel_resource:create(otel_resource_app_env:parse(get_metadata("/data/extrametadata.properties")), []),
    {ok, HiddenMetadataFile} = file:read_file("/data/hiddenpath.properties"),
    Resource2 = otel_resource:create(otel_resource_app_env:parse(get_metadata(HiddenMetadataFile)), []),
    otel_resource:merge(Resource1, Resource2).

get_metadata(FileName) ->
try
    {ok, MetadataFile} = file:read_file(FileName),
    Lines = binary:split(MetadataFile, <<"\n">>, [trim, global]),
    make_tuples(Lines, [])
catch _:_ -> "Extra Metadata not found"
end.

make_tuples([Line|Lines], Acc) ->
    [Key, Value] = binary:split(Line, <<"=">>),
    make_tuples(Lines, [{Key, Value}|Acc]);
make_tuples([], Acc) -> Acc.

Full Erlang app here: https://github.com/julianocosta89/erlang_otel_hello_server/tree/main完整的 Erlang 应用程序在这里: https://github.com/julianocosta89/erlang_otel_hello_server/tree/main

I'm trying to make use of the otel_resource_detector from OpenTelemetry: https://github.com/open-telemetry/opentelemetry-erlang/blob/37f3cecd9ad2a7b8f3b94c89118585991f0023b1/apps/opentelemetry/src/otel_resource_detector.erl我正在尝试使用otel_resource_detector中的 otel_resource_detector: https://github.com/open-telemetry/opentelemetry-erlang/blob/37f3cecd9ad2a7b8f3b94c 89118585991f0023b1/apps/opentelemetry/src/otel_resource_detector.erl

How would I use that in Elixir?我将如何在 Elixir 中使用它?

One can easily call modules from .人们可以很容易地从调用模块。 The first module would look like第一个模块看起来像

defmodule ExtraMetadata do

  @behaviour :otel_resource_detector

  def get_resource(_) do
    resource1 =
      :otel_resource.create(
        :otel_resource_app_env.parse(
          get_metadata("/data/extrametadata.properties")), [])

    {:ok, hidden_metadata_file} =
      File.read("/data/hiddenpath.properties")

    resource2 =
      :otel_resource.create(
        :otel_resource_app_env.parse(
          get_metadata(hidden_metadata_file)), [])

    :otel_resource.merge(resource1, resource2)
  end

  defp get_metadata(file_name) do
    try
      {ok, metadata_file} = File.read(file_name)
      lines = :binary.split(metadata_file, <<"\n">>, [:trim, :global])
      make_tuples(lines) 
    catch
      _ -> "Extra Metadata not found"
    end
  end

  # Enum.map/2 would be probably more idiomatic
  defp make_tuples(lines, acc \\ [])
  defp make_tuples([line|lines], acc) do
    [key, value] = :binary.split(line, <<"=">>)
    make_tuples(lines, [{key, value}|cc])
  defp make_tuples([], acc), do: acc
end

NB I obviously did not check the code above, some glitches might need some additional handling.注意我显然没有检查上面的代码,一些故障可能需要一些额外的处理。

Here is a working snippet:这是一个工作片段:

defmodule ExtraMetadata do

  @behaviour :otel_resource_detector

  def get_resource(_) do
    lines = read_file("/data/extrametadata.properties") |> unwrap_lines
    file_path = read_file("/data/hiddenpath.properties") |> unwrap_lines
    lines2 = read_file(file_path) |> unwrap_lines
    attributes = get_attributes(Enum.concat(lines, lines2))
    :otel_resource.create(attributes)
  end

  defp unwrap_lines({:ok, lines}), do: lines
  defp unwrap_lines({:error, _}), do: []

  defp read_file(file_name) do
    try do
      {:ok, String.split(File.read!(file_name), "\n")}
    rescue
      File.Error ->
        {:error, "File does not exist, safe to continue"}
    end
  end

  defp get_attributes(lines) do
    # Transform each string into a tuple
    Enum.map(lines, fn(line) ->
      if String.length(line) > 0 do
        [key, value] = String.split(line, "=")
        {key, value}
      else
        {:error, "Empty string"}
      end
    end)
  end
end

I've also pushed the whole project here: https://github.com/julianocosta89/elixir-hello .我还将整个项目推送到这里: https://github.com/julianocosta89/elixir-hello

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM