@@ -3,6 +3,7 @@ package lastgreen
33
44import (
55 "context"
6+ "fmt"
67 "time"
78
89 "github.com/uber-go/tally"
@@ -11,32 +12,67 @@ import (
1112 "github.com/uber/submitqueue/stovepipe/extension/storage"
1213)
1314
15+ type factory struct {
16+ scope tally.Scope
17+ stores storage.Factory
18+ sourceControls sourcecontrol.Factory
19+ }
20+
1421type reporter struct {
1522 scope tally.Scope
16- stores storage.Factory
17- sourceControl sourcecontrol.Factory
23+ queue string
24+ store storage.Storage
25+ sourceControl sourcecontrol.SourceControl
1826}
1927
28+ var _ observability.Factory = (* factory )(nil )
2029var _ observability.Reporter = (* reporter )(nil )
2130
31+ // NewFactory creates queue-scoped last-known-green reporters.
32+ func NewFactory (
33+ scope tally.Scope ,
34+ stores storage.Factory ,
35+ sourceControls sourcecontrol.Factory ,
36+ ) observability.Factory {
37+ return & factory {
38+ scope : scope ,
39+ stores : stores ,
40+ sourceControls : sourceControls ,
41+ }
42+ }
43+
44+ // For resolves the concrete dependencies needed to report for one queue.
45+ func (f * factory ) For (cfg observability.Config ) (observability.Reporter , error ) {
46+ store , err := f .stores .For (storage.Config {QueueName : cfg .QueueName })
47+ if err != nil {
48+ return nil , fmt .Errorf ("resolve storage for queue %q: %w" , cfg .QueueName , err )
49+ }
50+ sourceControl , err := f .sourceControls .For (sourcecontrol.Config {QueueName : cfg .QueueName })
51+ if err != nil {
52+ return nil , fmt .Errorf ("resolve source control for queue %q: %w" , cfg .QueueName , err )
53+ }
54+ return New (f .scope , cfg .QueueName , store , sourceControl ), nil
55+ }
56+
2257// New creates a Reporter for a queue's last-known-green age.
23- func New (scope tally.Scope , stores storage.Factory , sourceControl sourcecontrol.Factory ) observability.Reporter {
58+ func New (
59+ scope tally.Scope ,
60+ queue string ,
61+ store storage.Storage ,
62+ sourceControl sourcecontrol.SourceControl ,
63+ ) observability.Reporter {
2464 return & reporter {
2565 scope : scope .SubScope ("last_green" ),
26- stores : stores ,
66+ queue : queue ,
67+ store : store ,
2768 sourceControl : sourceControl ,
2869 }
2970}
3071
3172// Report updates the queue's current last-known-green age gauge.
32- func (r * reporter ) Report (ctx context.Context , queue string ) {
33- tags := map [string ]string {"queue" : queue }
34- store , err := r .stores .For (storage.Config {QueueName : queue })
35- if err != nil {
36- r .error (tags , "resolve_storage" )
37- return
38- }
39- queueRow , err := store .GetQueueStore ().Get (ctx , queue )
73+ func (r * reporter ) Report (ctx context.Context ) {
74+ tags := map [string ]string {"queue" : r .queue }
75+ queueRow , err := r .store .GetQueueStore ().Get (ctx , r .queue )
4076 if err != nil {
4177 r .error (tags , "get_queue" )
4278 return
@@ -45,12 +81,7 @@ func (r *reporter) Report(ctx context.Context, queue string) {
4581 r .scope .Tagged (tags ).Counter ("age_missing" ).Inc (1 )
4682 return
4783 }
48- control , err := r .sourceControl .For (sourcecontrol.Config {QueueName : queue })
49- if err != nil {
50- r .error (tags , "resolve_source_control" )
51- return
52- }
53- info , err := control .ChangeInfo (ctx , queueRow .LastGreenURI )
84+ info , err := r .sourceControl .ChangeInfo (ctx , queueRow .LastGreenURI )
5485 if err != nil || info .CreatedAt .IsZero () {
5586 r .error (tags , "get_change_info" )
5687 return
0 commit comments