Skip to content

Commit 01882f9

Browse files
sdclarkeQinusty
authored andcommitted
Add resource type to prometheus metrics
The value of the `resource_type` qualifier will now be included as a label for Fetch and Push actions where it has been specified
1 parent 6da46f5 commit 01882f9

File tree

2 files changed

+74
-22
lines changed

2 files changed

+74
-22
lines changed

pkg/fetch/metrics_fetcher.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ var (
2323
Subsystem: "remote_asset",
2424
Name: "http_fetcher_blob_size_bytes",
2525
Help: "Size of blobs fetched using the http fetcher, in bytes",
26-
Buckets: util.DecimalExponentialBuckets(-3, 6, 2),
26+
Buckets: util.DecimalExponentialBuckets(1, 6, 2),
2727
},
28-
[]string{"name", "operation"})
28+
[]string{"name", "operation", "resource_type"})
2929
blobAccessOperationsDurationSeconds = prometheus.NewHistogramVec(
3030
prometheus.HistogramOpts{
3131
Namespace: "buildbarn",
@@ -34,14 +34,14 @@ var (
3434
Help: "Amount of time spent per operation on fetching remote assets, in seconds.",
3535
Buckets: util.DecimalExponentialBuckets(-3, 6, 2),
3636
},
37-
[]string{"name", "operation", "status"})
37+
[]string{"name", "operation", "status", "resource_type"})
3838
)
3939

4040
type metricsFetcher struct {
4141
fetcher Fetcher
4242
clock clock.Clock
4343

44-
fetchBlobBlobSizeBytes prometheus.Observer
44+
fetchBlobBlobSizeBytes prometheus.ObserverVec
4545
fetchBlobDurationSeconds prometheus.ObserverVec
4646
fetchDirectoryDurationSeconds prometheus.ObserverVec
4747
}
@@ -57,36 +57,62 @@ func NewMetricsFetcher(fetcher Fetcher, clock clock.Clock, name string) Fetcher
5757
fetcher: fetcher,
5858
clock: clock,
5959

60-
fetchBlobBlobSizeBytes: httpFetcherOperationsBlobSizeBytes.WithLabelValues(name, "Fetch Blob"),
60+
fetchBlobBlobSizeBytes: httpFetcherOperationsBlobSizeBytes.MustCurryWith(map[string]string{"name": name, "operation": "Fetch Blob"}),
6161
fetchBlobDurationSeconds: blobAccessOperationsDurationSeconds.MustCurryWith(map[string]string{"name": name, "operation": "FetchBlob"}),
6262
fetchDirectoryDurationSeconds: blobAccessOperationsDurationSeconds.MustCurryWith(map[string]string{"name": name, "operation": "FetchDirectory"}),
6363
}
6464
}
6565

