Skip to content

Commit f9c8d2f

Browse files
author
Michael Ruoss
committed
only create module if deps loaded
1 parent 7930bd7 commit f9c8d2f

4 files changed

Lines changed: 168 additions & 159 deletions

File tree

guides/observability.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ K8s.Sys.OpenTelemetry.attach()
3131

3232
### Spandex
3333

34+
:warning: Requires Elixir ~> 1.10
3435

3536
If you're using a [Spandex](https://github.com/spandex-project/spandex) tracer, Attach
3637
`:telemetry` spans/events to the Spandex handler. Pass the tracer you created according

lib/k8s/sys/open_telemetry.ex

Lines changed: 81 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,95 @@
1-
defmodule K8s.Sys.OpenTelemetry do
2-
@moduledoc """
3-
This module is still in beta! It has not been tested well and feedback is welcome!
1+
if Code.ensure_loaded?(OpenTelemetry) and Code.ensure_loaded?(OpentelemetryTelemetry) do
2+
defmodule K8s.Sys.OpenTelemetry do
3+
@moduledoc """
4+
This module is still in beta! It has not been tested well and feedback is welcome!
45
5-
Converts telemetry spans to opentelemetry tracing spans
6+
Converts telemetry spans to opentelemetry tracing spans
67
7-
### Usage
8+
### Usage
89
9-
K8s.Sys.OpenTelemetry.attach()
10-
"""
10+
K8s.Sys.OpenTelemetry.attach()
11+
"""
1112

12-
@doc """
13-
Attaches telemetry spans to the opentelemetry processor
14-
"""
15-
@spec attach() :: :ok
16-
def attach do
17-
for span <- K8s.Sys.Telemetry.spans() do
18-
span_name = Enum.join(span, ".")
13+
@doc """
14+
Attaches telemetry spans to the opentelemetry processor
15+
"""
16+
@spec attach() :: :ok
17+
def attach do
18+
for span <- K8s.Sys.Telemetry.spans() do
19+
span_name = Enum.join(span, ".")
1920

20-
:ok =
21-
:telemetry.attach(
22-
"k8s-otel-tracer-#{span_name}-start",
23-
span ++ [:start],
24-
&__MODULE__.handle_event/4,
25-
%{tracer_id: :k8s, type: :start, span_name: "k8s." <> span_name}
26-
)
21+
:ok =
22+
:telemetry.attach(
23+
"k8s-otel-tracer-#{span_name}-start",
24+
span ++ [:start],
25+
&__MODULE__.handle_event/4,
26+
%{tracer_id: :k8s, type: :start, span_name: "k8s." <> span_name}
27+
)
2728

28-
:ok =
29-
:telemetry.attach(
30-
"k8s-otel-tracer-#{span_name}-stop",
31-
span ++ [:stop],
32-
&__MODULE__.handle_event/4,
33-
%{tracer_id: :k8s, type: :stop}
34-
)
29+
:ok =
30+
:telemetry.attach(
31+
"k8s-otel-tracer-#{span_name}-stop",
32+
span ++ [:stop],
33+
&__MODULE__.handle_event/4,
34+
%{tracer_id: :k8s, type: :stop}
35+
)
3536

36-
:ok =
37-
:telemetry.attach(
38-
"k8s-otel-tracer-#{span_name}-exception",
39-
span ++ [:exception],
40-
&__MODULE__.handle_event/4,
41-
%{tracer_id: :k8s, type: :exception}
42-
)
37+
:ok =
38+
:telemetry.attach(
39+
"k8s-otel-tracer-#{span_name}-exception",
40+
span ++ [:exception],
41+
&__MODULE__.handle_event/4,
42+
%{tracer_id: :k8s, type: :exception}
43+
)
44+
end
45+
46+
:ok
4347
end
4448

45-
:ok
46-
end
49+
@doc false
50+
@spec handle_event(
51+
:telemetry.event_name(),
52+
:telemetry.event_measurements(),
53+
:telemetry.event_metadata(),
54+
:telemetry.handler_config()
55+
) :: any()
56+
def handle_event(
57+
_event,
58+
%{system_time: start_time},
59+
metadata,
60+
%{type: :start, tracer_id: tracer_id, span_name: name}
61+
) do
62+
start_opts = %{start_time: start_time}
63+
OpentelemetryTelemetry.start_telemetry_span(tracer_id, name, metadata, start_opts)
64+
:ok
65+
end
4766

