@@ -48,6 +48,7 @@ describe('HTTP request handler', () => {
48
48
await pgPools . evaluate . query ( 'DELETE FROM retrieval_stats' )
49
49
await pgPools . evaluate . query ( 'DELETE FROM daily_participants' )
50
50
await pgPools . evaluate . query ( 'DELETE FROM daily_deals' )
51
+ await pgPools . evaluate . query ( 'DELETE FROM retrieval_timings' )
51
52
await pgPools . stats . query ( 'DELETE FROM daily_scheduled_rewards' )
52
53
await pgPools . stats . query ( 'DELETE FROM daily_reward_transfers' )
53
54
await pgPools . stats . query ( 'DELETE FROM daily_retrieval_result_codes' )
@@ -767,6 +768,63 @@ describe('HTTP request handler', () => {
767
768
] )
768
769
} )
769
770
} )
771
+
772
+ describe ( 'miner retrieval timing stats' , ( ) => {
773
+ beforeEach ( async ( ) => {
774
+ // before the range
775
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-09' , minerId : 'f1one' , timeToFirstByteP50 : [ 1000 ] } )
776
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-09' , minerId : 'f1two' , timeToFirstByteP50 : [ 1000 ] } )
777
+ // in the range
778
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-20' , minerId : 'f1one' , timeToFirstByteP50 : [ 1000 ] } )
779
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-20' , minerId : 'f1two' , timeToFirstByteP50 : [ 1000 ] } )
780
+
781
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-10' , minerId : 'f1one' , timeToFirstByteP50 : [ 123 , 345 ] } )
782
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-10' , minerId : 'f1two' , timeToFirstByteP50 : [ 654 , 789 ] } )
783
+ // after the range
784
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-21' , minerId : 'f1one' , timeToFirstByteP50 : [ 1000 ] } )
785
+ await givenRetrievalTimings ( pgPools . evaluate , { day : '2024-01-21' , minerId : 'f1two' , timeToFirstByteP50 : [ 1000 ] } )
786
+ } )
787
+
788
+ it ( 'lists daily retrieval timings in given date range' , async ( ) => {
789
+ const res = await fetch (
790
+ new URL (
791
+ '/retrieval-timings/daily?from=2024-01-10&to=2024-01-20' ,
792
+ baseUrl
793
+ ) , {
794
+ redirect : 'manual'
795
+ }
796
+ )
797
+ await assertResponseStatus ( res , 200 )
798
+
799
+ const stats = /** @type {{ day: string, success_rate: number }[] } */ (
800
+ await res . json ( )
801
+ )
802
+ assert . deepStrictEqual ( stats , [
803
+ { day : '2024-01-10' , ttfb_ms : 500 } ,
804
+ { day : '2024-01-20' , ttfb_ms : 1000 }
805
+ ] )
806
+ } )
807
+
808
+ it ( 'lists daily retrieval timings summary for specified miner in given date range' , async ( ) => {
809
+ const res = await fetch (
810
+ new URL (
811
+ '/miner/f1one/retrieval-timings/summary?from=2024-01-10&to=2024-01-20' ,
812
+ baseUrl
813
+ ) , {
814
+ redirect : 'manual'
815
+ }
816
+ )
817
+ await assertResponseStatus ( res , 200 )
818
+
819
+ const stats = /** @type {{ day: string, success_rate: number }[] } */ (
820
+ await res . json ( )
821
+ )
822
+ assert . deepStrictEqual ( stats , [
823
+ { day : '2024-01-10' , miner_id : 'f1one' , ttfb_ms : 234 } ,
824
+ { day : '2024-01-20' , miner_id : 'f1one' , ttfb_ms : 1000 }
825
+ ] )
826
+ } )
827
+ } )
770
828
} )
771
829
772
830
/**
@@ -843,3 +901,18 @@ const givenDailyDealStats = async (pgPool, {
843
901
retrievable
844
902
] )
845
903
}
904
+
905
+ /**
906
+ *
907
+ * @param {import('../lib/platform-stats-fetchers.js').Queryable } pgPool
908
+ * @param {object } data
909
+ * @param {string } data.day
910
+ * @param {string } data.minerId
911
+ * @param {number[] } data.timeToFirstByteP50
912
+ */
913
+ const givenRetrievalTimings = async ( pgPool , { day, minerId, timeToFirstByteP50 } ) => {
914
+ await pgPool . query (
915
+ 'INSERT INTO retrieval_timings (day, miner_id, ttfb_p50) VALUES ($1, $2, $3)' ,
916
+ [ day , minerId ?? 'f1test' , timeToFirstByteP50 ]
917
+ )
918
+ }
0 commit comments