Skip to content

Added page ownerId, type and pageId to accomodate per user analytics #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions db/clickhouse/migrations/02_add_visit_id.sql
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ CREATE TABLE umami.website_event_new
referrer_query String,
referrer_domain String,
page_title String,
page_owner_id String,
page_type String,
page_id String,
event_type UInt32,
event_name String,
created_at DateTime('UTC'),
Expand Down Expand Up @@ -70,14 +73,17 @@ SELECT we.website_id,
we.referrer_query,
we.referrer_domain,
we.page_title,
we.page_owner_id,
we.page_type,
we.page_id,
we.event_type,
we.event_name,
we.created_at,
we.job_id
FROM umami.website_event we
JOIN umami.website_event_join j
ON we.session_id = j.session_id
and date_trunc('hour', we.created_at) = j.created_at
and date_trunc('hour', we.created_at) = j.created_at;

RENAME TABLE umami.website_event TO umami.website_event_old;
RENAME TABLE umami.website_event_new TO umami.website_event;
Expand All @@ -87,4 +93,4 @@ RENAME TABLE umami.website_event_new TO umami.website_event;
DROP TABLE umami.website_event_old
DROP TABLE umami.website_event_join

*/
*/
8 changes: 7 additions & 1 deletion db/clickhouse/migrations/04_add_tag.sql
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ SELECT
url_query,
referrer_domain,
page_title,
page_owner_id,
page_type,
page_id,
event_type,
event_name,
views,
Expand All @@ -53,6 +56,9 @@ FROM (SELECT
arrayFilter(x -> x != '', groupArray(url_query)) url_query,
arrayFilter(x -> x != '', groupArray(referrer_domain)) referrer_domain,
arrayFilter(x -> x != '', groupArray(page_title)) page_title,
arrayFilter(x -> x != '', groupArray(page_owner_id)) page_owner_id,
arrayFilter(x -> x != '', groupArray(page_type)) page_type,
arrayFilter(x -> x != '', groupArray(page_id)) page_id,
event_type,
if(event_type = 2, groupArray(event_name), []) event_name,
sumIf(1, event_type = 1) views,
Expand All @@ -74,4 +80,4 @@ GROUP BY website_id,
subdivision1,
city,
event_type,
timestamp);
timestamp);
24 changes: 22 additions & 2 deletions db/clickhouse/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ CREATE TABLE umami.website_event
referrer_query String,
referrer_domain String,
page_title String,
page_owner_id String,
page_type String,
page_id String,
--events
event_type UInt32,
event_name String,
Expand Down Expand Up @@ -92,6 +95,9 @@ CREATE TABLE umami.website_event_stats_hourly
url_query SimpleAggregateFunction(groupArrayArray, Array(String)),
referrer_domain SimpleAggregateFunction(groupArrayArray, Array(String)),
page_title SimpleAggregateFunction(groupArrayArray, Array(String)),
page_owner_id SimpleAggregateFunction(groupArrayArray, Array(String)),
page_type SimpleAggregateFunction(groupArrayArray, Array(String)),
page_id SimpleAggregateFunction(groupArrayArray, Array(String)),
event_type UInt32,
event_name SimpleAggregateFunction(groupArrayArray, Array(String)),
views SimpleAggregateFunction(sum, UInt64),
Expand Down Expand Up @@ -133,6 +139,9 @@ SELECT
url_query,
referrer_domain,
page_title,
page_owner_id,
page_type,
page_id,
event_type,
event_name,
views,
Expand All @@ -159,6 +168,9 @@ FROM (SELECT
arrayFilter(x -> x != '', groupArray(url_query)) url_query,
arrayFilter(x -> x != '', groupArray(referrer_domain)) referrer_domain,
arrayFilter(x -> x != '', groupArray(page_title)) page_title,
arrayFilter(x -> x != '', groupArray(page_owner_id)) page_owner_id,
arrayFilter(x -> x != '', groupArray(page_type)) page_type,
arrayFilter(x -> x != '', groupArray(page_id)) page_id,
event_type,
if(event_type = 2, groupArray(event_name), []) event_name,
sumIf(1, event_type = 1) views,
Expand All @@ -183,16 +195,24 @@ GROUP BY website_id,
timestamp);

-- projections
ALTER TABLE umami.website_event
ALTER TABLE umami.website_event
ADD PROJECTION website_event_url_path_projection (
SELECT * ORDER BY toStartOfDay(created_at), website_id, url_path, created_at
);

ALTER TABLE umami.website_event MATERIALIZE PROJECTION website_event_url_path_projection;

ALTER TABLE umami.website_event
ALTER TABLE umami.website_event
ADD PROJECTION website_event_referrer_domain_projection (
SELECT * ORDER BY toStartOfDay(created_at), website_id, referrer_domain, created_at
);

ALTER TABLE umami.website_event MATERIALIZE PROJECTION website_event_referrer_domain_projection;


ALTER TABLE umami.website_event
ADD PROJECTION website_event_page_owner_id_page_type_projection (
SELECT * ORDER BY toStartOfDay(created_at), website_id, page_owner_id, page_type
);

