Skip to content

Commit

Permalink
Merge branch 'msg/add-consuming-metrics' of github.com:atlassian/gost…
Browse files Browse the repository at this point in the history
…atsd into limit-concurrent-req-n-batch
  • Loading branch information
hstan committed May 23, 2024
2 parents f04182e + 33ee86f commit 4b017b4
Show file tree
Hide file tree
Showing 36 changed files with 1,478 additions and 351 deletions.
17 changes: 17 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,20 @@
39.0.0
------
- Fix breaking change from viper 1.15 -> 1.16

38.1.0
------
- Add support for LZ4 compression

38.0.1
------
- Fix manual release due to failing docker builds

38.0.0
------
- Adds support for Lambda extension
- Adds optional fipsonly check on build

37.0.0
------
- Bumping go version to 1.21.4
Expand Down
19 changes: 10 additions & 9 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ REPO_VERSION ?= $(shell git describe --abbrev=0 --tags)
GIT_HASH ?= $(shell git rev-parse --short HEAD)
BINARY_NAME := gostatsd
CPU_ARCH ?= amd64
GCO_ENABLED ?= 0
CGO_ENABLED ?= 0
REPOSITORY_NAME := atlassianlabs/$(BINARY_NAME)
REGISTRY_NAME := docker-public.packages.atlassian.com
IMAGE_PREFIX := $(REGISTRY_NAME)/$(REPOSITORY_NAME)
Expand All @@ -21,7 +21,6 @@ TOOLS_SRC_DIR := $(PROJECT_ROOT_DIR)/internal/tools
ALL_TOOLS_PACKAGES := $(shell grep -E '(^|\s)_\s+\".*\"$$' < $(TOOLS_SRC_DIR)/tools.go | tr -d '"' | awk '{print $$2;}')
ALL_TOOLS_COMMAND := $(sort $(addprefix $(TOOLS_DIR)/,$(notdir $(ALL_TOOLS_PACKAGES))))


.PHONY: tools
tools: $(ALL_TOOLS_COMMAND)

Expand All @@ -41,15 +40,12 @@ pb/gostatsd.pb.go: pb/gostatsd.proto tools/bin/protoc
--go_opt=paths=source_relative $<

build: pb/gostatsd.pb.go
CGO_ENABLED=$(GCO_ENABLED) GOEXPERIMENT=boringcrypto \
CGO_ENABLED=$(CGO_ENABLED) GOEXPERIMENT=boringcrypto \
go build \
-v \
-ldflags "-s \
-X main.Version=$(REPO_VERSION) \
-X main.GitCommit=$(GIT_HASH) \
-X main.BuildDate=$(BUILD_DATE)" \
-ldflags "-X main.Version=$(REPO_VERSION) -X main.GitCommit=$(GIT_HASH) -X main.BuildDate=$(BUILD_DATE)" \
$(GOBUILD_OPTIONAL_FLAGS) \
-o build/bin/$(ARCH)/$(BINARY_NAME) \
-o bin/$(ARCH)/$(CPU_ARCH)/$(BINARY_NAME) \
$(PKG)

build-gostatsd:
Expand All @@ -59,11 +55,16 @@ build-lambda:
@$(MAKE) build PKG=$(LAMBDA_PKG) BINARY_NAME="lambda-extension"

build-gostatsd-race:
@$(MAKE) build-gostatsd GOBUILD_OPTIONAL_FLAGS=-race
@$(MAKE) build-gostatsd GOBUILD_OPTIONAL_FLAGS="-race"

build-cluster:
@$(MAKE) build PKG=$(CLUSTER_PKG) BINARY_NAME="cluster"

build-gostatsd-fips:
@$(MAKE) build-gostatsd GOBUILD_OPTIONAL_FLAGS="-tags fips"

build-lambda-fips:
@$(MAKE) build PKG=$(LAMBDA_PKG) BINARY_NAME="lambda-extension" GOBUILD_OPTIONAL_FLAGS="-tags fips"

build-all: pb/gostatsd.pb.go tools

