From ee113263844de458efb1663ebfeba84edfa6478f Mon Sep 17 00:00:00 2001 From: Oleksii Sholik Date: Wed, 22 Apr 2026 01:42:49 +0200 Subject: [PATCH 1/3] feat(telemetry): export admission_control.limit metric The limit (configured capacity) is already present in the telemetry metadata of the :acquire event; add a last_value metric that reads it so dashboards can plot fill percentage (acquire.current / limit) per kind. Closes electric-sql/stratovolt#1471 Co-Authored-By: Claude Opus 4.7 (1M context) --- .changeset/export-admission-control-limit.md | 5 +++++ .../lib/electric/telemetry/stack_telemetry.ex | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/export-admission-control-limit.md diff --git a/.changeset/export-admission-control-limit.md b/.changeset/export-admission-control-limit.md new file mode 100644 index 0000000000..c80a4b42fa --- /dev/null +++ b/.changeset/export-admission-control-limit.md @@ -0,0 +1,5 @@ +--- +'@core/electric-telemetry': patch +--- + +Export `electric.admission_control.limit` metric so dashboards can plot fill percentage (`acquire.current / limit`) by `kind`. diff --git a/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex b/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex index 58679fe5c8..fecfa1c2ad 100644 --- a/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex +++ b/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex @@ -114,6 +114,11 @@ defmodule ElectricTelemetry.StackTelemetry do last_value("electric.connection.consumers_ready.total"), last_value("electric.connection.consumers_ready.failed_to_recover"), last_value("electric.admission_control.acquire.current", tags: [:kind]), + last_value("electric.admission_control.limit", + event_name: [:electric, :admission_control, :acquire], + measurement: fn _measurements, metadata -> metadata.limit end, + tags: [:kind] + ), sum("electric.admission_control.reject.count", tags: [:kind]), distribution("electric.shape_log_collector.transaction.affected_shape_count") | additional_metrics(telemetry_opts) From d355cf50864026814e5dd028e6ee29e1ff8d7b14 Mon Sep 17 00:00:00 2001 From: Oleksii Sholik Date: Wed, 22 Apr 2026 01:45:33 +0200 Subject: [PATCH 2/3] rename metric to electric.admission_control.acquire.limit Keep the exported metric name aligned with the event it reads from, matching the convention used by the other admission_control metrics. Co-Authored-By: Claude Opus 4.7 (1M context) --- .changeset/export-admission-control-limit.md | 2 +- .../lib/electric/telemetry/stack_telemetry.ex | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.changeset/export-admission-control-limit.md b/.changeset/export-admission-control-limit.md index c80a4b42fa..0ad97bada4 100644 --- a/.changeset/export-admission-control-limit.md +++ b/.changeset/export-admission-control-limit.md @@ -2,4 +2,4 @@ '@core/electric-telemetry': patch --- -Export `electric.admission_control.limit` metric so dashboards can plot fill percentage (`acquire.current / limit`) by `kind`. +Export `electric.admission_control.acquire.limit` metric so dashboards can plot fill percentage (`acquire.current / acquire.limit`) by `kind`. diff --git a/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex b/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex index fecfa1c2ad..03e4c046bd 100644 --- a/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex +++ b/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex @@ -114,8 +114,7 @@ defmodule ElectricTelemetry.StackTelemetry do last_value("electric.connection.consumers_ready.total"), last_value("electric.connection.consumers_ready.failed_to_recover"), last_value("electric.admission_control.acquire.current", tags: [:kind]), - last_value("electric.admission_control.limit", - event_name: [:electric, :admission_control, :acquire], + last_value("electric.admission_control.acquire.limit", measurement: fn _measurements, metadata -> metadata.limit end, tags: [:kind] ), From e163f8f576e726404d0d56629a799caa5c9022c4 Mon Sep 17 00:00:00 2001 From: Oleksii Sholik Date: Wed, 22 Apr 2026 01:52:06 +0200 Subject: [PATCH 3/3] move limit into measurements and export reject.limit too - Move limit from event metadata into measurements in admission_control :telemetry.execute/3 calls for both :acquire and :reject events. - Export electric.admission_control.acquire.limit and reject.limit via plain-atom last_value metrics (no 2-arity measurement function needed). Co-Authored-By: Claude Opus 4.7 (1M context) --- .changeset/export-admission-control-limit.md | 3 ++- .../lib/electric/telemetry/stack_telemetry.ex | 6 ++---- packages/sync-service/lib/electric/admission_control.ex | 9 ++++----- .../test/electric/admission_control_test.exs | 4 ++-- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/.changeset/export-admission-control-limit.md b/.changeset/export-admission-control-limit.md index 0ad97bada4..0103cf64b9 100644 --- a/.changeset/export-admission-control-limit.md +++ b/.changeset/export-admission-control-limit.md @@ -1,5 +1,6 @@ --- '@core/electric-telemetry': patch +'@core/sync-service': patch --- -Export `electric.admission_control.acquire.limit` metric so dashboards can plot fill percentage (`acquire.current / acquire.limit`) by `kind`. +Export `electric.admission_control.acquire.limit` and `electric.admission_control.reject.limit` metrics so dashboards can plot fill percentage (`acquire.current / acquire.limit`) and over-limit pressure by `kind`. diff --git a/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex b/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex index 03e4c046bd..ef0d1dab77 100644 --- a/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex +++ b/packages/electric-telemetry/lib/electric/telemetry/stack_telemetry.ex @@ -114,11 +114,9 @@ defmodule ElectricTelemetry.StackTelemetry do last_value("electric.connection.consumers_ready.total"), last_value("electric.connection.consumers_ready.failed_to_recover"), last_value("electric.admission_control.acquire.current", tags: [:kind]), - last_value("electric.admission_control.acquire.limit", - measurement: fn _measurements, metadata -> metadata.limit end, - tags: [:kind] - ), + last_value("electric.admission_control.acquire.limit", tags: [:kind]), sum("electric.admission_control.reject.count", tags: [:kind]), + last_value("electric.admission_control.reject.limit", tags: [:kind]), distribution("electric.shape_log_collector.transaction.affected_shape_count") | additional_metrics(telemetry_opts) ] diff --git a/packages/sync-service/lib/electric/admission_control.ex b/packages/sync-service/lib/electric/admission_control.ex index 907a03f6ad..63290690dc 100644 --- a/packages/sync-service/lib/electric/admission_control.ex +++ b/packages/sync-service/lib/electric/admission_control.ex @@ -91,13 +91,12 @@ defmodule Electric.AdmissionControl do # Emit telemetry event :telemetry.execute( [:electric, :admission_control, :reject], - %{count: 1}, + %{count: 1, limit: max_concurrent}, %{ stack_id: stack_id, reason: :overloaded, kind: kind, - current: current, - limit: max_concurrent + current: current } ) @@ -107,8 +106,8 @@ defmodule Electric.AdmissionControl do # Emit telemetry for current concurrency level :telemetry.execute( [:electric, :admission_control, :acquire], - %{count: 1, current: current}, - %{stack_id: stack_id, kind: kind, limit: max_concurrent} + %{count: 1, current: current, limit: max_concurrent}, + %{stack_id: stack_id, kind: kind} ) :ok diff --git a/packages/sync-service/test/electric/admission_control_test.exs b/packages/sync-service/test/electric/admission_control_test.exs index 05ab5de199..af2d6601aa 100644 --- a/packages/sync-service/test/electric/admission_control_test.exs +++ b/packages/sync-service/test/electric/admission_control_test.exs @@ -232,8 +232,8 @@ defmodule Electric.AdmissionControlTest do assert measurements.count == 1 assert measurements.current == 1 + assert measurements.limit == 10 assert metadata.kind == :initial - assert metadata.limit == 10 :telemetry.detach(handler_id) end @@ -278,10 +278,10 @@ defmodule Electric.AdmissionControlTest do %{stack_id: ^stack_id} = metadata} assert measurements.count == 1 + assert measurements.limit == 2 assert metadata.kind == :initial assert metadata.reason == :overloaded assert metadata.current == 3 - assert metadata.limit == 2 :telemetry.detach(handler_id) end