1
+ import type { Tenant } from "@acme/super-schema" ;
2
+ import { type Client , createClient } from "@libsql/client" ;
3
+ import { fromUnixTime } from "date-fns/fromUnixTime" ;
4
+ import { formatDistanceToNow } from "date-fns/formatDistanceToNow" ;
5
+ import { AppConfig } from "src/app-config" ;
6
+ import { z } from "zod" ;
7
+
8
+ const formatDuration = ( s : number ) => {
9
+ const seconds = s % 60 ;
10
+ if ( s < 60 ) return `${ seconds } s`
11
+ const m = ( s - seconds ) / 60 ;
12
+ const minutes = m % 60 ;
13
+ if ( m < 60 ) return `${ minutes } m ${ seconds . toString ( ) . padStart ( 2 , '0' ) } s`
14
+ const h = ( m - minutes ) / 60 ;
15
+ return `${ h } h ${ minutes . toString ( ) . padStart ( 2 , '0' ) } m ${ seconds . toString ( ) . padStart ( 2 , '0' ) } s`
16
+ }
17
+
18
+ const rowSchema = z . object ( {
19
+ crawl_instance : z . number ( ) ,
20
+ event_count : z . number ( ) ,
21
+ crawl_duration_sec : z . number ( ) ,
22
+ crawl_started_at : z . number ( )
23
+ } ) ;
24
+
25
+ const readCrawlStats = async ( client :Client ) => {
26
+ const x = await client . execute ( `
27
+ SELECT
28
+ ce.instance_id as crawl_instance,
29
+ COUNT(ce.instance_id) as event_count,
30
+ MAX(ce.timestamp) - ci.started_at AS crawl_duration_sec,
31
+ ci.started_at as crawl_started_at
32
+ FROM crawl_events ce
33
+ JOIN crawl_instances ci ON ce.instance_id = ci.id
34
+ GROUP BY ce.instance_id;
35
+ ` ) ;
36
+ const rawStats = x . rows . map ( row => rowSchema . parse ( row ) ) ;
37
+
38
+ return rawStats . map ( ( rawStat ) => ( {
39
+ instanceId : rawStat . crawl_instance ,
40
+ eventCount : rawStat . event_count ,
41
+ duration : formatDuration ( rawStat . crawl_duration_sec ) ,
42
+ startedAt : formatDistanceToNow ( fromUnixTime ( rawStat . crawl_started_at ) )
43
+ } ) )
44
+ }
45
+
46
+ export const getCrawlStats = async ( tenant : Tenant ) => {
47
+ const client = createClient ( {
48
+ url : tenant . dbUrl ,
49
+ authToken : AppConfig . tenantDatabaseAuthToken
50
+ } ) ;
51
+
52
+ return await readCrawlStats ( client ) ;
53
+ }
0 commit comments