@@ -67,16 +67,16 @@ func (this *ServerDailyStatService) UploadServerDailyStats(ctx context.Context,
6767 return this .Success ()
6868}
6969
70- // FindServerHourlyStats 按小时读取统计数据
71- func (this * ServerDailyStatService ) FindServerHourlyStats (ctx context.Context , req * pb.FindServerHourlyStatsRequest ) (* pb.FindServerHourlyStatsResponse , error ) {
70+ // FindLatestServerHourlyStats 按小时读取统计数据
71+ func (this * ServerDailyStatService ) FindLatestServerHourlyStats (ctx context.Context , req * pb.FindLatestServerHourlyStatsRequest ) (* pb.FindLatestServerHourlyStatsResponse , error ) {
7272 _ , err := this .ValidateAdmin (ctx , 0 )
7373 if err != nil {
7474 return nil , err
7575 }
7676
7777 tx := this .NullTx ()
7878
79- result := []* pb.FindServerHourlyStatsResponse_HourlyStat {}
79+ result := []* pb.FindLatestServerHourlyStatsResponse_HourlyStat {}
8080 if req .Hours > 0 {
8181 for i := int32 (0 ); i < req .Hours ; i ++ {
8282 hourString := timeutil .Format ("YmdH" , time .Now ().Add (- time .Duration (i )* time .Hour ))
@@ -85,7 +85,7 @@ func (this *ServerDailyStatService) FindServerHourlyStats(ctx context.Context, r
8585 return nil , err
8686 }
8787 if stat != nil {
88- result = append (result , & pb.FindServerHourlyStatsResponse_HourlyStat {
88+ result = append (result , & pb.FindLatestServerHourlyStatsResponse_HourlyStat {
8989 Hour : hourString ,
9090 Bytes : stat .Bytes ,
9191 CachedBytes : stat .CachedBytes ,
@@ -95,5 +95,93 @@ func (this *ServerDailyStatService) FindServerHourlyStats(ctx context.Context, r
9595 }
9696 }
9797 }
98- return & pb.FindServerHourlyStatsResponse {Stats : result }, nil
98+ return & pb.FindLatestServerHourlyStatsResponse {Stats : result }, nil
99+ }
100+
101+ // FindLatestServerMinutelyStats 按分钟读取统计数据
102+ func (this * ServerDailyStatService ) FindLatestServerMinutelyStats (ctx context.Context , req * pb.FindLatestServerMinutelyStatsRequest ) (* pb.FindLatestServerMinutelyStatsResponse , error ) {
103+ _ , err := this .ValidateAdmin (ctx , 0 )
104+ if err != nil {
105+ return nil , err
106+ }
107+
108+ tx := this .NullTx ()
109+
110+ result := []* pb.FindLatestServerMinutelyStatsResponse_MinutelyStat {}
111+ cache := map [string ]* pb.FindLatestServerMinutelyStatsResponse_MinutelyStat {} // minute => stat
112+
113+ var avgRatio int64 = 5 * 60 // 因为每5分钟记录一次
114+
115+ if req .Minutes > 0 {
116+ for i := int32 (0 ); i < req .Minutes ; i ++ {
117+ date := time .Now ().Add (- time .Duration (i ) * time .Minute )
118+ minuteString := timeutil .Format ("YmdHi" , date )
119+
120+ minute := date .Minute ()
121+ roundMinute := minute - minute % 5
122+ if roundMinute != minute {
123+ date = date .Add (- time .Duration (minute - roundMinute ) * time .Minute )
124+ }
125+ queryMinuteString := timeutil .Format ("YmdHi" , date )
126+ pbStat , ok := cache [queryMinuteString ]
127+ if ok {
128+ result = append (result , & pb.FindLatestServerMinutelyStatsResponse_MinutelyStat {
129+ Minute : minuteString ,
130+ Bytes : pbStat .Bytes ,
131+ CachedBytes : pbStat .CachedBytes ,
132+ CountRequests : pbStat .CountRequests ,
133+ CountCachedRequests : pbStat .CountCachedRequests ,
134+ })
135+ continue
136+ }
137+
138+ stat , err := models .SharedServerDailyStatDAO .SumMinutelyStat (tx , req .ServerId , queryMinuteString )
139+ if err != nil {
140+ return nil , err
141+ }
142+ if stat != nil {
143+ pbStat = & pb.FindLatestServerMinutelyStatsResponse_MinutelyStat {
144+ Minute : minuteString ,
145+ Bytes : stat .Bytes / avgRatio ,
146+ CachedBytes : stat .CachedBytes / avgRatio ,
147+ CountRequests : stat .CountRequests / avgRatio ,
148+ CountCachedRequests : stat .CountCachedRequests / avgRatio ,
149+ }
150+ result = append (result , pbStat )
151+ cache [queryMinuteString ] = pbStat
152+ }
153+ }
154+ }
155+ return & pb.FindLatestServerMinutelyStatsResponse {Stats : result }, nil
156+ }
157+
158+ // FindLatestServerDailyStats 按天读取统计数据
159+ func (this * ServerDailyStatService ) FindLatestServerDailyStats (ctx context.Context , req * pb.FindLatestServerDailyStatsRequest ) (* pb.FindLatestServerDailyStatsResponse , error ) {
160+ _ , err := this .ValidateAdmin (ctx , 0 )
161+ if err != nil {
162+ return nil , err
163+ }
164+
165+ tx := this .NullTx ()
166+
167+ result := []* pb.FindLatestServerDailyStatsResponse_DailyStat {}
168+ if req .Days > 0 {
169+ for i := int32 (0 ); i < req .Days ; i ++ {
170+ dayString := timeutil .Format ("Ymd" , time .Now ().AddDate (0 , 0 , - int (i )))
171+ stat , err := models .SharedServerDailyStatDAO .SumDailyStat (tx , req .ServerId , dayString )
172+ if err != nil {
173+ return nil , err
174+ }
175+ if stat != nil {
176+ result = append (result , & pb.FindLatestServerDailyStatsResponse_DailyStat {
177+ Day : dayString ,
178+ Bytes : stat .Bytes ,
179+ CachedBytes : stat .CachedBytes ,
180+ CountRequests : stat .CountRequests ,
181+ CountCachedRequests : stat .CountCachedRequests ,
182+ })
183+ }
184+ }
185+ }
186+ return & pb.FindLatestServerDailyStatsResponse {Stats : result }, nil
99187}
0 commit comments