Skip to content

Commit

Permalink
chore(recordings): Optimize recordings list query (#14458)
Browse files Browse the repository at this point in the history
* derivative class

* derivative class

* tests

* Update query snapshots

* add flag

* typing

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* use person on events with new query

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* snapshots

* Update query snapshots

* Update query snapshots

* Update query snapshots

* merge master

* merge master

* remove unnecessary joins with poe is active

* try turning off the test unless poe

* revert poe changes

* don't use optimized recording list on hogql queries for now

* Moved flag to frontend

* Update query snapshots

* Update UI snapshots for `chromium` (1)

* Update UI snapshots for `webkit` (2)

* Update UI snapshots for `webkit` (2)

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Ben White <ben@posthog.com>
  • Loading branch information
3 people authored and alexkim205 committed Mar 22, 2023
1 parent 7bed041 commit a5bf926
Show file tree
Hide file tree
Showing 10 changed files with 2,197 additions and 1,026 deletions.
1 change: 1 addition & 0 deletions frontend/src/lib/constants.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ export const FEATURE_FLAGS = {
FF_CODE_EXAMPLE: 'ff-code-example', // owner: @liyiy
FEEDBACK_SCENE: 'feedback-scene', // owner: @lharries
DATABASE: 'database', // owner @mariusandra
RECORDINGS_LIST_V2: 'recordings-list-v2-enabled', // owner: #team-session-recordings
}

/** Which self-hosted plan's features are available with Cloud's "Standard" plan (aka card attached). */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import { actionToUrl, router, urlToAction } from 'kea-router'
import { eventUsageLogic } from 'lib/utils/eventUsageLogic'
import equal from 'fast-deep-equal'
import { loaders } from 'kea-loaders'
import { featureFlagLogic } from 'lib/logic/featureFlagLogic'
import { FEATURE_FLAGS } from 'lib/constants'

export type PersonUUID = string
interface Params {
Expand Down Expand Up @@ -122,6 +124,7 @@ export const sessionRecordingsListLogic = kea<sessionRecordingsListLogicType>([
key(generateSessionRecordingListLogicKey),
connect({
actions: [eventUsageLogic, ['reportRecordingsListFetched', 'reportRecordingsListFilterAdded']],
values: [featureFlagLogic, ['featureFlags']],
}),
actions({
setFilters: (filters: Partial<RecordingFilters>) => ({ filters }),
Expand All @@ -146,6 +149,7 @@ export const sessionRecordingsListLogic = kea<sessionRecordingsListLogicType>([
...values.filters,
person_uuid: props.personUUID ?? '',
limit: RECORDINGS_LIMIT,
version: values.featureFlags[FEATURE_FLAGS.RECORDINGS_LIST_V2] ? '2' : '1',
}

const params = toParams(paramsDict)
Expand Down
22 changes: 16 additions & 6 deletions posthog/api/session_recording.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import json
from typing import Any, List, cast
from typing import Any, List, Type, cast

import structlog
from dateutil import parser
Expand All @@ -22,7 +22,7 @@
from posthog.models.session_recording_event import SessionRecordingViewed
from posthog.models.team.team import Team
from posthog.permissions import ProjectMembershipNecessaryPermissions, TeamMemberAccessPermission
from posthog.queries.session_recordings.session_recording_list import SessionRecordingList
from posthog.queries.session_recordings.session_recording_list import SessionRecordingList, SessionRecordingListV2
from posthog.queries.session_recordings.session_recording_properties import SessionRecordingProperties
from posthog.rate_limit import ClickHouseBurstRateThrottle, ClickHouseSustainedRateThrottle
from posthog.session_recordings.session_recording_helpers import get_metadata_from_events_summary
Expand Down Expand Up @@ -93,7 +93,9 @@ class SessionRecordingViewSet(StructuredViewSetMixin, viewsets.ViewSet):

def list(self, request: request.Request, *args: Any, **kwargs: Any) -> Response:
filter = SessionRecordingsFilter(request=request)
return Response(list_recordings(filter, request, self.team))
use_v2_list = request.GET.get("version") == "2"

return Response(list_recordings(filter, request, self.team, v2=use_v2_list))

# Returns meta data about the recording
def retrieve(self, request: request.Request, *args: Any, **kwargs: Any) -> Response:
Expand Down Expand Up @@ -210,7 +212,7 @@ def properties(self, request: request.Request, **kwargs):
return Response({"results": session_recording_serializer.data})


def list_recordings(filter: SessionRecordingsFilter, request: request.Request, team: Team) -> dict:
def list_recordings(filter: SessionRecordingsFilter, request: request.Request, team: Team, v2=False) -> dict:
"""
As we can store recordings in S3 or in Clickhouse we need to do a few things here
Expand All @@ -224,6 +226,7 @@ def list_recordings(filter: SessionRecordingsFilter, request: request.Request, t
all_session_ids = filter.session_ids
recordings: List[SessionRecording] = []
more_recordings_available = False
can_use_v2 = v2 and not any(entity.has_hogql_property for entity in filter.entities)

if all_session_ids:
# If we specify the session ids (like from pinned recordings) we can optimise by only going to Postgres
Expand All @@ -242,7 +245,14 @@ def list_recordings(filter: SessionRecordingsFilter, request: request.Request, t

if (all_session_ids and filter.session_ids) or not all_session_ids:
# Only go to clickhouse if we still have remaining specified IDs or we are not specifying IDs
(ch_session_recordings, more_recordings_available) = SessionRecordingList(filter=filter, team=team).run()

# TODO: once person on events is deployed, we can remove the check for hogql properties https://github.com/PostHog/posthog/pull/14458#discussion_r1135780372
session_recording_list_instance: Type[SessionRecordingList] = (
SessionRecordingListV2 if can_use_v2 else SessionRecordingList
)
(ch_session_recordings, more_recordings_available) = session_recording_list_instance(
filter=filter, team=team
).run()
recordings_from_clickhouse = SessionRecording.get_or_build_from_clickhouse(team, ch_session_recordings)
recordings = recordings + recordings_from_clickhouse

Expand Down Expand Up @@ -279,4 +289,4 @@ def list_recordings(filter: SessionRecordingsFilter, request: request.Request, t
session_recording_serializer = SessionRecordingSerializer(recordings, many=True)
results = session_recording_serializer.data

return {"results": results, "has_next": more_recordings_available}
return {"results": results, "has_next": more_recordings_available, "version": 2 if can_use_v2 else 1}
Loading

0 comments on commit a5bf926

Please sign in to comment.