Releases: marcdel/open_telemetry_decorator
v1.5.2
v1.5.1
- Fixes a bug with missing
attrs_version
Full Changelog: v1.5.0...v1.5.1
v1.5.0
- 🚨 The decorator now uses the
O11y.set_attribute(s)
functions to set attributes on spans. This means that the attribute processing logic that was here previously has been migrated there. However, there are some backwards incompatible changes listed below. - 🚨 The decorator no longer supports nested attributes in the
include
option. TheO11y
set_attribute
andset_attributes
functions should now be used to handle more complex attribute specifications. TheSpanAttributes
protocol in particular is what I recommend if you need to extract a subset of fields from an object. The example below will add onlyuser.id
anduser.name
to the span attributes.
defmodule User do
@derive {O11y.SpanAttributes, only: [:id, :name]}
defstruct [:id, :name, :email, :password]
end
defmodule UserFactory do
use OpenTelemetryDecorator
@decorate with_span("UserFactory.create", include: [:user])
def create() do
user = %User{id: 1, name: "Bob", email: "bob@work.com", password: "secret"}
{:ok, user}
end
end
- 🚨 Changes the default attrs_version to "v2". You can override this with
config :open_telemetry_decorator, attrs_version: "v1"
, but that only affects usages ofAttribtues
directly. ⚠️ Changes AttributesV2 to use theO11y.set_attribute(s)
functions. The attribute processing logic that was here previously has been migrated there. However, there are some backwards incompatible changes listed below.⚠️ Changed functionality: theerror
attribute is no longer treated differently from other attributes. It will be namespaced or prefixed as expected. If you're using Honeycomb this field will be automatically derived from the span's status_code, so you don't need to (and probably shouldn't) set it manually. Instead, useO11y.set_error/1
to set the status code to "error" and message to the provided (string or exception) value.⚠️ Changed functionality: maps and structs given toAttributes.set/2
will be flattened and prefixed with the given name. e.g.
params = %{key: "value"}
Attributes.set(:params, params)
# Becomes
%{"params.key" => "value"}
Full Changelog: v1.4.13...v1.5.0
v1.4.13
- Updates O11y dependency to v0.1.4 to fix an issue with setting error messages on spans.
Full Changelog: v1.4.12...v1.4.13
v1.4.12
v1.4.12
- Updates decorator to use the o11y version of start and end span
- Refactor tests to use
O11y.TestHelper
and the available structs for asserting on span conents.
Full Changelog: v1.4.11...v1.4.12
v1.4.11
v1.4.11
Clean up after ourselves instead of right before setting the status
I didn't realize Span.end_span
does not change the current span, which is why when the parent catches the reraise it had the wrong span as the current span.
We're starting the span in a place where we can hold on to it so we can manually update the current span to the parent so that callers that aren't using the decorator have the correct current span.
Full Changelog: v1.4.10...v1.4.11
v1.4.10
v1.4.10
Addresses an issue setting error status on parent spans after exception
When two functions that are decorated with the with_span function are nested and the child throws, the current span was not being set back to the parent as expected.
Calling Tracer.set_status would attempt to set the status on the child span which has been closed at that point and fail meaning the parent's status would be undefined.
v1.4.9
Adds the ability to pass links to a function decorated with with_span
or trace
. This is done by passing a links
option to the decorator.
The links
option should be the atom names of variables containing linked spans. You can create a link to a span with OpenTelemetry.link/1
e.g.
require OpenTelemetry.Tracer, as: Tracer
def parent do
parent_span = Tracer.start_span("parent")
link = OpenTelemetry.link(parent_span)
child(link)
end
@decorate with_span("child", links: [:parent_link])
def child(parent_link) do
# ...
:ok
end
Full Changelog: v1.4.8...v1.4.9
v1.4.8
- Adds a v2 of the attributes module and the ability to toggle between. The v2 version is more limited, but simpler and (hopefully) easier to understand.
- Changes with_span to use start/end span
Previously dyalizer would not error on invalid contracts for functions
annotated with the decorator. presumably this was because the return
actually happens in a closure.
So, for example, the following code would pass dialyzer successfully
```elixir
@spec hello :: {:ok, :asdf}
@decorate with_span("hello")
def hello do
:world
end
````
After this change it fails as expected
```shell
lib/spec_demo.ex:17:invalid_contract
The @spec for the function does not match the success typing of the function.
Function:
SpecDemo.hello/0
Success typing:
@spec hello() :: :world
```
Full Changelog: v1.4.7...v1.4.8