48-
@doc false
49-
@spec handle_event(
50-
:telemetry.event_name(),
51-
:telemetry.event_measurements(),
52-
:telemetry.event_metadata(),
53-
:telemetry.handler_config()
54-
) :: any()
55-
def handle_event(
56-
_event,
57-
%{system_time: start_time},
58-
metadata,
59-
%{type: :start, tracer_id: tracer_id, span_name: name}
60-
) do
61-
start_opts = %{start_time: start_time}
62-
OpentelemetryTelemetry.start_telemetry_span(tracer_id, name, metadata, start_opts)
63-
:ok
64-
end
67+
def handle_event(
68+
_event,
69+
%{duration: duration},
70+
metadata,
71+
%{type: :stop, tracer_id: tracer_id}
72+
) do
73+
OpentelemetryTelemetry.set_current_telemetry_span(tracer_id, metadata)
74+
OpenTelemetry.Tracer.set_attribute(:duration, duration)
75+
OpentelemetryTelemetry.end_telemetry_span(tracer_id, metadata)
76+
:ok
77+
end
6578

66-
def handle_event(
67-
_event,
68-
%{duration: duration},
69-
metadata,
70-
%{type: :stop, tracer_id: tracer_id}
71-
) do
72-
OpentelemetryTelemetry.set_current_telemetry_span(tracer_id, metadata)
73-
OpenTelemetry.Tracer.set_attribute(:duration, duration)
74-
OpentelemetryTelemetry.end_telemetry_span(tracer_id, metadata)
75-
:ok
76-
end
79+
def handle_event(
80+
_event,
81+
%{duration: duration},
82+
%{kind: kind, reason: reason, stacktrace: stacktrace} = metadata,
83+
%{type: :exception, tracer_id: tracer_id}
84+
) do
85+
ctx = OpentelemetryTelemetry.set_current_telemetry_span(tracer_id, metadata)
86+
status = OpenTelemetry.status(:error, inspect(reason))
87+
OpenTelemetry.Span.record_exception(ctx, kind, stacktrace, duration: duration)
88+
OpenTelemetry.Tracer.set_status(status)
89+
OpentelemetryTelemetry.end_telemetry_span(tracer_id, metadata)
90+
:ok
91+
end
7792

78-
def handle_event(
79-
_event,
80-
%{duration: duration},
81-
%{kind: kind, reason: reason, stacktrace: stacktrace} = metadata,
82-
%{type: :exception, tracer_id: tracer_id}
83-
) do
84-
ctx = OpentelemetryTelemetry.set_current_telemetry_span(tracer_id, metadata)
85-
status = OpenTelemetry.status(:error, inspect(reason))
86-
OpenTelemetry.Span.record_exception(ctx, kind, stacktrace, duration: duration)
87-
OpenTelemetry.Tracer.set_status(status)
88-
OpentelemetryTelemetry.end_telemetry_span(tracer_id, metadata)
89-
:ok
93+
def handle_event(_event, _measurements, _metadata, _config), do: :ok
9094
end
91-
92-
def handle_event(_event, _measurements, _metadata, _config), do: :ok
9395
end

lib/k8s/sys/spandex.ex

Lines changed: 80 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,96 @@
1-
defmodule K8s.Sys.Spandex do
2-
@moduledoc """
3-
This module is still in beta! It has not been tested well and feedback is welcome!
1+
if Code.ensure_loaded?(Spandex) do
2+
defmodule K8s.Sys.Spandex do
3+
@moduledoc """
4+
This module is still in beta! It has not been tested well and feedback is welcome!
45
5-
Converts telemetry spans to Spandex tracing spans.
6+
Converts telemetry spans to Spandex tracing spans.
67
7-
### Usage
8+
### Usage
89
9-
K8s.Sys.Spandex.attach(MyApp.Tracer)
10-
"""
10+
K8s.Sys.Spandex.attach(MyApp.Tracer)
11+
"""
1112

12-
require Spandex
13+
require Spandex
1314

14-
@doc """
15-
Attaches telemetry spans to the spandex processor
16-
"""
17-
@spec attach(atom()) :: :ok
18-
def attach(tracer) do
19-
for span <- K8s.Sys.Telemetry.spans() do
20-
span_name = Enum.join(span, ".")
15+
@doc """
16+
Attaches telemetry spans to the spandex processor
17+
"""
18+
@spec attach(atom()) :: :ok
19+
def attach(tracer) do
20+
for span <- K8s.Sys.Telemetry.spans() do
21+
span_name = Enum.join(span, ".")
2122

22-
:ok =
23-
:telemetry.attach(
24-
"k8s-spandex-tracer-#{span_name}-start",
25-
span ++ [:start],
26-
&__MODULE__.handle_event/4,
27-
%{tracer: tracer, type: :start, span_name: "k8s." <> span_name}
28-
)
23+
:ok =
24+
:telemetry.attach(
25+
"k8s-spandex-tracer-#{span_name}-start",
26+
span ++ [:start],
27+
&__MODULE__.handle_event/4,
28+
%{tracer: tracer, type: :start, span_name: "k8s." <> span_name}
29+
)
2930

30-
:ok =
31-
:telemetry.attach(
32-
"k8s-spandex-tracer-#{span_name}-stop",
33-
span ++ [:stop],
34-
&__MODULE__.handle_event/4,
35-
%{tracer: tracer, type: :stop}
36-
)
31+
:ok =
32+
:telemetry.attach(
33+
"k8s-spandex-tracer-#{span_name}-stop",
34+
span ++ [:stop],
35+
&__MODULE__.handle_event/4,
36+
%{tracer: tracer, type: :stop}
37+
)
3738

