github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libpages/stats.go (about) 1 // Copyright 2018 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package libpages 6 7 import ( 8 "errors" 9 "time" 10 11 "github.com/keybase/client/go/kbfs/tlf" 12 ) 13 14 // ActivesGetter holds necessary data to generate number of active TLFs or 15 // hosts. 16 type ActivesGetter interface { 17 // GetActives returns the number of active TLFs and active hosts in the 18 // past dur. 19 GetActives(dur time.Duration) (activeTlfs int, activeHosts int, err error) 20 } 21 22 // ActivityStatsStorer defines a set of methods to record activities based on 23 // TLF ID and host names. 24 type ActivityStatsStorer interface { 25 // RecordActives records that tlfID and host has just been active. 26 RecordActives(tlfID tlf.ID, host string) 27 28 // GetActivesGetter returns a ActivesGetter from current state of the 29 // ActivityStatsStorer. 30 GetActivesGetter() (ActivesGetter, error) 31 } 32 33 // NameableDuration is a wrapper around time.Duration that allows customized 34 // String() encoding. 35 type NameableDuration struct { 36 Duration time.Duration 37 Name string 38 } 39 40 // String returns d.Name if it's not empty, or d.Duration.String(). 41 func (d NameableDuration) String() string { 42 if len(d.Name) > 0 { 43 return d.Name 44 } 45 return d.Duration.String() 46 } 47 48 // ActivityStatsEnabler describes what backend storer a StatsReporter should 49 // use for activity-based stats, and how the stats should be generated. 50 type ActivityStatsEnabler struct { 51 // Storer specifies a backend storer that a StatsReporter should use to 52 // store data necessary for generating activity-based stats. 53 Storer ActivityStatsStorer 54 // Durations specifies a slice of durations that activity-based stats 55 // should be about. For example, [1h, 1d, 1week] makes the StatsReporter 56 // should report hourly, daily, and weekly active stats. 57 Durations []NameableDuration 58 // Interval specifies how often the activity-based stats should be 59 // reported. 60 Interval time.Duration 61 } 62 63 // StatsReporter defines a collection of methods for stats reporting. 64 type StatsReporter interface { 65 // ReportServedRequest is called by libpages whenever a request comes in. 66 ReportServedRequest(r *ServedRequestInfo) 67 } 68 69 type multiStatReporter []StatsReporter 70 71 var _ StatsReporter = multiStatReporter(nil) 72 73 // NewMultiStatReporter creates a StatsReporter that reports through all passed 74 // in reporters. 75 func NewMultiStatReporter(reporters ...StatsReporter) StatsReporter { 76 return multiStatReporter(reporters) 77 } 78 79 // ReportServedRequest implements the StatsReporter interface. 80 func (m multiStatReporter) ReportServedRequest( 81 r *ServedRequestInfo) { 82 for _, reporter := range m { 83 reporter.ReportServedRequest(r) 84 } 85 } 86 87 type nullActivityStatsStorer struct{} 88 89 var _ ActivityStatsStorer = nullActivityStatsStorer{} 90 91 // RecordActives (does not) implement the ActivityStatsStorer interface. 92 func (nullActivityStatsStorer) RecordActives(tlf.ID, string) {} 93 94 // GetActiveTlfs (does not) implement the ActivityStatsStorer interface. 95 func (nullActivityStatsStorer) GetActivesGetter() (ActivesGetter, error) { 96 return nil, errors.New("not supported") 97 }