Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions desktop/src/ui/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,6 @@ export interface Config {
ACCOUNTS_URL: string
AI_URL?: string
ANALYTICS_COLLECTOR_URL?: string
POSTHOG_API_KEY?: string
POSTHOG_HOST?: string
SENTRY_DSN?: string
BRANDING_URL?: string
CALENDAR_URL: string
COLLABORATOR?: string
Expand Down
33 changes: 17 additions & 16 deletions dev/docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -426,22 +426,23 @@ services:
# - STATS_URL=http://huly.local:4900
# # - LOVE_ENDPOINT=http://huly.local:8096
# # - OPENAI_API_KEY=token
# analytics:
# image: hardcoreeng/analytics-collector
# extra_hosts:
# - 'huly.local:host-gateway'
# restart: unless-stopped
# ports:
# - 4017:4017
# environment:
# - SECRET=secret
# - PORT=4017
# - SERVICE_ID=analytics-collector-service
# - ACCOUNTS_URL=http://huly.local:3000
# - STATS_URL=http://huly.local:4900
# - POSTHOG_HOST=${POSTHOG_HOST}
# - POSTHOG_API_KEY=${POSTHOG_API_KEY}
# - MAX_PAYLOAD_SIZE=10mb
analytics:
image: hardcoreeng/analytics-collector
extra_hosts:
- 'huly.local:host-gateway'
restart: unless-stopped
ports:
- 4017:4017
environment:
- SECRET=secret
- PORT=4017
- SERVICE_ID=analytics-collector-service
- ACCOUNTS_URL=http://huly.local:3000
- STATS_URL=http://huly.local:4900
- OTEL_EXPORTER_OTLP_ENDPOINT=http://jaeger:4318/v1/traces
# - POSTHOG_HOST=${POSTHOG_HOST}
# - POSTHOG_API_KEY=${POSTHOG_API_KEY}
# - MAX_PAYLOAD_SIZE=10mb
export:
image: hardcoreeng/export
extra_hosts:
Expand Down
2 changes: 0 additions & 2 deletions dev/prod/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -282,8 +282,6 @@
"@hcengineering/ai-assistant": "^0.6.0",
"@hcengineering/ai-assistant-assets": "^0.6.0",
"@hcengineering/ai-assistant-resources": "^0.6.0",
"@sentry/svelte": "^9.22.0",
"posthog-js": "^1.246.0",
"readable-stream": "^4.7.0",
"svelte": "^4.2.20"
}
Expand Down
3 changes: 2 additions & 1 deletion dev/prod/public/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@
"BACKUP_URL": "http://huly.local:4039/api/backup",
"PULSE_URL": "ws://huly.local:8099/ws",
"HULYLAKE_URL": "http://huly.local:8096",
"EXCLUDED_APPLICATIONS_FOR_ANONYMOUS": "[\"chunter\", \"notification\"]"
"EXCLUDED_APPLICATIONS_FOR_ANONYMOUS": "[\"chunter\", \"notification\"]",
"ANALYTICS_COLLECTOR_URL": "http://huly.local:4017"
}
3 changes: 0 additions & 3 deletions dev/prod/src/platform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,10 @@ export interface Config {
GITHUB_APP?: string
GITHUB_CLIENTID?: string
GITHUB_URL: string
SENTRY_DSN?: string
LOVE_ENDPOINT?: string
LIVEKIT_WS?: string
SIGN_URL?: string
PRINT_URL?: string
POSTHOG_API_KEY?: string
POSTHOG_HOST?: string
ANALYTICS_COLLECTOR_URL?: string
BRANDING_URL?: string
TELEGRAM_BOT_URL?: string
Expand Down
2 changes: 0 additions & 2 deletions packages/analytics-providers/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,6 @@
"@hcengineering/analytics-collector": "^0.6.0",
"@hcengineering/presentation": "^0.6.3",
"@hcengineering/core": "^0.6.32",
"posthog-js": "^1.246.0",
"@sentry/svelte": "^9.22.0",
"ua-parser-js": "^2.0.4",
"@hcengineering/ui": "^0.6.15"
},
Expand Down
43 changes: 33 additions & 10 deletions packages/analytics-providers/src/analyticsCollector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
//

import { type AnalyticProvider } from '@hcengineering/analytics'
import presentation from '@hcengineering/presentation'
import { getMetadata } from '@hcengineering/platform'
import { AnalyticEventType } from '@hcengineering/analytics-collector'
import { collectEventMetadata, triggerUrlChange } from './utils'
import { getMetadata } from '@hcengineering/platform'
import presentation from '@hcengineering/presentation'
import { type QueuedEvent } from './types'
import { collectEventMetadata, triggerUrlChange } from './utils'

