From b2f55da8067c0a162e8cacecc7788158f66f4771 Mon Sep 17 00:00:00 2001 From: Jeremy Aube Date: Sat, 6 Jun 2026 07:49:22 -0400 Subject: [PATCH] fix: average calculation on conflict When the ON CONFLICT clause in the postgres query get's trigerred, we use to make an average of the old and new data without considering the count. We now use weighted average to have mathematically correct averages --- lib/telemetry_ui/backend/ecto_postgres.ex | 2 +- test/telemetry_ui/ecto_postgres_test.exs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/telemetry_ui/backend/ecto_postgres.ex b/lib/telemetry_ui/backend/ecto_postgres.ex index 2b89cbb..71976f6 100644 --- a/lib/telemetry_ui/backend/ecto_postgres.ex +++ b/lib/telemetry_ui/backend/ecto_postgres.ex @@ -42,7 +42,7 @@ defmodule TelemetryUI.Backend.EctoPostgres do DO UPDATE SET max_value = GREATEST(telemetry_ui_events.max_value, EXCLUDED.value), min_value = LEAST(telemetry_ui_events.min_value, EXCLUDED.value), - value = ROUND((telemetry_ui_events.value + EXCLUDED.value)::numeric / 2, 4), + value = ROUND(((telemetry_ui_events.value * telemetry_ui_events.count) + (EXCLUDED.value * EXCLUDED.count))::numeric / (telemetry_ui_events.count + EXCLUDED.count), 4), count = telemetry_ui_events.count + EXCLUDED.count """, [entry.value, entry.date, entry.name, entry.tags, entry.count, entry.min_value, entry.max_value], diff --git a/test/telemetry_ui/ecto_postgres_test.exs b/test/telemetry_ui/ecto_postgres_test.exs index 425af38..32924e9 100644 --- a/test/telemetry_ui/ecto_postgres_test.exs +++ b/test/telemetry_ui/ecto_postgres_test.exs @@ -107,7 +107,7 @@ defmodule TelemetryUI.EctoPostgresTest do [event] = backend.repo.all(Entry) - assert event.value === 15.0 + assert event.value === 16.6667 assert event.tags === %{} assert event.count === 6 assert event.date === ~U[2022-02-10T00:00:00Z] @@ -136,7 +136,7 @@ defmodule TelemetryUI.EctoPostgresTest do [event] = backend.repo.all(Entry) - assert event.value === 15.0 + assert event.value === 16.6667 assert event.min_value === 10.0 assert event.max_value === 20.0 assert event.tags === %{}