diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml index 9e763dd..0343b70 100644 --- a/.github/workflows/golangci-lint.yaml +++ b/.github/workflows/golangci-lint.yaml @@ -1,14 +1,14 @@ name: golangci-lint - -# Controls when the action will run. Triggers the workflow on push or pull requests on: push: branches: - main - master pull_request: + permissions: contents: read + jobs: golangci: name: lint @@ -19,6 +19,6 @@ jobs: with: go-version: stable - name: golangci-lint - uses: golangci/golangci-lint-action@v6 + uses: golangci/golangci-lint-action@v8 with: - version: v1.63 \ No newline at end of file + version: v2.1 \ No newline at end of file diff --git a/.golangci.yaml b/.golangci.yaml index ea8c4f6..096b822 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,69 +1,52 @@ -# options for analysis running -run: - # timeout for analysis, e.g. 30s, 5m, default is 1m - timeout: 2m - -issues: - # Only report issues for changes since master - new-from-rev: origin/master - -# output configuration options +version: "2" output: - # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" formats: - - format: colored-line-number - -linters-settings: - errcheck: - # report about not checking of errors in type assertions: `a := b.(MyStruct)`; - # default is false: such cases aren't reported by default. - check-type-assertions: true - - # Function length check - funlen: - lines: 60 - statements: 40 - - # Report deeply nested if statements - nestif: - # minimal complexity of if statements to report, 5 by default - min-complexity: 4 - - gofmt: - # simplify code: gofmt with `-s` option, true by default - simplify: true - - govet: - # report about shadowed variables - enable-all: true - disable: - # Do not check field memory alignment because in most cases the performance gain is not worth the headache - - fieldalignment - + text: + path: stdout linters: - # Disable the default linters so we can explicitly name the linters we want - disable-all: true - - # List of enabled linters + default: none enable: - ##################### - # Default linters - ##################### - - gofmt - # Checks error handling - errcheck - # Linter for Go source code that specializes in simplifying a code - - gosimple - # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose - # arguments do not align with the format string - govet - # Detects when assignments to existing variables are not used - ineffassign - # Static code analytics - staticcheck - # Reports unused function parameters. + - unconvert - unparam - # Check if variables or functions are unused - unused - # Remove unnecessary type conversions. - - unconvert \ No newline at end of file + settings: + errcheck: + check-type-assertions: true + funlen: + lines: 60 + statements: 40 + govet: + disable: + - fieldalignment + enable-all: true + nestif: + min-complexity: 4 + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ +issues: + new-from-rev: origin/master +formatters: + enable: + - gofmt + settings: + gofmt: + simplify: true + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/ecosystem/grpc/client_interceptor.go b/ecosystem/grpc/client_interceptor.go index 434d382..e80569c 100644 --- a/ecosystem/grpc/client_interceptor.go +++ b/ecosystem/grpc/client_interceptor.go @@ -34,9 +34,8 @@ func ReturnSimpleErrors(registry *Registry) grpc.UnaryClientInterceptor { } grpcCode := codes.Unknown - msg := err.Error() - serr := simplerr.New(msg).Attr(AttrGRPCMethod, method) // nolint: govet + serr := simplerr.Wrap(err).Attr(AttrGRPCMethod, method) // nolint: govet // Check if the error is a gRPC status error // The GRPC framework seems to always return grpc errors on the client side, even if the server does not diff --git a/ecosystem/grpc/client_interceptor_test.go b/ecosystem/grpc/client_interceptor_test.go index 8010b1f..68aa0ff 100644 --- a/ecosystem/grpc/client_interceptor_test.go +++ b/ecosystem/grpc/client_interceptor_test.go @@ -4,46 +4,20 @@ import ( "context" "fmt" "github.com/lobocv/simplerr" - "github.com/lobocv/simplerr/ecosystem/grpc/internal/ping" "github.com/stretchr/testify/require" "google.golang.org/grpc" "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/status" - "net" "testing" ) -type PingService struct { - err error -} - -func (s *PingService) Ping(_ context.Context, _ *ping.PingRequest) (*ping.PingResponse, error) { - // Your implementation of the Ping method goes here - fmt.Println("Received Ping request") - if s.err != nil { - return nil, s.err +var mockInvoker = func(grpcError error) grpc.UnaryInvoker { + return func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, opts ...grpc.CallOption) error { + return grpcError } - return &ping.PingResponse{}, nil } -func setupServerAndClient(port int) (*PingService, ping.PingServiceClient) { - - server := grpc.NewServer() - service := &PingService{err: status.Error(codes.NotFound, "test error")} - ping.RegisterPingServiceServer(server, service) - - // Create a listener on TCP port 50051 - listener, err := net.Listen("tcp", fmt.Sprintf(":%d", port)) - if err != nil { - panic(fmt.Sprintf("Error creating listener: %v", err)) - } - - go func() { - if err = server.Serve(listener); err != nil { - panic(fmt.Sprintf("Error serving: %v", err)) - } - }() +func makeMockGrpcCall(returnedError error) func() error { defaultInverseMapping := DefaultInverseMapping() defaultInverseMapping[codes.DataLoss] = simplerr.CodeResourceExhausted @@ -51,22 +25,14 @@ func setupServerAndClient(port int) (*PingService, ping.PingServiceClient) { interceptor := ReturnSimpleErrors(nil) - conn, err := grpc.NewClient(fmt.Sprintf(":%d", port), - grpc.WithUnaryInterceptor(interceptor), - grpc.WithTransportCredentials(insecure.NewCredentials()), - ) - if err != nil { - panic(err) + return func() error { + return interceptor(context.Background(), "/ping.PingService/Ping", nil, nil, nil, mockInvoker(returnedError)) } - client := ping.NewPingServiceClient(conn) - - return service, client } func TestClientInterceptor(t *testing.T) { - server, client := setupServerAndClient(50051) - _, err := client.Ping(context.Background(), &ping.PingRequest{}) + err := makeMockGrpcCall(status.Error(codes.NotFound, "not found"))() require.True(t, simplerr.HasErrorCode(err, simplerr.CodeNotFound), "simplerror code can be detected") require.Equal(t, codes.NotFound, status.Code(err), "grpc code can be detected with grpc status package") @@ -80,8 +46,7 @@ func TestClientInterceptor(t *testing.T) { require.Equal(t, "/ping.PingService/Ping", method, "can get the grpc method which errored") // Test the custom added mapping - server.err = status.Error(codes.DataLoss, "test error") - _, err = client.Ping(context.Background(), &ping.PingRequest{}) + err = makeMockGrpcCall(status.Error(codes.DataLoss, "data loss"))() require.True(t, simplerr.HasErrorCode(err, simplerr.CodeResourceExhausted), "simplerror code can be detected") } @@ -90,18 +55,11 @@ func TestClientInterceptor(t *testing.T) { // Our interceptor should still be able to detect attributes on the error func TestClientInterceptorNotGPRCError(t *testing.T) { - server, client := setupServerAndClient(50052) - server.err = fmt.Errorf("not a grpc error") - - _, err := client.Ping(context.Background(), &ping.PingRequest{}) + err := makeMockGrpcCall(fmt.Errorf("some error"))() require.True(t, simplerr.HasErrorCode(err, simplerr.CodeUnknown), "simplerror code can be detected") require.Equal(t, codes.Unknown, status.Code(err), "grpc code can be detected with grpc status package") - st, ok := simplerr.GetAttribute(err, AttrGRPCStatus) - require.True(t, ok) - require.Equal(t, codes.Unknown, st.(*status.Status).Code(), "can get the grpc Status") // nolint: errcheck - method, ok := simplerr.GetAttribute(err, AttrGRPCMethod) require.True(t, ok) require.Equal(t, "/ping.PingService/Ping", method, "can get the grpc method which errored") @@ -109,9 +67,6 @@ func TestClientInterceptorNotGPRCError(t *testing.T) { } func TestClientInterceptorNoError(t *testing.T) { - server, client := setupServerAndClient(50053) - server.err = nil - - _, err := client.Ping(context.Background(), &ping.PingRequest{}) + err := makeMockGrpcCall(nil)() require.Nil(t, err) } diff --git a/ecosystem/grpc/internal/ping/ping.pb.go b/ecosystem/grpc/internal/ping/ping.pb.go deleted file mode 100644 index 90489bf..0000000 --- a/ecosystem/grpc/internal/ping/ping.pb.go +++ /dev/null @@ -1,193 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: projects/content/pkg/organic/temp/ping.proto - -package ping - -import ( - context "context" - fmt "fmt" - proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -// Define the request message -type PingRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PingRequest) Reset() { *m = PingRequest{} } -func (m *PingRequest) String() string { return proto.CompactTextString(m) } -func (*PingRequest) ProtoMessage() {} -func (*PingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_3341227b34ddad8e, []int{0} -} - -func (m *PingRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PingRequest.Unmarshal(m, b) -} -func (m *PingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PingRequest.Marshal(b, m, deterministic) -} -func (m *PingRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingRequest.Merge(m, src) -} -func (m *PingRequest) XXX_Size() int { - return xxx_messageInfo_PingRequest.Size(m) -} -func (m *PingRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PingRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PingRequest proto.InternalMessageInfo - -// Define the response message -type PingResponse struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PingResponse) Reset() { *m = PingResponse{} } -func (m *PingResponse) String() string { return proto.CompactTextString(m) } -func (*PingResponse) ProtoMessage() {} -func (*PingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_3341227b34ddad8e, []int{1} -} - -func (m *PingResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PingResponse.Unmarshal(m, b) -} -func (m *PingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PingResponse.Marshal(b, m, deterministic) -} -func (m *PingResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingResponse.Merge(m, src) -} -func (m *PingResponse) XXX_Size() int { - return xxx_messageInfo_PingResponse.Size(m) -} -func (m *PingResponse) XXX_DiscardUnknown() { - xxx_messageInfo_PingResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_PingResponse proto.InternalMessageInfo - -func init() { - proto.RegisterType((*PingRequest)(nil), "ping.PingRequest") - proto.RegisterType((*PingResponse)(nil), "ping.PingResponse") -} - -func init() { - proto.RegisterFile("projects/content/pkg/organic/temp/ping.proto", fileDescriptor_3341227b34ddad8e) -} - -var fileDescriptor_3341227b34ddad8e = []byte{ - // 136 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0x29, 0x28, 0xca, 0xcf, - 0x4a, 0x4d, 0x2e, 0x29, 0xd6, 0x4f, 0xce, 0xcf, 0x2b, 0x49, 0xcd, 0x2b, 0xd1, 0x2f, 0xc8, 0x4e, - 0xd7, 0xcf, 0x2f, 0x4a, 0x4f, 0xcc, 0xcb, 0x4c, 0xd6, 0x2f, 0x49, 0xcd, 0x2d, 0xd0, 0x2f, 0xc8, - 0xcc, 0x4b, 0xd7, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x01, 0xb1, 0x95, 0x78, 0xb9, 0xb8, - 0x03, 0x32, 0xf3, 0xd2, 0x83, 0x52, 0x0b, 0x4b, 0x53, 0x8b, 0x4b, 0x94, 0xf8, 0xb8, 0x78, 0x20, - 0xdc, 0xe2, 0x82, 0xfc, 0xbc, 0xe2, 0x54, 0x23, 0x1b, 0x88, 0x74, 0x70, 0x6a, 0x51, 0x59, 0x66, - 0x72, 0xaa, 0x90, 0x2e, 0x17, 0x0b, 0x88, 0x2b, 0x24, 0xa8, 0x07, 0x36, 0x08, 0x49, 0xa7, 0x94, - 0x10, 0xb2, 0x10, 0x44, 0x77, 0x12, 0x1b, 0xd8, 0x26, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x9c, 0x61, 0xa6, 0xa9, 0x99, 0x00, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// PingServiceClient is the client API for PingService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type PingServiceClient interface { - // RPC method for ping - Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) -} - -type pingServiceClient struct { - cc *grpc.ClientConn -} - -func NewPingServiceClient(cc *grpc.ClientConn) PingServiceClient { - return &pingServiceClient{cc} -} - -func (c *pingServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) { - out := new(PingResponse) - err := c.cc.Invoke(ctx, "/ping.PingService/Ping", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// PingServiceServer is the server API for PingService service. -type PingServiceServer interface { - // RPC method for ping - Ping(context.Context, *PingRequest) (*PingResponse, error) -} - -// UnimplementedPingServiceServer can be embedded to have forward compatible implementations. -type UnimplementedPingServiceServer struct { -} - -func (*UnimplementedPingServiceServer) Ping(ctx context.Context, req *PingRequest) (*PingResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented") -} - -func RegisterPingServiceServer(s *grpc.Server, srv PingServiceServer) { - s.RegisterService(&_PingService_serviceDesc, srv) -} - -func _PingService_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PingRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(PingServiceServer).Ping(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/ping.PingService/Ping", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(PingServiceServer).Ping(ctx, req.(*PingRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _PingService_serviceDesc = grpc.ServiceDesc{ - ServiceName: "ping.PingService", - HandlerType: (*PingServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Ping", - Handler: _PingService_Ping_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "projects/content/pkg/organic/temp/ping.proto", -} diff --git a/ecosystem/grpc/internal/ping/ping.proto b/ecosystem/grpc/internal/ping/ping.proto deleted file mode 100644 index 41f8045..0000000 --- a/ecosystem/grpc/internal/ping/ping.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -package ping; - -// Define the service -service PingService { - // RPC method for ping - rpc Ping (PingRequest) returns (PingResponse); -} - -// Define the request message -message PingRequest { - // You can add any necessary fields here -} - -// Define the response message -message PingResponse { - // You can add any necessary fields here -} diff --git a/go.mod b/go.mod index 53194bf..532a625 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,19 @@ module github.com/lobocv/simplerr -go 1.23.2 +go 1.24 require ( - github.com/golang/protobuf v1.5.4 github.com/stretchr/testify v1.10.0 - google.golang.org/grpc v1.69.4 + google.golang.org/grpc v1.72.2 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.30.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/text v0.19.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect - google.golang.org/protobuf v1.35.1 // indirect + golang.org/x/net v0.40.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.25.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index e1b151e..62d1379 100644 --- a/go.sum +++ b/go.sum @@ -14,28 +14,30 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY= -go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= -go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE= -go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= -go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= -go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= -go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys= -go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= -golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= -golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 h1:X58yt85/IXCx0Y3ZwN6sEIKZzQtDEYaBWrDvErdXrRE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= -google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +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/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.72.2 h1:TdbGzwb82ty4OusHWepvFWGLgIbNo1/SUynEN0ssqv8= +google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=