diff --git a/src/core-api/cmd/init.go b/src/core-api/cmd/init.go index bd507e806..4d52ca433 100644 --- a/src/core-api/cmd/init.go +++ b/src/core-api/cmd/init.go @@ -25,6 +25,7 @@ import ( "core/pkg/database" "core/pkg/logging" "core/pkg/metric" + "core/pkg/trace" "github.com/getsentry/sentry-go" "github.com/spf13/viper" @@ -60,7 +61,7 @@ func initDatabase() { panic("database apigateway should be configured") } - database.InitDBClients(&defaultDBConfig) + database.InitDBClients(&defaultDBConfig, globalConfig.Tracing) logging.GetLogger().Info("init Database success") } @@ -86,3 +87,17 @@ func initMetrics() { metric.InitMetrics() logging.GetLogger().Info("init Metrics success") } + +func initTracing() { + if !globalConfig.Tracing.Enable { + logging.GetLogger().Info("tracing is not enabled, will not init it") + return + } + logging.GetLogger().Info("enabling tracing") + err := trace.InitTrace(globalConfig.Tracing) + if err != nil { + logging.GetLogger().Errorf("init tracing fail: %+v", err) + return + } + logging.GetLogger().Info("init tracing success") +} diff --git a/src/core-api/cmd/root.go b/src/core-api/cmd/root.go index 8da6787c6..8c754d52a 100644 --- a/src/core-api/cmd/root.go +++ b/src/core-api/cmd/root.go @@ -84,7 +84,8 @@ func Start() { } initConfig() - // 1. + // 1. init components + initTracing() initLogger() initSentry() initMetrics() diff --git a/src/core-api/config.yaml.tpl b/src/core-api/config.yaml.tpl index 8687d1a85..6d6b2ea59 100644 --- a/src/core-api/config.yaml.tpl +++ b/src/core-api/config.yaml.tpl @@ -35,3 +35,17 @@ logger: writer: file buffered: true settings: {name: core_api.log, size: 100, backups: 10, age: 7, path: ./} + +## config for trace +tracing: + enable: true + endpoint: "127.0.0.1:4318" + ## report type: grpc/http + type: "http" + ## support: "always_on"/"always_off"/"0.1"(TraceIDRatioBased samples),if not config,default: "parentbased_always_on" + sampler: "always_on" + token: "blueking" + serviceName: "apigateway-core-api" + instrument: + ginAPI: true + dbAPI: true \ No newline at end of file diff --git a/src/core-api/go.mod b/src/core-api/go.mod index 5149a0d5c..da5a4efdf 100644 --- a/src/core-api/go.mod +++ b/src/core-api/go.mod @@ -4,11 +4,11 @@ go 1.20 require ( github.com/DATA-DOG/go-sqlmock v1.5.0 - github.com/TencentBlueKing/gopkg v1.1.0 + github.com/TencentBlueKing/gopkg v1.2.0 github.com/agiledragon/gomonkey/v2 v2.10.1 github.com/dlmiddlecote/sqlstats v1.0.2 github.com/getsentry/sentry-go v0.20.0 - github.com/gin-gonic/gin v1.8.1 + github.com/gin-gonic/gin v1.8.2 github.com/go-playground/validator/v10 v10.11.1 github.com/go-sql-driver/mysql v1.7.0 github.com/gofrs/uuid v4.4.0+incompatible @@ -20,25 +20,37 @@ require ( github.com/prometheus/client_golang v1.15.0 github.com/spf13/cobra v1.7.0 github.com/spf13/viper v1.15.0 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.3 + github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 + github.com/uptrace/opentelemetry-go-extra/otelsqlx v0.2.2 + go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.42.0 + go.opentelemetry.io/otel v1.16.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 + go.opentelemetry.io/otel/sdk v1.16.0 + go.opentelemetry.io/otel/trace v1.16.0 go.uber.org/zap v1.24.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-logr/logr v1.2.4 // indirect - github.com/go-playground/locales v0.14.0 // indirect - github.com/go-playground/universal-translator v0.18.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/goccy/go-json v0.9.11 // indirect + github.com/goccy/go-json v0.10.0 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/leodido/go-urn v1.2.1 // indirect @@ -59,7 +71,10 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/ugorji/go/codec v1.2.7 // indirect + github.com/ugorji/go/codec v1.2.9 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.7.0 // indirect @@ -68,6 +83,8 @@ require ( golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/tools v0.9.1 // indirect + google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect + google.golang.org/grpc v1.55.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/src/core-api/go.sum b/src/core-api/go.sum index a1c4707b2..feb7b94c5 100644 --- a/src/core-api/go.sum +++ b/src/core-api/go.sum @@ -40,20 +40,25 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/TencentBlueKing/gopkg v1.1.0 h1:/89NOzIbqEqVRQoPYf0ZEB9J0BgHeLZVIZt3XsSvaoU= -github.com/TencentBlueKing/gopkg v1.1.0/go.mod h1:C8xV79ap0bF2pR10YfhsxO5w5LtJlPakrRunkRbl2yw= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/TencentBlueKing/gopkg v1.2.0 h1:gtqlJU1IbBgnUzb4OILKnwpiZ71ybYQ+VW8heQm5QYE= +github.com/TencentBlueKing/gopkg v1.2.0/go.mod h1:C8xV79ap0bF2pR10YfhsxO5w5LtJlPakrRunkRbl2yw= github.com/agiledragon/gomonkey/v2 v2.10.1 h1:FPJJNykD1957cZlGhr9X0zjr291/lbazoZ/dmc4mS4c= github.com/agiledragon/gomonkey/v2 v2.10.1/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -64,6 +69,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -76,6 +86,8 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -84,10 +96,11 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/getsentry/sentry-go v0.20.0 h1:bwXW98iMRIWxn+4FgPW7vMrjmbym6HblXALmhjHmQaQ= github.com/getsentry/sentry-go v0.20.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= +github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY= +github.com/gin-gonic/gin v1.8.2/go.mod h1:qw5AYuDrzRTnhvusDsrov+fDIxp9Dleuu12h8nfB398= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -96,14 +109,19 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -113,12 +131,14 @@ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/me github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= +github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= 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= @@ -160,6 +180,7 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -184,6 +205,9 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ 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= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -284,6 +308,7 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= @@ -294,6 +319,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -319,13 +345,16 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/ugorji/go v1.2.7/go.mod h1:nF9osbDWLy6bDVv/Rtoh6QgnvNDpmCalQV5urGCCS6M= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= +github.com/ugorji/go/codec v1.2.9 h1:rmenucSohSTiyL09Y+l2OCk+FrMxGMzho2+tjr5ticU= +github.com/ugorji/go/codec v1.2.9/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2 h1:USRngIQppxeyb39XzkVHXwQesKK0+JSwnHE/1c7fgic= +github.com/uptrace/opentelemetry-go-extra/otelsql v0.2.2/go.mod h1:1frv9RN1rlTq0jzCq+mVuEQisubZCQ4OU6S/8CaHzGY= +github.com/uptrace/opentelemetry-go-extra/otelsqlx v0.2.2 h1:on1WgxU/BeTEECJ0YIf3mWP6QoOeTCc33ce7Yx275CQ= +github.com/uptrace/opentelemetry-go-extra/otelsqlx v0.2.2/go.mod h1:0jd6Yb+UTnNMIkmR3np6MH5aA1rsiex7zrumHOaDkoE= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -336,11 +365,33 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.42.0 h1:l7AmwSVqozWKKXeZHycpdmpycQECRpoGwJ1FW2sWfTo= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.42.0/go.mod h1:Ep4uoO2ijR0f49Pr7jAqyTjSCyS1SRL18wwttKfwqXA= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= +go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 h1:TVQp/bboR4mhZSav+MdgXB8FaRho1RC8UwVn3T0vjVc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0/go.mod h1:I33vtIe0sR96wfrUcilIzLoA3mLHhRmz9S9Te0S3gDo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0 h1:iqjq9LAB8aK++sKVcELezzn655JnBNdsDhghU4G/So8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.16.0/go.mod h1:hGXzO5bhhSHZnKvrDaXB82Y9DRFour0Nz/KrBh7reWw= +go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= +go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= +go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= @@ -428,6 +479,7 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= @@ -441,6 +493,7 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -494,8 +547,10 @@ golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -509,6 +564,7 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= @@ -622,6 +678,7 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -635,6 +692,9 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 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-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -648,9 +708,15 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -663,6 +729,7 @@ 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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -679,6 +746,7 @@ gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYs gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/src/core-api/pkg/api/microgateway/permissions.go b/src/core-api/pkg/api/microgateway/permissions.go index 5cde2ef42..e40348309 100644 --- a/src/core-api/pkg/api/microgateway/permissions.go +++ b/src/core-api/pkg/api/microgateway/permissions.go @@ -55,6 +55,7 @@ func QueryPermission(c *gin.Context) { svc := service.NewAppPermissionService() permissions, err := svc.Query( + c.Request.Context(), util.GetInstanceID(c), query.BkGatewayName, query.BkStageName, diff --git a/src/core-api/pkg/api/microgateway/public_key.go b/src/core-api/pkg/api/microgateway/public_key.go index 7545fd031..e401ae9e4 100644 --- a/src/core-api/pkg/api/microgateway/public_key.go +++ b/src/core-api/pkg/api/microgateway/public_key.go @@ -49,7 +49,7 @@ func QueryPublicKey(c *gin.Context) { } svc := service.NewGatewayPublicKeyService() - publicKey, err := svc.Get(util.GetInstanceID(c), query.BkGatewayName) + publicKey, err := svc.Get(c.Request.Context(), util.GetInstanceID(c), query.BkGatewayName) if err != nil { if errors.Is(err, sql.ErrNoRows) { util.NotFoundJSONResponse(c, err.Error()) diff --git a/src/core-api/pkg/cacheimpls/app_gateway_permission.go b/src/core-api/pkg/cacheimpls/app_gateway_permission.go index 64747df79..91b3e5689 100644 --- a/src/core-api/pkg/cacheimpls/app_gateway_permission.go +++ b/src/core-api/pkg/cacheimpls/app_gateway_permission.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "database/sql" "errors" "strconv" @@ -40,12 +41,12 @@ func (k AppGatewayPermissionKey) Key() string { return k.AppCode + ":" + strconv.FormatInt(k.GatewayID, 10) } -func retrieveAppGatewayPermission(k cache.Key) (interface{}, error) { +func retrieveAppGatewayPermission(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(AppGatewayPermissionKey) manager := dao.NewAppGatewayPermissionManager() - perm, err := manager.Get(key.AppCode, key.GatewayID) + perm, err := manager.Get(ctx, key.AppCode, key.GatewayID) // if not permission records, cache `nil` if errors.Is(err, sql.ErrNoRows) { logging.GetLogger().Debugw("retrieveAppGatewayPermission", @@ -59,6 +60,7 @@ func retrieveAppGatewayPermission(k cache.Key) (interface{}, error) { // GetAppGatewayPermissionExpiredAt get the expired time of the app-gateway permission func GetAppGatewayPermissionExpiredAt( + ctx context.Context, appCode string, gatewayID int64, ) (int64, error) { @@ -66,7 +68,7 @@ func GetAppGatewayPermissionExpiredAt( AppCode: appCode, GatewayID: gatewayID, } - value, err := appGatewayPermissionCache.Get(key) + value, err := cacheGet(ctx, appGatewayPermissionCache, key) if err != nil { return 0, err } diff --git a/src/core-api/pkg/cacheimpls/app_gateway_permission_test.go b/src/core-api/pkg/cacheimpls/app_gateway_permission_test.go index 2ab541094..5614dec43 100644 --- a/src/core-api/pkg/cacheimpls/app_gateway_permission_test.go +++ b/src/core-api/pkg/cacheimpls/app_gateway_permission_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -42,24 +43,24 @@ func TestGetAppGatewayPermissionExpiredAt(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return dao.AppGatewayPermission{}, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) appGatewayPermissionCache = mockCache - _, err := GetAppGatewayPermissionExpiredAt("hello", 1) + _, err := GetAppGatewayPermissionExpiredAt(context.Background(), "hello", 1) assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) appGatewayPermissionCache = mockCache - _, err = GetAppGatewayPermissionExpiredAt("hello", 1) + _, err = GetAppGatewayPermissionExpiredAt(context.Background(), "hello", 1) assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/app_resource_permission.go b/src/core-api/pkg/cacheimpls/app_resource_permission.go index 1e7b28c7d..0b23dbee7 100644 --- a/src/core-api/pkg/cacheimpls/app_resource_permission.go +++ b/src/core-api/pkg/cacheimpls/app_resource_permission.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "database/sql" "errors" "strconv" @@ -41,12 +42,12 @@ func (k AppResourcePermissionKey) Key() string { return k.AppCode + ":" + strconv.FormatInt(k.GatewayID, 10) + ":" + strconv.FormatInt(k.ResourceID, 10) } -func retrieveAppResourcePermission(k cache.Key) (interface{}, error) { +func retrieveAppResourcePermission(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(AppResourcePermissionKey) manager := dao.NewAppResourcePermissionManager() - perm, err := manager.Get(key.AppCode, key.GatewayID, key.ResourceID) + perm, err := manager.Get(ctx, key.AppCode, key.GatewayID, key.ResourceID) // if not permission records, cache `nil` if errors.Is(err, sql.ErrNoRows) { @@ -61,6 +62,7 @@ func retrieveAppResourcePermission(k cache.Key) (interface{}, error) { // GetAppResourcePermissionExpiredAt get the expired time of the app-resource permission func GetAppResourcePermissionExpiredAt( + ctx context.Context, appCode string, gatewayID int64, resourceID int64, @@ -70,7 +72,7 @@ func GetAppResourcePermissionExpiredAt( GatewayID: gatewayID, ResourceID: resourceID, } - value, err := appResourcePermissionCache.Get(key) + value, err := cacheGet(ctx, appResourcePermissionCache, key) if err != nil { return 0, err } diff --git a/src/core-api/pkg/cacheimpls/app_resource_permission_test.go b/src/core-api/pkg/cacheimpls/app_resource_permission_test.go index 3660e51c3..68d2be285 100644 --- a/src/core-api/pkg/cacheimpls/app_resource_permission_test.go +++ b/src/core-api/pkg/cacheimpls/app_resource_permission_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -43,24 +44,24 @@ func TestGetAppResourcePermissionExpiredAt(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return dao.AppResourcePermission{}, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) appResourcePermissionCache = mockCache - _, err := GetAppResourcePermissionExpiredAt("hello", 1, 2) + _, err := GetAppResourcePermissionExpiredAt(context.Background(), "hello", 1, 2) assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) appResourcePermissionCache = mockCache - _, err = GetAppResourcePermissionExpiredAt("hello", 1, 2) + _, err = GetAppResourcePermissionExpiredAt(context.Background(), "hello", 1, 2) assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/gateway.go b/src/core-api/pkg/cacheimpls/gateway.go index eeedcd3b4..ce5ec9d7c 100644 --- a/src/core-api/pkg/cacheimpls/gateway.go +++ b/src/core-api/pkg/cacheimpls/gateway.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "core/pkg/database/dao" @@ -36,20 +37,20 @@ func (k GatewayNameKey) Key() string { return k.Name } -func retrieveGatewayByName(k cache.Key) (interface{}, error) { +func retrieveGatewayByName(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(GatewayNameKey) manager := dao.NewGatewayManager() - return manager.GetByName(key.Name) + return manager.GetByName(ctx, key.Name) } // GetGatewayByName will get the gateway object from cache by name -func GetGatewayByName(name string) (gateway dao.Gateway, err error) { +func GetGatewayByName(ctx context.Context, name string) (gateway dao.Gateway, err error) { key := GatewayNameKey{ Name: name, } var value interface{} - value, err = gatewayCache.Get(key) + value, err = cacheGet(ctx, gatewayCache, key) if err != nil { return } diff --git a/src/core-api/pkg/cacheimpls/gateway_test.go b/src/core-api/pkg/cacheimpls/gateway_test.go index 44f7d91b4..df17329fe 100644 --- a/src/core-api/pkg/cacheimpls/gateway_test.go +++ b/src/core-api/pkg/cacheimpls/gateway_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -41,24 +42,24 @@ func TestGetGatewayByName(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return dao.Gateway{}, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) gatewayCache = mockCache - _, err := GetGatewayByName("hello") + _, err := GetGatewayByName(context.Background(), "hello") assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) gatewayCache = mockCache - _, err = GetGatewayByName("hello") + _, err = GetGatewayByName(context.Background(), "hello") assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/init.go b/src/core-api/pkg/cacheimpls/init.go index 8b7cf6b2a..8af662caa 100644 --- a/src/core-api/pkg/cacheimpls/init.go +++ b/src/core-api/pkg/cacheimpls/init.go @@ -38,7 +38,6 @@ func newRandomDuration(seconds int) backend.RandomExtraExpirationDurationFunc { // NOTE: 如果 retrieve* 失败, 会cache 5s, 避免对 db 的频繁操作(并且有singleflight, 保证只有一个请求会去 db 拉数据) var ( - // NOTE: 以下几个cache, 业务逻辑侧会保证 id/name -> obj 是确定的不会变的 // instance_id => micro_gateway, will never change @@ -46,7 +45,7 @@ var ( microGatewayCache = memory.NewCache( "micro_gateway", DisableCache, - retrieveMicroGateway, + tracedFuncWrapper("micro_gateway", retrieveMicroGateway), 12*time.Hour, newRandomDuration(30), ) @@ -54,7 +53,7 @@ var ( microGatewayCredentialsCache = memory.NewCache( "micro_gateway_credentials", DisableCache, - retrieveAndVerifyMicroGatewayCredentials, + tracedFuncWrapper("micro_gateway_credentials", retrieveAndVerifyMicroGatewayCredentials), 1*time.Minute, newRandomDuration(10), ) @@ -63,7 +62,7 @@ var ( gatewayCache = memory.NewCache( "gateway", DisableCache, - retrieveGatewayByName, + tracedFuncWrapper("gateway", retrieveGatewayByName), 12*time.Hour, newRandomDuration(30), ) @@ -72,7 +71,7 @@ var ( jwtPublicKeyCache = memory.NewCache( "jwt_public_key", DisableCache, - retrieveJWTPublicKey, + tracedFuncWrapper("jwt_public_key", retrieveJWTPublicKey), 12*time.Hour, newRandomDuration(30), ) @@ -81,7 +80,7 @@ var ( resourceVersionMappingCache = memory.NewCache( "resource_version_mapping", DisableCache, - retrieveResourceVersionMapping, + tracedFuncWrapper("resource_version_mapping", retrieveResourceVersionMapping), 12*time.Hour, newRandomDuration(30), ) @@ -126,7 +125,7 @@ var ( stageCache = memory.NewCache( "stage", DisableCache, - retrieveStageByGatewayIDStageName, + tracedFuncWrapper("stage", retrieveStageByGatewayIDStageName), 5*time.Minute, newRandomDuration(30), ) @@ -136,7 +135,7 @@ var ( releaseCache = memory.NewCache( "release", DisableCache, - retrieveStageByGatewayIDStageID, + tracedFuncWrapper("release", retrieveStageByGatewayIDStageID), 1*time.Minute, newRandomDuration(10), ) @@ -145,7 +144,7 @@ var ( appGatewayPermissionCache = memory.NewCache( "app_gateway_permission", DisableCache, - retrieveAppGatewayPermission, + tracedFuncWrapper("app_gateway_permission", retrieveAppGatewayPermission), 1*time.Minute, newRandomDuration(10), ) @@ -153,7 +152,7 @@ var ( appResourcePermissionCache = memory.NewCache( "app_resource_permission", DisableCache, - retrieveAppResourcePermission, + tracedFuncWrapper("app_resource_permission", retrieveAppResourcePermission), 1*time.Minute, newRandomDuration(10), ) diff --git a/src/core-api/pkg/cacheimpls/jwt_public_key.go b/src/core-api/pkg/cacheimpls/jwt_public_key.go index d3776553f..bd252d6eb 100644 --- a/src/core-api/pkg/cacheimpls/jwt_public_key.go +++ b/src/core-api/pkg/cacheimpls/jwt_public_key.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "strconv" @@ -37,12 +38,12 @@ func (k JWTPublicKeyCacheKey) Key() string { return strconv.FormatInt(k.GatewayID, 10) } -func retrieveJWTPublicKey(k cache.Key) (interface{}, error) { +func retrieveJWTPublicKey(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(JWTPublicKeyCacheKey) manager := dao.NewJWTManager() - jwt, err := manager.Get(key.GatewayID) + jwt, err := manager.Get(ctx, key.GatewayID) if err != nil { return "", err } @@ -51,12 +52,12 @@ func retrieveJWTPublicKey(k cache.Key) (interface{}, error) { } // GetJWTPublicKey will get the jwt public key from cache by gatewayID -func GetJWTPublicKey(gatewayID int64) (publicKey string, err error) { +func GetJWTPublicKey(ctx context.Context, gatewayID int64) (publicKey string, err error) { key := JWTPublicKeyCacheKey{ GatewayID: gatewayID, } var value interface{} - value, err = jwtPublicKeyCache.Get(key) + value, err = cacheGet(ctx, jwtPublicKeyCache, key) if err != nil { return } diff --git a/src/core-api/pkg/cacheimpls/jwt_public_key_test.go b/src/core-api/pkg/cacheimpls/jwt_public_key_test.go index 7d7ec558f..19a4346f6 100644 --- a/src/core-api/pkg/cacheimpls/jwt_public_key_test.go +++ b/src/core-api/pkg/cacheimpls/jwt_public_key_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -39,24 +40,24 @@ func TestGetJWTPublicKey(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return "hello", nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) jwtPublicKeyCache = mockCache - _, err := GetJWTPublicKey(1) + _, err := GetJWTPublicKey(context.Background(), 1) assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) jwtPublicKeyCache = mockCache - _, err = GetJWTPublicKey(1) + _, err = GetJWTPublicKey(context.Background(), 1) assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/microgateway.go b/src/core-api/pkg/cacheimpls/microgateway.go index e2ca8770c..999632238 100644 --- a/src/core-api/pkg/cacheimpls/microgateway.go +++ b/src/core-api/pkg/cacheimpls/microgateway.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "core/pkg/database/dao" @@ -36,19 +37,19 @@ func (k MicroGatewayKey) Key() string { return k.InstanceID } -func retrieveMicroGateway(k cache.Key) (interface{}, error) { +func retrieveMicroGateway(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(MicroGatewayKey) instanceID := key.InstanceID manager := dao.NewMicroGatewayManager() - return manager.Get(instanceID) + return manager.Get(ctx, instanceID) } // GetMicroGateway will get the micro gateway object from cache by instanceID -func GetMicroGateway(instanceID string) (microGateway dao.MicroGateway, err error) { +func GetMicroGateway(ctx context.Context, instanceID string) (microGateway dao.MicroGateway, err error) { key := MicroGatewayKey{InstanceID: instanceID} var value interface{} - value, err = microGatewayCache.Get(key) + value, err = cacheGet(ctx, microGatewayCache, key) if err != nil { return } diff --git a/src/core-api/pkg/cacheimpls/microgateway_credentials.go b/src/core-api/pkg/cacheimpls/microgateway_credentials.go index 4b9876717..d67d55914 100644 --- a/src/core-api/pkg/cacheimpls/microgateway_credentials.go +++ b/src/core-api/pkg/cacheimpls/microgateway_credentials.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "fmt" @@ -37,10 +38,10 @@ func (k MicroGatewayCredentialsCacheKey) Key() string { return k.InstanceID + ":" + k.InstanceSecret } -func retrieveAndVerifyMicroGatewayCredentials(k cache.Key) (interface{}, error) { +func retrieveAndVerifyMicroGatewayCredentials(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(MicroGatewayCredentialsCacheKey) - microGateway, err := GetMicroGateway(key.InstanceID) + microGateway, err := GetMicroGateway(ctx, key.InstanceID) if err != nil { return false, fmt.Errorf("get micro_gateway fail, %w", err) } @@ -58,13 +59,13 @@ func retrieveAndVerifyMicroGatewayCredentials(k cache.Key) (interface{}, error) // VerifyMicroGatewayCredentials will verify the micro gateway credentials from cache by instanceID and instanceSecret // the result is cached, so it's fast -func VerifyMicroGatewayCredentials(instanceID, instanceSecret string) (bool, error) { +func VerifyMicroGatewayCredentials(ctx context.Context, instanceID, instanceSecret string) (bool, error) { key := MicroGatewayCredentialsCacheKey{ InstanceID: instanceID, InstanceSecret: instanceSecret, } var value interface{} - value, err := microGatewayCredentialsCache.Get(key) + value, err := cacheGet(ctx, microGatewayCredentialsCache, key) if err != nil { return false, err } diff --git a/src/core-api/pkg/cacheimpls/microgateway_credentials_test.go b/src/core-api/pkg/cacheimpls/microgateway_credentials_test.go index 30ebfdd4a..ebe9089a0 100644 --- a/src/core-api/pkg/cacheimpls/microgateway_credentials_test.go +++ b/src/core-api/pkg/cacheimpls/microgateway_credentials_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -40,24 +41,24 @@ func TestVerifyMicroGatewayCredentials(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return true, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) microGatewayCredentialsCache = mockCache - _, err := VerifyMicroGatewayCredentials("hello", "world") + _, err := VerifyMicroGatewayCredentials(context.Background(), "hello", "world") assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) microGatewayCredentialsCache = mockCache - _, err = VerifyMicroGatewayCredentials("hello", "world") + _, err = VerifyMicroGatewayCredentials(context.Background(), "hello", "world") assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/microgateway_test.go b/src/core-api/pkg/cacheimpls/microgateway_test.go index 783ac61ed..4fe123fdd 100644 --- a/src/core-api/pkg/cacheimpls/microgateway_test.go +++ b/src/core-api/pkg/cacheimpls/microgateway_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -41,24 +42,24 @@ func TestGetMicroGateway(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return dao.MicroGateway{}, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) microGatewayCache = mockCache - _, err := GetMicroGateway("hello") + _, err := GetMicroGateway(context.Background(), "hello") assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) microGatewayCache = mockCache - _, err = GetMicroGateway("hello") + _, err = GetMicroGateway(context.Background(), "hello") assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/release.go b/src/core-api/pkg/cacheimpls/release.go index d6cafe8cd..f33832341 100644 --- a/src/core-api/pkg/cacheimpls/release.go +++ b/src/core-api/pkg/cacheimpls/release.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "strconv" @@ -38,21 +39,21 @@ func (k ReleaseKey) Key() string { return strconv.FormatInt(k.GatewayID, 10) + ":" + strconv.FormatInt(k.StageID, 10) } -func retrieveStageByGatewayIDStageID(k cache.Key) (interface{}, error) { +func retrieveStageByGatewayIDStageID(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(ReleaseKey) manager := dao.NewReleaseManager() - return manager.Get(key.GatewayID, key.StageID) + return manager.Get(ctx, key.GatewayID, key.StageID) } // GetRelease will get the release from cache by gatewayID and stageID -func GetRelease(gatewayID, stageID int64) (release dao.Release, err error) { +func GetRelease(ctx context.Context, gatewayID, stageID int64) (release dao.Release, err error) { key := ReleaseKey{ GatewayID: gatewayID, StageID: stageID, } var value interface{} - value, err = releaseCache.Get(key) + value, err = cacheGet(ctx, releaseCache, key) if err != nil { return } diff --git a/src/core-api/pkg/cacheimpls/release_test.go b/src/core-api/pkg/cacheimpls/release_test.go index 9cbb3f31a..9665eab58 100644 --- a/src/core-api/pkg/cacheimpls/release_test.go +++ b/src/core-api/pkg/cacheimpls/release_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -42,24 +43,24 @@ func TestGetRelease(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return dao.Release{}, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) releaseCache = mockCache - _, err := GetRelease(1, 2) + _, err := GetRelease(context.Background(), 1, 2) assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) releaseCache = mockCache - _, err = GetRelease(1, 2) + _, err = GetRelease(context.Background(), 1, 2) assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/resource_version_mapping.go b/src/core-api/pkg/cacheimpls/resource_version_mapping.go index d224c0533..92c535d67 100644 --- a/src/core-api/pkg/cacheimpls/resource_version_mapping.go +++ b/src/core-api/pkg/cacheimpls/resource_version_mapping.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "encoding/json" "errors" "strconv" @@ -40,12 +41,12 @@ func (k ResourceVersionMappingKey) Key() string { return strconv.FormatInt(k.ID, 10) } -func retrieveResourceVersionMapping(k cache.Key) (interface{}, error) { +func retrieveResourceVersionMapping(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(ResourceVersionMappingKey) manager := dao.NewResourceVersionManager() - releaseResources, err := manager.Get(key.ID) + releaseResources, err := manager.Get(ctx, key.ID) if err != nil { // TODO: wrap return nil, err @@ -79,12 +80,12 @@ func retrieveResourceVersionMapping(k cache.Key) (interface{}, error) { // GetResourceVersionMapping will get the resource version mapping from cache // the mapping key is resource name, the value is resource id, resource_name => resource_id -func GetResourceVersionMapping(id int64) (resourceNameToID map[string]int64, err error) { +func GetResourceVersionMapping(ctx context.Context, id int64) (resourceNameToID map[string]int64, err error) { key := ResourceVersionMappingKey{ ID: id, } var value interface{} - value, err = resourceVersionMappingCache.Get(key) + value, err = cacheGet(ctx, resourceVersionMappingCache, key) if err != nil { return } diff --git a/src/core-api/pkg/cacheimpls/resource_version_mapping_test.go b/src/core-api/pkg/cacheimpls/resource_version_mapping_test.go index 777ad474b..d4e1aa99a 100644 --- a/src/core-api/pkg/cacheimpls/resource_version_mapping_test.go +++ b/src/core-api/pkg/cacheimpls/resource_version_mapping_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -39,24 +40,24 @@ func TestGetResourceVersionMapping(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return map[string]int64{}, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) resourceVersionMappingCache = mockCache - _, err := GetResourceVersionMapping(1) + _, err := GetResourceVersionMapping(context.Background(), 1) assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) resourceVersionMappingCache = mockCache - _, err = GetResourceVersionMapping(1) + _, err = GetResourceVersionMapping(context.Background(), 1) assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/stage.go b/src/core-api/pkg/cacheimpls/stage.go index a4229f1b0..929f839ab 100644 --- a/src/core-api/pkg/cacheimpls/stage.go +++ b/src/core-api/pkg/cacheimpls/stage.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "strconv" @@ -38,22 +39,22 @@ func (k StageKey) Key() string { return strconv.FormatInt(k.GatewayID, 10) + ":" + k.Name } -func retrieveStageByGatewayIDStageName(k cache.Key) (interface{}, error) { +func retrieveStageByGatewayIDStageName(ctx context.Context, k cache.Key) (interface{}, error) { key := k.(StageKey) manager := dao.NewStageManager() - return manager.GetByName(key.GatewayID, key.Name) + return manager.GetByName(ctx, key.GatewayID, key.Name) } // GetStage will get the stage from cache by gatewayID and stageName -func GetStage(gatewayID int64, name string) (stage dao.Stage, err error) { +func GetStage(ctx context.Context, gatewayID int64, name string) (stage dao.Stage, err error) { key := StageKey{ GatewayID: gatewayID, Name: name, } var value interface{} - value, err = stageCache.Get(key) + value, err = cacheGet(ctx, stageCache, key) if err != nil { return } diff --git a/src/core-api/pkg/cacheimpls/stage_test.go b/src/core-api/pkg/cacheimpls/stage_test.go index 81e154abf..ac1edbce2 100644 --- a/src/core-api/pkg/cacheimpls/stage_test.go +++ b/src/core-api/pkg/cacheimpls/stage_test.go @@ -19,6 +19,7 @@ package cacheimpls import ( + "context" "errors" "testing" "time" @@ -42,24 +43,24 @@ func TestGetStage(t *testing.T) { expiration := 5 * time.Minute // valid - retrieveFunc := func(key cache.Key) (interface{}, error) { + retrieveFunc := func(ctx context.Context, key cache.Key) (interface{}, error) { return dao.Stage{}, nil } mockCache := memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) stageCache = mockCache - _, err := GetStage(1, "hello") + _, err := GetStage(context.Background(), 1, "hello") assert.NoError(t, err) // error - retrieveFunc = func(key cache.Key) (interface{}, error) { + retrieveFunc = func(ctx context.Context, key cache.Key) (interface{}, error) { return false, errors.New("error here") } mockCache = memory.NewCache( "mockCache", false, retrieveFunc, expiration, nil) stageCache = mockCache - _, err = GetStage(1, "hello") + _, err = GetStage(context.Background(), 1, "hello") assert.Error(t, err) } diff --git a/src/core-api/pkg/cacheimpls/trace.go b/src/core-api/pkg/cacheimpls/trace.go new file mode 100644 index 000000000..2f13af75a --- /dev/null +++ b/src/core-api/pkg/cacheimpls/trace.go @@ -0,0 +1,51 @@ +/* + * TencentBlueKing is pleased to support the open source community by making + * 蓝鲸智云 - API 网关(BlueKing - APIGateway) available. + * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + * + * We undertake not to change the open source license (MIT license) applicable + * to the current version of the project delivered to anyone in the future. + */ + +package cacheimpls + +import ( + "context" + + "core/pkg/trace" + + "github.com/TencentBlueKing/gopkg/cache" + "github.com/TencentBlueKing/gopkg/cache/memory" + "go.opentelemetry.io/otel/attribute" +) + +// tracedFuncWrapper +func tracedFuncWrapper(name string, fn memory.RetrieveFunc) memory.RetrieveFunc { + return func(ctx context.Context, key cache.Key) (interface{}, error) { + startTrace, span := trace.StartTrace(ctx, "cache_load") + if span != nil { + span.SetAttributes(attribute.String("cache_name", name)) + defer span.End() + } + return fn(startTrace, key) + } +} + +// cacheGet +func cacheGet(ctx context.Context, cache memory.Cache, key cache.Key) (interface{}, error) { + startCtx, span := trace.StartTrace(ctx, "cache_get") + if span != nil { + span.SetAttributes(attribute.String("key", key.Key())) + defer span.End() + } + return cache.Get(startCtx, key) +} diff --git a/src/core-api/pkg/config/config.go b/src/core-api/pkg/config/config.go index 7a44839cf..4ca5e629e 100644 --- a/src/core-api/pkg/config/config.go +++ b/src/core-api/pkg/config/config.go @@ -70,6 +70,23 @@ type Sentry struct { DSN string } +// Tracing is the config for trace +type Tracing struct { + Enable bool + Endpoint string + Type string + Token string + Sampler string + ServiceName string + Instrument Instrument +} + +// Instrument is the config for trace +type Instrument struct { + GinAPI bool + DbAPI bool +} + // Config is the config for the whole project type Config struct { Debug bool @@ -79,8 +96,9 @@ type Config struct { Databases []Database DatabaseMap map[string]Database - // Cache Cache - Logger Logger + + Logger Logger + Tracing Tracing } // Load will load config from viper @@ -103,3 +121,13 @@ func Load(v *viper.Viper) (*Config, error) { } return &cfg, nil } + +// GinAPIEnabled get gin api trace switch +func (t Tracing) GinAPIEnabled() bool { + return t.Enable && t.Instrument.GinAPI +} + +// DBAPIEnabled get db api trace switch +func (t Tracing) DBAPIEnabled() bool { + return t.Enable && t.Instrument.DbAPI +} diff --git a/src/core-api/pkg/database/dao/app_gateway_permission.go b/src/core-api/pkg/database/dao/app_gateway_permission.go index f06c88e28..f10266597 100644 --- a/src/core-api/pkg/database/dao/app_gateway_permission.go +++ b/src/core-api/pkg/database/dao/app_gateway_permission.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "time" "core/pkg/database" @@ -41,7 +42,7 @@ type AppGatewayPermission struct { // AppGatewayPermissionManager ... type AppGatewayPermissionManager interface { - Get(bkAppCode string, gatewayID int64) (AppGatewayPermission, error) + Get(ctx context.Context, bkAppCode string, gatewayID int64) (AppGatewayPermission, error) } // NewAppGatewayPermissionManager ... @@ -56,7 +57,7 @@ type appGatewayPermissionManager struct { } // Get ... -func (m appGatewayPermissionManager) Get(bkAppCode string, gatewayID int64) (AppGatewayPermission, error) { +func (m appGatewayPermissionManager) Get(ctx context.Context, bkAppCode string, gatewayID int64) (AppGatewayPermission, error) { perm := AppGatewayPermission{} query := `SELECT id, @@ -66,6 +67,6 @@ func (m appGatewayPermissionManager) Get(bkAppCode string, gatewayID int64) (App FROM permission_app_api WHERE bk_app_code = ? AND api_id = ?` - err := database.SqlxGet(m.DB, &perm, query, bkAppCode, gatewayID) + err := database.SqlxGet(ctx, m.DB, &perm, query, bkAppCode, gatewayID) return perm, err } diff --git a/src/core-api/pkg/database/dao/app_gateway_permission_test.go b/src/core-api/pkg/database/dao/app_gateway_permission_test.go index 6ecc2cc5a..f224202a4 100644 --- a/src/core-api/pkg/database/dao/app_gateway_permission_test.go +++ b/src/core-api/pkg/database/dao/app_gateway_permission_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "time" @@ -50,7 +51,7 @@ func Test_appGatewayPermissionManager_Get(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(bkAppCode, gatewayID).WillReturnRows(mockRows) manager := &appGatewayPermissionManager{DB: db} - p, err := manager.Get(bkAppCode, gatewayID) + p, err := manager.Get(context.Background(), bkAppCode, gatewayID) assert.NoError(t, err, "query from db fail.") assert.Equal(t, permission, p) diff --git a/src/core-api/pkg/database/dao/app_resource_permission.go b/src/core-api/pkg/database/dao/app_resource_permission.go index 5a67a611b..c2b59a53a 100644 --- a/src/core-api/pkg/database/dao/app_resource_permission.go +++ b/src/core-api/pkg/database/dao/app_resource_permission.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "time" "core/pkg/database" @@ -42,7 +43,7 @@ type AppResourcePermission struct { // AppResourcePermissionManager ... type AppResourcePermissionManager interface { - Get(bkAppCode string, gatewayID int64, resourceID int64) (AppResourcePermission, error) + Get(ctx context.Context, bkAppCode string, gatewayID int64, resourceID int64) (AppResourcePermission, error) } // NewAppResourcePermissionManager ... @@ -57,11 +58,7 @@ type appResourcePermissionManager struct { } // Get ... -func (m appResourcePermissionManager) Get( - bkAppCode string, - gatewayID int64, - resourceID int64, -) (AppResourcePermission, error) { +func (m appResourcePermissionManager) Get(ctx context.Context, bkAppCode string, gatewayID int64, resourceID int64) (AppResourcePermission, error) { perm := AppResourcePermission{} query := `SELECT id, @@ -73,6 +70,6 @@ func (m appResourcePermissionManager) Get( WHERE bk_app_code = ? AND api_id = ? AND resource_id = ?` - err := database.SqlxGet(m.DB, &perm, query, bkAppCode, gatewayID, resourceID) + err := database.SqlxGet(ctx, m.DB, &perm, query, bkAppCode, gatewayID, resourceID) return perm, err } diff --git a/src/core-api/pkg/database/dao/app_resource_permission_test.go b/src/core-api/pkg/database/dao/app_resource_permission_test.go index 048071c59..7a6ca5e59 100644 --- a/src/core-api/pkg/database/dao/app_resource_permission_test.go +++ b/src/core-api/pkg/database/dao/app_resource_permission_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "time" @@ -53,7 +54,7 @@ func Test_appResourcePermissionManager_Get(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(bkAppCode, gatewayID, resourceID).WillReturnRows(mockRows) manager := &appResourcePermissionManager{DB: db} - p, err := manager.Get(bkAppCode, gatewayID, resourceID) + p, err := manager.Get(context.Background(), bkAppCode, gatewayID, resourceID) assert.NoError(t, err, "query from db fail.") assert.Equal(t, permission, p) diff --git a/src/core-api/pkg/database/dao/gateway.go b/src/core-api/pkg/database/dao/gateway.go index b761a4715..e10aebc14 100644 --- a/src/core-api/pkg/database/dao/gateway.go +++ b/src/core-api/pkg/database/dao/gateway.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "core/pkg/database" "github.com/jmoiron/sqlx" @@ -36,7 +37,7 @@ type Gateway struct { // GatewayManager ... type GatewayManager interface { - GetByName(name string) (Gateway, error) + GetByName(ctx context.Context, name string) (Gateway, error) } // NewGatewayManager ... @@ -51,13 +52,13 @@ type gatewayManager struct { } // GetByName ... -func (m gatewayManager) GetByName(name string) (Gateway, error) { +func (m gatewayManager) GetByName(ctx context.Context, name string) (Gateway, error) { gateway := Gateway{} query := `SELECT id, name FROM core_api WHERE name = ?` - err := database.SqlxGet(m.DB, &gateway, query, name) + err := database.SqlxGet(ctx, m.DB, &gateway, query, name) return gateway, err } diff --git a/src/core-api/pkg/database/dao/gateway_test.go b/src/core-api/pkg/database/dao/gateway_test.go index 1b0d95b1c..aea4d6775 100644 --- a/src/core-api/pkg/database/dao/gateway_test.go +++ b/src/core-api/pkg/database/dao/gateway_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "core/pkg/database" @@ -48,7 +49,7 @@ func Test_gatewayManager_GetByName(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(name).WillReturnRows(mockRows) manager := &gatewayManager{DB: db} - p, err := manager.GetByName(name) + p, err := manager.GetByName(context.Background(), name) assert.NoError(t, err, "query from db fail.") assert.Equal(t, record, p) diff --git a/src/core-api/pkg/database/dao/jwt.go b/src/core-api/pkg/database/dao/jwt.go index 2a4810ad6..c4610eafe 100644 --- a/src/core-api/pkg/database/dao/jwt.go +++ b/src/core-api/pkg/database/dao/jwt.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "core/pkg/database" "github.com/jmoiron/sqlx" @@ -33,7 +34,7 @@ type JWT struct { // JWTManager ... type JWTManager interface { - Get(gatewayID int64) (JWT, error) + Get(ctx context.Context, gatewayID int64) (JWT, error) } // NewJWTManager ... @@ -48,12 +49,12 @@ type jwtManager struct { } // Get ... -func (m jwtManager) Get(gatewayID int64) (JWT, error) { +func (m jwtManager) Get(ctx context.Context, gatewayID int64) (JWT, error) { JWT := JWT{} query := `SELECT public_key FROM core_jwt WHERE api_id = ?` - err := database.SqlxGet(m.DB, &JWT, query, gatewayID) + err := database.SqlxGet(ctx, m.DB, &JWT, query, gatewayID) return JWT, err } diff --git a/src/core-api/pkg/database/dao/jwt_test.go b/src/core-api/pkg/database/dao/jwt_test.go index 5c4684291..bfd26f841 100644 --- a/src/core-api/pkg/database/dao/jwt_test.go +++ b/src/core-api/pkg/database/dao/jwt_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "core/pkg/database" @@ -46,7 +47,7 @@ func Test_jwtManager_Get(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(gatewayID).WillReturnRows(mockRows) manager := &jwtManager{DB: db} - p, err := manager.Get(gatewayID) + p, err := manager.Get(context.Background(), gatewayID) assert.NoError(t, err, "query from db fail.") assert.Equal(t, record, p) diff --git a/src/core-api/pkg/database/dao/microgateway.go b/src/core-api/pkg/database/dao/microgateway.go index d5b6ac6f8..3df11bddc 100644 --- a/src/core-api/pkg/database/dao/microgateway.go +++ b/src/core-api/pkg/database/dao/microgateway.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "strings" "core/pkg/database" @@ -44,7 +45,7 @@ type MicroGateway struct { // MicroGatewayManager ... type MicroGatewayManager interface { - Get(instanceID string) (MicroGateway, error) + Get(ctx context.Context, instanceID string) (MicroGateway, error) } // NewMicroGatewayManager ... @@ -59,7 +60,7 @@ type microGatewayManager struct { } // Get ... -func (m microGatewayManager) Get(instanceID string) (MicroGateway, error) { +func (m microGatewayManager) Get(ctx context.Context, instanceID string) (MicroGateway, error) { // the id in database is uuid(32), the django handled the 36 to 32 by default // but here we need to do it ourselves instanceID = strings.ReplaceAll(instanceID, "-", "") @@ -73,6 +74,6 @@ func (m microGatewayManager) Get(instanceID string) (MicroGateway, error) { config FROM core_micro_gateway WHERE id = ?` - err := database.SqlxGet(m.DB, &perm, query, instanceID) + err := database.SqlxGet(ctx, m.DB, &perm, query, instanceID) return perm, err } diff --git a/src/core-api/pkg/database/dao/microgateway_test.go b/src/core-api/pkg/database/dao/microgateway_test.go index 4ba98ae98..ebe171a97 100644 --- a/src/core-api/pkg/database/dao/microgateway_test.go +++ b/src/core-api/pkg/database/dao/microgateway_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "core/pkg/database" @@ -50,7 +51,7 @@ func Test_microGatewayManager_Get(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(instanceID).WillReturnRows(mockRows) manager := µGatewayManager{DB: db} - p, err := manager.Get(instanceID) + p, err := manager.Get(context.Background(), instanceID) assert.NoError(t, err, "query from db fail.") assert.Equal(t, record, p) diff --git a/src/core-api/pkg/database/dao/mock/app_gateway_permission.go b/src/core-api/pkg/database/dao/mock/app_gateway_permission.go index bb9dcabd9..45e6b871a 100644 --- a/src/core-api/pkg/database/dao/mock/app_gateway_permission.go +++ b/src/core-api/pkg/database/dao/mock/app_gateway_permission.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockAppGatewayPermissionManager) EXPECT() *MockAppGatewayPermissionMana } // Get mocks base method. -func (m *MockAppGatewayPermissionManager) Get(bkAppCode string, gatewayID int64) (dao.AppGatewayPermission, error) { +func (m *MockAppGatewayPermissionManager) Get(ctx context.Context, bkAppCode string, gatewayID int64) (dao.AppGatewayPermission, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", bkAppCode, gatewayID) + ret := m.ctrl.Call(m, "Get", ctx, bkAppCode, gatewayID) ret0, _ := ret[0].(dao.AppGatewayPermission) ret1, _ := ret[1].(error) return ret0, ret1 } // Get indicates an expected call of Get. -func (mr *MockAppGatewayPermissionManagerMockRecorder) Get(bkAppCode, gatewayID interface{}) *gomock.Call { +func (mr *MockAppGatewayPermissionManagerMockRecorder) Get(ctx, bkAppCode, gatewayID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockAppGatewayPermissionManager)(nil).Get), bkAppCode, gatewayID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockAppGatewayPermissionManager)(nil).Get), ctx, bkAppCode, gatewayID) } diff --git a/src/core-api/pkg/database/dao/mock/app_resource_permission.go b/src/core-api/pkg/database/dao/mock/app_resource_permission.go index 20eb900f5..903ce77ae 100644 --- a/src/core-api/pkg/database/dao/mock/app_resource_permission.go +++ b/src/core-api/pkg/database/dao/mock/app_resource_permission.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockAppResourcePermissionManager) EXPECT() *MockAppResourcePermissionMa } // Get mocks base method. -func (m *MockAppResourcePermissionManager) Get(bkAppCode string, gatewayID, resourceID int64) (dao.AppResourcePermission, error) { +func (m *MockAppResourcePermissionManager) Get(ctx context.Context, bkAppCode string, gatewayID, resourceID int64) (dao.AppResourcePermission, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", bkAppCode, gatewayID, resourceID) + ret := m.ctrl.Call(m, "Get", ctx, bkAppCode, gatewayID, resourceID) ret0, _ := ret[0].(dao.AppResourcePermission) ret1, _ := ret[1].(error) return ret0, ret1 } // Get indicates an expected call of Get. -func (mr *MockAppResourcePermissionManagerMockRecorder) Get(bkAppCode, gatewayID, resourceID interface{}) *gomock.Call { +func (mr *MockAppResourcePermissionManagerMockRecorder) Get(ctx, bkAppCode, gatewayID, resourceID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockAppResourcePermissionManager)(nil).Get), bkAppCode, gatewayID, resourceID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockAppResourcePermissionManager)(nil).Get), ctx, bkAppCode, gatewayID, resourceID) } diff --git a/src/core-api/pkg/database/dao/mock/gateway.go b/src/core-api/pkg/database/dao/mock/gateway.go index 25e3577fe..be33e3a21 100644 --- a/src/core-api/pkg/database/dao/mock/gateway.go +++ b/src/core-api/pkg/database/dao/mock/gateway.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockGatewayManager) EXPECT() *MockGatewayManagerMockRecorder { } // GetByName mocks base method. -func (m *MockGatewayManager) GetByName(name string) (dao.Gateway, error) { +func (m *MockGatewayManager) GetByName(ctx context.Context, name string) (dao.Gateway, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetByName", name) + ret := m.ctrl.Call(m, "GetByName", ctx, name) ret0, _ := ret[0].(dao.Gateway) ret1, _ := ret[1].(error) return ret0, ret1 } // GetByName indicates an expected call of GetByName. -func (mr *MockGatewayManagerMockRecorder) GetByName(name interface{}) *gomock.Call { +func (mr *MockGatewayManagerMockRecorder) GetByName(ctx, name interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockGatewayManager)(nil).GetByName), name) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockGatewayManager)(nil).GetByName), ctx, name) } diff --git a/src/core-api/pkg/database/dao/mock/jwt.go b/src/core-api/pkg/database/dao/mock/jwt.go index bd6291644..ebfad9e52 100644 --- a/src/core-api/pkg/database/dao/mock/jwt.go +++ b/src/core-api/pkg/database/dao/mock/jwt.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockJWTManager) EXPECT() *MockJWTManagerMockRecorder { } // Get mocks base method. -func (m *MockJWTManager) Get(gatewayID int64) (dao.JWT, error) { +func (m *MockJWTManager) Get(ctx context.Context, gatewayID int64) (dao.JWT, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", gatewayID) + ret := m.ctrl.Call(m, "Get", ctx, gatewayID) ret0, _ := ret[0].(dao.JWT) ret1, _ := ret[1].(error) return ret0, ret1 } // Get indicates an expected call of Get. -func (mr *MockJWTManagerMockRecorder) Get(gatewayID interface{}) *gomock.Call { +func (mr *MockJWTManagerMockRecorder) Get(ctx, gatewayID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockJWTManager)(nil).Get), gatewayID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockJWTManager)(nil).Get), ctx, gatewayID) } diff --git a/src/core-api/pkg/database/dao/mock/microgateway.go b/src/core-api/pkg/database/dao/mock/microgateway.go index 330602b35..46779f3d5 100644 --- a/src/core-api/pkg/database/dao/mock/microgateway.go +++ b/src/core-api/pkg/database/dao/mock/microgateway.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockMicroGatewayManager) EXPECT() *MockMicroGatewayManagerMockRecorder } // Get mocks base method. -func (m *MockMicroGatewayManager) Get(instanceID string) (dao.MicroGateway, error) { +func (m *MockMicroGatewayManager) Get(ctx context.Context, instanceID string) (dao.MicroGateway, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", instanceID) + ret := m.ctrl.Call(m, "Get", ctx, instanceID) ret0, _ := ret[0].(dao.MicroGateway) ret1, _ := ret[1].(error) return ret0, ret1 } // Get indicates an expected call of Get. -func (mr *MockMicroGatewayManagerMockRecorder) Get(instanceID interface{}) *gomock.Call { +func (mr *MockMicroGatewayManagerMockRecorder) Get(ctx, instanceID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMicroGatewayManager)(nil).Get), instanceID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockMicroGatewayManager)(nil).Get), ctx, instanceID) } diff --git a/src/core-api/pkg/database/dao/mock/release.go b/src/core-api/pkg/database/dao/mock/release.go index a0106abd2..8e6c8d93f 100644 --- a/src/core-api/pkg/database/dao/mock/release.go +++ b/src/core-api/pkg/database/dao/mock/release.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockReleaseManager) EXPECT() *MockReleaseManagerMockRecorder { } // Get mocks base method. -func (m *MockReleaseManager) Get(gatewayID, stageID int64) (dao.Release, error) { +func (m *MockReleaseManager) Get(ctx context.Context, gatewayID, stageID int64) (dao.Release, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", gatewayID, stageID) + ret := m.ctrl.Call(m, "Get", ctx, gatewayID, stageID) ret0, _ := ret[0].(dao.Release) ret1, _ := ret[1].(error) return ret0, ret1 } // Get indicates an expected call of Get. -func (mr *MockReleaseManagerMockRecorder) Get(gatewayID, stageID interface{}) *gomock.Call { +func (mr *MockReleaseManagerMockRecorder) Get(ctx, gatewayID, stageID interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockReleaseManager)(nil).Get), gatewayID, stageID) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockReleaseManager)(nil).Get), ctx, gatewayID, stageID) } diff --git a/src/core-api/pkg/database/dao/mock/resource_version.go b/src/core-api/pkg/database/dao/mock/resource_version.go index 9042f521c..012e98a66 100644 --- a/src/core-api/pkg/database/dao/mock/resource_version.go +++ b/src/core-api/pkg/database/dao/mock/resource_version.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockResourceVersionManager) EXPECT() *MockResourceVersionManagerMockRec } // Get mocks base method. -func (m *MockResourceVersionManager) Get(id int64) (dao.ResourceVersion, error) { +func (m *MockResourceVersionManager) Get(ctx context.Context, id int64) (dao.ResourceVersion, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", id) + ret := m.ctrl.Call(m, "Get", ctx, id) ret0, _ := ret[0].(dao.ResourceVersion) ret1, _ := ret[1].(error) return ret0, ret1 } // Get indicates an expected call of Get. -func (mr *MockResourceVersionManagerMockRecorder) Get(id interface{}) *gomock.Call { +func (mr *MockResourceVersionManagerMockRecorder) Get(ctx, id interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockResourceVersionManager)(nil).Get), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockResourceVersionManager)(nil).Get), ctx, id) } diff --git a/src/core-api/pkg/database/dao/mock/stage.go b/src/core-api/pkg/database/dao/mock/stage.go index 424dc1ee3..999e95192 100644 --- a/src/core-api/pkg/database/dao/mock/stage.go +++ b/src/core-api/pkg/database/dao/mock/stage.go @@ -5,6 +5,7 @@ package mock import ( + context "context" dao "core/pkg/database/dao" reflect "reflect" @@ -35,16 +36,16 @@ func (m *MockStageManager) EXPECT() *MockStageManagerMockRecorder { } // GetByName mocks base method. -func (m *MockStageManager) GetByName(gatewayID int64, stageName string) (dao.Stage, error) { +func (m *MockStageManager) GetByName(ctx context.Context, gatewayID int64, stageName string) (dao.Stage, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetByName", gatewayID, stageName) + ret := m.ctrl.Call(m, "GetByName", ctx, gatewayID, stageName) ret0, _ := ret[0].(dao.Stage) ret1, _ := ret[1].(error) return ret0, ret1 } // GetByName indicates an expected call of GetByName. -func (mr *MockStageManagerMockRecorder) GetByName(gatewayID, stageName interface{}) *gomock.Call { +func (mr *MockStageManagerMockRecorder) GetByName(ctx, gatewayID, stageName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockStageManager)(nil).GetByName), gatewayID, stageName) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetByName", reflect.TypeOf((*MockStageManager)(nil).GetByName), ctx, gatewayID, stageName) } diff --git a/src/core-api/pkg/database/dao/release.go b/src/core-api/pkg/database/dao/release.go index cd8384831..ec6786950 100644 --- a/src/core-api/pkg/database/dao/release.go +++ b/src/core-api/pkg/database/dao/release.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "core/pkg/database" "github.com/jmoiron/sqlx" @@ -41,7 +42,7 @@ type Release struct { // ReleaseManager ... type ReleaseManager interface { - Get(gatewayID int64, stageID int64) (Release, error) + Get(ctx context.Context, gatewayID int64, stageID int64) (Release, error) } // NewReleaseManager ... @@ -56,7 +57,7 @@ type releaseManager struct { } // Get ... -func (m releaseManager) Get(gatewayID int64, stageID int64) (Release, error) { +func (m releaseManager) Get(ctx context.Context, gatewayID int64, stageID int64) (Release, error) { Release := Release{} query := `SELECT id, @@ -66,6 +67,6 @@ func (m releaseManager) Get(gatewayID int64, stageID int64) (Release, error) { FROM core_release WHERE api_id = ? AND stage_id = ?` - err := database.SqlxGet(m.DB, &Release, query, gatewayID, stageID) + err := database.SqlxGet(ctx, m.DB, &Release, query, gatewayID, stageID) return Release, err } diff --git a/src/core-api/pkg/database/dao/release_test.go b/src/core-api/pkg/database/dao/release_test.go index 0690e3394..e910804aa 100644 --- a/src/core-api/pkg/database/dao/release_test.go +++ b/src/core-api/pkg/database/dao/release_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "core/pkg/database" @@ -50,7 +51,7 @@ func Test_releaseManager_Get(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(gatewayID, stageID).WillReturnRows(mockRows) manager := &releaseManager{DB: db} - p, err := manager.Get(gatewayID, stageID) + p, err := manager.Get(context.Background(), gatewayID, stageID) assert.NoError(t, err, "query from db fail.") assert.Equal(t, record, p) diff --git a/src/core-api/pkg/database/dao/resource_version.go b/src/core-api/pkg/database/dao/resource_version.go index 504ca8abd..fb300f0bb 100644 --- a/src/core-api/pkg/database/dao/resource_version.go +++ b/src/core-api/pkg/database/dao/resource_version.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "core/pkg/database" "github.com/jmoiron/sqlx" @@ -37,7 +38,7 @@ type ResourceVersion struct { // ResourceVersionManager ... type ResourceVersionManager interface { - Get(id int64) (ResourceVersion, error) + Get(ctx context.Context, id int64) (ResourceVersion, error) } // NewResourceVersionManager ... @@ -52,13 +53,13 @@ type resourceVersionManager struct { } // Get ... -func (m resourceVersionManager) Get(id int64) (ResourceVersion, error) { +func (m resourceVersionManager) Get(ctx context.Context, id int64) (ResourceVersion, error) { ResourceVersion := ResourceVersion{} query := `SELECT id, data FROM core_resource_version WHERE id = ?` - err := database.SqlxGet(m.DB, &ResourceVersion, query, id) + err := database.SqlxGet(ctx, m.DB, &ResourceVersion, query, id) return ResourceVersion, err } diff --git a/src/core-api/pkg/database/dao/resource_version_test.go b/src/core-api/pkg/database/dao/resource_version_test.go index 605311522..fbc96b2ce 100644 --- a/src/core-api/pkg/database/dao/resource_version_test.go +++ b/src/core-api/pkg/database/dao/resource_version_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "core/pkg/database" @@ -47,7 +48,7 @@ func Test_resourceVersionManager_Get(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(id).WillReturnRows(mockRows) manager := &resourceVersionManager{DB: db} - p, err := manager.Get(id) + p, err := manager.Get(context.Background(), id) assert.NoError(t, err, "query from db fail.") assert.Equal(t, record, p) diff --git a/src/core-api/pkg/database/dao/stage.go b/src/core-api/pkg/database/dao/stage.go index a384337d0..ed2837987 100644 --- a/src/core-api/pkg/database/dao/stage.go +++ b/src/core-api/pkg/database/dao/stage.go @@ -21,6 +21,7 @@ package dao //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "core/pkg/database" "github.com/jmoiron/sqlx" @@ -36,7 +37,7 @@ type Stage struct { // StageManager ... type StageManager interface { - GetByName(gatewayID int64, stageName string) (Stage, error) + GetByName(ctx context.Context, gatewayID int64, stageName string) (Stage, error) } // NewStageManager ... @@ -51,7 +52,7 @@ type stageManager struct { } // GetByName ... -func (m stageManager) GetByName(gatewayID int64, stageName string) (Stage, error) { +func (m stageManager) GetByName(ctx context.Context, gatewayID int64, stageName string) (Stage, error) { Stage := Stage{} query := `SELECT id, @@ -59,6 +60,6 @@ func (m stageManager) GetByName(gatewayID int64, stageName string) (Stage, error FROM core_stage WHERE api_id = ? AND name = ?` - err := database.SqlxGet(m.DB, &Stage, query, gatewayID, stageName) + err := database.SqlxGet(ctx, m.DB, &Stage, query, gatewayID, stageName) return Stage, err } diff --git a/src/core-api/pkg/database/dao/stage_test.go b/src/core-api/pkg/database/dao/stage_test.go index 0cf1d3bdf..cf542be9b 100644 --- a/src/core-api/pkg/database/dao/stage_test.go +++ b/src/core-api/pkg/database/dao/stage_test.go @@ -19,6 +19,7 @@ package dao import ( + "context" "testing" "core/pkg/database" @@ -50,7 +51,7 @@ func Test_stageManager_GetByName(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs(gatewayID, name).WillReturnRows(mockRows) manager := &stageManager{DB: db} - p, err := manager.GetByName(gatewayID, name) + p, err := manager.GetByName(context.Background(), gatewayID, name) assert.NoError(t, err, "query from db fail.") assert.Equal(t, record, p) diff --git a/src/core-api/pkg/database/init.go b/src/core-api/pkg/database/init.go index 511073a38..615b2eac1 100644 --- a/src/core-api/pkg/database/init.go +++ b/src/core-api/pkg/database/init.go @@ -39,10 +39,12 @@ var ( var defaultDBClientOnce sync.Once // InitDBClients ... -func InitDBClients(defaultDBConfig *config.Database) { +func InitDBClients(defaultDBConfig *config.Database, tracerConfig config.Tracing) { if DefaultDBClient == nil { defaultDBClientOnce.Do(func() { DefaultDBClient = NewDBClient(defaultDBConfig) + //set db trace + DefaultDBClient.SetTraceEnabled(tracerConfig.DBAPIEnabled()) if err := DefaultDBClient.Connect(); err != nil { panic(err) } diff --git a/src/core-api/pkg/database/mysql.go b/src/core-api/pkg/database/mysql.go index 345f69b35..f48666e9e 100644 --- a/src/core-api/pkg/database/mysql.go +++ b/src/core-api/pkg/database/mysql.go @@ -27,6 +27,9 @@ import ( "core/pkg/logging" "github.com/jmoiron/sqlx" + "github.com/uptrace/opentelemetry-go-extra/otelsql" + "github.com/uptrace/opentelemetry-go-extra/otelsqlx" + "go.opentelemetry.io/otel/semconv/v1.10.0" ) // ! set the default https://making.pusher.com/production-ready-connection-pooling-in-go/ @@ -53,6 +56,7 @@ type DBClient struct { maxOpenConns int maxIdleConns int connMaxLifetime time.Duration + traceEnabled bool } // TestConnection ... @@ -69,11 +73,17 @@ func (db *DBClient) TestConnection() (err error) { // Connect connect to db, and update some settings func (db *DBClient) Connect() error { var err error - db.DB, err = sqlx.Connect("mysql", db.dataSource) + if db.traceEnabled { + db.DB, err = otelsqlx.Open("mysql", db.dataSource, + otelsql.WithAttributes(semconv.DBSystemMySQL), + otelsql.WithDBName(db.name), + ) + } else { + db.DB, err = sqlx.Connect("mysql", db.dataSource) + } if err != nil { return err } - db.DB.SetMaxOpenConns(db.maxOpenConns) db.DB.SetMaxIdleConns(db.maxIdleConns) db.DB.SetConnMaxLifetime(db.connMaxLifetime) @@ -89,6 +99,11 @@ func (db *DBClient) Connect() error { return nil } +// SetTraceEnabled Set db trace +func (db *DBClient) SetTraceEnabled(enabled bool) { + db.traceEnabled = enabled +} + // Close close db connection func (db *DBClient) Close() { if db.DB != nil { diff --git a/src/core-api/pkg/database/sqlx.go b/src/core-api/pkg/database/sqlx.go index 8128957f9..3af0c689e 100644 --- a/src/core-api/pkg/database/sqlx.go +++ b/src/core-api/pkg/database/sqlx.go @@ -19,37 +19,38 @@ package database import ( + "context" "time" "github.com/jmoiron/sqlx" ) -type queryFunc func(db *sqlx.DB, dest interface{}, query string, args ...interface{}) error +type queryFunc func(ctx context.Context, db *sqlx.DB, dest interface{}, query string, args ...interface{}) error func queryTimer(f queryFunc) queryFunc { - return func(db *sqlx.DB, dest interface{}, query string, args ...interface{}) error { + return func(ctx context.Context, db *sqlx.DB, dest interface{}, query string, args ...interface{}) error { start := time.Now() defer logSlowSQL(start, query, args) // NOTE: must be args... - return f(db, dest, query, args...) + return f(ctx, db, dest, query, args...) } } -func sqlxSelectFunc(db *sqlx.DB, dest interface{}, query string, args ...interface{}) error { +func sqlxSelectFunc(ctx context.Context, db *sqlx.DB, dest interface{}, query string, args ...interface{}) error { query, args, err := sqlx.In(query, args...) if err != nil { return err } - err = db.Select(dest, query, args...) + err = db.SelectContext(ctx, dest, query, args...) return err } -func sqlxGetFunc(db *sqlx.DB, dest interface{}, query string, args ...interface{}) error { +func sqlxGetFunc(ctx context.Context, db *sqlx.DB, dest interface{}, query string, args ...interface{}) error { query, args, err := sqlx.In(query, args...) if err != nil { return err } - err = db.Get(dest, query, args...) + err = db.GetContext(ctx, dest, query, args...) if err == nil { return nil diff --git a/src/core-api/pkg/database/sqlx_test.go b/src/core-api/pkg/database/sqlx_test.go index 40f718a03..9f0bd7ed8 100644 --- a/src/core-api/pkg/database/sqlx_test.go +++ b/src/core-api/pkg/database/sqlx_test.go @@ -19,6 +19,7 @@ package database import ( + "context" "database/sql" "fmt" "testing" @@ -46,7 +47,7 @@ func TestSqlxSelect(t *testing.T) { mock.ExpectQuery(mockQuery).WillReturnRows(mockRows) snippets := []Snippet{} - err := SqlxSelect(db, &snippets, "select name from snippet") + err := SqlxSelect(context.Background(), db, &snippets, "select name from snippet") assert.NoError(t, err) for index, mockSnippet := range mockSnippets { @@ -61,7 +62,7 @@ func TestSqlxSelect(t *testing.T) { mock.ExpectQuery(mockQuery).WillReturnRows(mockRows) snippets := []Snippet{} - err := SqlxSelect(db, &snippets, "select name from snippet") + err := SqlxSelect(context.Background(), db, &snippets, "select name from snippet") assert.NoError(t, err) assert.Equal(t, []Snippet{}, snippets) @@ -72,7 +73,7 @@ func TestSqlxSelect(t *testing.T) { mock.ExpectQuery(mockQuery).WillReturnError(fmt.Errorf("some error")) snippets := []Snippet{} - err := SqlxSelect(db, &snippets, "select name from snippet") + err := SqlxSelect(context.Background(), db, &snippets, "select name from snippet") assert.Error(t, err) assert.NotEqual(t, sql.ErrNoRows, err) @@ -94,7 +95,7 @@ func TestSqlxGet(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs("test").WillReturnRows(mockRows) snippet := Snippet{} - err := SqlxGet(db, &snippet, "select name from snippet where name=?", "test") + err := SqlxGet(context.Background(), db, &snippet, "select name from snippet where name=?", "test") assert.NoError(t, err) mockSnippet := mockSnippets[0].(Snippet) @@ -107,7 +108,7 @@ func TestSqlxGet(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs("test").WillReturnRows(mockRows) snippets := Snippet{} - err := SqlxGet(db, &snippets, "select name from snippet where name=?", "test") + err := SqlxGet(context.Background(), db, &snippets, "select name from snippet where name=?", "test") assert.Error(t, err) assert.Equal(t, sql.ErrNoRows, err) @@ -118,7 +119,7 @@ func TestSqlxGet(t *testing.T) { mock.ExpectQuery(mockQuery).WithArgs("test").WillReturnError(fmt.Errorf("some error")) snippets := Snippet{} - err := SqlxGet(db, &snippets, "select name from snippet where name=?", "test") + err := SqlxGet(context.Background(), db, &snippets, "select name from snippet where name=?", "test") assert.Error(t, err) assert.NotEqual(t, sql.ErrNoRows, err) diff --git a/src/core-api/pkg/middleware/micro_gateway_instance.go b/src/core-api/pkg/middleware/micro_gateway_instance.go index 42d5413ed..1e86d9163 100644 --- a/src/core-api/pkg/middleware/micro_gateway_instance.go +++ b/src/core-api/pkg/middleware/micro_gateway_instance.go @@ -47,7 +47,7 @@ func MicroGatewayInstanceMiddleware() gin.HandlerFunc { return } - matched, err := cacheimpls.VerifyMicroGatewayCredentials(instanceID, instanceSecret) + matched, err := cacheimpls.VerifyMicroGatewayCredentials(c.Request.Context(), instanceID, instanceSecret) if err != nil { err = fmt.Errorf("verify micro_gateway credentials fail, %w", err) util.SystemErrorJSONResponse(c, err) diff --git a/src/core-api/pkg/server/router.go b/src/core-api/pkg/server/router.go index 1da73cb7a..a88948e9c 100644 --- a/src/core-api/pkg/server/router.go +++ b/src/core-api/pkg/server/router.go @@ -29,6 +29,7 @@ import ( "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus/promhttp" + "go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin" ) func checkDatabase(dbConfig *config.Database) error { @@ -75,7 +76,11 @@ func NewRouter(cfg *config.Config) *gin.Engine { // metrics router.GET("/metrics", gin.WrapH(promhttp.Handler())) // router.GET("/version", handler.Version) - + // trace + if cfg.Tracing.GinAPIEnabled() { + // set gin otel + router.Use(otelgin.Middleware(cfg.Tracing.ServiceName)) + } microGatewayRouter := router.Group("/api/v1/micro-gateway") microGatewayRouter.Use(middleware.APILogger()) microGatewayRouter.Use(middleware.MicroGatewayInstanceMiddleware()) diff --git a/src/core-api/pkg/service/app_permission.go b/src/core-api/pkg/service/app_permission.go index 02ec013ec..520baf231 100644 --- a/src/core-api/pkg/service/app_permission.go +++ b/src/core-api/pkg/service/app_permission.go @@ -19,6 +19,7 @@ package service import ( + "context" "fmt" "time" @@ -36,7 +37,7 @@ const ( // AppPermissionService is the interface of app permission service type AppPermissionService interface { - Query(instanceID, gatewayName, stageName, resourceName, appCode string) (map[string]int64, error) + Query(ctx context.Context, instanceID, gatewayName, stageName, resourceName, appCode string) (map[string]int64, error) } type appPermissionService struct { @@ -89,17 +90,17 @@ func (k appResourcePermissionKey) Key() string { // Query will query the app permission, it will get app-permission and resource-permission from cache func (s *appPermissionService) Query( - instanceID, gatewayName, stageName, resourceName, appCode string, + ctx context.Context, instanceID, gatewayName, stageName, resourceName, appCode string, ) (map[string]int64, error) { permissions := make(map[string]int64, 2) - gatewayID, err := getGatewayID(instanceID, gatewayName) + gatewayID, err := getGatewayID(ctx, instanceID, gatewayName) if err != nil { return nil, err } // 1. get app-gateway permission - gatewayPermissionExpiredAt, err := cacheimpls.GetAppGatewayPermissionExpiredAt(appCode, gatewayID) + gatewayPermissionExpiredAt, err := cacheimpls.GetAppGatewayPermissionExpiredAt(ctx, appCode, gatewayID) if err != nil { return nil, fmt.Errorf("call GetAppGatewayPermissionExpiredAt fail: %w, gatewayID = %d", err, gatewayID) } @@ -139,7 +140,7 @@ func (s *appPermissionService) Query( } } - stageID, err := getStageID(gatewayID, stageName) + stageID, err := getStageID(ctx, gatewayID, stageName) if err != nil { return nil, err } @@ -147,7 +148,7 @@ func (s *appPermissionService) Query( // 2. get app-resource permission // 2.1 get resourceID by resourceName from release-resource_version-data - resourceID, ok, err := getResourceIDByName(gatewayID, stageID, resourceName) + resourceID, ok, err := getResourceIDByName(ctx, gatewayID, stageID, resourceName) if err != nil { return nil, err } @@ -166,7 +167,7 @@ func (s *appPermissionService) Query( } // 2.2 query teh app-resource permission - resourcePermissionExpiredAt, err := cacheimpls.GetAppResourcePermissionExpiredAt(appCode, gatewayID, resourceID) + resourcePermissionExpiredAt, err := cacheimpls.GetAppResourcePermissionExpiredAt(ctx, appCode, gatewayID, resourceID) if err != nil { return nil, fmt.Errorf( "call GetAppResourcePermissionExpiredAt fail: %w, appCode=%s, gatewayID=%d, resourceID=%d", @@ -198,15 +199,15 @@ func (s *appPermissionService) Query( return permissions, nil } -func getGatewayID(instanceID, gatewayName string) (int64, error) { - microGateway, err := cacheimpls.GetMicroGateway(instanceID) +func getGatewayID(ctx context.Context, instanceID, gatewayName string) (int64, error) { + microGateway, err := cacheimpls.GetMicroGateway(ctx, instanceID) if err != nil { return 0, fmt.Errorf("call GetMicroGateway fail: %w, instanceID=%s", err, instanceID) } // var gateway dao.Gateway if microGateway.IsShared { - gateway, err := cacheimpls.GetGatewayByName(gatewayName) + gateway, err := cacheimpls.GetGatewayByName(ctx, gatewayName) if err != nil { return 0, fmt.Errorf("call GetGatewayByName fail: %w, isShared=true, gatewayName=%s", err, gatewayName) } @@ -217,8 +218,8 @@ func getGatewayID(instanceID, gatewayName string) (int64, error) { return microGateway.GatewayID, nil } -func getStageID(gatewayID int64, stageName string) (int64, error) { - stage, err := cacheimpls.GetStage(gatewayID, stageName) +func getStageID(ctx context.Context, gatewayID int64, stageName string) (int64, error) { + stage, err := cacheimpls.GetStage(ctx, gatewayID, stageName) if err != nil { return 0, fmt.Errorf("call GetStage fail: %w, gatewayID = %d, stageName = %s", err, gatewayID, stageName) } @@ -226,7 +227,7 @@ func getStageID(gatewayID int64, stageName string) (int64, error) { return stage.ID, nil } -func getResourceIDByName(gatewayID int64, stageID int64, resourceName string) (resourceID int64, ok bool, err error) { +func getResourceIDByName(ctx context.Context, gatewayID int64, stageID int64, resourceName string) (resourceID int64, ok bool, err error) { // NOTE: there got no resourceID in private Gateway(isShared=False), only have resourceName // so, we should get resourceID by resourceName // 1. get `Release` by gatewayID and stageID, release has a reference field `resource_version_id ` to ResourceVersion @@ -235,13 +236,13 @@ func getResourceIDByName(gatewayID int64, stageID int64, resourceName string) (r // 4. get resourceID by resourceName // 2.1 get release id first - release, err := cacheimpls.GetRelease(gatewayID, stageID) + release, err := cacheimpls.GetRelease(ctx, gatewayID, stageID) if err != nil { err = fmt.Errorf("call GetRelease fail: %w, gatewayID=%d, stageID=%d", err, gatewayID, stageID) return } - resourceNameToID, err := cacheimpls.GetResourceVersionMapping(release.ResourceVersionID) + resourceNameToID, err := cacheimpls.GetResourceVersionMapping(ctx, release.ResourceVersionID) if err != nil { err = fmt.Errorf("call GetResourceVersionMapping fail: %w, releaseID=%d, resourceVersionID=%d", err, diff --git a/src/core-api/pkg/service/app_permission_test.go b/src/core-api/pkg/service/app_permission_test.go index 50e89ab5d..f87b94450 100644 --- a/src/core-api/pkg/service/app_permission_test.go +++ b/src/core-api/pkg/service/app_permission_test.go @@ -19,6 +19,7 @@ package service import ( + "context" "errors" "time" @@ -68,12 +69,12 @@ var _ = Describe("AppPermissionService", func() { It("getGatewayID fail", func() { patches.ApplyFunc( cacheimpls.GetMicroGateway, - func(instanceID string) (dao.MicroGateway, error) { + func(ctx context.Context, instanceID string) (dao.MicroGateway, error) { return dao.MicroGateway{}, errors.New("get GetMicroGateway fail") }, ) - _, err := getGatewayID(instanceID, gatewayName) + _, err := getGatewayID(context.Background(), instanceID, gatewayName) assert.Error(GinkgoT(), err) assert.Contains(GinkgoT(), err.Error(), "get GetMicroGateway fail") }) @@ -81,14 +82,14 @@ var _ = Describe("AppPermissionService", func() { It("getGatewayID ok, not shared", func() { patches.ApplyFunc( cacheimpls.GetMicroGateway, - func(instanceID string) (dao.MicroGateway, error) { + func(ctx context.Context, instanceID string) (dao.MicroGateway, error) { return dao.MicroGateway{ IsShared: false, GatewayID: 123, }, nil }, ) - id, err := getGatewayID(instanceID, gatewayName) + id, err := getGatewayID(context.Background(), instanceID, gatewayName) assert.NoError(GinkgoT(), err) assert.Equal(GinkgoT(), int64(123), id) }) @@ -96,7 +97,7 @@ var _ = Describe("AppPermissionService", func() { It("getGatewayID ok, shared, GetGatewayByName fail", func() { patches.ApplyFunc( cacheimpls.GetMicroGateway, - func(instanceID string) (dao.MicroGateway, error) { + func(ctx context.Context, instanceID string) (dao.MicroGateway, error) { return dao.MicroGateway{ IsShared: true, GatewayID: 123, @@ -106,12 +107,12 @@ var _ = Describe("AppPermissionService", func() { patches.ApplyFunc( cacheimpls.GetGatewayByName, - func(string) (dao.Gateway, error) { + func(context.Context, string) (dao.Gateway, error) { return dao.Gateway{}, errors.New("get GetGatewayByName fail") }, ) - _, err := getGatewayID(instanceID, gatewayName) + _, err := getGatewayID(context.Background(), instanceID, gatewayName) assert.Error(GinkgoT(), err) assert.Contains(GinkgoT(), err.Error(), "get GetGatewayByName fail") }) @@ -119,7 +120,7 @@ var _ = Describe("AppPermissionService", func() { It("getGatewayID ok, shared, GetGatewayByName ok", func() { patches.ApplyFunc( cacheimpls.GetMicroGateway, - func(instanceID string) (dao.MicroGateway, error) { + func(ctx context.Context, instanceID string) (dao.MicroGateway, error) { return dao.MicroGateway{ IsShared: true, GatewayID: 123, @@ -129,13 +130,13 @@ var _ = Describe("AppPermissionService", func() { patches.ApplyFunc( cacheimpls.GetGatewayByName, - func(string) (dao.Gateway, error) { + func(context.Context, string) (dao.Gateway, error) { return dao.Gateway{ ID: 456, }, nil }, ) - id, err := getGatewayID(instanceID, gatewayName) + id, err := getGatewayID(context.Background(), instanceID, gatewayName) assert.NoError(GinkgoT(), err) assert.Equal(GinkgoT(), int64(456), id) }) @@ -158,12 +159,12 @@ var _ = Describe("AppPermissionService", func() { It("GetStage fail", func() { patches.ApplyFunc( cacheimpls.GetStage, - func(gatewayID int64, stageName string) (dao.Stage, error) { + func(ctx context.Context, gatewayID int64, stageName string) (dao.Stage, error) { return dao.Stage{}, errors.New("get GetStage fail") }, ) - _, err := getStageID(gatewayID, stageName) + _, err := getStageID(context.Background(), gatewayID, stageName) assert.Error(GinkgoT(), err) assert.Contains(GinkgoT(), err.Error(), "get GetStage fail") }) @@ -171,11 +172,11 @@ var _ = Describe("AppPermissionService", func() { It("GetStage ok", func() { patches.ApplyFunc( cacheimpls.GetStage, - func(gatewayID int64, stageName string) (dao.Stage, error) { + func(ctx context.Context, gatewayID int64, stageName string) (dao.Stage, error) { return dao.Stage{ID: 1}, nil }, ) - id, err := getStageID(gatewayID, stageName) + id, err := getStageID(context.Background(), gatewayID, stageName) assert.NoError(GinkgoT(), err) assert.Equal(GinkgoT(), int64(1), id) }) @@ -200,12 +201,12 @@ var _ = Describe("AppPermissionService", func() { It("GetRelease fail", func() { patches.ApplyFunc( cacheimpls.GetRelease, - func(int64, int64) (dao.Release, error) { + func(context.Context, int64, int64) (dao.Release, error) { return dao.Release{}, errors.New("get GetRelease fail") }, ) - _, _, err := getResourceIDByName(gatewayID, stageID, resourceName) + _, _, err := getResourceIDByName(context.Background(), gatewayID, stageID, resourceName) assert.Error(GinkgoT(), err) assert.Contains(GinkgoT(), err.Error(), "get GetRelease fail") }) @@ -213,7 +214,7 @@ var _ = Describe("AppPermissionService", func() { It("GetRelease ok, GetResourceVersionMapping fail", func() { patches.ApplyFunc( cacheimpls.GetRelease, - func(int64, int64) (dao.Release, error) { + func(context.Context, int64, int64) (dao.Release, error) { return dao.Release{ ID: 1, ResourceVersionID: 2, @@ -223,12 +224,12 @@ var _ = Describe("AppPermissionService", func() { patches.ApplyFunc( cacheimpls.GetResourceVersionMapping, - func(int64) (map[string]int64, error) { + func(context.Context, int64) (map[string]int64, error) { return nil, errors.New("get GetResourceVersionMapping fail") }, ) - _, _, err := getResourceIDByName(gatewayID, stageID, resourceName) + _, _, err := getResourceIDByName(context.Background(), gatewayID, stageID, resourceName) assert.Error(GinkgoT(), err) assert.Contains(GinkgoT(), err.Error(), "get GetResourceVersionMapping fail") }) @@ -236,7 +237,7 @@ var _ = Describe("AppPermissionService", func() { It("getGatewayID ok, shared, GetGatewayByName ok", func() { patches.ApplyFunc( cacheimpls.GetRelease, - func(int64, int64) (dao.Release, error) { + func(context.Context, int64, int64) (dao.Release, error) { return dao.Release{ ID: 1, ResourceVersionID: 2, @@ -246,14 +247,14 @@ var _ = Describe("AppPermissionService", func() { patches.ApplyFunc( cacheimpls.GetResourceVersionMapping, - func(int64) (map[string]int64, error) { + func(context.Context, int64) (map[string]int64, error) { return map[string]int64{ resourceName: 456, }, nil }, ) - resourceID, ok, err := getResourceIDByName(gatewayID, stageID, resourceName) + resourceID, ok, err := getResourceIDByName(context.Background(), gatewayID, stageID, resourceName) assert.NoError(GinkgoT(), err) assert.True(GinkgoT(), ok) assert.Equal(GinkgoT(), int64(456), resourceID) @@ -278,19 +279,19 @@ var _ = Describe("AppPermissionService", func() { patches.ApplyFunc( getGatewayID, - func(instanceID, gatewayName string) (int64, error) { + func(ctx context.Context, instanceID, gatewayName string) (int64, error) { return gatewayID, nil }, ) patches.ApplyFunc( getStageID, - func(gatewayID int64, stageName string) (int64, error) { + func(ctx context.Context, gatewayID int64, stageName string) (int64, error) { return stageID, nil }, ) patches.ApplyFunc( getResourceIDByName, - func(gatewayID, stageID int64, resourceName string) (int64, bool, error) { + func(ctx context.Context, gatewayID, stageID int64, resourceName string) (int64, bool, error) { return resourceID, true, nil }, ) @@ -303,13 +304,13 @@ var _ = Describe("AppPermissionService", func() { It("GetAppGatewayPermissionExpiredAt fail", func() { patches.ApplyFunc( cacheimpls.GetAppGatewayPermissionExpiredAt, - func(string, int64) (int64, error) { + func(context.Context, string, int64) (int64, error) { return 0, errors.New("get GetAppGatewayPermissionExpiredAt fail") }, ) svc := &appPermissionService{} - _, err := svc.Query(instanceID, gatewayName, stageName, resourceName, appCode) + _, err := svc.Query(context.Background(), instanceID, gatewayName, stageName, resourceName, appCode) assert.Error(GinkgoT(), err) assert.Contains(GinkgoT(), err.Error(), "get GetAppGatewayPermissionExpiredAt fail") }) @@ -317,19 +318,19 @@ var _ = Describe("AppPermissionService", func() { It("GetAppResourcePermissionExpiredAt fail", func() { patches.ApplyFunc( cacheimpls.GetAppGatewayPermissionExpiredAt, - func(string, int64) (int64, error) { + func(context.Context, string, int64) (int64, error) { return 123, nil }, ) patches.ApplyFunc( cacheimpls.GetAppResourcePermissionExpiredAt, - func(string, int64, int64) (int64, error) { + func(context.Context, string, int64, int64) (int64, error) { return 0, errors.New("get GetAppResourcePermissionExpiredAt fail") }, ) svc := &appPermissionService{} - _, err := svc.Query(instanceID, gatewayName, stageName, resourceName, appCode) + _, err := svc.Query(context.Background(), instanceID, gatewayName, stageName, resourceName, appCode) assert.Error(GinkgoT(), err) assert.Contains(GinkgoT(), err.Error(), "get GetAppResourcePermissionExpiredAt fail") }) @@ -337,19 +338,19 @@ var _ = Describe("AppPermissionService", func() { It("ok", func() { patches.ApplyFunc( cacheimpls.GetAppGatewayPermissionExpiredAt, - func(string, int64) (int64, error) { + func(context.Context, string, int64) (int64, error) { return 123, nil }, ) patches.ApplyFunc( cacheimpls.GetAppResourcePermissionExpiredAt, - func(string, int64, int64) (int64, error) { + func(context.Context, string, int64, int64) (int64, error) { return 456, nil }, ) svc := &appPermissionService{} - permissions, err := svc.Query(instanceID, gatewayName, stageName, resourceName, appCode) + permissions, err := svc.Query(context.Background(), instanceID, gatewayName, stageName, resourceName, appCode) assert.NoError(GinkgoT(), err) assert.Equal(GinkgoT(), int64(123), permissions[gatewayName+":-:"+appCode]) @@ -360,19 +361,19 @@ var _ = Describe("AppPermissionService", func() { expiredAt := time.Now().Unix() + 1000 patches.ApplyFunc( cacheimpls.GetAppGatewayPermissionExpiredAt, - func(string, int64) (int64, error) { + func(context.Context, string, int64) (int64, error) { return expiredAt, nil }, ) patches.ApplyFunc( cacheimpls.GetAppResourcePermissionExpiredAt, - func(string, int64, int64) (int64, error) { + func(context.Context, string, int64, int64) (int64, error) { return 456, nil }, ) svc := &appPermissionService{} - permissions, err := svc.Query(instanceID, gatewayName, stageName, resourceName, appCode) + permissions, err := svc.Query(context.Background(), instanceID, gatewayName, stageName, resourceName, appCode) assert.NoError(GinkgoT(), err) assert.Equal(GinkgoT(), expiredAt, permissions[gatewayName+":-:"+appCode]) diff --git a/src/core-api/pkg/service/mock/app_permission.go b/src/core-api/pkg/service/mock/app_permission.go index b83fee4de..397087ba5 100644 --- a/src/core-api/pkg/service/mock/app_permission.go +++ b/src/core-api/pkg/service/mock/app_permission.go @@ -5,6 +5,7 @@ package mock import ( + context "context" reflect "reflect" gomock "github.com/golang/mock/gomock" @@ -34,16 +35,16 @@ func (m *MockAppPermissionService) EXPECT() *MockAppPermissionServiceMockRecorde } // Query mocks base method. -func (m *MockAppPermissionService) Query(instanceID, gatewayName, stageName, resourceName, appCode string) (map[string]int64, error) { +func (m *MockAppPermissionService) Query(ctx context.Context, instanceID, gatewayName, stageName, resourceName, appCode string) (map[string]int64, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Query", instanceID, gatewayName, stageName, resourceName, appCode) + ret := m.ctrl.Call(m, "Query", ctx, instanceID, gatewayName, stageName, resourceName, appCode) ret0, _ := ret[0].(map[string]int64) ret1, _ := ret[1].(error) return ret0, ret1 } // Query indicates an expected call of Query. -func (mr *MockAppPermissionServiceMockRecorder) Query(instanceID, gatewayName, stageName, resourceName, appCode interface{}) *gomock.Call { +func (mr *MockAppPermissionServiceMockRecorder) Query(ctx, instanceID, gatewayName, stageName, resourceName, appCode interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockAppPermissionService)(nil).Query), instanceID, gatewayName, stageName, resourceName, appCode) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Query", reflect.TypeOf((*MockAppPermissionService)(nil).Query), ctx, instanceID, gatewayName, stageName, resourceName, appCode) } diff --git a/src/core-api/pkg/service/mock/public_key.go b/src/core-api/pkg/service/mock/public_key.go index 6a05addfd..ccc610bab 100644 --- a/src/core-api/pkg/service/mock/public_key.go +++ b/src/core-api/pkg/service/mock/public_key.go @@ -5,6 +5,7 @@ package mock import ( + context "context" reflect "reflect" gomock "github.com/golang/mock/gomock" @@ -34,16 +35,16 @@ func (m *MockGatewayPublicKeyService) EXPECT() *MockGatewayPublicKeyServiceMockR } // Get mocks base method. -func (m *MockGatewayPublicKeyService) Get(instanceID, gatewayName string) (string, error) { +func (m *MockGatewayPublicKeyService) Get(ctx context.Context, instanceID, gatewayName string) (string, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Get", instanceID, gatewayName) + ret := m.ctrl.Call(m, "Get", ctx, instanceID, gatewayName) ret0, _ := ret[0].(string) ret1, _ := ret[1].(error) return ret0, ret1 } // Get indicates an expected call of Get. -func (mr *MockGatewayPublicKeyServiceMockRecorder) Get(instanceID, gatewayName interface{}) *gomock.Call { +func (mr *MockGatewayPublicKeyServiceMockRecorder) Get(ctx, instanceID, gatewayName interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockGatewayPublicKeyService)(nil).Get), instanceID, gatewayName) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockGatewayPublicKeyService)(nil).Get), ctx, instanceID, gatewayName) } diff --git a/src/core-api/pkg/service/public_key.go b/src/core-api/pkg/service/public_key.go index 8e6f17cf6..e876e7906 100644 --- a/src/core-api/pkg/service/public_key.go +++ b/src/core-api/pkg/service/public_key.go @@ -21,13 +21,14 @@ package service //go:generate mockgen -source=$GOFILE -destination=./mock/$GOFILE -package=mock import ( + "context" "core/pkg/cacheimpls" "core/pkg/database/dao" ) // GatewayPublicKeyService is the interface of gateway public key service type GatewayPublicKeyService interface { - Get(instanceID, gatewayName string) (string, error) + Get(ctx context.Context, instanceID, gatewayName string) (string, error) } type gatewayPublicKeyService struct { @@ -42,17 +43,15 @@ func NewGatewayPublicKeyService() GatewayPublicKeyService { } // Get will get the gateway public key from cache by instanceID and gatewayName -func (s *gatewayPublicKeyService) Get( - instanceID, gatewayName string, -) (string, error) { +func (s *gatewayPublicKeyService) Get(ctx context.Context, instanceID, gatewayName string) (string, error) { // get gatewayID - gatewayID, err := getGatewayID(instanceID, gatewayName) + gatewayID, err := getGatewayID(ctx, instanceID, gatewayName) if err != nil { return "", err } // query jwt - publicKey, err := cacheimpls.GetJWTPublicKey(gatewayID) + publicKey, err := cacheimpls.GetJWTPublicKey(ctx, gatewayID) if err != nil { return "", err } diff --git a/src/core-api/pkg/service/public_key_test.go b/src/core-api/pkg/service/public_key_test.go index eed9c634c..7f3c3e9b5 100644 --- a/src/core-api/pkg/service/public_key_test.go +++ b/src/core-api/pkg/service/public_key_test.go @@ -19,6 +19,7 @@ package service import ( + "context" "errors" "core/pkg/cacheimpls" @@ -58,18 +59,18 @@ var _ = Describe("GatewayPublicKeyService", func() { It("error", func() { patches.ApplyFunc( getGatewayID, - func(instanceID, gatewayName string) (int64, error) { + func(ctx context.Context, instanceID, gatewayName string) (int64, error) { return 1, nil }, ) patches.ApplyFunc( cacheimpls.GetJWTPublicKey, - func(gatewayID int64) (string, error) { + func(ctx context.Context, gatewayID int64) (string, error) { return "", errors.New("get GetActionDetail fail") }, ) - publicKey, err := svc.Get(instanceID, gatewayName) + publicKey, err := svc.Get(context.Background(), instanceID, gatewayName) assert.Empty(GinkgoT(), publicKey) assert.Error(GinkgoT(), err) }) @@ -77,18 +78,18 @@ var _ = Describe("GatewayPublicKeyService", func() { It("ok", func() { patches.ApplyFunc( getGatewayID, - func(instanceID, gatewayName string) (int64, error) { + func(ctx context.Context, instanceID, gatewayName string) (int64, error) { return 1, nil }, ) patches.ApplyFunc( cacheimpls.GetJWTPublicKey, - func(gatewayID int64) (string, error) { + func(ctx context.Context, gatewayID int64) (string, error) { return "publicKey", nil }, ) - publicKey, err := svc.Get(instanceID, gatewayName) + publicKey, err := svc.Get(context.Background(), instanceID, gatewayName) assert.Equal(GinkgoT(), "publicKey", publicKey) assert.NoError(GinkgoT(), err) }) diff --git a/src/core-api/pkg/trace/init.go b/src/core-api/pkg/trace/init.go new file mode 100644 index 000000000..b39c0764c --- /dev/null +++ b/src/core-api/pkg/trace/init.go @@ -0,0 +1,147 @@ +/* + * TencentBlueKing is pleased to support the open source community by making + * 蓝鲸智云 - API 网关(BlueKing - APIGateway) available. + * Copyright (C) 2017 THL A29 Limited, a Tencent company. All rights reserved. + * Licensed under the MIT License (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software distributed under + * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language governing permissions and + * limitations under the License. + * + * We undertake not to change the open source license (MIT license) applicable + * to the current version of the project delivered to anyone in the future. + */ + +package trace + +import ( + "context" + "fmt" + "strconv" + "sync" + + "core/pkg/config" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + "go.opentelemetry.io/otel/sdk/resource" + "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.10.0" + tc "go.opentelemetry.io/otel/trace" +) + +const ( + sampleTypeAlwaysOn = "always_on" + sampleTypeAlwaysOff = "always_off" +) + +type Trace struct { + tc.Tracer + config config.Tracing +} + +// Tracer global tracer +var globalTracer *Trace + +var traceOnce sync.Once + +// InitTrace init +func InitTrace(config config.Tracing) error { + var err error + // init global tracer + traceOnce.Do(func() { + // init exporter + client, clientErr := getExporterClient(config.Type, config.Endpoint) + if clientErr != nil { + err = clientErr + return + } + exporter, exporterErr := otlptrace.New(context.Background(), client) + if exporterErr != nil { + err = exporterErr + return + } + traceOptions := []trace.TracerProviderOption{ + trace.WithBatcher(exporter), + trace.WithResource(resource.NewWithAttributes( + semconv.SchemaURL, + semconv.ServiceNameKey.String(config.ServiceName), + attribute.Key("bk.data.token").String(config.Token), + )), + } + // get sampler + samplerOption, ok := getTraceSampler(config.Sampler) + if ok { + traceOptions = append(traceOptions, samplerOption) + } + // init provider + tp := trace.NewTracerProvider(traceOptions...) + // set global provider + otel.SetTracerProvider(tp) + globalTracer = &Trace{ + Tracer: tp.Tracer(config.ServiceName), + config: config, + } + }) + if err != nil { + return err + } + return nil +} + +// getExporterClient Get exporter client +func getExporterClient(protocolType string, endpoint string) (otlptrace.Client, error) { + switch protocolType { + case "http": + return otlptracehttp.NewClient( + otlptracehttp.WithEndpoint(endpoint), + otlptracehttp.WithInsecure(), + ), nil + case "grpc": + return otlptracegrpc.NewClient( + otlptracegrpc.WithEndpoint(endpoint), + otlptracegrpc.WithInsecure(), + ), nil + default: + return nil, fmt.Errorf("unsupported protocol type:%s", protocolType) + } +} + +// StartTrace start span from global tracer +func StartTrace(ctx context.Context, name string) (context.Context, tc.Span) { + if globalTracer != nil && globalTracer.config.Enable { + return globalTracer.Tracer.Start(ctx, name) + } else { + return ctx, nil + } +} + +// getTraceSampler get the sampler strategy +func getTraceSampler(samplerStrategy string) (trace.TracerProviderOption, bool) { + switch samplerStrategy { + case sampleTypeAlwaysOn: + return trace.WithSampler(trace.AlwaysSample()), true + case sampleTypeAlwaysOff: + return trace.WithSampler(trace.NeverSample()), true + default: + // sampler empty will use default: ParentBased(AlwaysSample) Sampler + if samplerStrategy != "" { + //TraceIDRatioBased samples + f, err := strconv.ParseFloat(samplerStrategy, 64) + if err != nil { + return nil, false + } + if f >= 0 && f <= 1 { + return trace.WithSampler(trace.TraceIDRatioBased(f)), true + } + } + } + return nil, false +}