38-
:ok =
39-
:telemetry.attach(
40-
"k8s-spandex-tracer-#{span_name}-exception",
41-
span ++ [:exception],
42-
&__MODULE__.handle_event/4,
43-
%{tracer: tracer, type: :exception}
44-
)
39+
:ok =
40+
:telemetry.attach(
41+
"k8s-spandex-tracer-#{span_name}-exception",
42+
span ++ [:exception],
43+
&__MODULE__.handle_event/4,
44+
%{tracer: tracer, type: :exception}
45+
)
46+
end
47+
48+
:ok
4549
end
4650

47-
:ok
48-
end
51+
@doc false
52+
@spec handle_event(
53+
:telemetry.event_name(),
54+
:telemetry.event_measurements(),
55+
:telemetry.event_metadata(),
56+
:telemetry.handler_config()
57+
) :: any()
58+
def handle_event(
59+
_event,
60+
%{system_time: _start_time},
61+
metadata,
62+
%{type: :start, tracer: tracer, span_name: name}
63+
) do
64+
tracer.start_span(name, service: :k8s, type: :custom, tags: Map.to_list(metadata))
65+
:ok
66+
end
4967

50-
@doc false
51-
@spec handle_event(
52-
:telemetry.event_name(),
53-
:telemetry.event_measurements(),
54-
:telemetry.event_metadata(),
55-
:telemetry.handler_config()
56-
) :: any()
57-
def handle_event(
58-
_event,
59-
%{system_time: _start_time},
60-
metadata,
61-
%{type: :start, tracer: tracer, span_name: name}
62-
) do
63-
tracer.start_span(name, service: :k8s, type: :custom, tags: Map.to_list(metadata))
64-
:ok
65-
end
68+
def handle_event(
69+
_event,
70+
%{duration: _duration},
71+
metadata,
72+
%{type: :stop, tracer: tracer}
73+
) do
74+
tracer.update_span(tags: Map.to_list(metadata))
75+
tracer.finish_span()
76+
:ok
77+
end
6678

67-
def handle_event(
68-
_event,
69-
%{duration: _duration},
70-
metadata,
71-
%{type: :stop, tracer: tracer}
72-
) do
73-
tracer.update_span(tags: Map.to_list(metadata))
74-
tracer.finish_span()
75-
:ok
76-
end
79+
def handle_event(
80+
_event,
81+
%{duration: _duration},
82+
%{kind: kind, reason: reason, stacktrace: stacktrace} = metadata,
83+
%{type: :exception, tracer: tracer}
84+
) do
85+
metadata =
86+
metadata
87+
|> Map.put(:error, reason)
88+
|> Map.delete(:reason)
7789

78-
def handle_event(
79-
_event,
80-
%{duration: _duration},
81-
%{kind: kind, reason: reason, stacktrace: stacktrace} = metadata,
82-
%{type: :exception, tracer: tracer}
83-
) do
84-
metadata =
85-
metadata
86-
|> Map.put(:error, reason)
87-
|> Map.delete(:reason)
90+
tracer.span_error(kind, stacktrace, error: reason, tags: metadata)
91+
:ok
92+
end
8893

89-
tracer.span_error(kind, stacktrace, error: reason, tags: metadata)
90-
:ok
94+
def handle_event(_event, _measurements, _metadata, _config), do: :ok
9195
end
92-
93-
def handle_event(_event, _measurements, _metadata, _config), do: :ok
9496
end

mix.exs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,13 @@ defmodule K8s.MixProject do
3131

3232
# Run "mix help deps" to learn about dependencies.
3333
defp deps do
34-
[
34+
deps = [
3535
{:yaml_elixir, "~> 2.8"},
3636
{:httpoison, "~> 1.7"},
3737
{:jason, "~> 1.0"},
3838
{:telemetry, "~> 1.0"},
3939
{:opentelemetry_telemetry, "~> 1.0.0-beta.4", optional: true},
4040
{:opentelemetry, "~> 1.0", optional: true},
41-
{:spandex, "~> 3.0.3", optional: true},
4241

4342
# dev/test deps (e.g. code coverage)
4443
{:inch_ex, github: "rrrene/inch_ex", only: [:dev, :test]},
@@ -48,6 +47,11 @@ defmodule K8s.MixProject do
4847
{:excoveralls, "~> 0.14", only: [:test]},
4948
{:mix_test_watch, "~> 1.1", only: :dev, runtime: false}
5049
]
50+
51+
# spandex requires 1.10
52+
if Version.match?(System.version(), "~> 1.10"),
53+
do: [{:spandex, "~> 3.0.3", optional: true} | deps],
54+
else: deps
5155
end
5256

5357
defp package do

0 commit comments

Comments
 (0)