Skip to content

Commit 210da90

Browse files
authored
Assign installation_id to the OTEL resource (#2434)
Follow-up to #2409. This change makes the installation_id available in OTEL traces and metrics.
1 parent fc69b47 commit 210da90

File tree

6 files changed

+45
-4
lines changed

6 files changed

+45
-4
lines changed

packages/sync-service/config/runtime.exs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ instance_id = env!("ELECTRIC_INSTANCE_ID", :string, Electric.Utils.uuid4())
5050
version = Electric.version()
5151

5252
config :opentelemetry,
53-
resource_detectors: [:otel_resource_env_var, :otel_resource_app_env],
53+
resource_detectors: [
54+
:otel_resource_env_var,
55+
:otel_resource_app_env,
56+
Electric.Telemetry.OpenTelemetry.ResourceDetector
57+
],
5458
resource: %{service: %{name: service_name, version: version}, instance: %{id: instance_id}}
5559

5660
otlp_endpoint = env!("ELECTRIC_OTLP_ENDPOINT", :string, nil)

packages/sync-service/lib/electric/config.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ defmodule Electric.Config do
149149
Application.fetch_env!(:electric, key)
150150
end
151151

152+
def persistent_kv do
153+
with {m, f, a} <- get_env(:persistent_kv) do
154+
apply(m, f, [a])
155+
end
156+
end
157+
152158
@doc ~S"""
153159
Parse a PostgreSQL URI into a keyword list.
154160
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
defmodule Electric.Telemetry.OpenTelemetry.ResourceDetector do
2+
@behaviour :otel_resource_detector
3+
4+
# A resource detector is called inside a one-off process and has 5-6 seconds to return
5+
# the resource.
6+
#
7+
# We need to wait just long enough for the OTP application callback to persist
8+
# an installation_id to the KV store.
9+
def get_resource(_config) do
10+
{m, f, a} = Electric.Config.get_env(:persistent_kv)
11+
kv = apply(m, f, [a])
12+
13+
installation_id = poll_installation_id(kv, 100)
14+
:otel_resource.create("instance.installation_id": installation_id)
15+
end
16+
17+
defp poll_installation_id(kv, sleep_ms) do
18+
try do
19+
Electric.Config.installation_id!(kv)
20+
rescue
21+
_ ->
22+
Process.sleep(sleep_ms)
23+
poll_installation_id(kv, sleep_ms)
24+
end
25+
end
26+
end

packages/sync-service/lib/electric/telemetry/stack_telemetry.ex

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,16 @@ with_telemetry [OtelMetricExporter, Telemetry.Metrics] do
6464
end
6565

6666
defp otel_reporter_child_spec(%{otel_metrics?: true} = opts) do
67+
kv = Electric.Config.persistent_kv()
68+
6769
{OtelMetricExporter,
6870
name: :"stack_otel_telemetry_#{opts.stack_id}",
6971
metrics: otel_metrics(opts),
7072
export_period: opts.otel_export_period,
71-
resource: %{stack_id: opts.stack_id}}
73+
resource: %{
74+
stack_id: opts.stack_id,
75+
instance: %{installation_id: Electric.Config.installation_id!(kv)}
76+
}}
7277
end
7378

7479
defp otel_reporter_child_spec(_), do: nil

packages/sync-service/mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ defmodule Electric.MixProject do
138138
{:sentry, "~> 10.0"},
139139
{:opentelemetry, "~> 1.5"},
140140
{:opentelemetry_exporter, "~> 1.8"},
141-
{:otel_metric_exporter, "~> 0.2"},
141+
{:otel_metric_exporter, "~> 0.3"},
142142
# For debugging the otel_metric_exporter check it out locally and uncomment the line below
143143
# {:otel_metric_exporter, path: "../../../elixir-otel-metric-exporter"},
144144
{:telemetry_metrics_prometheus_core, "~> 1.1"},

packages/sync-service/mix.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"opentelemetry_exporter": {:hex, :opentelemetry_exporter, "1.8.0", "5d546123230771ef4174e37bedfd77e3374913304cd6ea3ca82a2add49cd5d56", [:rebar3], [{:grpcbox, ">= 0.0.0", [hex: :grpcbox, repo: "hexpm", optional: false]}, {:opentelemetry, "~> 1.5.0", [hex: :opentelemetry, repo: "hexpm", optional: false]}, {:opentelemetry_api, "~> 1.4.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}, {:tls_certificate_check, "~> 1.18", [hex: :tls_certificate_check, repo: "hexpm", optional: false]}], "hexpm", "a1f9f271f8d3b02b81462a6bfef7075fd8457fdb06adff5d2537df5e2264d9af"},
4040
"opentelemetry_semantic_conventions": {:hex, :opentelemetry_semantic_conventions, "1.27.0", "acd0194a94a1e57d63da982ee9f4a9f88834ae0b31b0bd850815fe9be4bbb45f", [:mix, :rebar3], [], "hexpm", "9681ccaa24fd3d810b4461581717661fd85ff7019b082c2dff89c7d5b1fc2864"},
4141
"opentelemetry_telemetry": {:hex, :opentelemetry_telemetry, "1.1.1", "4a73bfa29d7780ffe33db345465919cef875034854649c37ac789eb8e8f38b21", [:mix, :rebar3], [{:opentelemetry_api, "~> 1.0", [hex: :opentelemetry_api, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ee43b14e6866123a3ee1344e3c0d3d7591f4537542c2a925fcdbf46249c9b50b"},
42-
"otel_metric_exporter": {:hex, :otel_metric_exporter, "0.2.4", "1e476848c52e7967d4e938603b0db840798ae3525407e85596508885e68374ce", [:mix], [{:finch, "~> 0.19", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:nimble_options, "~> 1.1", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:protobuf, "~> 0.13.0", [hex: :protobuf, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "bbb8667cae543df822def74625d1e1bf62206a5349da14604b8a9a563507a080"},
42+
"otel_metric_exporter": {:hex, :otel_metric_exporter, "0.3.4", "801e99db107c99eabe57a6bc0750c0fa375c84ab1012183fae3c378bd6fb55be", [:mix], [{:finch, "~> 0.19", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:nimble_options, "~> 1.1", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:protobuf, "~> 0.13.0", [hex: :protobuf, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}, {:telemetry_metrics, "~> 1.0", [hex: :telemetry_metrics, repo: "hexpm", optional: false]}], "hexpm", "db7473226ee36cb16d546124f751e94c0a7a071ab9a2a278185a589ed6f40f4d"},
4343
"pg_query_ex": {:hex, :pg_query_ex, "0.5.3", "84bf09f4ea10ada6e1cbfd739ccb9ffb6e5b21d87ab81cf52a42fefcc1808566", [:make, :mix], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:protox, "~> 1.7", [hex: :protox, repo: "hexpm", optional: false]}], "hexpm", "ec0554d6d287da4cc15cc773577ef61cf41d5d6fcc784bb85f6209439cb246a7"},
4444
"plug": {:hex, :plug, "1.16.1", "40c74619c12f82736d2214557dedec2e9762029b2438d6d175c5074c933edc9d", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2 or ~> 2.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.3 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "a13ff6b9006b03d7e33874945b2755253841b238c34071ed85b0e86057f8cddc"},
4545
"plug_crypto": {:hex, :plug_crypto, "2.1.0", "f44309c2b06d249c27c8d3f65cfe08158ade08418cf540fd4f72d4d6863abb7b", [:mix], [], "hexpm", "131216a4b030b8f8ce0f26038bc4421ae60e4bb95c5cf5395e1421437824c4fa"},

0 commit comments

Comments
 (0)