export class AnalyticsCollectorProvider implements AnalyticProvider {
private readonly collectIntervalMs = 5000
Expand All @@ -39,6 +39,7 @@ export class AnalyticsCollectorProvider implements AnalyticProvider {
if (this.url !== undefined && this.url !== '' && this.url !== null) {
this.initializeAnonymousId()
this.startCollectionTimer()
this.registerExceptionHandlers()
return true
}
return false
Expand All @@ -48,6 +49,18 @@ export class AnalyticsCollectorProvider implements AnalyticProvider {
this.anonymousId = this.generateAnonymousId()
}

private registerExceptionHandlers (): void {
// Capture unhandled errors
window.addEventListener('error', (event) => {
this.handleError(event.error ?? new Error(event.message))
})

// Capture unhandled promise rejections
window.addEventListener('unhandledrejection', (event) => {
this.handleError(event.reason instanceof Error ? event.reason : new Error(String(event.reason)))
})
}

private generateAnonymousId (): string {
return 'anon_' + Date.now() + '_' + Math.random().toString(36).substring(2, 15)
}
Expand Down Expand Up @@ -151,7 +164,13 @@ export class AnalyticsCollectorProvider implements AnalyticProvider {
$is_identified: this.isAuthenticated
}

const eventMetadata: Record<string, any> = collectEventMetadata(baseProperties)
let eventMetadata: Record<string, any> = {}

try {
eventMetadata = collectEventMetadata(baseProperties)
} catch (err: any) {
// Ignore metadata collection errors
}
if (eventType === AnalyticEventType.CustomEvent && (eventName !== '' || eventName != null)) {
eventMetadata.event = eventName
}
Expand Down Expand Up @@ -271,16 +290,20 @@ export class AnalyticsCollectorProvider implements AnalyticProvider {

handleError (error: Error): void {
const currentId = this.isAuthenticated && (this.email != null || this.email !== '') ? this.email : this.anonymousId
this.addEvent(
AnalyticEventType.Error,
{

const event: QueuedEvent = {
event: AnalyticEventType.Error,
properties: {
error_message: error.message ?? 'Unknown error',
error_type: error.name ?? 'Error',
error_stack: error.stack ?? ''
},
'$exception',
currentId
)
timestamp: Date.now(),
distinct_id: currentId ?? ''
}
this.events.push(event)
// We need to trigger sending immediately for errors
void this.sendEvents()
}

navigate (path: string): void {
Expand Down
10 changes: 1 addition & 9 deletions packages/analytics-providers/src/configure.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,22 +15,14 @@

import { type AnalyticProvider, Analytics } from '@hcengineering/analytics'
import { AnalyticsCollectorProvider } from './analyticsCollector'
import { PosthogAnalyticProvider } from './posthog'
import { SentryAnalyticProvider } from './sentry'
import { type AnalyticsConfig } from './types'

export * from './analyticsCollector'
export * from './posthog'
export * from './sentry'
export * from './utils'
export * from './types'

export function configureAnalyticsProviders (config: AnalyticsConfig): void {
const providers: AnalyticProvider[] = [
new AnalyticsCollectorProvider(),
new SentryAnalyticProvider(),
new PosthogAnalyticProvider()
]
const providers: AnalyticProvider[] = [new AnalyticsCollectorProvider()]

for (const provider of providers) {
Analytics.init(provider, config)
Expand Down
2 changes: 0 additions & 2 deletions packages/analytics-providers/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@
//

export * from './analyticsCollector'
export * from './posthog'
export * from './sentry'
export * from './utils'
export * from './types'
export * from './configure'
68 changes: 0 additions & 68 deletions packages/analytics-providers/src/posthog.ts

This file was deleted.

75 changes: 0 additions & 75 deletions packages/analytics-providers/src/sentry.ts

This file was deleted.

1 change: 0 additions & 1 deletion packages/analytics-providers/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import { type AnalyticEvent } from '@hcengineering/analytics-collector'

export interface AnalyticsConfig {
ANALYTICS_COLLECTOR_URL?: string
SENTRY_DSN?: string
POSTHOG_API?: string
POSTHOG_HOST?: string
[key: string]: any
Expand Down
3 changes: 2 additions & 1 deletion packages/presentation/src/components/DocPopup.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import presentation from '..'
import { ObjectCreate } from '../types'
import { getClient } from '../utils'
import { Analytics } from '@hcengineering/analytics'

export let _class: Ref<Class<Doc>>
export let objects: Doc[] = []
Expand Down Expand Up @@ -184,7 +185,7 @@
presenter = result
})
.catch((err) => {
console.error('Failed to find presenter for class ' + _class, err)
Analytics.handleError(err)
})
}
}
Expand Down
2 changes: 0 additions & 2 deletions packages/presentation/src/components/DrawingBoard.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,6 @@
} catch (error: any) {
commandProcessor.set([])
Analytics.handleError(error)
console.error('Failed to parse drawing content', error)
}
} else {
commandProcessor.set([])
Expand All @@ -151,7 +150,6 @@
}
createDrawing(data).catch((error) => {
Analytics.handleError(error)
console.error('Failed to save drawing', error)
})
}
}
Expand Down
Loading