Allow custom event timeseries in stats API (#3505)

* Allow custom event timeseries in stats API

* Fix linting error

---------

Co-authored-by: Uku Taht <Uku.taht@gmail.com>
This commit is contained in:
Márton Salomváry 2023-11-17 11:37:56 +01:00 committed by GitHub
parent cfaa5be8f4
commit 555eb25d20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 1 deletions

View File

@ -38,6 +38,7 @@ All notable changes to this project will be documented in this file.
- Update bot detection (matomo 6.1.4, ua_inspector 3.4.0)
- Improved the Goal Settings page (search, autcompletion etc.)
- Log mailer errors plausible/analytics#3336
- Allow custom event timeseries in stats API plausible/analytics#3505
## v2.0.0 - 2023-07-12

View File

@ -15,7 +15,7 @@ defmodule Plausible.Stats.Timeseries do
@typep value :: nil | integer() | float()
@type results :: nonempty_list(%{required(:date) => Date.t(), required(metric()) => value()})
@event_metrics [:visitors, :pageviews, :average_revenue, :total_revenue]
@event_metrics [:visitors, :pageviews, :events, :average_revenue, :total_revenue]
@session_metrics [:visits, :bounce_rate, :visit_duration, :views_per_visit]
def timeseries(site, query, metrics) do
steps = buckets(query)
@ -218,10 +218,12 @@ defmodule Plausible.Stats.Timeseries do
end
end
# credo:disable-for-next-line Credo.Check.Refactor.CyclomaticComplexity
defp empty_row(date, metrics) do
Enum.reduce(metrics, %{date: date}, fn metric, row ->
case metric do
:pageviews -> Map.merge(row, %{pageviews: 0})
:events -> Map.merge(row, %{events: 0})
:visitors -> Map.merge(row, %{visitors: 0})
:visits -> Map.merge(row, %{visits: 0})
:views_per_visit -> Map.merge(row, %{views_per_visit: 0.0})

View File

@ -846,6 +846,55 @@ defmodule PlausibleWeb.Api.ExternalStatsController.TimeseriesTest do
}
end
test "shows events for last 7d", %{conn: conn, site: site} do
populate_stats(site, [
build(:event, name: "Signup", timestamp: ~N[2021-01-01 00:00:00]),
build(:event, name: "Signup", timestamp: ~N[2021-01-01 00:00:00]),
build(:event, name: "Signup", timestamp: ~N[2021-01-07 23:59:00])
])
conn =
get(conn, "/api/v1/stats/timeseries", %{
"site_id" => site.domain,
"period" => "7d",
"metrics" => "events",
"date" => "2021-01-07"
})
assert json_response(conn, 200) == %{
"results" => [
%{
"date" => "2021-01-01",
"events" => 2
},
%{
"date" => "2021-01-02",
"events" => 0
},
%{
"date" => "2021-01-03",
"events" => 0
},
%{
"date" => "2021-01-04",
"events" => 0
},
%{
"date" => "2021-01-05",
"events" => 0
},
%{
"date" => "2021-01-06",
"events" => 0
},
%{
"date" => "2021-01-07",
"events" => 1
}
]
}
end
test "rounds views_per_visit to two decimal places", %{
conn: conn,
site: site