Introduce `active_visitors` to `imported_pages` and start populating it with `activeUsers` from GA4 imports (#4027)
* Import `activeUsers` into `imported_pages.active_visitors` for GA4 * Add test for active visitors * Simplify assertion in active visitors test * Improve assertion for active visitors further
This commit is contained in:
parent
069170eb1d
commit
3023cb12fd
File diff suppressed because it is too large
Load Diff
|
|
@ -60,7 +60,13 @@ defmodule Plausible.Google.GA4.ReportRequest do
|
||||||
dataset: "imported_pages",
|
dataset: "imported_pages",
|
||||||
dimensions: ["date", "hostName", "pagePath"],
|
dimensions: ["date", "hostName", "pagePath"],
|
||||||
# NOTE: no exits as GA4 DATA API does not provide that metric
|
# NOTE: no exits as GA4 DATA API does not provide that metric
|
||||||
metrics: ["totalUsers", "screenPageViews", "sessions", "userEngagementDuration"]
|
metrics: [
|
||||||
|
"totalUsers",
|
||||||
|
"activeUsers",
|
||||||
|
"screenPageViews",
|
||||||
|
"sessions",
|
||||||
|
"userEngagementDuration"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
%__MODULE__{
|
%__MODULE__{
|
||||||
dataset: "imported_entry_pages",
|
dataset: "imported_entry_pages",
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,7 @@ defmodule Plausible.Imported.GoogleAnalytics4 do
|
||||||
hostname: row.dimensions |> Map.fetch!("hostName") |> String.replace_prefix("www.", ""),
|
hostname: row.dimensions |> Map.fetch!("hostName") |> String.replace_prefix("www.", ""),
|
||||||
page: row.dimensions |> Map.fetch!("pagePath") |> URI.parse() |> Map.get(:path),
|
page: row.dimensions |> Map.fetch!("pagePath") |> URI.parse() |> Map.get(:path),
|
||||||
visitors: row.metrics |> Map.fetch!("totalUsers") |> parse_number(),
|
visitors: row.metrics |> Map.fetch!("totalUsers") |> parse_number(),
|
||||||
|
active_visitors: row.metrics |> Map.fetch!("activeUsers") |> parse_number(),
|
||||||
visits: row.metrics |> Map.fetch!("sessions") |> parse_number(),
|
visits: row.metrics |> Map.fetch!("sessions") |> parse_number(),
|
||||||
pageviews: row.metrics |> Map.fetch!("screenPageViews") |> parse_number(),
|
pageviews: row.metrics |> Map.fetch!("screenPageViews") |> parse_number(),
|
||||||
# NOTE: no exits metric in GA4 API currently
|
# NOTE: no exits metric in GA4 API currently
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ defmodule Plausible.Imported.Page do
|
||||||
field :page, :string
|
field :page, :string
|
||||||
field :visits, Ch, type: "UInt64"
|
field :visits, Ch, type: "UInt64"
|
||||||
field :visitors, Ch, type: "UInt64"
|
field :visitors, Ch, type: "UInt64"
|
||||||
|
field :active_visitors, Ch, type: "UInt64"
|
||||||
field :pageviews, Ch, type: "UInt64"
|
field :pageviews, Ch, type: "UInt64"
|
||||||
field :exits, Ch, type: "UInt64"
|
field :exits, Ch, type: "UInt64"
|
||||||
field :time_on_page, Ch, type: "UInt64"
|
field :time_on_page, Ch, type: "UInt64"
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ defmodule Plausible.Imported.GoogleAnalytics4Test do
|
||||||
import Mox
|
import Mox
|
||||||
import Ecto.Query, only: [from: 2]
|
import Ecto.Query, only: [from: 2]
|
||||||
|
|
||||||
|
alias Plausible.ClickhouseRepo
|
||||||
alias Plausible.Repo
|
alias Plausible.Repo
|
||||||
alias Plausible.Imported.GoogleAnalytics4
|
alias Plausible.Imported.GoogleAnalytics4
|
||||||
|
|
||||||
|
|
@ -131,9 +132,38 @@ defmodule Plausible.Imported.GoogleAnalytics4Test do
|
||||||
assert_browsers(conn, breakdown_params)
|
assert_browsers(conn, breakdown_params)
|
||||||
assert_os(conn, breakdown_params)
|
assert_os(conn, breakdown_params)
|
||||||
assert_os_versions(conn, breakdown_params)
|
assert_os_versions(conn, breakdown_params)
|
||||||
|
assert_active_visitors(site_import)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp assert_active_visitors(site_import) do
|
||||||
|
result =
|
||||||
|
ClickhouseRepo.query!(
|
||||||
|
"SELECT date, sum(visitors) AS all_visitors, sum(active_visitors) AS all_active_visitors " <>
|
||||||
|
"FROM imported_pages WHERE site_id = #{site_import.site_id} AND import_id = #{site_import.id} GROUP BY date"
|
||||||
|
)
|
||||||
|
|> Map.fetch!(:rows)
|
||||||
|
|> Enum.map(fn [date, all_visitors, all_active_visitors] ->
|
||||||
|
%{date: date, visitors: all_visitors, active_visitors: all_active_visitors}
|
||||||
|
end)
|
||||||
|
|
||||||
|
assert length(result) == 31
|
||||||
|
|
||||||
|
Enum.each(result, fn row ->
|
||||||
|
assert row.visitors > 100 and row.active_visitors > 100
|
||||||
|
assert row.active_visitors <= row.visitors
|
||||||
|
end)
|
||||||
|
|
||||||
|
ClickhouseRepo.query!(
|
||||||
|
"SELECT time_on_page FROM imported_pages WHERE active_visitors = 0 AND " <>
|
||||||
|
"site_id = #{site_import.site_id} AND import_id = #{site_import.id}"
|
||||||
|
)
|
||||||
|
|> Map.fetch!(:rows)
|
||||||
|
|> Enum.each(fn [time_on_page] ->
|
||||||
|
assert time_on_page == 0
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
defp assert_timeseries(conn, params) do
|
defp assert_timeseries(conn, params) do
|
||||||
params =
|
params =
|
||||||
Map.put(
|
Map.put(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue