Skip to content

Commit 0981f93

Browse files
authored
feat(httpserver): Updated http server metrics middleware configurations (ankorstore#117)
1 parent 2d19398 commit 0981f93

File tree

8 files changed

+223
-80
lines changed

8 files changed

+223
-80
lines changed

httpserver/README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ func main() {
459459
}
460460
```
461461

462-
If you need, you can configure the metrics registry, namespace, subsystem, buckets and status code normalization:
462+
If you need, you can configure the metrics registry, namespace, subsystem, buckets and request path / response code normalization:
463463

464464
```go
465465
import (
@@ -473,10 +473,25 @@ server.Use(middleware.RequestMetricsMiddlewareWithConfig(middleware.RequestMetri
473473
Namespace: "foo",
474474
Subsystem: "bar",
475475
Buckets: []float64{0.01, 1, 10},
476-
NormalizeHTTPStatus: true,
476+
NormalizeRequestPath: true,
477+
NormalizeResponseStatus: true,
477478
}))
478479
```
479480

481+
Regarding metrics normalization, if you create a handler like:
482+
483+
```go
484+
server.GET("/foo/bar/:id", func(c echo.Context) error {
485+
// returns a 200 response
486+
return c.String(http.StatusOK, c.Param("id"))
487+
})
488+
```
489+
490+
And receive requests on `/foo/bar/baz?page=1`:
491+
492+
- if `NormalizeRequestPath=true`, the metrics `path` label will be `/foo/bar/:id`, otherwise it'll be `/foo/bar/baz?page=1`
493+
- if `NormalizeResponseStatus=true`, the metrics `status` label will be `2xx`, otherwise it'll be `200`
494+
480495
#### HTML Templates
481496

482497
This module provides a [HtmlTemplateRenderer](renderer.go) for rendering HTML templates.

httpserver/factory_test.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"net/http"
66
"net/http/httptest"
7+
"strings"
78
"testing"
89

910
"github.com/ankorstore/yokai/httpserver"
@@ -13,6 +14,8 @@ import (
1314
"github.com/ankorstore/yokai/trace"
1415
"github.com/ankorstore/yokai/trace/tracetest"
1516
"github.com/labstack/echo/v4"
17+
"github.com/prometheus/client_golang/prometheus"
18+
"github.com/prometheus/client_golang/prometheus/testutil"
1619
"github.com/stretchr/testify/assert"
1720
"go.opentelemetry.io/otel/attribute"
1821
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
@@ -1933,6 +1936,92 @@ func TestCreateWithLeveledRequestLoggerAndTracerAndErrorHandlerOnGenericErrorWit
19331936
})
19341937
}
19351938

1939+
func TestCreateWithRequestMetricsAndWithNormalization(t *testing.T) {
1940+
t.Parallel()
1941+
1942+
registry := prometheus.NewPedanticRegistry()
1943+
1944+
httpServer, err := httpserver.NewDefaultHttpServerFactory().Create()
1945+
assert.NoError(t, err)
1946+
assert.IsType(t, &echo.Echo{}, httpServer)
1947+
1948+
httpServer.Use(middleware.RequestMetricsMiddlewareWithConfig(middleware.RequestMetricsMiddlewareConfig{
1949+
Registry: registry,
1950+
Namespace: "namespace",
1951+
Subsystem: "subsystem",
1952+
NormalizeResponseStatus: true,
1953+
NormalizeRequestPath: true,
1954+
}))
1955+
1956+
httpServer.GET("/foo/bar/:id", func(c echo.Context) error {
1957+
return c.String(http.StatusOK, c.Param("id"))
1958+
})
1959+
1960+
req := httptest.NewRequest(http.MethodGet, "/foo/bar/baz?page=1", nil)
1961+
1962+
rec := httptest.NewRecorder()
1963+
httpServer.ServeHTTP(rec, req)
1964+
1965+
assert.Equal(t, http.StatusOK, rec.Code)
1966+
assert.Contains(t, rec.Body.String(), `baz`)
1967+
1968+
expectedCounterMetric := `
1969+
# HELP namespace_subsystem_requests_total Number of processed HTTP requests
1970+
# TYPE namespace_subsystem_requests_total counter
1971+
namespace_subsystem_requests_total{method="GET",path="/foo/bar/:id",status="2xx"} 1
1972+
`
1973+
1974+
err = testutil.GatherAndCompare(
1975+
registry,
1976+
strings.NewReader(expectedCounterMetric),
1977+
"namespace_subsystem_requests_total",
1978+
)
1979+
assert.NoError(t, err)
1980+
}
1981+
1982+
func TestCreateWithRequestMetricsAndWithoutNormalization(t *testing.T) {
1983+
t.Parallel()
1984+
1985+
registry := prometheus.NewPedanticRegistry()
1986+
1987+
httpServer, err := httpserver.NewDefaultHttpServerFactory().Create()
1988+
assert.NoError(t, err)
1989+
assert.IsType(t, &echo.Echo{}, httpServer)
1990+
1991+
httpServer.Use(middleware.RequestMetricsMiddlewareWithConfig(middleware.RequestMetricsMiddlewareConfig{
1992+
Registry: registry,
1993+
Namespace: "namespace",
1994+
Subsystem: "subsystem",
1995+
NormalizeResponseStatus: false,
1996+
NormalizeRequestPath: false,
1997+
}))
1998+
1999+
httpServer.GET("/foo/bar/:id", func(c echo.Context) error {
2000+
return c.String(http.StatusOK, c.Param("id"))
2001+
})
2002+
2003+
req := httptest.NewRequest(http.MethodGet, "/foo/bar/baz?page=1", nil)
2004+
2005+
rec := httptest.NewRecorder()
2006+
httpServer.ServeHTTP(rec, req)
2007+
2008+
assert.Equal(t, http.StatusOK, rec.Code)
2009+
assert.Contains(t, rec.Body.String(), `baz`)
2010+
2011+
expectedCounterMetric := `
2012+
# HELP namespace_subsystem_requests_total Number of processed HTTP requests
2013+
# TYPE namespace_subsystem_requests_total counter
2014+
namespace_subsystem_requests_total{method="GET",path="/foo/bar/baz?page=1",status="200"} 1
2015+
`
2016+
2017+
err = testutil.GatherAndCompare(
2018+
registry,
2019+
strings.NewReader(expectedCounterMetric),
2020+
"namespace_subsystem_requests_total",
2021+
)
2022+
assert.NoError(t, err)
2023+
}
2024+
19362025
func TestCreateWithPanicRecovery(t *testing.T) {
19372026
t.Parallel()
19382027

httpserver/go.mod

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ require (
66
github.com/ankorstore/yokai/config v1.1.0
77
github.com/ankorstore/yokai/generate v1.0.0
88
github.com/ankorstore/yokai/healthcheck v1.0.0
9-
github.com/ankorstore/yokai/log v1.0.0
9+
github.com/ankorstore/yokai/log v1.1.0
1010
github.com/ankorstore/yokai/trace v1.0.0
1111
github.com/go-errors/errors v1.4.2
1212
github.com/labstack/echo/v4 v4.11.1
1313
github.com/labstack/gommon v0.4.0
14-
github.com/prometheus/client_golang v1.17.0
14+
github.com/prometheus/client_golang v1.19.0
1515
github.com/rs/zerolog v1.29.1
1616
github.com/stretchr/testify v1.8.4
1717
go.opentelemetry.io/otel v1.16.0
@@ -35,13 +35,12 @@ require (
3535
github.com/magiconair/properties v1.8.7 // indirect
3636
github.com/mattn/go-colorable v0.1.13 // indirect
3737
github.com/mattn/go-isatty v0.0.19 // indirect
38-
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
3938
github.com/mitchellh/mapstructure v1.5.0 // indirect
4039
github.com/pelletier/go-toml/v2 v2.1.0 // indirect
4140
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
42-
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect
43-
github.com/prometheus/common v0.44.0 // indirect
44-
github.com/prometheus/procfs v0.11.1 // indirect
41+
github.com/prometheus/client_model v0.5.0 // indirect
42+
github.com/prometheus/common v0.48.0 // indirect
43+
github.com/prometheus/procfs v0.12.0 // indirect
4544
github.com/sagikazarmark/locafero v0.4.0 // indirect
4645
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
4746
github.com/sourcegraph/conc v0.3.0 // indirect
@@ -61,17 +60,17 @@ require (
6160
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
6261
go.uber.org/atomic v1.9.0 // indirect
6362
go.uber.org/multierr v1.9.0 // indirect
64-
golang.org/x/crypto v0.16.0 // indirect
63+
golang.org/x/crypto v0.18.0 // indirect
6564
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
66-
golang.org/x/net v0.19.0 // indirect
67-
golang.org/x/sys v0.15.0 // indirect
65+
golang.org/x/net v0.20.0 // indirect
66+
golang.org/x/sys v0.16.0 // indirect
6867
golang.org/x/text v0.14.0 // indirect
6968
golang.org/x/time v0.5.0 // indirect
7069
google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect
7170
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
7271
google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect
7372
google.golang.org/grpc v1.59.0 // indirect
74-
google.golang.org/protobuf v1.31.0 // indirect
73+
google.golang.org/protobuf v1.32.0 // indirect
7574
gopkg.in/ini.v1 v1.67.0 // indirect
7675
gopkg.in/yaml.v3 v3.0.1 // indirect
7776
)

httpserver/go.sum

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ github.com/ankorstore/yokai/generate v1.0.0 h1:kHpbl8cet9qklUamMqSTJy3h6aiybKMgn
4040
github.com/ankorstore/yokai/generate v1.0.0/go.mod h1:7/gebXdxAOmqeDG54RcguC0a+f3JtqEKVKtSy8f2dlk=
4141
github.com/ankorstore/yokai/healthcheck v1.0.0 h1:uX6RrchsvbxCV70dh5d6RX5LEuGIf+Pt+14waV0CzY0=
4242
github.com/ankorstore/yokai/healthcheck v1.0.0/go.mod h1:Frz73NuG8ruLDz04vQxzf0bWhKK1Ru2Ktod+3ltaIxs=
43-
github.com/ankorstore/yokai/log v1.0.0 h1:9NsM0J+1O028WuNDW7vr0yeUdWDX1JKYTkuz7hiYCSs=
44-
github.com/ankorstore/yokai/log v1.0.0/go.mod h1:lyBRVA8VkrmlNjaR2jVTH9XjV06ioolWTuDVN6wF0vk=
43+
github.com/ankorstore/yokai/log v1.1.0 h1:7+kkmbGMtpfkEEaWSZ4/4Yp+dieVoolOVG24NpEJDO4=
44+
github.com/ankorstore/yokai/log v1.1.0/go.mod h1:lyBRVA8VkrmlNjaR2jVTH9XjV06ioolWTuDVN6wF0vk=
4545
github.com/ankorstore/yokai/trace v1.0.0 h1:EKWXyg2W8v3xszIiB5JfiDwU2OUfSDOo8LXJMDxlSrw=
4646
github.com/ankorstore/yokai/trace v1.0.0/go.mod h1:OhCIJouVmBD7je1dIynqR1mhMEFCBzidy16a624lwBw=
4747
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
@@ -136,7 +136,7 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
136136
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
137137
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
138138
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
139-
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
139+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
140140
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
141141
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
142142
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
@@ -182,8 +182,6 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k
182182
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
183183
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
184184
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
185-
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
186-
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
187185
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
188186
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
189187
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
@@ -192,15 +190,15 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
192190
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
193191
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
194192
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
195-
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
196-
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
193+
github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU=
194+
github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k=
197195
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
198-
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 h1:v7DLqVdK4VrYkVD5diGdl4sxJurKJEMnODWRJlxV9oM=
199-
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
200-
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
201-
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
202-
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
203-
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
196+
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
197+
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
198+
github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE=
199+
github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
200+
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
201+
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
204202
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
205203
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
206204
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
@@ -278,8 +276,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
278276
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
279277
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
280278
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
281-
golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
282-
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
279+
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
280+
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
283281
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
284282
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
285283
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -339,8 +337,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R
339337
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
340338
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
341339
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
342-
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
343-
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
340+
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
341+
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
344342
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
345343
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
346344
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -388,8 +386,8 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
388386
golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
389387
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
390388
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
391-
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
392-
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
389+
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
390+
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
393391
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
394392
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
395393
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -538,8 +536,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
538536
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
539537
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
540538
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
541-
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
542-
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
539+
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
540+
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
543541
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
544542
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
545543
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=

0 commit comments

Comments
 (0)