Skip to content

Commit e878110

Browse files
authored
feat: emit metrics when serving p2p registry API (#53)
1 parent 145f21b commit e878110

File tree

3 files changed

+31
-12
lines changed

3 files changed

+31
-12
lines changed

pkg/discovery/content/registry/mirror.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313

1414
pcontext "github.com/azure/peerd/pkg/context"
1515
"github.com/azure/peerd/pkg/discovery/routing"
16+
"github.com/azure/peerd/pkg/metrics"
1617
"github.com/azure/peerd/pkg/peernet"
1718
)
1819

@@ -30,7 +31,8 @@ type Mirror struct {
3031
router routing.Router
3132
resolveRetries int
3233

33-
n peernet.Network
34+
n peernet.Network
35+
metricsRecorder metrics.Metrics
3436
}
3537

3638
// Handle handles a request to this registry mirror.
@@ -56,6 +58,8 @@ func (m *Mirror) Handle(c pcontext.Context) {
5658
c.AbortWithError(http.StatusInternalServerError, errors.New("neither digest nor reference provided"))
5759
}
5860

61+
startTime := time.Now()
62+
peerCount := 0
5963
peersChan, err := m.router.Resolve(resolveCtx, key, false, m.resolveRetries)
6064
if err != nil {
6165
//nolint
@@ -79,6 +83,12 @@ func (m *Mirror) Handle(c pcontext.Context) {
7983
return
8084
}
8185

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+
8292
succeeded := false
8393
u, err := url.Parse(peer.HttpHost)
8494
if err != nil {
@@ -94,12 +104,16 @@ func (m *Mirror) Handle(c pcontext.Context) {
94104
r.URL.RawQuery = c.Request.URL.RawQuery
95105
pcontext.SetOutboundHeaders(r, c)
96106
}
107+
108+
count := int64(0)
109+
97110
proxy.ModifyResponse = func(resp *http.Response) error {
98111
if resp.StatusCode != http.StatusOK {
99112
return fmt.Errorf("expected peer to respond with 200, got: %s", resp.Status)
100113
}
101114

102115
succeeded = true
116+
count = resp.ContentLength
103117
return nil
104118
}
105119
proxy.ErrorHandler = func(w http.ResponseWriter, r *http.Request, err error) {
@@ -112,18 +126,20 @@ func (m *Mirror) Handle(c pcontext.Context) {
112126
break
113127
}
114128

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")
116131
return
117132
}
118133
}
119134
}
120135

121136
// New creates a new mirror handler.
122-
func New(router routing.Router) *Mirror {
137+
func New(ctx context.Context, router routing.Router) *Mirror {
123138
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(),
128144
}
129145
}

pkg/discovery/content/registry/mirror_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import (
1111

1212
pcontext "github.com/azure/peerd/pkg/context"
1313
"github.com/azure/peerd/pkg/discovery/routing/mocks"
14+
"github.com/azure/peerd/pkg/metrics"
1415
"github.com/gin-gonic/gin"
16+
"github.com/prometheus/client_golang/prometheus"
1517
"github.com/stretchr/testify/require"
1618
)
1719

@@ -64,10 +66,11 @@ func TestMirrorHandler(t *testing.T) {
6466
}
6567
router := mocks.NewMockRouter(resolver)
6668
m := &Mirror{
67-
router: router,
68-
resolveRetries: ResolveRetries,
69-
resolveTimeout: ResolveTimeout,
70-
n: router.Net(),
69+
metricsRecorder: metrics.NewPromMetrics(prometheus.DefaultRegisterer, "test", "test"),
70+
router: router,
71+
resolveRetries: ResolveRetries,
72+
resolveTimeout: ResolveTimeout,
73+
n: router.Net(),
7174
}
7275

7376
tests := []struct {

pkg/handlers/v2/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (h *V2Handler) fill(c pcontext.Context) error {
8787
// New creates a new OCI content handler.
8888
func New(ctx context.Context, router routing.Router, containerdStore containerd.Store) (*V2Handler, error) {
8989
return &V2Handler{
90-
proxy: registry.New(router),
90+
proxy: registry.New(ctx, router),
9191
registry: containerd.NewRegistry(containerdStore),
9292
metricsRecorder: metrics.FromContext(ctx),
9393
}, nil

0 commit comments

Comments
 (0)