66-
func (mf *metricsFetcher) updateDurationSeconds(vec prometheus.ObserverVec, code codes.Code, timeStart time.Time) {
67-
vec.WithLabelValues(code.String()).Observe(mf.clock.Now().Sub(timeStart).Seconds())
66+
func (mf *metricsFetcher) updateDurationSeconds(vec prometheus.ObserverVec, code codes.Code, timeStart time.Time, qualifiers []*remoteasset.Qualifier) {
67+
if len(qualifiers) == 0 {
68+
vec.WithLabelValues(code.String(), "N/A").Observe(mf.clock.Now().Sub(timeStart).Seconds())
69+
} else {
70+
resourceType := "N/A"
71+
for _, qualifier := range qualifiers {
72+
if qualifier.Name == "resource_type" {
73+
resourceType = qualifier.Value
74+
break
75+
}
76+
}
77+
vec.WithLabelValues(code.String(), resourceType).Observe(mf.clock.Now().Sub(timeStart).Seconds())
78+
}
79+
}
80+
81+
func (mf *metricsFetcher) updateBlobSizeBytes(vec prometheus.ObserverVec, blobSize float64, qualifiers []*remoteasset.Qualifier) {
82+
if len(qualifiers) == 0 {
83+
vec.WithLabelValues("N/A").Observe(blobSize)
84+
} else {
85+
resourceType := "N/A"
86+
for _, qualifier := range qualifiers {
87+
if qualifier.Name == "resource_type" {
88+
resourceType = qualifier.Value
89+
break
90+
}
91+
}
92+
vec.WithLabelValues(resourceType).Observe(blobSize)
93+
}
6894
}
6995

7096
func (mf *metricsFetcher) FetchBlob(ctx context.Context, req *remoteasset.FetchBlobRequest) (*remoteasset.FetchBlobResponse, error) {
7197
timeStart := mf.clock.Now()
7298
resp, err := mf.fetcher.FetchBlob(ctx, req)
7399
if err != nil {
74-
mf.updateDurationSeconds(mf.fetchBlobDurationSeconds, status.Code(err), timeStart)
100+
mf.updateDurationSeconds(mf.fetchBlobDurationSeconds, status.Code(err), timeStart, req.Qualifiers)
75101
return nil, err
76102
}
77-
mf.updateDurationSeconds(mf.fetchBlobDurationSeconds, codes.Code(resp.Status.Code), timeStart)
78-
mf.fetchBlobBlobSizeBytes.Observe(float64(resp.BlobDigest.SizeBytes))
103+
mf.updateDurationSeconds(mf.fetchBlobDurationSeconds, codes.Code(resp.Status.Code), timeStart, req.Qualifiers)
104+
mf.updateBlobSizeBytes(mf.fetchBlobBlobSizeBytes, float64(resp.BlobDigest.SizeBytes), req.Qualifiers)
79105
return resp, err
80106
}
81107

82108
func (mf *metricsFetcher) FetchDirectory(ctx context.Context, req *remoteasset.FetchDirectoryRequest) (*remoteasset.FetchDirectoryResponse, error) {
83109
timeStart := mf.clock.Now()
84110
resp, err := mf.fetcher.FetchDirectory(ctx, req)
85111
if err != nil {
86-
mf.updateDurationSeconds(mf.fetchDirectoryDurationSeconds, status.Code(err), timeStart)
112+
mf.updateDurationSeconds(mf.fetchDirectoryDurationSeconds, status.Code(err), timeStart, req.Qualifiers)
87113
return nil, err
88114
}
89-
mf.updateDurationSeconds(mf.fetchDirectoryDurationSeconds, codes.Code(resp.Status.Code), timeStart)
115+
mf.updateDurationSeconds(mf.fetchDirectoryDurationSeconds, codes.Code(resp.Status.Code), timeStart, req.Qualifiers)
90116
return resp, err
91117
}
92118

pkg/push/metrics_push_server.go

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ var (
2222
Subsystem: "push_server",
2323
Name: "push_server_blob_size_bytes",
2424
Help: "Size of blobs being pushed, in bytes.",
25-
Buckets: util.DecimalExponentialBuckets(-3, 6, 2),
25+
Buckets: util.DecimalExponentialBuckets(1, 6, 2),
2626
},
27-
[]string{"name", "operation"})
27+
[]string{"name", "operation", "resource_type"})
2828
pushServerOperationsDurationSeconds = prometheus.NewHistogramVec(
2929
prometheus.HistogramOpts{
3030
Namespace: "buildbarn",
@@ -33,7 +33,7 @@ var (
3333
Help: "Amount of time spent per operation on pushing remote assets, in seconds.",
3434
Buckets: util.DecimalExponentialBuckets(-3, 6, 2),
3535
},
36-
[]string{"name", "operation", "grpc_code"})
36+
[]string{"name", "operation", "grpc_code", "resource_type"})
3737