Expand Down
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ spoken is not configurable per server (see [HTTP.md](HTTP.md) for version guaran
following configuration options:

- `compress`: boolean indicating if the payload should be compressed. Defaults to `true`
- `compression-type`: compression algorithm to use, one of `zlib` or `lz4`. Defaults to `zlib`. Note `lz4` is non-standard
so make sure the downstream consumer can handle `Content-Encoding='lz4'`.
- `compression-level`: compression level to use (0-9). 0 = best speed, 9 = best compression. Defaults to 9.
- `api-endpoint`: configures the endpoint to submit raw metrics to. This setting should be just a base URL, for example
`https://statsd-aggregator.private`, with no path. Required, no default
- `max-requests`: maximum number of requests in flight. Defaults to `1000` (which is probably too high)
Expand Down Expand Up @@ -161,6 +164,29 @@ The following settings from the previous section are also supported:
- `hostname`
- `log-raw-metric`

Running as a Lambda Extension (experimental feature)
-----------------------------
Gostatsd can be run as a lambda extension in forwarder mode. The metrics are flushed at the end of each lambda invocation
by default. The flush interval is ignored for your custom metrics, internal metrics are still flushed on a best effort
basis using the configured flush interval.

To support flushes based on the runtime function, a lambda telemetry server is started at the reserved lambda hostname
`sandbox` on port 8083. This can be configured by setting the `lambda-extension-telemetry-address` configuration parameter.
This will need to be done if port 8083 is not available within the lambda runtime.

The flush per invocation setting can be disabled by setting `lambda-extension-manual-flush` to `false`, however this
is not recommended unless the lambda is constantly invoked. Since the extensions are suspended once the user lambda
functions return, this may lead to metric loss (for inflight requests) or metric delay until the next invocation in
lambdas that are sparsely invoked.

Configurable options:
- `lambda-extension-telemetry-address`: address that the extension telemetry server should listen on
- `lambda-extension-manual-flush`: boolean indicating whether the lambda should flush per invocation and disregard the
the flush interval

All options for specified in the previous section for the forwarder are also configurable with the following caveats:
- `dynamic-headers` are not supported
- `flush-interval` will not be respected when `lambda-extension-manual-flush` is set to true

Metric expiry and persistence
-----------------------------
Expand Down
2 changes: 1 addition & 1 deletion build/Dockerfile-multiarch
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Go version needs to be the same in: CI config, README, Dockerfiles, and Makefile
FROM golang:1.21.3 AS build
FROM golang:1.21.4 AS build
WORKDIR /build

# Install dependencies first to take advantage of the docker build cache.
Expand Down
2 changes: 1 addition & 1 deletion build/Dockerfile-multiarch-glibc
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ ADD . /build

# Race needs CGO
# https://github.com/golang/go/issues/51235
RUN make build CGO_ENABLED=1 PKG=${MAIN_PKG}
RUN make build CPU_ARCH=${TARGETARCH} CGO_ENABLED=1 PKG=${MAIN_PKG}

FROM ubuntu:22.04

Expand Down
8 changes: 8 additions & 0 deletions cmd/gostatsd/enforce_fips.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//go:build fips

package main

// To ensure that fips is only built when requested,
// the go build tags are used to adopt the allowed crypto libraries.

import _ "crypto/tls/fipsonly"
8 changes: 8 additions & 0 deletions cmd/lambda-extension/enforce_fips.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//go:build fips

package main

// To ensure that fips is only built when requested,
// the go build tags are used to adopt the allowed crypto libraries.

import _ "crypto/tls/fipsonly"
51 changes: 35 additions & 16 deletions cmd/lambda-extension/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import (
"github.com/atlassian/gostatsd"
"github.com/atlassian/gostatsd/internal/awslambda/extension"
"github.com/atlassian/gostatsd/internal/awslambda/extension/api"
"github.com/atlassian/gostatsd/internal/awslambda/extension/telemetry"
"github.com/atlassian/gostatsd/internal/flush"
"github.com/atlassian/gostatsd/internal/util"
"github.com/atlassian/gostatsd/pkg/statsd"
"github.com/atlassian/gostatsd/pkg/transport"
Expand All @@ -40,7 +42,7 @@ func GetConfiguration() (*viper.Viper, error) {
cmd := pflag.NewFlagSet(os.Args[0], pflag.ContinueOnError)
cmd.Bool(ParamVerbose, false, "Enables debug level logs within the extension")
cmd.String(ParamConfigPath, "", "Path to a configuration file")
cmd.String(ParamLambdaFileName, "", "Name of executable that boostraps lambda. Used as Lambda-Extension-Name header")
cmd.String(ParamLambdaFileName, "", "Name of executable that bootstraps lambda. Used as Lambda-Extension-Name header")

gostatsd.AddFlags(cmd)

Expand All @@ -61,15 +63,16 @@ func GetConfiguration() (*viper.Viper, error) {
}
}

// enable manual flush mode by default
v.SetDefault(gostatsd.ParamLambdaExtensionManualFlush, true)
v.SetDefault(gostatsd.ParamLambdaExtensionTelemetryAddress, telemetry.LambdaRuntimeAvailableAddr)

return v, nil
}

func CreateServer(v *viper.Viper, logger logrus.FieldLogger) (*statsd.Server, error) {
// HTTP client pool
pool := transport.NewTransportPool(logger, v)

// Create server in forwarder mode
return &statsd.Server{
func NewServer(v *viper.Viper, logger logrus.FieldLogger) *statsd.Server {
// create server in forwarder mode
s := &statsd.Server{
InternalTags: v.GetStringSlice(gostatsd.ParamInternalTags),
InternalNamespace: v.GetString(gostatsd.ParamInternalNamespace),
DefaultTags: v.GetStringSlice(gostatsd.ParamDefaultTags),
Expand All @@ -93,8 +96,16 @@ func CreateServer(v *viper.Viper, logger logrus.FieldLogger) (*statsd.Server, er
},
BadLineRateLimitPerSecond: rate.Limit(v.GetFloat64(gostatsd.ParamBadLinesPerMinute) / 60.0),
Viper: v,
TransportPool: pool,
}, nil
TransportPool: transport.NewTransportPool(logger, v),
}

if v.GetBool(gostatsd.ParamLambdaExtensionManualFlush) {
s.ForwarderFlushCoordinator = flush.NewFlushCoordinator()
// Dynamic headers are disable as they can cause multiple flush notifies per flush
v.Set("dynamic-header", []string{})
}

return s
}

func main() {
Expand All @@ -119,21 +130,29 @@ func main() {
log.Logger.SetLevel(logrus.DebugLevel)
}

// TODO: Configure log group

log.Info("Starting extension runtime")

ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()

manager := extension.NewManager(os.Getenv(api.EnvLambdaAPIHostname), conf.GetString(ParamLambdaFileName), log)
server := NewServer(conf, log)

server, err := CreateServer(conf, log)
if err != nil {
log.WithError(err).Panic("Unable to create gostatsd server")
var opts = make([]extension.ManagerOpt, 0)
telemetryServerAddr := conf.GetString(gostatsd.ParamLambdaExtensionTelemetryAddress)
if conf.GetBool(gostatsd.ParamLambdaExtensionManualFlush) {
log.Info("Starting extension with manual flush")
opts = append(opts, extension.WithManualFlushEnabled(server.ForwarderFlushCoordinator, telemetryServerAddr))
}

if err := manager.Run(ctx, server); err != nil {
manager := extension.NewManager(
os.Getenv(api.EnvLambdaAPIHostname),
conf.GetString(ParamLambdaFileName),
log,
server,
opts...,
)

if err := manager.Run(ctx); err != nil {
log.WithError(err).Error("Failed trying to run lambda extension")
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/tester/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM alpine:3.19.0
FROM alpine:3.19.1
RUN apk --no-cache add \
ca-certificates
ADD statsd-tester-linux /bin/statsd-tester
Expand Down
4 changes: 4 additions & 0 deletions defaults_and_params.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@ const (
ParamLogRawMetric = "log-raw-metric"
// ParamDisableInternalEvents enables sending internal events from gostatsd
ParamDisableInternalEvents = "disable-internal-events"
// ParamLambdaExtensionManualFlush enables the manual flushing of metrics in forwarder mode, the flush interval is ignored
ParamLambdaExtensionManualFlush = "lambda-extension-manual-flush"
// ParamLambdaExtensionTelemetryAddress enables the manual flushing of metrics in forwarder mode, the flush interval is ignored
ParamLambdaExtensionTelemetryAddress = "lambda-extension-telemetry-address"
)

// AddFlags adds flags to the specified FlagSet.
Expand Down
8 changes: 3 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/atlassian/gostatsd

go 1.19
go 1.21.4

require (
github.com/alicebob/miniredis/v2 v2.23.0
Expand All @@ -20,7 +20,7 @@ require (
github.com/tilinna/clock v1.1.0
golang.org/x/net v0.17.0
golang.org/x/time v0.3.0
google.golang.org/protobuf v1.31.0
google.golang.org/protobuf v1.33.0
k8s.io/api v0.25.2
k8s.io/apimachinery v0.25.2
k8s.io/client-go v0.25.2
Expand All @@ -29,6 +29,7 @@ require (
)

require (
github.com/pierrec/lz4/v4 v4.1.19
go.opentelemetry.io/proto/otlp v1.0.0
go.uber.org/multierr v1.9.0
golang.org/x/exp v0.0.0-20230905200255-921286631fa9
Expand Down Expand Up @@ -92,6 +93,3 @@ require (
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.2.0 // indirect
)

// https://github.com/atlassian/gostatsd/pull/455
replace github.com/denis-tingajkin/go-header => github.com/denis-tingaikin/go-header v0.4.2
18 changes: 16 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
Expand All @@ -104,6 +105,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE=
github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
Expand Down Expand Up @@ -167,6 +169,7 @@ github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLe
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
Expand Down Expand Up @@ -200,6 +203,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
Expand All @@ -223,11 +227,17 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU=
github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=
github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=
github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4=
github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
github.com/pierrec/lz4/v4 v4.1.19 h1:tYLzDnjDXh9qIxSTKHwXwOYmm9d887Y7Y1ZkyXYHAN4=
github.com/pierrec/lz4/v4 v4.1.19/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
Expand All @@ -237,6 +247,7 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ=
github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U=
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
Expand Down Expand Up @@ -567,6 +578,7 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb h1:XFBgcDwm7irdHTbz4Zk2h7Mh+eis4nfJEFQFYzJzuIA=
google.golang.org/genproto v0.0.0-20230913181813-007df8e322eb/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4=
google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb h1:lK0oleSc7IQsUxO3U5TjL9DWlsxpEBemh+zpB7IqhWI=
google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk=
google.golang.org/genproto/googleapis/rpc v0.0.0-20230920204549-e6e6cdab5c13 h1:N3bU/SQDCDyD6R528GJ/PwW9KjYcJA3dgyH+MovAkIM=
Expand Down Expand Up @@ -601,19 +613,21 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
Expand Down
Loading

0 comments on commit 4b017b4

Please sign in to comment.