@@ -13,6 +13,7 @@ import (
13
13
14
14
pcontext "github.com/azure/peerd/pkg/context"
15
15
"github.com/azure/peerd/pkg/discovery/routing"
16
+ "github.com/azure/peerd/pkg/metrics"
16
17
"github.com/azure/peerd/pkg/peernet"
17
18
)
18
19
@@ -30,7 +31,8 @@ type Mirror struct {
30
31
router routing.Router
31
32
resolveRetries int
32
33
33
- n peernet.Network
34
+ n peernet.Network
35
+ metricsRecorder metrics.Metrics
34
36
}
35
37
36
38
// Handle handles a request to this registry mirror.
@@ -56,6 +58,8 @@ func (m *Mirror) Handle(c pcontext.Context) {
56
58
c .AbortWithError (http .StatusInternalServerError , errors .New ("neither digest nor reference provided" ))
57
59
}
58
60
61
+ startTime := time .Now ()
62
+ peerCount := 0
59
63
peersChan , err := m .router .Resolve (resolveCtx , key , false , m .resolveRetries )
60
64
if err != nil {
61
65
//nolint
@@ -79,6 +83,12 @@ func (m *Mirror) Handle(c pcontext.Context) {
79
83
return
80
84
}
81
85
86
+ if peerCount == 0 {
87
+ // Only report the time it took to discover the first peer.
88
+ m .metricsRecorder .RecordPeerDiscovery (peer .HttpHost , time .Since (startTime ).Seconds ())
89
+ peerCount ++
90
+ }
91
+
82
92
succeeded := false
83
93
u , err := url .Parse (peer .HttpHost )
84
94
if err != nil {
@@ -94,12 +104,16 @@ func (m *Mirror) Handle(c pcontext.Context) {
94
104
r .URL .RawQuery = c .Request .URL .RawQuery
95
105
pcontext .SetOutboundHeaders (r , c )
96
106
}
107
+
108
+ count := int64 (0 )
109
+
97
110
proxy .ModifyResponse = func (resp * http.Response ) error {
98
111
if resp .StatusCode != http .StatusOK {
99
112
return fmt .Errorf ("expected peer to respond with 200, got: %s" , resp .Status )
100
113
}
101
114
102
115
succeeded = true
116
+ count = resp .ContentLength
103
117
return nil
104
118
}
105
119
proxy .ErrorHandler = func (w http.ResponseWriter , r * http.Request , err error ) {
@@ -112,18 +126,20 @@ func (m *Mirror) Handle(c pcontext.Context) {
112
126
break
113
127
}
114
128
115
- l .Info ().Str ("peer" , u .Host ).Msg ("request served from peer" )
129
+ m .metricsRecorder .RecordPeerResponse (peer .HttpHost , key , "pull" , time .Since (startTime ).Seconds (), count )
130
+ l .Info ().Str ("peer" , u .Host ).Int64 ("count" , count ).Msg ("request served from peer" )
116
131
return
117
132
}
118
133
}
119
134
}
120
135
121
136
// New creates a new mirror handler.
122
- func New (router routing.Router ) * Mirror {
137
+ func New (ctx context. Context , router routing.Router ) * Mirror {
123
138
return & Mirror {
124
- resolveTimeout : ResolveTimeout ,
125
- router : router ,
126
- resolveRetries : ResolveRetries ,
127
- n : router .Net (),
139
+ metricsRecorder : metrics .FromContext (ctx ),
140
+ resolveTimeout : ResolveTimeout ,
141
+ router : router ,
142
+ resolveRetries : ResolveRetries ,
143
+ n : router .Net (),
128
144
}
129
145
}
0 commit comments