diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3563ded..851a707 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,20 +13,20 @@ jobs: strategy: matrix: include: - - pair: - elixir: '1.11' - otp: '23.0' - pair: elixir: '1.12' - otp: '24.0' + otp: '24.3' + - pair: + elixir: '1.19' + otp: '28.4' lint: lint steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v6 - uses: erlef/setup-beam@v1 with: otp-version: ${{matrix.pair.otp}} elixir-version: ${{matrix.pair.elixir}} - - uses: actions/cache@v2 + - uses: actions/cache@v5 with: path: | deps diff --git a/CHANGELOG.md b/CHANGELOG.md index e1f3f91..7e6ba4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.2.0 + +* Start span within function, not outside. This adds support for delayed and + repeated invocations of the wrapped function. +* Bump OpenTelemetry API dependency to 1.1.0. +* Include exception message as span error status message instead of using an + empty message. +* Drop support for Elixir 1.11. + ## 0.1.0 * Initial release diff --git a/README.md b/README.md index de9f93e..e832b73 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ dependencies in `mix.exs`: ```elixir def deps do [ - {:opentelemetry_function, "~> 0.1"} + {:opentelemetry_function, "~> 0.2"} ] end ``` diff --git a/lib/opentelemetry_function.ex b/lib/opentelemetry_function.ex index 7fc780f..13fa46f 100644 --- a/lib/opentelemetry_function.ex +++ b/lib/opentelemetry_function.ex @@ -45,25 +45,25 @@ defmodule OpentelemetryFunction do @spec wrap(fun, binary) :: fun Enum.each(0..9, fn arity -> - args = for _ <- 1..arity, arity > 0, do: Macro.unique_var(:arg, __MODULE__) + args = for _ <- 1..arity//1, arity > 0, do: Macro.unique_var(:arg, __MODULE__) def wrap(original_fun, span_name) when is_function(original_fun, unquote(arity)) do - span_ctx = OpenTelemetry.Tracer.start_span(span_name) - ctx = OpenTelemetry.Ctx.get_current() + outer_ctx = OpenTelemetry.Ctx.get_current() fn unquote_splicing(args) -> - OpenTelemetry.Ctx.attach(ctx) - OpenTelemetry.Tracer.set_current_span(span_ctx) - - try do - original_fun.(unquote_splicing(args)) - rescue - exception -> - OpenTelemetry.Span.record_exception(span_ctx, exception, __STACKTRACE__, []) - OpenTelemetry.Tracer.set_status(OpenTelemetry.status(:error, "")) - reraise(exception, __STACKTRACE__) - after - OpenTelemetry.Span.end_span(span_ctx) + OpenTelemetry.Tracer.with_span outer_ctx, span_name, %{} do + try do + original_fun.(unquote_splicing(args)) + rescue + exception -> + OpenTelemetry.Tracer.record_exception(exception, __STACKTRACE__) + + OpenTelemetry.Tracer.set_status( + OpenTelemetry.status(:error, Exception.message(exception)) + ) + + reraise(exception, __STACKTRACE__) + end end end end @@ -71,22 +71,22 @@ defmodule OpentelemetryFunction do @spec wrap({module, atom, [term]}, binary()) :: fun def wrap({mod, fun, args}, span_name) do - span_ctx = OpenTelemetry.Tracer.start_span(span_name) - ctx = OpenTelemetry.Ctx.get_current() + outer_ctx = OpenTelemetry.Ctx.get_current() fn -> - OpenTelemetry.Ctx.attach(ctx) - OpenTelemetry.Tracer.set_current_span(span_ctx) - - try do - apply(mod, fun, args) - rescue - exception -> - OpenTelemetry.Span.record_exception(span_ctx, exception, __STACKTRACE__, []) - OpenTelemetry.Tracer.set_status(OpenTelemetry.status(:error, "")) - reraise(exception, __STACKTRACE__) - after - OpenTelemetry.Span.end_span(span_ctx) + OpenTelemetry.Tracer.with_span outer_ctx, span_name, %{} do + try do + apply(mod, fun, args) + rescue + exception -> + OpenTelemetry.Tracer.record_exception(exception, __STACKTRACE__) + + OpenTelemetry.Tracer.set_status( + OpenTelemetry.status(:error, Exception.message(exception)) + ) + + reraise(exception, __STACKTRACE__) + end end end end diff --git a/mix.exs b/mix.exs index cb9b09b..d846c74 100644 --- a/mix.exs +++ b/mix.exs @@ -4,8 +4,8 @@ defmodule OpentelemetryFunction.MixProject do def project do [ app: :opentelemetry_function, - version: "0.1.0", - elixir: "~> 1.11", + version: "0.2.0", + elixir: "~> 1.12", start_permanent: Mix.env() == :prod, deps: deps(), docs: [ @@ -44,13 +44,13 @@ defmodule OpentelemetryFunction.MixProject do # Run "mix help deps" to learn about dependencies. defp deps do [ - {:opentelemetry_api, "~> 1.0"}, - {:opentelemetry, "~> 1.0", only: [:test]}, + {:opentelemetry_api, "~> 1.1"}, + {:opentelemetry, "~> 1.1", only: [:test]}, ### Dev tools # Static type checking tool (see Erlang Dialyzer for more info) - {:dialyxir, "~> 1.0", only: [:dev, :test], runtime: false}, + {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, # Build documentation (run `mix docs`) {:ex_doc, "~> 0.25", only: [:dev, :test], runtime: false} diff --git a/mix.lock b/mix.lock index afe8232..f991252 100644 --- a/mix.lock +++ b/mix.lock @@ -1,12 +1,12 @@ %{ - "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, + "dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"}, "earmark_parser": {:hex, :earmark_parser, "1.4.16", "607709303e1d4e3e02f1444df0c821529af1c03b8578dfc81bb9cf64553d02b9", [:mix], [], "hexpm", "69fcf696168f5a274dd012e3e305027010658b2d1630cef68421d6baaeaccead"}, - "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, + "erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"}, "ex_doc": {:hex, :ex_doc, "0.25.3", "3edf6a0d70a39d2eafde030b8895501b1c93692effcbd21347296c18e47618ce", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "9ebebc2169ec732a38e9e779fd0418c9189b3ca93f4a676c961be6c1527913f5"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, "makeup_elixir": {:hex, :makeup_elixir, "0.15.1", "b5888c880d17d1cc3e598f05cdb5b5a91b7b17ac4eaf5f297cb697663a1094dd", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "db68c173234b07ab2a07f645a5acdc117b9f99d69ebf521821d89690ae6c6ec8"}, "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "nimble_parsec": {:hex, :nimble_parsec, "1.1.0", "3a6fca1550363552e54c216debb6a9e95bd8d32348938e13de5eda962c0d7f89", [:mix], [], "hexpm", "08eb32d66b706e913ff748f11694b17981c0b04a33ef470e33e11b3d3ac8f54b"}, - "opentelemetry": {:hex, :opentelemetry, "1.0.0", "6e98f4a9230681b2e4c88d45783ce1c02d671ffc0b5ac0cba69a34a3f5ada8d8", [:rebar3], [{:opentelemetry_api, "~> 1.0.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "08d8697740f70594d05067cb62a0a8845ff568b2d47e1f8c78c46708ab58a74f"}, - "opentelemetry_api": {:hex, :opentelemetry_api, "1.0.0", "6e501f750ead189f35aed07eb8023fa6655fca12f913a196102f67db4ed5172c", [:mix, :rebar3], [], "hexpm", "ac51520bde21fdea7f82cea9236ce4e88a21281c22bc23b0f1fa3b28b4352fcf"}, + "opentelemetry": {:hex, :opentelemetry, "1.1.0", "f843f13c3285ca6f88aebf6843ff228732369b4fa045cd629086053e9a401bdb", [:rebar3], [{:opentelemetry_api, "~> 1.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}], "hexpm", "4323fd49306005449ae7453627794dc1e701466a8eff38535b6cf0107a9a63dc"}, + "opentelemetry_api": {:hex, :opentelemetry_api, "1.1.0", "156366bfbf249f54daf2626e087e29ad91201eab670993fd9ae1bd278d03a096", [:mix, :rebar3], [], "hexpm", "e0d0b49e21e5785da675c97104c385283cae84fcc0d8522932a5dcf55489ead1"}, } diff --git a/test/opentelemetry_function_test.exs b/test/opentelemetry_function_test.exs index 71a9638..45f7169 100644 --- a/test/opentelemetry_function_test.exs +++ b/test/opentelemetry_function_test.exs @@ -148,7 +148,7 @@ defmodule OpentelemetryFunctionTest do assert_receive {:span, span(name: "root span", trace_id: root_span_trace_id)} - expected_status = OpenTelemetry.status(:error, "") + expected_status = OpenTelemetry.status(:error, "some exception") assert_receive {:span, span(