From 218bfdf725643fd0fc3aa76971c6d3c912c68511 Mon Sep 17 00:00:00 2001 From: David Newell Date: Thu, 28 Nov 2024 16:15:34 +0000 Subject: [PATCH] chore: use $exception_issue_id (#26488) --- ...nes-app-errortracking--list-page--dark.png | Bin 47894 -> 46532 bytes ...es-app-errortracking--list-page--light.png | Bin 48743 -> 47287 bytes frontend/src/lib/api.ts | 34 +- frontend/src/queries/schema.json | 48 +- frontend/src/queries/schema.ts | 13 +- .../scenes/error-tracking/AssigneeSelect.tsx | 4 +- .../scenes/error-tracking/ErrorTracking.scss | 2 +- .../error-tracking/ErrorTracking.stories.tsx | 3 +- .../ErrorTrackingGroupScene.tsx | 33 +- .../error-tracking/ErrorTrackingScene.tsx | 49 +- .../__mocks__/error_tracking_query.ts | 15 +- .../errorTrackingDataNodeLogic.tsx | 58 +-- .../errorTrackingGroupSceneLogic.ts | 68 ++- .../error-tracking/errorTrackingSceneLogic.ts | 10 +- .../error-tracking/groups/OverviewTab.tsx | 6 +- .../src/scenes/error-tracking/queries.test.ts | 27 +- frontend/src/scenes/error-tracking/queries.ts | 34 +- .../src/scenes/error-tracking/utils.test.ts | 47 +- frontend/src/scenes/error-tracking/utils.ts | 35 +- frontend/src/scenes/scenes.ts | 2 +- frontend/src/scenes/urls.ts | 3 +- .../tiles/WebAnalyticsErrorTracking.tsx | 9 +- .../error_tracking_query_runner.py | 192 ++------ .../test_error_tracking_query_runner.ambr | 466 ++---------------- .../test/test_error_tracking_query_runner.py | 314 ++++-------- posthog/schema.py | 19 +- 26 files changed, 375 insertions(+), 1116 deletions(-) diff --git a/frontend/__snapshots__/scenes-app-errortracking--list-page--dark.png b/frontend/__snapshots__/scenes-app-errortracking--list-page--dark.png index 476a6507dab73e38f31513edbb3096b83d375deb..bef1e957a7f151b987eb41a9e2bf5bc9cab71df3 100644 GIT binary patch literal 46532 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�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ó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

-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 diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index f08cae4a66b03..4c10f7c0660e5 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -5,7 +5,6 @@ import { ActivityLogItem } from 'lib/components/ActivityLog/humanizeActivity' import { apiStatusLogic } from 'lib/logic/apiStatusLogic' import { objectClean, toParams } from 'lib/utils' import posthog from 'posthog-js' -import { stringifiedFingerprint } from 'scenes/error-tracking/utils' import { RecordingComment } from 'scenes/session-recordings/player/inspector/playerInspectorLogic' import { SavedSessionRecordingPlaylistsResult } from 'scenes/session-recordings/saved-playlists/savedSessionRecordingPlaylistsLogic' @@ -14,7 +13,7 @@ import { Variable } from '~/queries/nodes/DataVisualization/types' import { DashboardFilter, DatabaseSerializedFieldType, - ErrorTrackingGroup, + ErrorTrackingIssue, HogCompileResponse, HogQLVariable, QuerySchema, @@ -712,14 +711,12 @@ class ApiRequest { return this.projectsDetail(teamId).addPathComponent('error_tracking') } - public errorTrackingGroup(fingerprint: ErrorTrackingGroup['fingerprint'], teamId?: TeamType['id']): ApiRequest { - return this.errorTracking(teamId) - .addPathComponent('group') - .addPathComponent(stringifiedFingerprint(fingerprint)) + public errorTrackingIssue(id: ErrorTrackingIssue['id'], teamId?: TeamType['id']): ApiRequest { + return this.errorTracking(teamId).addPathComponent('issue').addPathComponent(id) } - public errorTrackingGroupMerge(fingerprint: ErrorTrackingGroup['fingerprint']): ApiRequest { - return this.errorTrackingGroup(fingerprint).addPathComponent('merge') + public errorTrackingIssueMerge(into: ErrorTrackingIssue['id']): ApiRequest { + return this.errorTrackingIssue(into).addPathComponent('merge') } public errorTrackingSymbolSets(teamId?: TeamType['id']): ApiRequest { @@ -1862,21 +1859,22 @@ const api = { errorTracking: { async updateIssue( - fingerprint: ErrorTrackingGroup['fingerprint'], - data: Partial> - ): Promise { - return await new ApiRequest().errorTrackingGroup(fingerprint).update({ data }) + id: ErrorTrackingIssue['id'], + data: Partial> + ): Promise { + return await new ApiRequest().errorTrackingIssue(id).update({ data }) }, - async merge( - primaryFingerprint: ErrorTrackingGroup['fingerprint'], - mergingFingerprints: ErrorTrackingGroup['fingerprint'][] + async mergeInto( + primaryIssueId: ErrorTrackingIssue['id'], + mergingIssueIds: ErrorTrackingIssue['id'][] ): Promise<{ content: string }> { return await new ApiRequest() - .errorTrackingGroup(primaryFingerprint) - .create({ data: { merging_fingerprints: mergingFingerprints } }) + .errorTrackingIssueMerge(primaryIssueId) + .create({ data: { ids: mergingIssueIds } }) }, - async updateSymbolSet(id: ErrorTrackingSymbolSet['id'], data: FormData): Promise { + + async updateSymbolSet(id: ErrorTrackingSymbolSet['id'], data: FormData): Promise { return await new ApiRequest().errorTrackingSymbolSet(id).update({ data }) }, diff --git a/frontend/src/queries/schema.json b/frontend/src/queries/schema.json index 053eab4793c45..50d70878c64bc 100644 --- a/frontend/src/queries/schema.json +++ b/frontend/src/queries/schema.json @@ -1893,7 +1893,7 @@ }, "results": { "items": { - "$ref": "#/definitions/ErrorTrackingGroup" + "$ref": "#/definitions/ErrorTrackingIssue" }, "type": "array" }, @@ -4580,7 +4580,7 @@ }, "results": { "items": { - "$ref": "#/definitions/ErrorTrackingGroup" + "$ref": "#/definitions/ErrorTrackingIssue" }, "type": "array" }, @@ -5498,7 +5498,7 @@ "enum": ["actions", "events", "data_warehouse", "new_entity"], "type": "string" }, - "ErrorTrackingGroup": { + "ErrorTrackingIssue": { "additionalProperties": false, "properties": { "assignee": { @@ -5507,31 +5507,19 @@ "description": { "type": ["string", "null"] }, - "exception_type": { - "type": ["string", "null"] - }, - "fingerprint": { - "items": { - "type": "string" - }, - "type": "array" - }, "first_seen": { "format": "date-time", "type": "string" }, + "id": { + "type": "string" + }, "last_seen": { "format": "date-time", "type": "string" }, - "merged_fingerprints": { - "items": { - "items": { - "type": "string" - }, - "type": "array" - }, - "type": "array" + "name": { + "type": ["string", "null"] }, "occurrences": { "type": "number" @@ -5549,13 +5537,12 @@ "volume": {} }, "required": [ - "fingerprint", - "exception_type", - "merged_fingerprints", + "id", + "name", + "description", "occurrences", "sessions", "users", - "description", "first_seen", "last_seen", "assignee", @@ -5585,11 +5572,8 @@ "filterTestAccounts": { "type": "boolean" }, - "fingerprint": { - "items": { - "type": "string" - }, - "type": "array" + "issueId": { + "type": "string" }, "kind": { "const": "ErrorTrackingQuery", @@ -5658,7 +5642,7 @@ }, "results": { "items": { - "$ref": "#/definitions/ErrorTrackingGroup" + "$ref": "#/definitions/ErrorTrackingIssue" }, "type": "array" }, @@ -9856,7 +9840,7 @@ }, "results": { "items": { - "$ref": "#/definitions/ErrorTrackingGroup" + "$ref": "#/definitions/ErrorTrackingIssue" }, "type": "array" }, @@ -10529,7 +10513,7 @@ }, "results": { "items": { - "$ref": "#/definitions/ErrorTrackingGroup" + "$ref": "#/definitions/ErrorTrackingIssue" }, "type": "array" }, diff --git a/frontend/src/queries/schema.ts b/frontend/src/queries/schema.ts index 166eab904b81c..ae5d085a349c4 100644 --- a/frontend/src/queries/schema.ts +++ b/frontend/src/queries/schema.ts @@ -1934,7 +1934,7 @@ export type CachedSessionAttributionExplorerQueryResponse = CachedQueryResponse< export interface ErrorTrackingQuery extends DataNode { kind: NodeKind.ErrorTrackingQuery - fingerprint?: string[] + issueId?: string select?: HogQLExpression[] order?: 'last_seen' | 'first_seen' | 'occurrences' | 'users' | 'sessions' dateRange: DateRange @@ -1945,14 +1945,13 @@ export interface ErrorTrackingQuery extends DataNode limit?: integer } -export interface ErrorTrackingGroup { - fingerprint: string[] - exception_type: string | null - merged_fingerprints: string[][] +export interface ErrorTrackingIssue { + id: string + name: string | null + description: string | null occurrences: number sessions: number users: number - description: string | null /** @format date-time */ first_seen: string /** @format date-time */ @@ -1963,7 +1962,7 @@ export interface ErrorTrackingGroup { status: 'archived' | 'active' | 'resolved' | 'pending_release' } -export interface ErrorTrackingQueryResponse extends AnalyticsQueryResponseBase { +export interface ErrorTrackingQueryResponse extends AnalyticsQueryResponseBase { hasMore?: boolean limit?: integer offset?: integer diff --git a/frontend/src/scenes/error-tracking/AssigneeSelect.tsx b/frontend/src/scenes/error-tracking/AssigneeSelect.tsx index c45ab1afac27d..aab0690d16a6a 100644 --- a/frontend/src/scenes/error-tracking/AssigneeSelect.tsx +++ b/frontend/src/scenes/error-tracking/AssigneeSelect.tsx @@ -3,7 +3,7 @@ import { LemonButton, LemonButtonProps, ProfilePicture } from '@posthog/lemon-ui import { MemberSelect } from 'lib/components/MemberSelect' import { fullName } from 'lib/utils' -import { ErrorTrackingGroup } from '../../queries/schema' +import { ErrorTrackingIssue } from '../../queries/schema' export const AssigneeSelect = ({ assignee, @@ -11,7 +11,7 @@ export const AssigneeSelect = ({ showName = false, ...buttonProps }: { - assignee: ErrorTrackingGroup['assignee'] + assignee: ErrorTrackingIssue['assignee'] onChange: (userId: number | null) => void showName?: boolean } & Partial>): JSX.Element => { diff --git a/frontend/src/scenes/error-tracking/ErrorTracking.scss b/frontend/src/scenes/error-tracking/ErrorTracking.scss index dabda01de319a..2a981bfdbf970 100644 --- a/frontend/src/scenes/error-tracking/ErrorTracking.scss +++ b/frontend/src/scenes/error-tracking/ErrorTracking.scss @@ -1,4 +1,4 @@ -.ErrorTracking__group { +.ErrorTracking__issue { height: calc(100vh - 12rem); min-height: 25rem; } diff --git a/frontend/src/scenes/error-tracking/ErrorTracking.stories.tsx b/frontend/src/scenes/error-tracking/ErrorTracking.stories.tsx index 2a97ca624ab98..ef101016a6337 100644 --- a/frontend/src/scenes/error-tracking/ErrorTracking.stories.tsx +++ b/frontend/src/scenes/error-tracking/ErrorTracking.stories.tsx @@ -8,7 +8,6 @@ import { mswDecorator } from '~/mocks/browser' import { NodeKind } from '~/queries/schema' import { errorTrackingEventsQueryResponse, errorTrackingQueryResponse } from './__mocks__/error_tracking_query' -import { stringifiedFingerprint } from './utils' const meta: Meta = { title: 'Scenes-App/ErrorTracking', @@ -41,7 +40,7 @@ export function ListPage(): JSX.Element { export function GroupPage(): JSX.Element { useEffect(() => { - router.actions.push(urls.errorTrackingGroup(stringifiedFingerprint(['TypeError']))) + router.actions.push(urls.errorTrackingIssue('id')) }, []) return } diff --git a/frontend/src/scenes/error-tracking/ErrorTrackingGroupScene.tsx b/frontend/src/scenes/error-tracking/ErrorTrackingGroupScene.tsx index 3270a14d564cd..5b364cf617129 100644 --- a/frontend/src/scenes/error-tracking/ErrorTrackingGroupScene.tsx +++ b/frontend/src/scenes/error-tracking/ErrorTrackingGroupScene.tsx @@ -3,11 +3,10 @@ import './ErrorTracking.scss' import { LemonButton, LemonDivider } from '@posthog/lemon-ui' import { useActions, useValues } from 'kea' import { PageHeader } from 'lib/components/PageHeader' -import { base64Decode } from 'lib/utils' import { useEffect } from 'react' import { SceneExport } from 'scenes/sceneTypes' -import { ErrorTrackingGroup } from '~/queries/schema' +import { ErrorTrackingIssue } from '~/queries/schema' import { AssigneeSelect } from './AssigneeSelect' import ErrorTrackingFilters from './ErrorTrackingFilters' @@ -18,12 +17,10 @@ import { SymbolSetUploadModal } from './SymbolSetUploadModal' export const scene: SceneExport = { component: ErrorTrackingGroupScene, logic: errorTrackingGroupSceneLogic, - paramsToProps: ({ params: { fingerprint } }): (typeof errorTrackingGroupSceneLogic)['props'] => ({ - fingerprint: JSON.parse(base64Decode(decodeURIComponent(fingerprint))), - }), + paramsToProps: ({ params: { id } }): (typeof errorTrackingGroupSceneLogic)['props'] => ({ id }), } -const STATUS_LABEL: Record = { +const STATUS_LABEL: Record = { active: 'Active', archived: 'Archived', resolved: 'Resolved', @@ -31,14 +28,14 @@ const STATUS_LABEL: Record = { } export function ErrorTrackingGroupScene(): JSX.Element { - const { group, groupLoading, hasGroupActions } = useValues(errorTrackingGroupSceneLogic) - const { updateGroup, loadGroup } = useActions(errorTrackingGroupSceneLogic) + const { issue, issueLoading, hasGroupActions } = useValues(errorTrackingGroupSceneLogic) + const { updateIssue, loadIssue } = useActions(errorTrackingGroupSceneLogic) useEffect(() => { // don't like doing this but scene logics do not unmount after being loaded // so this refreshes the group on each page visit in case any changes occurred - if (!groupLoading) { - loadGroup() + if (!issueLoading) { + loadIssue() } }, []) @@ -46,20 +43,20 @@ export function ErrorTrackingGroupScene(): JSX.Element { <> updateGroup({ assignee })} + assignee={issue.assignee} + onChange={(assignee) => updateIssue({ assignee })} type="secondary" showName />

- updateGroup({ status: 'archived' })}> + updateIssue({ status: 'archived' })}> Archive - updateGroup({ status: 'resolved' })}> + updateIssue({ status: 'resolved' })}> Resolve
@@ -68,10 +65,10 @@ export function ErrorTrackingGroupScene(): JSX.Element { updateGroup({ status: 'active' })} + onClick={() => updateIssue({ status: 'active' })} tooltip="Mark as active" > - {STATUS_LABEL[group.status]} + {STATUS_LABEL[issue.status]} ) ) : ( diff --git a/frontend/src/scenes/error-tracking/ErrorTrackingScene.tsx b/frontend/src/scenes/error-tracking/ErrorTrackingScene.tsx index 54f05ae67caf2..e9b68fef636a1 100644 --- a/frontend/src/scenes/error-tracking/ErrorTrackingScene.tsx +++ b/frontend/src/scenes/error-tracking/ErrorTrackingScene.tsx @@ -11,7 +11,7 @@ import { urls } from 'scenes/urls' import { insightVizDataNodeKey } from '~/queries/nodes/InsightViz/InsightViz' import { Query } from '~/queries/Query/Query' -import { ErrorTrackingGroup } from '~/queries/schema' +import { ErrorTrackingIssue } from '~/queries/schema' import { QueryContext, QueryContextColumnComponent, QueryContextColumnTitleComponent } from '~/queries/types' import { InsightLogicProps } from '~/types' @@ -20,7 +20,6 @@ import { errorTrackingDataNodeLogic } from './errorTrackingDataNodeLogic' import ErrorTrackingFilters from './ErrorTrackingFilters' import { errorTrackingLogic } from './errorTrackingLogic' import { errorTrackingSceneLogic } from './errorTrackingSceneLogic' -import { stringifiedFingerprint } from './utils' export const scene: SceneExport = { component: ErrorTrackingScene, @@ -28,7 +27,7 @@ export const scene: SceneExport = { } export function ErrorTrackingScene(): JSX.Element { - const { query, selectedRowIndexes } = useValues(errorTrackingSceneLogic) + const { query, selectedIssueIds } = useValues(errorTrackingSceneLogic) const insightProps: InsightLogicProps = { dashboardItemId: 'new-ErrorTrackingQuery', @@ -56,29 +55,29 @@ export function ErrorTrackingScene(): JSX.Element { - {selectedRowIndexes.length === 0 ? : } + {selectedIssueIds.length === 0 ? : } ) } const ErrorTrackingActions = (): JSX.Element => { - const { selectedRowIndexes } = useValues(errorTrackingSceneLogic) - const { setSelectedRowIndexes } = useActions(errorTrackingSceneLogic) - const { mergeGroups } = useActions(errorTrackingDataNodeLogic) + const { selectedIssueIds } = useValues(errorTrackingSceneLogic) + const { setSelectedIssueIds } = useActions(errorTrackingSceneLogic) + const { mergeIssues } = useActions(errorTrackingDataNodeLogic) return (
- setSelectedRowIndexes([])}> + setSelectedIssueIds([])}> Unselect all - {selectedRowIndexes.length > 1 && ( + {selectedIssueIds.length > 1 && ( { - mergeGroups(selectedRowIndexes) - setSelectedRowIndexes([]) + mergeIssues(selectedIssueIds) + setSelectedIssueIds([]) }} > Merge @@ -111,13 +110,12 @@ const CustomVolumeColumnHeader: QueryContextColumnTitleComponent = ({ columnName const CustomGroupTitleColumn: QueryContextColumnComponent = (props) => { const { hasGroupActions } = useValues(errorTrackingLogic) - const { selectedRowIndexes } = useValues(errorTrackingSceneLogic) - const { setSelectedRowIndexes } = useActions(errorTrackingSceneLogic) + const { selectedIssueIds } = useValues(errorTrackingSceneLogic) + const { setSelectedIssueIds } = useActions(errorTrackingSceneLogic) - const rowIndex = props.recordIndex - const record = props.record as ErrorTrackingGroup + const record = props.record as ErrorTrackingIssue - const checked = selectedRowIndexes.includes(props.recordIndex) + const checked = selectedIssueIds.includes(record.id) return (
@@ -126,16 +124,16 @@ const CustomGroupTitleColumn: QueryContextColumnComponent = (props) => { className={clsx('pt-1 group-hover:visible', !checked && 'invisible')} checked={checked} onChange={(newValue) => { - setSelectedRowIndexes( + setSelectedIssueIds( newValue - ? [...selectedRowIndexes, rowIndex] - : selectedRowIndexes.filter((id) => id != rowIndex) + ? [...new Set([...selectedIssueIds, record.id])] + : selectedIssueIds.filter((id) => id != record.id) ) }} /> )}
{record.description}
@@ -147,23 +145,20 @@ const CustomGroupTitleColumn: QueryContextColumnComponent = (props) => {
} className="flex-1" - to={urls.errorTrackingGroup(stringifiedFingerprint(record.fingerprint))} + to={urls.errorTrackingIssue(record.id)} />
) } const AssigneeColumn: QueryContextColumnComponent = (props) => { - const { assignGroup } = useActions(errorTrackingDataNodeLogic) + const { assignIssue } = useActions(errorTrackingDataNodeLogic) - const record = props.record as ErrorTrackingGroup + const record = props.record as ErrorTrackingIssue return (
- assignGroup(props.recordIndex, assigneeId)} - /> + assignIssue(record.id, assigneeId)} />
) } diff --git a/frontend/src/scenes/error-tracking/__mocks__/error_tracking_query.ts b/frontend/src/scenes/error-tracking/__mocks__/error_tracking_query.ts index 50fd5d545853c..01a293f12a86a 100644 --- a/frontend/src/scenes/error-tracking/__mocks__/error_tracking_query.ts +++ b/frontend/src/scenes/error-tracking/__mocks__/error_tracking_query.ts @@ -9,7 +9,7 @@ const eventProperties = JSON.stringify({ distinct_id: 'person_id', $exception_message: "Cannot read properties of undefined (reading 'onLCP')", $exception_type: 'TypeError', - $exception_fingerprint: ['TypeError'], + $exception_fingerprint: 'fingerprint', $exception_personURL: 'https://us.posthog.com/project/:id/person/:person_id', $exception_level: 'error', $sentry_event_id: '790b4d4b9ec6430fb88f18ba2dc7e7c4', @@ -89,16 +89,15 @@ const errorTrackingQueryResponse = { columns: ['occurrences', 'sessions', 'users', 'last_seen', 'first_seen', 'description', 'fingerprint', 'volume'], hasMore: false, results: [ - { fingerprint: ['TypeError'], occurrences: 1000, sessions: 750, users: 500 }, - { fingerprint: ['SyntaxError'], occurrences: 800, sessions: 200, users: 50 }, - { fingerprint: ['Error'], occurrences: 6, sessions: 3, users: 1 }, - ].map(({ fingerprint, occurrences, sessions, users }) => ({ + { name: 'TypeError', occurrences: 1000, sessions: 750, users: 500 }, + { name: ['SyntaxError'], occurrences: 800, sessions: 200, users: 50 }, + { name: 'Error', occurrences: 6, sessions: 3, users: 1 }, + ].map(({ name, occurrences, sessions, users }) => ({ assignee: null, - description: `This is a ${fingerprint} error`, - fingerprint: fingerprint, + description: `This is a ${name} error`, + name: name, first_seen: '2023-07-07T00:00:00.000000-00:00', last_seen: '2024-07-07T00:00:00.000000-00:00', - merged_fingerprints: [], occurrences: occurrences, sessions: sessions, users: users, diff --git a/frontend/src/scenes/error-tracking/errorTrackingDataNodeLogic.tsx b/frontend/src/scenes/error-tracking/errorTrackingDataNodeLogic.tsx index 1b47979cb8b7a..e173c7e5a259c 100644 --- a/frontend/src/scenes/error-tracking/errorTrackingDataNodeLogic.tsx +++ b/frontend/src/scenes/error-tracking/errorTrackingDataNodeLogic.tsx @@ -2,10 +2,10 @@ import { actions, connect, kea, listeners, path, props } from 'kea' import api from 'lib/api' import { dataNodeLogic, DataNodeLogicProps } from '~/queries/nodes/DataNode/dataNodeLogic' -import { ErrorTrackingGroup } from '~/queries/schema' +import { ErrorTrackingIssue } from '~/queries/schema' import type { errorTrackingDataNodeLogicType } from './errorTrackingDataNodeLogicType' -import { mergeGroups } from './utils' +import { mergeIssues } from './utils' export interface ErrorTrackingDataNodeLogicProps { query: DataNodeLogicProps['query'] @@ -18,52 +18,54 @@ export const errorTrackingDataNodeLogic = kea([ connect(({ key, query }: ErrorTrackingDataNodeLogicProps) => ({ values: [dataNodeLogic({ key, query }), ['response']], - actions: [dataNodeLogic({ key, query }), ['setResponse']], + actions: [dataNodeLogic({ key, query }), ['setResponse', 'loadData']], })), actions({ - mergeGroups: (indexes: number[]) => ({ indexes }), - assignGroup: (recordIndex: number, assigneeId: number | null) => ({ - recordIndex, - assigneeId, - }), + mergeIssues: (ids: string[]) => ({ ids }), + assignIssue: (id: string, assigneeId: number | null) => ({ id, assigneeId }), }), listeners(({ values, actions }) => ({ - mergeGroups: async ({ indexes }) => { - const results = values.response?.results as ErrorTrackingGroup[] + mergeIssues: async ({ ids }) => { + const results = values.response?.results as ErrorTrackingIssue[] - const groups = results.filter((_, id) => indexes.includes(id)) - const primaryGroup = groups.shift() + const issues = results.filter(({ id }) => ids.includes(id)) + const primaryIssue = issues.shift() - if (primaryGroup && groups.length > 0) { - const mergingFingerprints = groups.map((g) => g.fingerprint) - const mergedGroup = mergeGroups(primaryGroup, groups) + if (primaryIssue && issues.length > 0) { + const mergingIds = issues.map((g) => g.id) + const mergedIssue = mergeIssues(primaryIssue, issues) // optimistically update local results actions.setResponse({ ...values.response, results: results - // remove merged groups - .filter((_, id) => !indexes.includes(id)) - .map((group) => - // replace primary group - mergedGroup.fingerprint === group.fingerprint ? mergedGroup : group + // remove merged issues + .filter(({ id }) => !ids.includes(id)) + .map((issue) => + // replace primary issue + mergedIssue.id === issue.id ? mergedIssue : issue ), }) - await api.errorTracking.merge(primaryGroup?.fingerprint, mergingFingerprints) + await api.errorTracking.mergeInto(primaryIssue.id, mergingIds) + actions.loadData(true) } }, - assignGroup: async ({ recordIndex, assigneeId }) => { + assignIssue: async ({ id, assigneeId }) => { const response = values.response if (response) { const params = { assignee: assigneeId } - const results = response.results as ErrorTrackingGroup[] - const group = { ...results[recordIndex], ...params } - results.splice(recordIndex, 1, group) - // optimistically update local results - actions.setResponse({ ...response, results: results }) - await api.errorTracking.updateIssue(group.fingerprint, params) + const results = response.results as ErrorTrackingIssue[] + const recordIndex = results.findIndex((r) => r.id === id) + if (recordIndex > -1) { + const issue = { ...results[recordIndex], ...params } + results.splice(recordIndex, 1, issue) + // optimistically update local results + actions.setResponse({ ...response, results: results }) + await api.errorTracking.updateIssue(issue.id, params) + actions.loadData(true) + } } }, })), diff --git a/frontend/src/scenes/error-tracking/errorTrackingGroupSceneLogic.ts b/frontend/src/scenes/error-tracking/errorTrackingGroupSceneLogic.ts index 506fcdec0e1e0..64445e5116185 100644 --- a/frontend/src/scenes/error-tracking/errorTrackingGroupSceneLogic.ts +++ b/frontend/src/scenes/error-tracking/errorTrackingGroupSceneLogic.ts @@ -6,12 +6,12 @@ import { Dayjs, dayjs } from 'lib/dayjs' import { Scene } from 'scenes/sceneTypes' import { urls } from 'scenes/urls' -import { ErrorTrackingGroup } from '~/queries/schema' +import { ErrorTrackingIssue } from '~/queries/schema' import { Breadcrumb } from '~/types' import type { errorTrackingGroupSceneLogicType } from './errorTrackingGroupSceneLogicType' import { errorTrackingLogic } from './errorTrackingLogic' -import { errorTrackingGroupEventsQuery, errorTrackingGroupQuery } from './queries' +import { errorTrackingIssueEventsQuery, errorTrackingIssueQuery } from './queries' export interface ErrorTrackingEvent { uuid: string @@ -26,10 +26,10 @@ export interface ErrorTrackingEvent { } export interface ErrorTrackingGroupSceneLogicProps { - fingerprint: ErrorTrackingGroup['fingerprint'] + id: ErrorTrackingIssue['id'] } -export enum ErrorGroupTab { +export enum IssueTab { Overview = 'overview', Breakdowns = 'breakdowns', } @@ -37,23 +37,23 @@ export enum ErrorGroupTab { export const errorTrackingGroupSceneLogic = kea([ path((key) => ['scenes', 'error-tracking', 'errorTrackingGroupSceneLogic', key]), props({} as ErrorTrackingGroupSceneLogicProps), - key((props) => JSON.stringify(props.fingerprint)), + key((props) => props.id), connect({ values: [errorTrackingLogic, ['dateRange', 'filterTestAccounts', 'filterGroup', 'hasGroupActions']], }), actions({ - setErrorGroupTab: (tab: ErrorGroupTab) => ({ tab }), + setTab: (tab: IssueTab) => ({ tab }), setActiveEventUUID: (uuid: ErrorTrackingEvent['uuid']) => ({ uuid }), - updateGroup: (group: Partial>) => ({ group }), + updateIssue: (issue: Partial>) => ({ issue }), }), reducers(() => ({ - errorGroupTab: [ - ErrorGroupTab.Overview as ErrorGroupTab, + tab: [ + IssueTab.Overview as IssueTab, { - setErrorGroupTab: (_, { tab }) => tab, + setTab: (_, { tab }) => tab, }, ], activeEventUUID: [ @@ -65,13 +65,13 @@ export const errorTrackingGroupSceneLogic = kea ({ - group: [ - null as ErrorTrackingGroup | null, + issue: [ + null as ErrorTrackingIssue | null, { - loadGroup: async () => { + loadIssue: async () => { const response = await api.query( - errorTrackingGroupQuery({ - fingerprint: props.fingerprint, + errorTrackingIssueQuery({ + issueId: props.id, dateRange: values.dateRange, filterTestAccounts: values.filterTestAccounts, filterGroup: values.filterGroup, @@ -81,13 +81,13 @@ export const errorTrackingGroupSceneLogic = kea { - const response = await api.errorTracking.updateIssue(props.fingerprint, group) - return { ...values.group, ...response } + updateIssue: async ({ issue }) => { + const response = await api.errorTracking.updateIssue(props.id, issue) + return { ...values.issue, ...response } }, }, ], @@ -96,9 +96,9 @@ export const errorTrackingGroupSceneLogic = kea { const response = await api.query( - errorTrackingGroupEventsQuery({ + errorTrackingIssueEventsQuery({ select: ['uuid', 'properties', 'timestamp', 'person'], - fingerprints: values.combinedFingerprints, + issueId: props.id, dateRange: values.dateRange, filterTestAccounts: values.filterTestAccounts, filterGroup: values.filterGroup, @@ -120,7 +120,7 @@ export const errorTrackingGroupSceneLogic = kea ({ - loadGroupSuccess: () => { + loadIssueSuccess: () => { actions.loadEvents() }, loadEventsSuccess: () => { @@ -132,9 +132,9 @@ export const errorTrackingGroupSceneLogic = kea [s.group], - (group): Breadcrumb[] => { - const exceptionType = group?.exception_type || 'Unknown Type' + (s) => [s.issue], + (issue): Breadcrumb[] => { + const exceptionType = issue?.name || 'Unknown Type' return [ { key: Scene.ErrorTracking, @@ -148,20 +148,14 @@ export const errorTrackingGroupSceneLogic = kea [s.group], - (group): ErrorTrackingGroup['fingerprint'][] => - group ? [group.fingerprint, ...group.merged_fingerprints] : [], - ], }), actionToUrl(({ values }) => ({ - setErrorGroupTab: () => { + setTab: () => { const searchParams = router.values.searchParams - if (values.errorGroupTab != ErrorGroupTab.Overview) { - searchParams['tab'] = values.errorGroupTab + if (values.tab != IssueTab.Overview) { + searchParams['tab'] = values.tab } return [router.values.location.pathname, searchParams] @@ -169,9 +163,9 @@ export const errorTrackingGroupSceneLogic = kea ({ - [urls.errorTrackingGroup('*')]: (_, searchParams) => { + [urls.errorTrackingIssue('*')]: (_, searchParams) => { if (searchParams.tab) { - actions.setErrorGroupTab(searchParams.tab) + actions.setTab(searchParams.tab) } }, })), diff --git a/frontend/src/scenes/error-tracking/errorTrackingSceneLogic.ts b/frontend/src/scenes/error-tracking/errorTrackingSceneLogic.ts index f2f2b8713fb4c..e1128d177e0de 100644 --- a/frontend/src/scenes/error-tracking/errorTrackingSceneLogic.ts +++ b/frontend/src/scenes/error-tracking/errorTrackingSceneLogic.ts @@ -27,7 +27,7 @@ export const errorTrackingSceneLogic = kea([ actions({ setOrder: (order: ErrorTrackingQuery['order']) => ({ order }), - setSelectedRowIndexes: (ids: number[]) => ({ ids }), + setSelectedIssueIds: (ids: string[]) => ({ ids }), }), reducers({ @@ -38,10 +38,10 @@ export const errorTrackingSceneLogic = kea([ setOrder: (_, { order }) => order, }, ], - selectedRowIndexes: [ - [] as number[], + selectedIssueIds: [ + [] as string[], { - setSelectedRowIndexes: (_, { ids }) => ids, + setSelectedIssueIds: (_, { ids }) => ids, }, ], }), @@ -84,6 +84,6 @@ export const errorTrackingSceneLogic = kea([ }), subscriptions(({ actions }) => ({ - query: () => actions.setSelectedRowIndexes([]), + query: () => actions.setSelectedIssueIds([]), })), ]) diff --git a/frontend/src/scenes/error-tracking/groups/OverviewTab.tsx b/frontend/src/scenes/error-tracking/groups/OverviewTab.tsx index 323bbdf3da110..7abbbcd962589 100644 --- a/frontend/src/scenes/error-tracking/groups/OverviewTab.tsx +++ b/frontend/src/scenes/error-tracking/groups/OverviewTab.tsx @@ -12,14 +12,14 @@ import { PropertyIcons } from 'scenes/session-recordings/playlist/SessionRecordi import { ErrorTrackingEvent, errorTrackingGroupSceneLogic } from '../errorTrackingGroupSceneLogic' export const OverviewTab = (): JSX.Element => { - const { events, groupLoading, eventsLoading, activeEventUUID } = useValues(errorTrackingGroupSceneLogic) + const { events, issueLoading, eventsLoading, activeEventUUID } = useValues(errorTrackingGroupSceneLogic) const { loadEvents, setActiveEventUUID } = useActions(errorTrackingGroupSceneLogic) return ( -
+
{ beforeAll(() => { @@ -136,23 +131,3 @@ describe('parseSparklineSelection', () => { expect(parseSparklineSelection('6w')).toEqual({ value: 6, displayAs: 'week' }) }) }) - -describe('stringifyFingerprints', () => { - it('works for basic case', async () => { - expect(stringifyFingerprints([['a', 'b', 'c']])).toEqual("[['a','b','c']]") - expect(stringifyFingerprints([['a']])).toEqual("[['a']]") - expect(stringifyFingerprints([])).toEqual('[]') - }) - - it('escapes single quotes correctly', async () => { - expect(stringifyFingerprints([["a'"]])).toEqual("[['a\\'']]") - expect(stringifyFingerprints([["a'", "b'"]])).toEqual("[['a\\'','b\\'']]") - expect(stringifyFingerprints([["a'", "b'"], ["c'"]])).toEqual("[['a\\'','b\\''],['c\\'']]") - }) - - it('escapes double quotes correctly', async () => { - expect(stringifyFingerprints([['a"']])).toEqual("[['a\"']]") - expect(stringifyFingerprints([['a"', 'b"']])).toEqual("[['a\"','b\"']]") - expect(stringifyFingerprints([['a"', 'b"'], ['c"']])).toEqual("[['a\"','b\"'],['c\"']]") - }) -}) diff --git a/frontend/src/scenes/error-tracking/queries.ts b/frontend/src/scenes/error-tracking/queries.ts index 6061773ecc562..6aa1c3f8d7f5c 100644 --- a/frontend/src/scenes/error-tracking/queries.ts +++ b/frontend/src/scenes/error-tracking/queries.ts @@ -4,7 +4,7 @@ import { range } from 'lib/utils' import { DataTableNode, DateRange, - ErrorTrackingGroup, + ErrorTrackingIssue, ErrorTrackingQuery, EventsQuery, InsightVizNode, @@ -117,36 +117,36 @@ export const generateSparklineProps = ({ return { labels, data } } -export const errorTrackingGroupQuery = ({ - fingerprint, +export const errorTrackingIssueQuery = ({ + issueId, dateRange, filterTestAccounts, filterGroup, }: { - fingerprint: string[] + issueId: string dateRange: DateRange filterTestAccounts: boolean filterGroup: UniversalFiltersGroup }): ErrorTrackingQuery => { return { kind: NodeKind.ErrorTrackingQuery, - fingerprint: fingerprint, + issueId: issueId, dateRange: dateRange, filterGroup: filterGroup as PropertyGroupFilter, filterTestAccounts: filterTestAccounts, } } -export const errorTrackingGroupEventsQuery = ({ +export const errorTrackingIssueEventsQuery = ({ select, - fingerprints, + issueId, dateRange, filterTestAccounts, filterGroup, offset, }: { select: string[] - fingerprints: ErrorTrackingGroup['fingerprint'][] + issueId: ErrorTrackingIssue['id'] dateRange: DateRange filterTestAccounts: boolean filterGroup: UniversalFiltersGroup @@ -155,11 +155,9 @@ export const errorTrackingGroupEventsQuery = ({ const group = filterGroup.values[0] as UniversalFiltersGroup const properties = group.values as AnyPropertyFilter[] - const where = [ - `has(${stringifyFingerprints( - fingerprints - )}, JSONExtract(ifNull(properties.$exception_fingerprint,'[]'),'Array(String)'))`, - ] + // TODO: fix this where clause. It does not take into account the events + // associated with issues that have been merged into this primary issue + const where = [`eq(${issueId}, properties.$exception_issue_id)`] const query: EventsQuery = { kind: NodeKind.EventsQuery, @@ -182,16 +180,6 @@ export const errorTrackingGroupEventsQuery = ({ return query } -// JSON.stringify wraps strings in double quotes and HogQL only supports single quote strings -export const stringifyFingerprints = (fingerprints: ErrorTrackingGroup['fingerprint'][]): string => { - // so we escape all single quoted strings and replace double quotes with single quotes, unless they're already escaped. - // Also replace escaped double quotes with regular double quotes - this isn't valid JSON, but we aren't trying to generate JSON so its ok. - return JSON.stringify(fingerprints) - .replace(/'/g, "\\'") - .replace(/(? { +describe('mergeIssues', () => { it('arbitrary values', async () => { - const primaryGroup: ErrorTrackingGroup = { + const primaryIssue: ErrorTrackingIssue = { + id: 'primaryId', assignee: 400, description: 'This is the original description', - exception_type: 'TypeError', - fingerprint: ['Fingerprint'], + name: 'TypeError', first_seen: '2024-07-22T13:15:07.074000Z', last_seen: '2024-07-20T13:15:50.186000Z', - merged_fingerprints: [['ExistingFingerprint']], occurrences: 250, sessions: 100, status: 'active', @@ -32,15 +31,14 @@ describe('mergeGroups', () => { ], } - const mergingGroups: ErrorTrackingGroup[] = [ + const mergingIssues: ErrorTrackingIssue[] = [ { + id: 'secondId', assignee: 100, description: 'This is another description', - exception_type: 'SyntaxError', - fingerprint: ['Fingerprint2'], + name: 'SyntaxError', first_seen: '2024-07-21T13:15:07.074000Z', last_seen: '2024-07-20T13:15:50.186000Z', - merged_fingerprints: [['NestedFingerprint']], occurrences: 10, sessions: 5, status: 'active', @@ -61,13 +59,12 @@ describe('mergeGroups', () => { ], }, { + id: 'thirdId', assignee: 400, description: 'This is another description', - exception_type: 'SyntaxError', - fingerprint: ['Fingerprint3'], + name: 'SyntaxError', first_seen: '2024-07-21T13:15:07.074000Z', last_seen: '2024-07-22T13:15:50.186000Z', - merged_fingerprints: [], occurrences: 1, sessions: 1, status: 'active', @@ -88,13 +85,12 @@ describe('mergeGroups', () => { ], }, { + id: 'fourthId', assignee: null, description: 'This is another description', - exception_type: 'SyntaxError', - fingerprint: ['Fingerprint4'], + name: 'SyntaxError', first_seen: '2023-07-22T13:15:07.074000Z', last_seen: '2024-07-22T13:15:50.186000Z', - merged_fingerprints: [], occurrences: 1000, sessions: 500, status: 'active', @@ -116,28 +112,19 @@ describe('mergeGroups', () => { }, ] - const mergedGroup = mergeGroups(primaryGroup, mergingGroups) + const mergedIssue = mergeIssues(primaryIssue, mergingIssues) - expect(mergedGroup).toEqual({ + expect(mergedIssue).toEqual({ // retains values from primary group + id: 'primaryId', assignee: 400, description: 'This is the original description', - exception_type: 'TypeError', - fingerprint: ['Fingerprint'], + name: 'TypeError', status: 'active', // earliest first_seen first_seen: '2023-07-22T13:15:07.074Z', // latest last_seen last_seen: '2024-07-22T13:15:50.186Z', - // retains previously merged_fingerprints - // adds new fingerprints AND their nested fingerprints - merged_fingerprints: [ - ['ExistingFingerprint'], - ['Fingerprint2'], - ['NestedFingerprint'], - ['Fingerprint3'], - ['Fingerprint4'], - ], // sums counts occurrences: 1261, sessions: 606, diff --git a/frontend/src/scenes/error-tracking/utils.ts b/frontend/src/scenes/error-tracking/utils.ts index e07ef8a6c2f5c..5ef545f005a98 100644 --- a/frontend/src/scenes/error-tracking/utils.ts +++ b/frontend/src/scenes/error-tracking/utils.ts @@ -1,44 +1,37 @@ import { dayjs } from 'lib/dayjs' -import { base64Encode } from 'lib/utils' -import { ErrorTrackingGroup } from '~/queries/schema' - -export const mergeGroups = ( - primaryGroup: ErrorTrackingGroup, - mergingGroups: ErrorTrackingGroup[] -): ErrorTrackingGroup => { - const mergingFingerprints = mergingGroups.flatMap((g) => [g.fingerprint, ...g.merged_fingerprints]) - - const mergedFingerprints = [...primaryGroup.merged_fingerprints] - mergedFingerprints.push(...mergingFingerprints) +import { ErrorTrackingIssue } from '~/queries/schema' +export const mergeIssues = ( + primaryIssue: ErrorTrackingIssue, + mergingIssues: ErrorTrackingIssue[] +): ErrorTrackingIssue => { const sum = (value: 'occurrences' | 'users' | 'sessions'): number => { - return mergingGroups.reduce((sum, g) => sum + g[value], primaryGroup[value]) + return mergingIssues.reduce((sum, g) => sum + g[value], primaryIssue[value]) } - const [firstSeen, lastSeen] = mergingGroups.reduce( + const [firstSeen, lastSeen] = mergingIssues.reduce( (res, g) => { const firstSeen = dayjs(g.first_seen) const lastSeen = dayjs(g.last_seen) return [res[0].isAfter(firstSeen) ? firstSeen : res[0], res[1].isBefore(lastSeen) ? lastSeen : res[1]] }, - [dayjs(primaryGroup.first_seen), dayjs(primaryGroup.last_seen)] + [dayjs(primaryIssue.first_seen), dayjs(primaryIssue.last_seen)] ) - const volume = primaryGroup.volume + const volume = primaryIssue.volume if (volume) { const dataIndex = 3 - const data = mergingGroups.reduce( + const data = mergingIssues.reduce( (sum: number[], g) => g.volume[dataIndex].map((num: number, idx: number) => num + sum[idx]), - primaryGroup.volume[dataIndex] + primaryIssue.volume[dataIndex] ) volume.splice(dataIndex, 1, data) } return { - ...primaryGroup, - merged_fingerprints: mergedFingerprints, + ...primaryIssue, occurrences: sum('occurrences'), sessions: sum('sessions'), users: sum('users'), @@ -47,7 +40,3 @@ export const mergeGroups = ( volume: volume, } } - -export const stringifiedFingerprint = (fingerprint: string[]): string => { - return base64Encode(JSON.stringify(fingerprint)) -} diff --git a/frontend/src/scenes/scenes.ts b/frontend/src/scenes/scenes.ts index 8d4e73759c647..93972268e2edd 100644 --- a/frontend/src/scenes/scenes.ts +++ b/frontend/src/scenes/scenes.ts @@ -559,7 +559,7 @@ export const routes: Record = { [urls.earlyAccessFeature(':id')]: Scene.EarlyAccessFeature, [urls.errorTracking()]: Scene.ErrorTracking, [urls.errorTrackingConfiguration()]: Scene.ErrorTrackingConfiguration, - [urls.errorTrackingGroup(':fingerprint')]: Scene.ErrorTrackingGroup, + [urls.errorTrackingIssue(':id')]: Scene.ErrorTrackingGroup, [urls.surveys()]: Scene.Surveys, [urls.survey(':id')]: Scene.Survey, [urls.surveyTemplates()]: Scene.SurveyTemplates, diff --git a/frontend/src/scenes/urls.ts b/frontend/src/scenes/urls.ts index 4cd64504e3237..bfcc75e8bd7e3 100644 --- a/frontend/src/scenes/urls.ts +++ b/frontend/src/scenes/urls.ts @@ -164,8 +164,7 @@ export const urls = { earlyAccessFeature: (id: string): string => `/early_access_features/${id}`, errorTracking: (): string => '/error_tracking', errorTrackingConfiguration: (): string => '/error_tracking/configuration', - errorTrackingGroup: (fingerprint: string): string => - `/error_tracking/${fingerprint === ':fingerprint' ? fingerprint : encodeURIComponent(fingerprint)}`, + errorTrackingIssue: (id: string): string => `/error_tracking/${id}`, surveys: (tab?: SurveysTabs): string => `/surveys${tab ? `?tab=${tab}` : ''}`, /** @param id A UUID or 'new'. ':id' for routing. */ survey: (id: string): string => `/surveys/${id}`, diff --git a/frontend/src/scenes/web-analytics/tiles/WebAnalyticsErrorTracking.tsx b/frontend/src/scenes/web-analytics/tiles/WebAnalyticsErrorTracking.tsx index 59692aa627c70..59c6cfcd56821 100644 --- a/frontend/src/scenes/web-analytics/tiles/WebAnalyticsErrorTracking.tsx +++ b/frontend/src/scenes/web-analytics/tiles/WebAnalyticsErrorTracking.tsx @@ -3,22 +3,21 @@ import { TZLabel } from 'lib/components/TZLabel' import { IconOpenInNew } from 'lib/lemon-ui/icons' import { LemonButton } from 'lib/lemon-ui/LemonButton' import { LemonTableLink } from 'lib/lemon-ui/LemonTable/LemonTableLink' -import { stringifiedFingerprint } from 'scenes/error-tracking/utils' import { urls } from 'scenes/urls' import { ErrorTrackingTile } from 'scenes/web-analytics/webAnalyticsLogic' import { QueryFeature } from '~/queries/nodes/DataTable/queryFeatures' import { Query } from '~/queries/Query/Query' -import { ErrorTrackingGroup } from '~/queries/schema' +import { ErrorTrackingIssue } from '~/queries/schema' import { QueryContext, QueryContextColumnComponent } from '~/queries/types' export const CustomGroupTitleColumn: QueryContextColumnComponent = (props) => { - const record = props.record as ErrorTrackingGroup + const record = props.record as ErrorTrackingIssue return (
{record.description}
@@ -28,7 +27,7 @@ export const CustomGroupTitleColumn: QueryContextColumnComponent = (props) => {
} className="flex-1" - to={urls.errorTrackingGroup(stringifiedFingerprint(record.fingerprint))} + to={urls.errorTrackingIssue(record.id)} />
) diff --git a/posthog/hogql_queries/error_tracking_query_runner.py b/posthog/hogql_queries/error_tracking_query_runner.py index 58317854b56ff..20eebdeb1ac2c 100644 --- a/posthog/hogql_queries/error_tracking_query_runner.py +++ b/posthog/hogql_queries/error_tracking_query_runner.py @@ -1,4 +1,6 @@ import re +import structlog + from posthog.hogql import ast from posthog.hogql.constants import LimitContext from posthog.hogql_queries.insights.paginators import HogQLHasMorePaginator @@ -11,6 +13,9 @@ ) from posthog.hogql.parser import parse_expr from posthog.models.filters.mixins.utils import cached_property +from posthog.models.error_tracking import ErrorTrackingIssue + +logger = structlog.get_logger(__name__) class ErrorTrackingQueryRunner(QueryRunner): @@ -32,7 +37,7 @@ def to_query(self) -> ast.SelectQuery: select_from=ast.JoinExpr(table=ast.Field(chain=["events"])), where=self.where(), order_by=self.order_by, - group_by=self.group_by(), + group_by=[ast.Field(chain=["properties", "$exception_issue_id"])], ) def select(self): @@ -48,82 +53,14 @@ def select(self): ), ast.Alias(alias="last_seen", expr=ast.Call(name="max", args=[ast.Field(chain=["timestamp"])])), ast.Alias(alias="first_seen", expr=ast.Call(name="min", args=[ast.Field(chain=["timestamp"])])), - ast.Alias( - alias="description", - expr=ast.Call( - name="nullIf", - args=[ - ast.Call( - name="coalesce", - args=[ - self.extracted_exception_list_property("value"), - ast.Call(name="any", args=[ast.Field(chain=["properties", "$exception_message"])]), - ], - ), - ast.Constant(value=""), - ], - ), - ), - ast.Alias( - alias="exception_type", - expr=ast.Call( - name="nullIf", - args=[ - ast.Call( - name="coalesce", - args=[ - self.extracted_exception_list_property("type"), - ast.Call(name="any", args=[ast.Field(chain=["properties", "$exception_type"])]), - ], - ), - ast.Constant(value=""), - ], - ), - ), + ast.Alias(alias="id", expr=ast.Field(chain=["properties", "$exception_issue_id"])), ] - if not self.query.fingerprint: - exprs.append(self.fingerprint_grouping_expr) - if self.query.select: exprs.extend([parse_expr(x) for x in self.query.select]) return exprs - @property - def fingerprint_grouping_expr(self): - groups = self.error_tracking_groups.values() - - expr: ast.Expr = self.extracted_fingerprint_property() - - if groups: - args: list[ast.Expr] = [] - for group in groups: - # set the "fingerprint" of an exception to match that of the groups primary fingerprint - # replaces exceptions in "merged_fingerprints" with the group fingerprint - args.extend( - [ - ast.Call( - name="has", - args=[ - self.group_fingerprints([group]), - self.extracted_fingerprint_property(), - ], - ), - ast.Constant(value=group["fingerprint"]), - ] - ) - - # default to $exception_fingerprint property for exception events that don't match a group - args.append(self.extracted_fingerprint_property()) - - expr = ast.Call( - name="multiIf", - args=args, - ) - - return ast.Alias(alias="fingerprint", expr=expr) - def where(self): exprs: list[ast.Expr] = [ ast.CompareOperation( @@ -131,25 +68,20 @@ def where(self): left=ast.Field(chain=["event"]), right=ast.Constant(value="$exception"), ), + ast.Call( + name="isNotNull", + args=[ast.Field(chain=["properties", "$exception_issue_id"])], + ), ast.Placeholder(expr=ast.Field(chain=["filters"])), ] - groups = [] - - if self.query.fingerprint: - groups.append(self.group_or_default(self.query.fingerprint)) - elif self.query.assignee: - groups.extend(self.error_tracking_groups.values()) - - if groups: + if self.query.issueId: exprs.append( - ast.Call( - name="has", - args=[ - self.group_fingerprints(groups), - self.extracted_fingerprint_property(), - ], - ), + ast.CompareOperation( + op=ast.CompareOperationOp.Eq, + left=ast.Field(chain=["properties", "$exception_issue_id"]), + right=ast.Constant(value=self.query.issueId), + ) ) if self.query.searchQuery: @@ -200,9 +132,6 @@ def where(self): return ast.And(exprs=exprs) - def group_by(self): - return None if self.query.fingerprint else [ast.Field(chain=["fingerprint"])] - def calculate(self): query_result = self.paginator.execute_hogql_query( query=self.to_query(), @@ -231,12 +160,22 @@ def calculate(self): ) def results(self, columns: list[str], query_results: list): - mapped_results = [dict(zip(columns, value)) for value in query_results] results = [] + mapped_results = [dict(zip(columns, value)) for value in query_results] + + issue_ids = [result["id"] for result in mapped_results] + issues = self.error_tracking_issues(issue_ids) + for result_dict in mapped_results: - fingerprint = self.query.fingerprint if self.query.fingerprint else result_dict["fingerprint"] - group = self.group_or_default(fingerprint) - results.append(result_dict | group) + issue = issues.get(result_dict["id"]) + if issue: + results.append(issue | result_dict | {"assignee": self.query.assignee}) + else: + logger.error( + "error tracking issue not found", + issue_id=result_dict["id"], + exc_info=True, + ) return results @@ -257,65 +196,20 @@ def order_by(self): def properties(self): return self.query.filterGroup.values[0].values if self.query.filterGroup else None - def group_or_default(self, fingerprint): - return self.error_tracking_groups.get( - str(fingerprint), - { - "fingerprint": fingerprint, - "assignee": None, - "merged_fingerprints": [], - "status": "active", - # "status": str(ErrorTrackingGroup.Status.ACTIVE), - }, - ) - - def group_fingerprints(self, groups): - exprs: list[ast.Expr] = [] - for group in groups: - exprs.append(ast.Constant(value=group["fingerprint"])) - for fp in group["merged_fingerprints"]: - exprs.append(ast.Constant(value=fp)) - return ast.Array(exprs=exprs) - - def extracted_exception_list_property(self, property): - return ast.Call( - name="JSON_VALUE", - args=[ - ast.Call(name="any", args=[ast.Field(chain=["properties", "$exception_list"])]), - ast.Constant(value=f"$[0].{property}"), - ], + def error_tracking_issues(self, ids): + queryset = ErrorTrackingIssue.objects.filter(team=self.team, id__in=ids) + queryset = ( + queryset.filter(id=self.query.issueId) + if self.query.issueId + else queryset.filter(status__in=[ErrorTrackingIssue.Status.ACTIVE]) ) - - def extracted_fingerprint_property(self): - return ast.Call( - name="JSONExtract", - args=[ - ast.Call( - name="ifNull", - args=[ - ast.Field(chain=["properties", "$exception_fingerprint"]), - ast.Constant(value="[]"), - ], - ), - ast.Constant(value="Array(String)"), - ], + queryset = ( + queryset.filter(errortrackingissueassignment__user_id=self.query.assignee) + if self.query.assignee + else queryset ) - - @cached_property - def error_tracking_groups(self): - return {} - # queryset = ErrorTrackingGroup.objects.filter(team=self.team) - # # :TRICKY: Ideally we'd have no null characters in the fingerprint, but if something made it into the pipeline with null characters - # # (because rest of the system supports it), try cleaning it up here. Make sure this cleaning is consistent with the rest of the system. - # cleaned_fingerprint = [part.replace("\x00", "\ufffd") for part in self.query.fingerprint or []] - # queryset = ( - # queryset.filter(fingerprint=cleaned_fingerprint) - # if self.query.fingerprint - # else queryset.filter(status__in=[ErrorTrackingGroup.Status.ACTIVE]) - # ) - # queryset = queryset.filter(assignee=self.query.assignee) if self.query.assignee else queryset - # groups = queryset.values("fingerprint", "merged_fingerprints", "status", "assignee") - # return {str(item["fingerprint"]): item for item in groups} + issues = queryset.values("id", "status", "name", "description") + return {str(item["id"]): item for item in issues} def search_tokenizer(query: str) -> list[str]: diff --git a/posthog/hogql_queries/test/__snapshots__/test_error_tracking_query_runner.ambr b/posthog/hogql_queries/test/__snapshots__/test_error_tracking_query_runner.ambr index 72b1396910a22..dd53fefcdb46c 100644 --- a/posthog/hogql_queries/test/__snapshots__/test_error_tracking_query_runner.ambr +++ b/posthog/hogql_queries/test/__snapshots__/test_error_tracking_query_runner.ambr @@ -1,27 +1,4 @@ # serializer version: 1 -# name: TestErrorTrackingQueryRunner.test_assignee_groups - ''' - SELECT count(DISTINCT events.uuid) AS occurrences, - count(DISTINCT events.`$session_id`) AS sessions, - count(DISTINCT events.distinct_id) AS users, - max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, - min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')) AS description, - any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')) AS exception_type, - multiIf(has([['SyntaxError']], JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)')), ['SyntaxError'], has([['custom_fingerprint']], JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)')), ['custom_fingerprint'], JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)')) AS fingerprint - FROM events - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), 1, has([['SyntaxError'], ['custom_fingerprint']], JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)'))) - GROUP BY fingerprint - LIMIT 101 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 - ''' -# --- # name: TestErrorTrackingQueryRunner.test_column_names ''' SELECT count(DISTINCT events.uuid) AS occurrences, @@ -29,9 +6,7 @@ count(DISTINCT events.distinct_id) AS users, max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type, - JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)') AS fingerprint + replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') AS id FROM events LEFT OUTER JOIN (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, @@ -50,8 +25,8 @@ WHERE equals(person.team_id, 99999) GROUP BY person.id HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)) - GROUP BY fingerprint + WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), isNotNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '')), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)) + GROUP BY replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') LIMIT 101 OFFSET 0 SETTINGS readonly=2, max_execution_time=60, @@ -69,8 +44,7 @@ count(DISTINCT events.distinct_id) AS users, max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type + replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') AS id FROM events LEFT OUTER JOIN (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, @@ -89,28 +63,8 @@ WHERE equals(person.team_id, 99999) GROUP BY person.id HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1), has([['SyntaxError']], JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)'))) - LIMIT 101 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints - ''' - SELECT count(DISTINCT events.uuid) AS occurrences, - count(DISTINCT events.`$session_id`) AS sessions, - count(DISTINCT events.distinct_id) AS users, - max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, - min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type - FROM events - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), 1, has([['SyntaxError']], JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)'))) + WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), isNotNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '')), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1), ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', ''), '01936e7f-d7ff-7314-b2d4-7627981e34f0'), 0)) + GROUP BY replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') LIMIT 101 OFFSET 0 SETTINGS readonly=2, max_execution_time=60, @@ -121,323 +75,6 @@ max_bytes_before_external_group_by=0 ''' # --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters - ''' - SELECT count(DISTINCT events.uuid) AS occurrences, - count(DISTINCT events.`$session_id`) AS sessions, - count(DISTINCT events.distinct_id) AS users, - max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, - min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type - FROM events - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), 1, has([['SyntaxError', 'Cannot use \'in\' operator to search for \'wireframes\' in ‹\b\0”\fýf\0ì½é–"\0Ø']], JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)'))) - LIMIT 101 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.1 - ''' - SELECT "posthog_person"."id", - "posthog_person"."created_at", - "posthog_person"."properties_last_updated_at", - "posthog_person"."properties_last_operation", - "posthog_person"."team_id", - "posthog_person"."properties", - "posthog_person"."is_user_id", - "posthog_person"."is_identified", - "posthog_person"."uuid", - "posthog_person"."version" - FROM "posthog_person" - INNER JOIN "posthog_persondistinctid" ON ("posthog_person"."id" = "posthog_persondistinctid"."person_id") - WHERE ("posthog_persondistinctid"."distinct_id" = 'user_1' - AND "posthog_persondistinctid"."team_id" = 2) - LIMIT 21 - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.10 - ''' - SELECT "posthog_datawarehousejoin"."created_by_id", - "posthog_datawarehousejoin"."created_at", - "posthog_datawarehousejoin"."deleted", - "posthog_datawarehousejoin"."deleted_at", - "posthog_datawarehousejoin"."id", - "posthog_datawarehousejoin"."team_id", - "posthog_datawarehousejoin"."source_table_name", - "posthog_datawarehousejoin"."source_table_key", - "posthog_datawarehousejoin"."joining_table_name", - "posthog_datawarehousejoin"."joining_table_key", - "posthog_datawarehousejoin"."field_name" - FROM "posthog_datawarehousejoin" - WHERE ("posthog_datawarehousejoin"."team_id" = 2 - AND NOT ("posthog_datawarehousejoin"."deleted" - AND "posthog_datawarehousejoin"."deleted" IS NOT NULL)) - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.11 - ''' - SELECT "posthog_propertydefinition"."name", - "posthog_propertydefinition"."property_type" - FROM "posthog_propertydefinition" - WHERE ("posthog_propertydefinition"."name" IN ('$exception_message', - '$exception_type', - '$exception_fingerprint') - AND "posthog_propertydefinition"."team_id" = 2 - AND "posthog_propertydefinition"."type" IN (1, - 2, - 3, - 4, - 5 /* ... */)) - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.2 - ''' - SELECT "posthog_errortrackinggroup"."fingerprint", - "posthog_errortrackinggroup"."merged_fingerprints", - "posthog_errortrackinggroup"."status", - "posthog_errortrackinggroup"."assignee_id" - FROM "posthog_errortrackinggroup" - WHERE ("posthog_errortrackinggroup"."team_id" = 2 - AND "posthog_errortrackinggroup"."fingerprint" = (ARRAY['SyntaxError', - 'Cannot use ''in'' operator to search for ''wireframes'' in ‹�” ýf�ì½é–"¹’0ø*Lö¹SY A�Ξ÷ԝf - ˆ�Ø'])::text[]) - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.3 - ''' - SELECT "posthog_grouptypemapping"."id", - "posthog_grouptypemapping"."team_id", - "posthog_grouptypemapping"."group_type", - "posthog_grouptypemapping"."group_type_index", - "posthog_grouptypemapping"."name_singular", - "posthog_grouptypemapping"."name_plural" - FROM "posthog_grouptypemapping" - WHERE "posthog_grouptypemapping"."team_id" = 2 - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.4 - ''' - SELECT "posthog_datawarehousetable"."created_by_id", - "posthog_datawarehousetable"."created_at", - "posthog_datawarehousetable"."updated_at", - "posthog_datawarehousetable"."deleted", - "posthog_datawarehousetable"."deleted_at", - "posthog_datawarehousetable"."id", - "posthog_datawarehousetable"."name", - "posthog_datawarehousetable"."format", - "posthog_datawarehousetable"."team_id", - "posthog_datawarehousetable"."url_pattern", - "posthog_datawarehousetable"."credential_id", - "posthog_datawarehousetable"."external_data_source_id", - "posthog_datawarehousetable"."columns", - "posthog_datawarehousetable"."row_count", - "posthog_user"."id", - "posthog_user"."password", - "posthog_user"."last_login", - "posthog_user"."first_name", - "posthog_user"."last_name", - "posthog_user"."is_staff", - "posthog_user"."is_active", - "posthog_user"."date_joined", - "posthog_user"."uuid", - "posthog_user"."current_organization_id", - "posthog_user"."current_team_id", - "posthog_user"."email", - "posthog_user"."pending_email", - "posthog_user"."temporary_token", - "posthog_user"."distinct_id", - "posthog_user"."is_email_verified", - "posthog_user"."requested_password_reset_at", - "posthog_user"."has_seen_product_intro_for", - "posthog_user"."strapi_id", - "posthog_user"."theme_mode", - "posthog_user"."partial_notification_settings", - "posthog_user"."anonymize_data", - "posthog_user"."toolbar_mode", - "posthog_user"."hedgehog_config", - "posthog_user"."events_column_config", - "posthog_user"."email_opt_in", - "posthog_datawarehousecredential"."created_by_id", - "posthog_datawarehousecredential"."created_at", - "posthog_datawarehousecredential"."id", - "posthog_datawarehousecredential"."access_key", - "posthog_datawarehousecredential"."access_secret", - "posthog_datawarehousecredential"."team_id", - "posthog_externaldatasource"."created_by_id", - "posthog_externaldatasource"."created_at", - "posthog_externaldatasource"."updated_at", - "posthog_externaldatasource"."deleted", - "posthog_externaldatasource"."deleted_at", - "posthog_externaldatasource"."id", - "posthog_externaldatasource"."source_id", - "posthog_externaldatasource"."connection_id", - "posthog_externaldatasource"."destination_id", - "posthog_externaldatasource"."team_id", - "posthog_externaldatasource"."sync_frequency", - "posthog_externaldatasource"."status", - "posthog_externaldatasource"."source_type", - "posthog_externaldatasource"."job_inputs", - "posthog_externaldatasource"."are_tables_created", - "posthog_externaldatasource"."prefix" - FROM "posthog_datawarehousetable" - LEFT OUTER JOIN "posthog_user" ON ("posthog_datawarehousetable"."created_by_id" = "posthog_user"."id") - LEFT OUTER JOIN "posthog_datawarehousecredential" ON ("posthog_datawarehousetable"."credential_id" = "posthog_datawarehousecredential"."id") - LEFT OUTER JOIN "posthog_externaldatasource" ON ("posthog_datawarehousetable"."external_data_source_id" = "posthog_externaldatasource"."id") - WHERE ("posthog_datawarehousetable"."team_id" = 2 - AND NOT ("posthog_datawarehousetable"."deleted" - AND "posthog_datawarehousetable"."deleted" IS NOT NULL)) - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.5 - ''' - SELECT "posthog_datawarehousesavedquery"."created_by_id", - "posthog_datawarehousesavedquery"."created_at", - "posthog_datawarehousesavedquery"."deleted", - "posthog_datawarehousesavedquery"."deleted_at", - "posthog_datawarehousesavedquery"."id", - "posthog_datawarehousesavedquery"."name", - "posthog_datawarehousesavedquery"."team_id", - "posthog_datawarehousesavedquery"."columns", - "posthog_datawarehousesavedquery"."external_tables", - "posthog_datawarehousesavedquery"."query", - "posthog_datawarehousesavedquery"."status", - "posthog_datawarehousesavedquery"."last_run_at" - FROM "posthog_datawarehousesavedquery" - WHERE ("posthog_datawarehousesavedquery"."team_id" = 2 - AND NOT ("posthog_datawarehousesavedquery"."deleted" - AND "posthog_datawarehousesavedquery"."deleted" IS NOT NULL)) - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.6 - ''' - SELECT "posthog_datawarehousejoin"."created_by_id", - "posthog_datawarehousejoin"."created_at", - "posthog_datawarehousejoin"."deleted", - "posthog_datawarehousejoin"."deleted_at", - "posthog_datawarehousejoin"."id", - "posthog_datawarehousejoin"."team_id", - "posthog_datawarehousejoin"."source_table_name", - "posthog_datawarehousejoin"."source_table_key", - "posthog_datawarehousejoin"."joining_table_name", - "posthog_datawarehousejoin"."joining_table_key", - "posthog_datawarehousejoin"."field_name" - FROM "posthog_datawarehousejoin" - WHERE ("posthog_datawarehousejoin"."team_id" = 2 - AND NOT ("posthog_datawarehousejoin"."deleted" - AND "posthog_datawarehousejoin"."deleted" IS NOT NULL)) - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.7 - ''' - SELECT "posthog_grouptypemapping"."id", - "posthog_grouptypemapping"."team_id", - "posthog_grouptypemapping"."group_type", - "posthog_grouptypemapping"."group_type_index", - "posthog_grouptypemapping"."name_singular", - "posthog_grouptypemapping"."name_plural" - FROM "posthog_grouptypemapping" - WHERE "posthog_grouptypemapping"."team_id" = 2 - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.8 - ''' - SELECT "posthog_datawarehousetable"."created_by_id", - "posthog_datawarehousetable"."created_at", - "posthog_datawarehousetable"."updated_at", - "posthog_datawarehousetable"."deleted", - "posthog_datawarehousetable"."deleted_at", - "posthog_datawarehousetable"."id", - "posthog_datawarehousetable"."name", - "posthog_datawarehousetable"."format", - "posthog_datawarehousetable"."team_id", - "posthog_datawarehousetable"."url_pattern", - "posthog_datawarehousetable"."credential_id", - "posthog_datawarehousetable"."external_data_source_id", - "posthog_datawarehousetable"."columns", - "posthog_datawarehousetable"."row_count", - "posthog_user"."id", - "posthog_user"."password", - "posthog_user"."last_login", - "posthog_user"."first_name", - "posthog_user"."last_name", - "posthog_user"."is_staff", - "posthog_user"."is_active", - "posthog_user"."date_joined", - "posthog_user"."uuid", - "posthog_user"."current_organization_id", - "posthog_user"."current_team_id", - "posthog_user"."email", - "posthog_user"."pending_email", - "posthog_user"."temporary_token", - "posthog_user"."distinct_id", - "posthog_user"."is_email_verified", - "posthog_user"."requested_password_reset_at", - "posthog_user"."has_seen_product_intro_for", - "posthog_user"."strapi_id", - "posthog_user"."theme_mode", - "posthog_user"."partial_notification_settings", - "posthog_user"."anonymize_data", - "posthog_user"."toolbar_mode", - "posthog_user"."hedgehog_config", - "posthog_user"."events_column_config", - "posthog_user"."email_opt_in", - "posthog_datawarehousecredential"."created_by_id", - "posthog_datawarehousecredential"."created_at", - "posthog_datawarehousecredential"."id", - "posthog_datawarehousecredential"."access_key", - "posthog_datawarehousecredential"."access_secret", - "posthog_datawarehousecredential"."team_id", - "posthog_externaldatasource"."created_by_id", - "posthog_externaldatasource"."created_at", - "posthog_externaldatasource"."updated_at", - "posthog_externaldatasource"."deleted", - "posthog_externaldatasource"."deleted_at", - "posthog_externaldatasource"."id", - "posthog_externaldatasource"."source_id", - "posthog_externaldatasource"."connection_id", - "posthog_externaldatasource"."destination_id", - "posthog_externaldatasource"."team_id", - "posthog_externaldatasource"."sync_frequency", - "posthog_externaldatasource"."status", - "posthog_externaldatasource"."source_type", - "posthog_externaldatasource"."job_inputs", - "posthog_externaldatasource"."are_tables_created", - "posthog_externaldatasource"."prefix" - FROM "posthog_datawarehousetable" - LEFT OUTER JOIN "posthog_user" ON ("posthog_datawarehousetable"."created_by_id" = "posthog_user"."id") - LEFT OUTER JOIN "posthog_datawarehousecredential" ON ("posthog_datawarehousetable"."credential_id" = "posthog_datawarehousecredential"."id") - LEFT OUTER JOIN "posthog_externaldatasource" ON ("posthog_datawarehousetable"."external_data_source_id" = "posthog_externaldatasource"."id") - WHERE ("posthog_datawarehousetable"."team_id" = 2 - AND NOT ("posthog_datawarehousetable"."deleted" - AND "posthog_datawarehousetable"."deleted" IS NOT NULL)) - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_fingerprints_with_null_characters.9 - ''' - SELECT "posthog_datawarehousesavedquery"."created_by_id", - "posthog_datawarehousesavedquery"."created_at", - "posthog_datawarehousesavedquery"."deleted", - "posthog_datawarehousesavedquery"."deleted_at", - "posthog_datawarehousesavedquery"."id", - "posthog_datawarehousesavedquery"."name", - "posthog_datawarehousesavedquery"."team_id", - "posthog_datawarehousesavedquery"."columns", - "posthog_datawarehousesavedquery"."external_tables", - "posthog_datawarehousesavedquery"."query", - "posthog_datawarehousesavedquery"."status", - "posthog_datawarehousesavedquery"."last_run_at" - FROM "posthog_datawarehousesavedquery" - WHERE ("posthog_datawarehousesavedquery"."team_id" = 2 - AND NOT ("posthog_datawarehousesavedquery"."deleted" - AND "posthog_datawarehousesavedquery"."deleted" IS NOT NULL)) - ''' -# --- # name: TestErrorTrackingQueryRunner.test_hogql_filters ''' SELECT count(DISTINCT events.uuid) AS occurrences, @@ -445,9 +82,7 @@ count(DISTINCT events.distinct_id) AS users, max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type, - JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)') AS fingerprint + replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') AS id FROM events LEFT OUTER JOIN (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, @@ -466,8 +101,29 @@ WHERE equals(person.team_id, 99999) GROUP BY person.id HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), ifNull(equals(events__person.properties___email, 'email@posthog.com'), 0)) - GROUP BY fingerprint + WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), isNotNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '')), ifNull(equals(events__person.properties___email, 'email@posthog.com'), 0)) + GROUP BY replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') + LIMIT 101 + OFFSET 0 SETTINGS readonly=2, + max_execution_time=60, + allow_experimental_object_type=1, + format_csv_allow_double_quotes=0, + max_ast_elements=4000000, + max_expanded_ast_elements=4000000, + max_bytes_before_external_group_by=0 + ''' +# --- +# name: TestErrorTrackingQueryRunner.test_issue_grouping + ''' + SELECT count(DISTINCT events.uuid) AS occurrences, + count(DISTINCT events.`$session_id`) AS sessions, + count(DISTINCT events.distinct_id) AS users, + max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, + min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, + replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') AS id + FROM events + WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), isNotNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '')), 1, ifNull(equals(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', ''), '01936e7f-d7ff-7314-b2d4-7627981e34f0'), 0)) + GROUP BY replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') LIMIT 101 OFFSET 0 SETTINGS readonly=2, max_execution_time=60, @@ -485,9 +141,7 @@ count(DISTINCT events.distinct_id) AS users, max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type, - JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)') AS fingerprint + replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') AS id FROM events LEFT OUTER JOIN (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, @@ -506,8 +160,8 @@ WHERE equals(person.team_id, 99999) GROUP BY person.id HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), and(less(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-01-11 00:00:00.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-01-10 00:00:00.000000', 6, 'UTC')), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)), or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('databasenot')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('databasenot')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('databasenot')), 0), 0))) - GROUP BY fingerprint + WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), isNotNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '')), and(less(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-01-11 00:00:00.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2022-01-10 00:00:00.000000', 6, 'UTC')), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1)), or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('databasenot')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('databasenot')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('databasenot')), 0), 0))) + GROUP BY replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') LIMIT 101 OFFSET 0 SETTINGS readonly=2, max_execution_time=60, @@ -525,9 +179,7 @@ count(DISTINCT events.distinct_id) AS users, max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type, - JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)') AS fingerprint + replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') AS id FROM events LEFT OUTER JOIN (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, @@ -546,54 +198,8 @@ WHERE equals(person.team_id, 99999) GROUP BY person.id HAVING and(ifNull(equals(argMax(person.is_deleted, person.version), 0), 0), ifNull(less(argMax(toTimeZone(person.created_at, 'UTC'), person.version), plus(now64(6, 'UTC'), toIntervalDay(1))), 0)))), 0)) SETTINGS optimize_aggregation_in_order=1) AS events__person ON equals(if(not(empty(events__override.distinct_id)), events__override.person_id, events.person_id), events__person.id) - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1), and(or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('databasenotfoundX')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('databasenotfoundX')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('databasenotfoundX')), 0), 0)), or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('clickhouse/client/execute.py')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('clickhouse/client/execute.py')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('clickhouse/client/execute.py')), 0), 0)))) - GROUP BY fingerprint - LIMIT 101 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_search_query_with_null_characters - ''' - SELECT count(DISTINCT events.uuid) AS occurrences, - count(DISTINCT events.`$session_id`) AS sessions, - count(DISTINCT events.distinct_id) AS users, - max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, - min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type, - JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)') AS fingerprint - FROM events - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), and(less(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-11 00:00:00.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-10 00:00:00.000000', 6, 'UTC'))), or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('wireframe')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('wireframe')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('wireframe')), 0), 0))) - GROUP BY fingerprint - LIMIT 101 - OFFSET 0 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 - ''' -# --- -# name: TestErrorTrackingQueryRunner.test_search_query_with_null_characters.1 - ''' - SELECT count(DISTINCT events.uuid) AS occurrences, - count(DISTINCT events.`$session_id`) AS sessions, - count(DISTINCT events.distinct_id) AS users, - max(toTimeZone(events.timestamp, 'UTC')) AS last_seen, - min(toTimeZone(events.timestamp, 'UTC')) AS first_seen, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].value'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', ''))), '') AS description, - nullIf(coalesce(JSON_VALUE(any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), '$[0].type'), any(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', ''))), '') AS exception_type, - JSONExtract(ifNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_fingerprint'), ''), 'null'), '^"|"$', ''), '[]'), 'Array(String)') AS fingerprint - FROM events - WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), and(less(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-11 00:00:00.000000', 6, 'UTC')), greaterOrEquals(toTimeZone(events.timestamp, 'UTC'), toDateTime64('2021-01-10 00:00:00.000000', 6, 'UTC'))), or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('f\0ì½é')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('f\0ì½é')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('f\0ì½é')), 0), 0))) - GROUP BY fingerprint + WHERE and(equals(events.team_id, 99999), equals(events.event, '$exception'), isNotNull(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '')), ifNull(notILike(events__person.properties___email, '%@posthog.com%'), 1), and(or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('databasenotfoundX')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('databasenotfoundX')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('databasenotfoundX')), 0), 0)), or(ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_list'), ''), 'null'), '^"|"$', '')), lower('clickhouse/client/execute.py')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_type'), ''), 'null'), '^"|"$', '')), lower('clickhouse/client/execute.py')), 0), 0), ifNull(greater(position(lower(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_message'), ''), 'null'), '^"|"$', '')), lower('clickhouse/client/execute.py')), 0), 0)))) + GROUP BY replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(events.properties, '$exception_issue_id'), ''), 'null'), '^"|"$', '') LIMIT 101 OFFSET 0 SETTINGS readonly=2, max_execution_time=60, diff --git a/posthog/hogql_queries/test/test_error_tracking_query_runner.py b/posthog/hogql_queries/test/test_error_tracking_query_runner.py index 01c6731d2c768..0071779a0e18c 100644 --- a/posthog/hogql_queries/test/test_error_tracking_query_runner.py +++ b/posthog/hogql_queries/test/test_error_tracking_query_runner.py @@ -11,6 +11,7 @@ PersonPropertyFilter, PropertyOperator, ) +from posthog.models.error_tracking import ErrorTrackingIssue from posthog.test.base import ( APIBaseTest, ClickhouseTestMixin, @@ -182,6 +183,24 @@ class TestErrorTrackingQueryRunner(ClickhouseTestMixin, APIBaseTest): distinct_id_one = "user_1" distinct_id_two = "user_2" + issue_one = "01936e7f-d7ff-7314-b2d4-7627981e34f0" + issue_two = "01936e80-5e69-7e70-b837-871f5cdad28b" + issue_three = "01936e80-aa51-746f-aec4-cdf16a5c5332" + + def create_events_and_issue(self, issue_id, distinct_ids, exception_list=None): + event_properties = {"$exception_issue_id": issue_id} + if exception_list: + event_properties["$exception_list"] = exception_list + + for distinct_id in distinct_ids: + _create_event( + distinct_id=distinct_id, + event="$exception", + team=self.team, + properties=event_properties, + ) + + ErrorTrackingIssue.objects.create(id=issue_id, team=self.team) def setUp(self): super().setUp() @@ -202,44 +221,12 @@ def setUp(self): is_identified=True, ) - _create_event( - distinct_id=self.distinct_id_one, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["SyntaxError"], - "$exception_list": [ - { - "type": "SyntaxError", - "value": "this is the same error message", - } - ], - }, - ) - _create_event( - distinct_id=self.distinct_id_one, - event="$exception", - team=self.team, - properties={"$exception_fingerprint": ["TypeError"], "$exception_list": [{"type": "TypeError"}]}, - ) - _create_event( - distinct_id=self.distinct_id_two, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["SyntaxError"], - "$exception_list": [{"type": "SyntaxError", "value": "this is the same error message"}], - }, - ) - _create_event( - distinct_id=self.distinct_id_two, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["custom_fingerprint"], - "$exception_list": [{"type": "SyntaxError", "value": "this is the same error message"}], - }, + self.create_events_and_issue( + issue_id=self.issue_one, + distinct_ids=[self.distinct_id_one, self.distinct_id_two], ) + self.create_events_and_issue(issue_id=self.issue_two, distinct_ids=[self.distinct_id_one]) + self.create_events_and_issue(issue_id=self.issue_three, distinct_ids=[self.distinct_id_two]) flush_persons_and_events() @@ -252,7 +239,7 @@ def test_column_names(self): team=self.team, query=ErrorTrackingQuery( kind="ErrorTrackingQuery", - fingerprint=None, + issueId=None, dateRange=DateRange(), filterTestAccounts=True, ), @@ -267,9 +254,7 @@ def test_column_names(self): "users", "last_seen", "first_seen", - "description", - "exception_type", - "fingerprint", + "id", ], ) @@ -277,7 +262,7 @@ def test_column_names(self): team=self.team, query=ErrorTrackingQuery( kind="ErrorTrackingQuery", - fingerprint=["SyntaxError"], + issueId=self.issue_one, dateRange=DateRange(), filterTestAccounts=True, ), @@ -292,40 +277,44 @@ def test_column_names(self): "users", "last_seen", "first_seen", - "description", - "exception_type", + "id", ], ) + @snapshot_clickhouse_queries + def test_issue_grouping(self): + runner = ErrorTrackingQueryRunner( + team=self.team, + query=ErrorTrackingQuery( + kind="ErrorTrackingQuery", + issueId=self.issue_one, + dateRange=DateRange(), + ), + ) + + results = self._calculate(runner)["results"] + # returns a single group with multiple errors + self.assertEqual(len(results), 1) + self.assertEqual(results[0]["id"], self.issue_one) + self.assertEqual(results[0]["occurrences"], 2) + @snapshot_clickhouse_queries def test_search_query(self): with freeze_time("2022-01-10 12:11:00"): - _create_event( - distinct_id=self.distinct_id_one, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["DatabaseNotFoundX"], - "$exception_list": [{"type": "DatabaseNotFoundX", "value": "this is the same error message"}], - }, + self.create_events_and_issue( + issue_id="01936e81-b0ce-7b56-8497-791e505b0d0c", + distinct_ids=[self.distinct_id_one], + exception_list=[{"type": "DatabaseNotFoundX", "value": "this is the same error message"}], ) - _create_event( - distinct_id=self.distinct_id_one, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["DatabaseNotFoundY"], - "$exception_list": [{"type": "DatabaseNotFoundY", "value": "this is the same error message"}], - }, + self.create_events_and_issue( + issue_id="01936e81-f5ce-79b1-99f1-f0e9675fcfef", + distinct_ids=[self.distinct_id_one], + exception_list=[{"type": "DatabaseNotFoundY", "value": "this is the same error message"}], ) - _create_event( - distinct_id=self.distinct_id_two, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["xyz"], - "$exception_list": [{"type": "xyz", "value": "this is the same error message"}], - }, + self.create_events_and_issue( + issue_id="01936e82-241e-7e27-b47d-6659c54eb0be", + distinct_ids=[self.distinct_id_two], + exception_list=[{"type": "xyz", "value": "this is the same error message"}], ) flush_persons_and_events() @@ -333,22 +322,22 @@ def test_search_query(self): team=self.team, query=ErrorTrackingQuery( kind="ErrorTrackingQuery", - fingerprint=None, + issueId=None, dateRange=DateRange(date_from="2022-01-10", date_to="2022-01-11"), filterTestAccounts=True, searchQuery="databasenot", ), ) - results = sorted(self._calculate(runner)["results"], key=lambda x: x["fingerprint"]) + results = sorted(self._calculate(runner)["results"], key=lambda x: x["id"]) self.assertEqual(len(results), 2) - self.assertEqual(results[0]["fingerprint"], ["DatabaseNotFoundX"]) + self.assertEqual(results[0]["id"], "01936e81-b0ce-7b56-8497-791e505b0d0c") self.assertEqual(results[0]["occurrences"], 1) self.assertEqual(results[0]["sessions"], 1) self.assertEqual(results[0]["users"], 1) - self.assertEqual(results[1]["fingerprint"], ["DatabaseNotFoundY"]) + self.assertEqual(results[1]["id"], "01936e81-f5ce-79b1-99f1-f0e9675fcfef") self.assertEqual(results[1]["occurrences"], 1) self.assertEqual(results[1]["sessions"], 1) self.assertEqual(results[1]["users"], 1) @@ -358,7 +347,7 @@ def test_empty_search_query(self): team=self.team, query=ErrorTrackingQuery( kind="ErrorTrackingQuery", - fingerprint=None, + issueId=None, dateRange=DateRange(), filterTestAccounts=False, searchQuery="probs not found", @@ -372,36 +361,28 @@ def test_empty_search_query(self): @snapshot_clickhouse_queries def test_search_query_with_multiple_search_items(self): with freeze_time("2022-01-10 12:11:00"): - _create_event( - distinct_id=self.distinct_id_one, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["DatabaseNotFoundX"], - "$exception_list": [ - { - "type": "DatabaseNotFoundX", - "value": "this is the same error message", - "stack_trace": {"frames": SAMPLE_STACK_TRACE}, - } - ], - }, + self.create_events_and_issue( + issue_id="01936e81-b0ce-7b56-8497-791e505b0d0c", + distinct_ids=[self.distinct_id_one], + exception_list=[ + { + "type": "DatabaseNotFoundX", + "value": "this is the same error message", + "stack_trace": {"frames": SAMPLE_STACK_TRACE}, + } + ], ) - _create_event( - distinct_id=self.distinct_id_two, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": ["DatabaseNotFoundY"], - "$exception_list": [ - { - "type": "DatabaseNotFoundY", - "value": "this is the same error message", - "stack_trace": {"frames": SAMPLE_STACK_TRACE}, - } - ], - }, + self.create_events_and_issue( + issue_id="01936e81-f5ce-79b1-99f1-f0e9675fcfef", + distinct_ids=[self.distinct_id_two], + exception_list=[ + { + "type": "DatabaseNotFoundY", + "value": "this is the same error message", + "stack_trace": {"frames": SAMPLE_STACK_TRACE}, + } + ], ) flush_persons_and_events() @@ -409,7 +390,7 @@ def test_search_query_with_multiple_search_items(self): team=self.team, query=ErrorTrackingQuery( kind="ErrorTrackingQuery", - fingerprint=None, + issueId=None, dateRange=DateRange(), filterTestAccounts=True, searchQuery="databasenotfoundX clickhouse/client/execute.py", @@ -419,143 +400,18 @@ def test_search_query_with_multiple_search_items(self): results = self._calculate(runner)["results"] self.assertEqual(len(results), 1) - self.assertEqual(results[0]["fingerprint"], ["DatabaseNotFoundX"]) + self.assertEqual(results[0]["id"], "01936e81-b0ce-7b56-8497-791e505b0d0c") self.assertEqual(results[0]["occurrences"], 1) self.assertEqual(results[0]["sessions"], 1) self.assertEqual(results[0]["users"], 1) - @snapshot_clickhouse_queries - def test_search_query_with_null_characters(self): - fingerprint_with_null_bytes = [ - "SyntaxError", - "Cannot use 'in' operator to search for 'wireframes' in \x1f\x8b\x08\x00\x94\x0cýf\x00\x03ì½é\x96\"¹\x920ø*Lö¹SY\x1dA\x00Î\x9e÷Ô\x9df\r\x88\x00Ø", - ] - exception_type_with_null_bytes = "SyntaxError\x00" - exception_message_with_null_bytes = "this is the same error message\x00" - exception_stack_trace_with_null_bytes = { - "frames": [ - { - "filename": "file.py\x00", - "lineno": 1, - "colno": 1, - "function": "function\x00", - "extra": "Cannot use 'in' operator to search for 'wireframes' in \x1f\x8b\x08\x00\x94\x0cýf\x00\x03ì½é\x96\"¹\x920ø*Lö¹SY\x1dA\x00Î\x9e÷Ô\x9df\r\x88\x00Ø", - } - ] - } - with freeze_time("2021-01-10 12:11:00"): - _create_event( - distinct_id=self.distinct_id_one, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": fingerprint_with_null_bytes, - "$exception_list": [ - { - "type": exception_type_with_null_bytes, - "value": exception_message_with_null_bytes, - "stack_trace": exception_stack_trace_with_null_bytes, - } - ], - }, - ) - flush_persons_and_events() - - runner = ErrorTrackingQueryRunner( - team=self.team, - query=ErrorTrackingQuery( - kind="ErrorTrackingQuery", - searchQuery="wireframe", - dateRange=DateRange(date_from="2021-01-10", date_to="2021-01-11"), - ), - ) - - results = self._calculate(runner)["results"] - self.assertEqual(len(results), 1) - self.assertEqual(results[0]["fingerprint"], fingerprint_with_null_bytes) - self.assertEqual(results[0]["occurrences"], 1) - - # TODO: Searching for null characters doesn't work, probs because of how clickhouse handles this. Should it work??? - runner = ErrorTrackingQueryRunner( - team=self.team, - query=ErrorTrackingQuery( - kind="ErrorTrackingQuery", - searchQuery="f\x00\x03ì½é", - dateRange=DateRange(date_from="2021-01-10", date_to="2021-01-11"), - ), - ) - results = self._calculate(runner)["results"] - self.assertEqual(len(results), 0) - - @snapshot_clickhouse_queries - def test_fingerprints(self): - runner = ErrorTrackingQueryRunner( - team=self.team, - query=ErrorTrackingQuery( - kind="ErrorTrackingQuery", - fingerprint=["SyntaxError"], - dateRange=DateRange(), - ), - ) - - results = self._calculate(runner)["results"] - # returns a single group with multiple errors - self.assertEqual(len(results), 1) - self.assertEqual(results[0]["fingerprint"], ["SyntaxError"]) - self.assertEqual(results[0]["occurrences"], 2) - - @snapshot_clickhouse_queries - def test_fingerprints_with_null_characters(self): - fingerprint_with_null_bytes = [ - "SyntaxError", - "Cannot use 'in' operator to search for 'wireframes' in \x1f\x8b\x08\x00\x94\x0cýf\x00\x03ì½é\x96\"\x00Ø", - ] - exception_type_with_null_bytes = "SyntaxError\x00" - exception_message_with_null_bytes = "this is the same error message\x00" - exception_stack_trace_with_null_bytes = { - "frames": [{"filename": "file.py\x00", "lineno": 1, "colno": 1, "function": "function\x00"}] - } - with freeze_time("2020-01-10 12:11:00"): - _create_event( - distinct_id=self.distinct_id_one, - event="$exception", - team=self.team, - properties={ - "$exception_fingerprint": fingerprint_with_null_bytes, - "$exception_list": [ - { - "type": exception_type_with_null_bytes, - "value": exception_message_with_null_bytes, - "stack_trace": exception_stack_trace_with_null_bytes, - } - ], - }, - ) - flush_persons_and_events() - - runner = ErrorTrackingQueryRunner( - team=self.team, - query=ErrorTrackingQuery( - kind="ErrorTrackingQuery", - fingerprint=fingerprint_with_null_bytes, - dateRange=DateRange(), - ), - ) - - results = self._calculate(runner)["results"] - self.assertEqual(len(results), 1) - self.assertEqual(results[0]["fingerprint"], fingerprint_with_null_bytes) - self.assertEqual(results[0]["occurrences"], 1) - def test_only_returns_exception_events(self): with freeze_time("2020-01-10 12:11:00"): _create_event( distinct_id=self.distinct_id_one, event="$pageview", team=self.team, - properties={ - "$exception_fingerprint": ["SyntaxError"], - }, + properties={"$exception_issue_id": self.issue_one}, ) flush_persons_and_events() diff --git a/posthog/schema.py b/posthog/schema.py index 11d9b36c5aedd..1b9ba09ef7b01 100644 --- a/posthog/schema.py +++ b/posthog/schema.py @@ -746,17 +746,16 @@ class Status(StrEnum): PENDING_RELEASE = "pending_release" -class ErrorTrackingGroup(BaseModel): +class ErrorTrackingIssue(BaseModel): model_config = ConfigDict( extra="forbid", ) assignee: Optional[float] = None description: Optional[str] = None - exception_type: Optional[str] = None - fingerprint: list[str] first_seen: AwareDatetime + id: str last_seen: AwareDatetime - merged_fingerprints: list[list[str]] + name: Optional[str] = None occurrences: float sessions: float status: Status @@ -2719,7 +2718,7 @@ class QueryResponseAlternative15(BaseModel): query_status: Optional[QueryStatus] = Field( default=None, description="Query status indicates whether next to the provided data, a query is still running." ) - results: list[ErrorTrackingGroup] + results: list[ErrorTrackingIssue] timings: Optional[list[QueryTiming]] = Field( default=None, description="Measured timings for different parts of the query generation process" ) @@ -2931,7 +2930,7 @@ class QueryResponseAlternative27(BaseModel): query_status: Optional[QueryStatus] = Field( default=None, description="Query status indicates whether next to the provided data, a query is still running." ) - results: list[ErrorTrackingGroup] + results: list[ErrorTrackingIssue] timings: Optional[list[QueryTiming]] = Field( default=None, description="Measured timings for different parts of the query generation process" ) @@ -3948,7 +3947,7 @@ class CachedErrorTrackingQueryResponse(BaseModel): query_status: Optional[QueryStatus] = Field( default=None, description="Query status indicates whether next to the provided data, a query is still running." ) - results: list[ErrorTrackingGroup] + results: list[ErrorTrackingIssue] timezone: str timings: Optional[list[QueryTiming]] = Field( default=None, description="Measured timings for different parts of the query generation process" @@ -4828,7 +4827,7 @@ class Response9(BaseModel): query_status: Optional[QueryStatus] = Field( default=None, description="Query status indicates whether next to the provided data, a query is still running." ) - results: list[ErrorTrackingGroup] + results: list[ErrorTrackingIssue] timings: Optional[list[QueryTiming]] = Field( default=None, description="Measured timings for different parts of the query generation process" ) @@ -5012,7 +5011,7 @@ class ErrorTrackingQueryResponse(BaseModel): query_status: Optional[QueryStatus] = Field( default=None, description="Query status indicates whether next to the provided data, a query is still running." ) - results: list[ErrorTrackingGroup] + results: list[ErrorTrackingIssue] timings: Optional[list[QueryTiming]] = Field( default=None, description="Measured timings for different parts of the query generation process" ) @@ -6143,7 +6142,7 @@ class ErrorTrackingQuery(BaseModel): dateRange: DateRange filterGroup: Optional[PropertyGroupFilter] = None filterTestAccounts: Optional[bool] = None - fingerprint: Optional[list[str]] = None + issueId: Optional[str] = None kind: Literal["ErrorTrackingQuery"] = "ErrorTrackingQuery" limit: Optional[int] = None modifiers: Optional[HogQLQueryModifiers] = Field(