3838
// todo(arlyon): directory size?
3939
)
@@ -42,7 +42,7 @@ type metricsAssetPushServer struct {
4242
pushServer remoteasset.PushServer
4343
clock clock.Clock
4444

45-
pushBlobBlobSizeBytes prometheus.Observer
45+
pushBlobBlobSizeBytes prometheus.ObserverVec
4646
pushBlobDurationSeconds prometheus.ObserverVec
4747
pushDirectoryDurationSeconds prometheus.ObserverVec
4848
}
@@ -59,29 +59,55 @@ func NewMetricsAssetPushServer(ps remoteasset.PushServer, clock clock.Clock, nam
5959
pushServer: ps,
6060
clock: clock,
6161

62-
pushBlobBlobSizeBytes: pushServerOperationsBlobSizeBytes.WithLabelValues(name, "PushBlob"),
62+
pushBlobBlobSizeBytes: pushServerOperationsBlobSizeBytes.MustCurryWith(map[string]string{"name": name, "operation": "PushBlob"}),
6363
pushBlobDurationSeconds: pushServerOperationsDurationSeconds.MustCurryWith(map[string]string{"name": name, "operation": "PushBlob"}),
6464
pushDirectoryDurationSeconds: pushServerOperationsDurationSeconds.MustCurryWith(map[string]string{"name": name, "operation": "PushDirectory"}),
6565
}
6666
}
6767

68-
func (s *metricsAssetPushServer) updateDurationSeconds(vec prometheus.ObserverVec, code codes.Code, timeStart time.Time) {
69-
vec.WithLabelValues(code.String()).Observe(s.clock.Now().Sub(timeStart).Seconds())
68+
func (s *metricsAssetPushServer) updateDurationSeconds(vec prometheus.ObserverVec, code codes.Code, timeStart time.Time, qualifiers []*remoteasset.Qualifier) {
69+
if len(qualifiers) == 0 {
70+
vec.WithLabelValues(code.String(), "N/A").Observe(s.clock.Now().Sub(timeStart).Seconds())
71+
} else {
72+
resourceType := "N/A"
73+
for _, qualifier := range qualifiers {
74+
if qualifier.Name == "resource_type" {
75+
resourceType = qualifier.Value
76+
break
77+
}
78+
}
79+
vec.WithLabelValues(code.String(), resourceType).Observe(s.clock.Now().Sub(timeStart).Seconds())
80+
}
81+
}
82+
83+
func (s *metricsAssetPushServer) updateBlobSizeBytes(vec prometheus.ObserverVec, blobSize float64, qualifiers []*remoteasset.Qualifier) {
84+
if len(qualifiers) == 0 {
85+
vec.WithLabelValues("N/A").Observe(blobSize)
86+
} else {
87+
resourceType := "N/A"
88+
for _, qualifier := range qualifiers {
89+
if qualifier.Name == "resource_type" {
90+
resourceType = qualifier.Value
91+
break
92+
}
93+
}
94+
vec.WithLabelValues(resourceType).Observe(blobSize)
95+
}
7096
}
7197

7298
func (s *metricsAssetPushServer) PushBlob(ctx context.Context, req *remoteasset.PushBlobRequest) (*remoteasset.PushBlobResponse, error) {
7399
if req.BlobDigest != nil {
74-
s.pushBlobBlobSizeBytes.Observe(float64(req.BlobDigest.SizeBytes))
100+
s.updateBlobSizeBytes(s.pushBlobBlobSizeBytes, float64(req.BlobDigest.SizeBytes), req.Qualifiers)
75101
}
76102
timeStart := s.clock.Now()
77103
resp, err := s.pushServer.PushBlob(ctx, req)
78-
s.updateDurationSeconds(s.pushBlobDurationSeconds, status.Code(err), timeStart)
104+
s.updateDurationSeconds(s.pushBlobDurationSeconds, status.Code(err), timeStart, req.Qualifiers)
79105
return resp, err
80106
}
81107

82108
func (s *metricsAssetPushServer) PushDirectory(ctx context.Context, req *remoteasset.PushDirectoryRequest) (*remoteasset.PushDirectoryResponse, error) {
83109
timeStart := s.clock.Now()
84110
resp, err := s.pushServer.PushDirectory(ctx, req)
85-
s.updateDurationSeconds(s.pushDirectoryDurationSeconds, status.Code(err), timeStart)
111+
s.updateDurationSeconds(s.pushDirectoryDurationSeconds, status.Code(err), timeStart, req.Qualifiers)
86112
return resp, err
87113
}

0 commit comments

Comments
 (0)