ALTER TABLE umami.website_event MATERIALIZE PROJECTION website_event_page_owner_id_page_type_projection;
5 changes: 4 additions & 1 deletion db/postgresql/migrations/01_init/migration.sql
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ CREATE TABLE "website_event" (
"referrer_query" VARCHAR(500),
"referrer_domain" VARCHAR(500),
"page_title" VARCHAR(500),
"page_owner_id" VARCHAR(500),
"page_type" VARCHAR(500),
"page_id" VARCHAR(500),
"event_type" INTEGER NOT NULL DEFAULT 1,
"event_name" VARCHAR(50),

Expand Down Expand Up @@ -196,4 +199,4 @@ CREATE INDEX "team_website_team_id_idx" ON "team_website"("team_id");
CREATE INDEX "team_website_website_id_idx" ON "team_website"("website_id");

-- AddSystemUser
INSERT INTO "user" (user_id, username, role, password) VALUES ('41e2b680-648e-4b09-bcd7-3e2b10c06264' , 'admin', 'admin', '$2b$10$BUli0c.muyCW1ErNJc3jL.vFRFtFJWrT8/GcR4A.sUdCznaXiqFXa');
INSERT INTO "user" (user_id, username, role, password) VALUES ('41e2b680-648e-4b09-bcd7-3e2b10c06264' , 'admin', 'admin', '$2b$10$BUli0c.muyCW1ErNJc3jL.vFRFtFJWrT8/GcR4A.sUdCznaXiqFXa');
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,6 @@ CREATE INDEX "website_event_website_id_created_at_page_title_idx" ON "website_ev

-- CreateIndex
CREATE INDEX "website_event_website_id_created_at_event_name_idx" ON "website_event"("website_id", "created_at", "event_name");

-- CreateIndex
CREATE INDEX "website_event_website_id_created_at_page_owner_id_page_type_idx" ON "website_event"("website_id", "created_at", "page_owner_id", "page_type");
4 changes: 4 additions & 0 deletions db/postgresql/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ model WebsiteEvent {
createdAt DateTime? @default(now()) @map("created_at") @db.Timestamptz(6)
urlPath String @map("url_path") @db.VarChar(500)
urlQuery String? @map("url_query") @db.VarChar(500)
pageOwnerId String? @map("page_owner_id") @db.VarChar(500)
pageId String? @map("page_id") @db.VarChar(500)
pageType String? @map("page_type") @db.VarChar(500)
referrerPath String? @map("referrer_path") @db.VarChar(500)
referrerQuery String? @map("referrer_query") @db.VarChar(500)
referrerDomain String? @map("referrer_domain") @db.VarChar(500)
Expand All @@ -114,6 +117,7 @@ model WebsiteEvent {
@@index([websiteId])
@@index([websiteId, createdAt])
@@index([websiteId, createdAt, urlPath])
@@index([websiteId, createdAt, pageOwnerId, pageType])
@@index([websiteId, createdAt, urlQuery])
@@index([websiteId, createdAt, referrerDomain])
@@index([websiteId, createdAt, pageTitle])
Expand Down
6 changes: 6 additions & 0 deletions src/lib/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,9 @@ export const FILTER_COLUMNS = {
referrer: 'referrer_domain',
host: 'hostname',
title: 'page_title',
ownerId: 'page_owner_id',
pageType: 'page_type',
pageId: 'page_id',
query: 'url_query',
os: 'os',
browser: 'browser',
Expand Down Expand Up @@ -257,6 +260,9 @@ export const MOBILE_SCREEN_WIDTH = 479;

export const URL_LENGTH = 500;
export const PAGE_TITLE_LENGTH = 500;
export const PAGE_OWNER_ID_LENGTH = 500;
export const PAGE_TYPE_LENGTH = 500;
export const PAGE_ID_LENGTH = 500;
export const EVENT_NAME_LENGTH = 50;

export const UTM_PARAMS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
Expand Down
3 changes: 3 additions & 0 deletions src/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,9 @@ export interface QueryFilters {
url?: string;
referrer?: string;
title?: string;
ownerId?: string;
pageId?: string;
pageType?: string;
query?: string;
host?: string;
os?: string;
Expand Down
14 changes: 13 additions & 1 deletion src/pages/api/send.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ export interface CollectRequestBody {
screen?: string;
tag?: string;
title?: string;
ownerId?: string;
pageType?: string;
pageId?: string;
url: string;
};
type: CollectionType;
Expand Down Expand Up @@ -68,6 +71,9 @@ const schema = {
referrer: yup.string(),
screen: yup.string().max(11),
title: yup.string(),
ownerId: yup.string(),
pageType: yup.string(),
pageId: yup.string(),
url: yup.string(),
website: yup.string().uuid().required(),
name: yup.string().max(50),
Expand Down Expand Up @@ -96,8 +102,11 @@ export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
}

const { type, payload } = req.body;
const { url, referrer, name: eventName, data, title, tag } = payload;
const { url, referrer, name: eventName, data, title, tag, ownerId, pageType, pageId } = payload;
const pageTitle = safeDecodeURI(title);
const pageOwnerId = safeDecodeURI(ownerId);
const pageTypeVal = safeDecodeURI(pageType);
const pageIdVal = safeDecodeURI(pageId);

await useSession(req, res);

Expand Down Expand Up @@ -144,6 +153,9 @@ export default async (req: NextApiRequestCollect, res: NextApiResponse) => {
referrerQuery,
referrerDomain,
pageTitle,
pageOwnerId,
pageType: pageTypeVal,
pageId: pageIdVal,
eventName,
eventData: data,
...session,
Expand Down
6 changes: 6 additions & 0 deletions src/queries/analytics/events/getWebsiteEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ async function relationalQuery(websiteId: string, filters: QueryFilters, pagePar
referrer_query as "referrerQuery",
referrer_domain as "referrerDomain",
page_title as "pageTitle",
page_owner_id as "pageOwnerId",
page_id as "pageId",
page_type as "pageType",
event_type as "eventType",
event_name as "eventName"
from website_event
Expand Down Expand Up @@ -76,6 +79,9 @@ async function clickhouseQuery(websiteId: string, filters: QueryFilters, pagePar
referrer_query as referrerQuery,
referrer_domain as referrerDomain,
page_title as pageTitle,
page_owner_id as "pageOwnerId",
page_id as "pageId",
page_type as "pageType",
event_type as eventType,
event_name as eventName
from website_event
Expand Down
31 changes: 30 additions & 1 deletion src/queries/analytics/events/saveEvent.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
import { EVENT_NAME_LENGTH, URL_LENGTH, EVENT_TYPE, PAGE_TITLE_LENGTH } from 'lib/constants';
import {
EVENT_NAME_LENGTH,
URL_LENGTH,
EVENT_TYPE,
PAGE_TITLE_LENGTH,
PAGE_OWNER_ID_LENGTH,
PAGE_TYPE_LENGTH,
PAGE_ID_LENGTH,
} from 'lib/constants';
import { CLICKHOUSE, PRISMA, runQuery } from 'lib/db';
import clickhouse from 'lib/clickhouse';
import kafka from 'lib/kafka';
Expand All @@ -16,6 +24,9 @@ export async function saveEvent(args: {
referrerQuery?: string;
referrerDomain?: string;
pageTitle?: string;
pageOwnerId?: string;
pageType?: string;
pageId?: string;
eventName?: string;
eventData?: any;
hostname?: string;
Expand Down Expand Up @@ -46,6 +57,9 @@ async function relationalQuery(data: {
referrerQuery?: string;
referrerDomain?: string;
pageTitle?: string;
pageOwnerId?: string;
pageType?: string;
pageId?: string;
eventName?: string;
eventData?: any;
tag?: string;
Expand All @@ -62,6 +76,9 @@ async function relationalQuery(data: {
eventName,
eventData,
pageTitle,
pageOwnerId,
pageType,
pageId,
tag,
} = data;
const websiteEventId = uuid();
Expand All @@ -78,6 +95,9 @@ async function relationalQuery(data: {
referrerQuery: referrerQuery?.substring(0, URL_LENGTH),
referrerDomain: referrerDomain?.substring(0, URL_LENGTH),
pageTitle: pageTitle?.substring(0, PAGE_TITLE_LENGTH),
pageOwnerId: pageOwnerId?.substring(0, PAGE_OWNER_ID_LENGTH),
pageType: pageType?.substring(0, PAGE_TYPE_LENGTH),
pageId: pageId?.substring(0, PAGE_ID_LENGTH),
eventType: eventName ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView,
eventName: eventName ? eventName?.substring(0, EVENT_NAME_LENGTH) : null,
tag,
Expand Down Expand Up @@ -108,6 +128,9 @@ async function clickhouseQuery(data: {
referrerQuery?: string;
referrerDomain?: string;
pageTitle?: string;
pageOwnerId?: string;
pageType?: string;
pageId?: string;
eventName?: string;
eventData?: any;
hostname?: string;
Expand All @@ -132,6 +155,9 @@ async function clickhouseQuery(data: {
referrerQuery,
referrerDomain,
pageTitle,
pageOwnerId,
pageType,
pageId,
eventName,
eventData,
country,
Expand Down Expand Up @@ -167,6 +193,9 @@ async function clickhouseQuery(data: {
referrer_query: referrerQuery?.substring(0, URL_LENGTH),
referrer_domain: referrerDomain?.substring(0, URL_LENGTH),
page_title: pageTitle?.substring(0, PAGE_TITLE_LENGTH),
page_owner_id: pageOwnerId?.substring(0, PAGE_OWNER_ID_LENGTH),
page_type: pageType?.substring(0, PAGE_TYPE_LENGTH),
page_id: pageId?.substring(0, PAGE_ID_LENGTH),
event_type: eventName ? EVENT_TYPE.customEvent : EVENT_TYPE.pageView,
event_name: eventName ? eventName?.substring(0, EVENT_NAME_LENGTH) : null,
tag: tag,
Expand Down
Loading