# OpentelemetryFunction
This package provides functions to help propagating OpenTelemetry context
across functions that are executed asynchronously.
## Installation
The package can be installed by adding `opentelemetry_function` to your list of
dependencies in `mix.exs`:
```elixir
def deps do
[
{:opentelemetry_function, "~> 0.1.0-rc.1"}
]
end
```
## Examples
Lets say you are executing a function in a different process. For example:
```elixir
task = Task.async(func)
Task.await(task, timeout)
```
OpenTelemetry by default does not propagate context through processes, so you'll have to do something like this:
```elixir
span_ctx = OpenTelemetry.Tracer.start_span("Some expensive calculation")
ctx = OpenTelemetry.Ctx.get_current()
task = Task.async(fn ->
OpenTelemetry.Ctx.attach(ctx)
OpenTelemetry.Tracer.set_current_span(span_ctx)
func.()
end)
Task.await(task, timeout)
OpenTelemetry.Span.end_span(span_ctx)
```
With this module you can use `wrap/2` function instead:
```elixir
task = Task.async(OpentelemetryFunction.wrap(func, "Some expensive calculation"))
Task.await(task, timeout)
```
This helps to keep the code short and to the point.
If you do not provide the span name, then `Function.wrap` is used as the span name.
`OpenTelemetry.Tracer` functions that work on the current span can be used as well:
```elixir
OpenTelemetry.Tracer.update_name("Some expensive calculation")
```
## Documentation
Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/opentelemetry_function](https://hexdocs.pm/opentelemetry_function).