From c6054a09bd94645197c3a506bc1744e101569f14 Mon Sep 17 00:00:00 2001 From: yumaojun03 <719118794@qq.com> Date: Sun, 25 May 2025 15:19:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/v4/application.toml | 13 ++++- book/v4/apps/book/README.md | 83 ++++++++++++++++++++++++++++++- book/v4/apps/book/api/api.go | 55 ++++++++++++++++++++ book/v4/apps/book/api/book.go | 61 +++++++++++++++++++++++ book/v4/apps/book/api/flow.drawio | 70 ++++++++++++++++++++++++++ book/v4/apps/registry.go | 12 +++++ book/v4/main.go | 20 ++++++++ book/v4/server/http.go | 7 +++ go.mod | 11 ++++ go.sum | 24 +++++++++ 10 files changed, 354 insertions(+), 2 deletions(-) create mode 100644 book/v4/apps/book/api/api.go create mode 100644 book/v4/apps/book/api/book.go create mode 100644 book/v4/apps/book/api/flow.drawio create mode 100644 book/v4/apps/registry.go create mode 100644 book/v4/server/http.go diff --git a/book/v4/application.toml b/book/v4/application.toml index 4f8c6e9..e664f4b 100644 --- a/book/v4/application.toml +++ b/book/v4/application.toml @@ -1,3 +1,9 @@ +[app] + name = "simple_api" + description = "app desc" + address = "localhost" + encrypt_key = "defualt app encrypt key" + [datasource] provider = "mysql" host = "127.0.0.1" @@ -6,4 +12,9 @@ username = "root" password = "123456" auto_migrate = false - debug = false \ No newline at end of file + debug = false + +[http] + host = "127.0.0.1" + port = 8010 + path_prefix = "api" diff --git a/book/v4/apps/book/README.md b/book/v4/apps/book/README.md index 82cea64..c44b65b 100644 --- a/book/v4/apps/book/README.md +++ b/book/v4/apps/book/README.md @@ -58,5 +58,86 @@ func (b *BookServiceImpl) UpdateBook(context.Context, *book.UpdateBookRequest) ( } ``` -编写单元测试 +## 编写单元测试 + +```go +func TestCreateBook(t *testing.T) { + req := book.NewCreateBookRequest() + req.SetIsSale(true) + req.Title = "Go语言V4" + req.Author = "will" + req.Price = 10 + ins, err := svc.CreateBook(ctx, req) + if err != nil { + t.Fatal(err) + } + t.Log(ins) +} +``` + +## 业务对象注册(ioc controller) + +手动维护 +```sh +pkg gloab + +bookContrller = xxx +commentContrller = xx +... +``` + +通过容器来维护对象 + +```go +// Book业务的具体实现 +type BookServiceImpl struct { + ioc.ObjectImpl +} + +// 返回对象的名称, 因此我需要 服务名称 +// 当前的MySQLBookServiceImpl 是 service book.APP_NAME 的 一个具体实现 +// 当前的MongoDBBookServiceImpl 是 service book.APP_NAME 的 一个具体实现 +func (s *BookServiceImpl) Name() string { + return book.APP_NAME +} + +func init() { + ioc.Controller().Registry(&BookServiceImpl{}) +} +``` + +## 面向接口 + +对象取处理, 断言他满足业务接口,然后我们以接口的方式来使用 + +```go +func GetService() Service { + return ioc.Controller().Get(APP_NAME).(Service) +} + +const ( + APP_NAME = "book" +) +``` + +第三方模块,可以依赖 接口进行开发 +```go +// AddComment implements comment.Service. +func (c *CommentServiceImpl) AddComment(ctx context.Context, in *comment.AddCommentRequest) (*comment.Comment, error) { + // 能不能 直接Book Service的具体实现 + // (&impl.BookServiceImpl{}).DescribeBook(ctx, nil) + // 依赖接口,面向接口编程, 不依赖具体实现 + book.GetService().DescribeBook(ctx, nil) + panic("unimplemented") +} +``` + +## 开发API + +接口是需求, 对业务进行设计, 可以选择把这些能力 以那种接口的访问对外提供服务 + +1. 不对外提供接口,仅仅作为其他的业务的依赖 +2. (API)对外提供 HTTP接口, RESTful接口 +3. (API)对内提供 RPC接口(JSON RPC/GRPC/thrift) + diff --git a/book/v4/apps/book/api/api.go b/book/v4/apps/book/api/api.go new file mode 100644 index 0000000..3a0d586 --- /dev/null +++ b/book/v4/apps/book/api/api.go @@ -0,0 +1,55 @@ +package api + +import ( + "122.51.31.227/go-course/go18/book/v4/apps/book" + "github.com/infraboard/mcube/v2/ioc" + + // 引入Gin Root Router: *gin.Engine + ioc_gin "github.com/infraboard/mcube/v2/ioc/config/gin" + // 引入Gin Root Router: *gin.Engine +) + +type BookApiHandler struct { + ioc.ObjectImpl + + // 业务依赖 + svc book.Service +} + +// 这个就是 API 的资源名称 +// /api/book/v1/books +func (h *BookApiHandler) Name() string { + return "books" +} + +// 对象的初始化, 初始化对象的一些熟悉 &BookApiHandler{} +// 构造函数 +// 当你这个对象初始化的时候,直接把的处理函数(ApiHandler注册给Server) +func (h *BookApiHandler) Init() error { + h.svc = book.GetService() + + // 本地依赖 + // r := server.Gin + // 框架托管, 通过容器获取 Server对象 + // 获取的 Gin Engine对象 + // ioc_gin.RootRouter() + // URL 容器冲突, book/comment + // 怎么避免 2个业务API 不不冲突,加上业务板块的前缀,或者 对的名称 + // //// + // http 接口前缀 + r := ioc_gin.ObjectRouter(h) + + // Book Restful API + // List of books + // /api/simple_api/v1/books + r.GET("", h.queryBook) + // Create new book + // Body: HTTP Entity + // /api/simple_api/v1/books + r.POST("", h.createBook) + return nil +} + +func init() { + ioc.Api().Registry(&BookApiHandler{}) +} diff --git a/book/v4/apps/book/api/book.go b/book/v4/apps/book/api/book.go new file mode 100644 index 0000000..809f133 --- /dev/null +++ b/book/v4/apps/book/api/book.go @@ -0,0 +1,61 @@ +package api + +import ( + "strconv" + + "122.51.31.227/go-course/go18/book/v4/apps/book" + "github.com/gin-gonic/gin" + "github.com/infraboard/mcube/v2/http/gin/response" +) + +func (h *BookApiHandler) queryBook(ctx *gin.Context) { + // 给默认值 + req := book.NewQueryBookRequest() + req.Keywords = ctx.Query("keywords") + // /api/books?page_number=1&page_size=20 + pageNumber := ctx.Query("page_number") + if pageNumber != "" { + pnInt, err := strconv.ParseInt(pageNumber, 10, 64) + if err != nil { + response.Failed(ctx, err) + return + } + req.PageNumber = uint64(pnInt) + } + + pageSize := ctx.Query("page_size") + if pageSize != "" { + psInt, err := strconv.ParseInt(pageSize, 10, 64) + if err != nil { + response.Failed(ctx, err) + return + } + req.PageSize = uint64(psInt) + } + + set, err := h.svc.QueryBook(ctx.Request.Context(), req) + if err != nil { + // 针对Response的统一封装, 已经落到 mcube + response.Failed(ctx, err) + return + } + + response.Success(ctx, set) +} + +func (h *BookApiHandler) createBook(ctx *gin.Context) { + req := book.NewCreateBookRequest() + if err := ctx.BindJSON(req); err != nil { + response.Failed(ctx, err) + return + } + + ins, err := h.svc.CreateBook(ctx.Request.Context(), req) + if err != nil { + response.Failed(ctx, err) + return + } + + // 返回响应 + response.Success(ctx, ins) +} diff --git a/book/v4/apps/book/api/flow.drawio b/book/v4/apps/book/api/flow.drawio new file mode 100644 index 0000000..2ea013a --- /dev/null +++ b/book/v4/apps/book/api/flow.drawio @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/book/v4/apps/registry.go b/book/v4/apps/registry.go new file mode 100644 index 0000000..2a12b35 --- /dev/null +++ b/book/v4/apps/registry.go @@ -0,0 +1,12 @@ +package apps + +// 业务加载区, 选择性的价值的业务处理对象 + +import ( + // Api Impl + _ "122.51.31.227/go-course/go18/book/v4/apps/book/api" + + // Service Impl + _ "122.51.31.227/go-course/go18/book/v4/apps/book/impl" + _ "122.51.31.227/go-course/go18/book/v4/apps/comment/impl" +) diff --git a/book/v4/main.go b/book/v4/main.go index 10e517f..293945a 100644 --- a/book/v4/main.go +++ b/book/v4/main.go @@ -1,5 +1,25 @@ package main +import ( + "github.com/infraboard/mcube/v2/ioc/server/cmd" + + // 业务对象 + _ "122.51.31.227/go-course/go18/book/v4/apps" +) + func main() { // ioc框架 加载对象, 注入对象, 配置对象 + // server.Gin.Run() + // application.Get().AppName + // http.Get().Host + // server.DefaultConfig.ConfigFile.Enabled = true + // server.DefaultConfig.ConfigFile.Path = "application.toml" + // server.Run(context.Background()) + // 不能指定配置文件逻辑 + // 使用者来说,体验不佳 + + // ioc 直接提供server, 直接run就行了, + // mcube 包含 一个 gin Engine + // CLI, start 指令 -f 指定配置文件 + cmd.Start() } diff --git a/book/v4/server/http.go b/book/v4/server/http.go new file mode 100644 index 0000000..9b8702e --- /dev/null +++ b/book/v4/server/http.go @@ -0,0 +1,7 @@ +package server + +import "github.com/gin-gonic/gin" + +var Gin = gin.Default() + +// ObjectRouter diff --git a/go.mod b/go.mod index 2b74209..fee9d9d 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,10 @@ require ( github.com/glebarez/sqlite v1.11.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.26.0 // indirect @@ -34,15 +38,18 @@ require ( github.com/goccy/go-json v0.10.5 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgx/v5 v5.5.5 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/leodido/go-urn v1.4.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -52,11 +59,15 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/uptrace/opentelemetry-go-extra/otelgorm v0.3.2 // indirect github.com/uptrace/opentelemetry-go-extra/otelsql v0.3.2 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.60.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/otel v1.35.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 // indirect diff --git a/go.sum b/go.sum index ea4b8c8..9be0048 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,7 @@ github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCy github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -33,6 +34,14 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= 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-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -58,6 +67,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/infraboard/mcube/v2 v2.0.59 h1:NONiCPjN6xlbGCJx8+e+ZYZfXV58JByEMlzQ6ZZ+pXk= github.com/infraboard/mcube/v2 v2.0.59/go.mod h1:TbYs8cnD8Cg19sTdU0D+vqWAN+LzoxhMYWmAC2pfJkQ= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= @@ -72,6 +83,8 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= @@ -84,6 +97,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= @@ -111,6 +126,11 @@ github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWN github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -133,6 +153,10 @@ github.com/uptrace/opentelemetry-go-extra/otelsql v0.3.2 h1:ZjUj9BLYf9PEqBn8W/Oa github.com/uptrace/opentelemetry-go-extra/otelsql v0.3.2/go.mod h1:O8bHQfyinKwTXKkiKNGmLQS7vRsqRxIQTFZpYpHK3IQ= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.60.0 h1:jj/B7eX95/mOxim9g9laNZkOHKz/XCHG0G410SntRy4= +go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.60.0/go.mod h1:ZvRTVaYYGypytG0zRp2A60lpj//cMq3ZnxYdZaljVBM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw=