Skip to content

Commit ebe1e39

Browse files
committed
feat: add logging support
1 parent 4cdb1af commit ebe1e39

31 files changed

+645
-240
lines changed

‎go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,4 @@ require (
3333
golang.org/x/crypto v0.31.0 // indirect
3434
golang.org/x/sys v0.28.0 // indirect
3535
golang.org/x/text v0.21.0 // indirect
36-
google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 // indirect
3736
)

‎go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
5151
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
5252
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
5353
golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
54-
google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697 h1:pgr/4QbFyktUv9CtQ/Fq4gzEE6/Xs7iCXbktaGzLHbQ=
55-
google.golang.org/genproto/googleapis/api v0.0.0-20241118233622-e639e219e697/go.mod h1:+D9ySVjN8nY8YCVjc5O7PZDIdZporIDY3KaGfJunh88=
54+
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g=
55+
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4=
5656
google.golang.org/genproto/googleapis/bytestream v0.0.0-20241206012308-a4fef0638583 h1:QNxhiucJGWLF/fFpnyTIk8GdEGTa6tUC7/JYG7VN3XU=
5757
google.golang.org/genproto/googleapis/bytestream v0.0.0-20241206012308-a4fef0638583/go.mod h1:qUsLYwbwz5ostUWtuFuXPlHmSJodC5NI/88ZlHj4M1o=
5858
google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583 h1:IfdSdTcLFy4lqUQrQJLkLt1PB+AsqVz6lwkWPzWEz10=

‎go.work.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,8 @@ github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
674674
github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k=
675675
github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI=
676676
github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
677+
github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
678+
github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
677679
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
678680
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
679681
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
@@ -704,6 +706,7 @@ go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40
704706
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
705707
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
706708
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
709+
golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
707710
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
708711
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
709712
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=

‎google-api-go-generator/gen.go

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,7 @@ func (a *API) GenerateCode() ([]byte, error) {
809809
"errors",
810810
"fmt",
811811
"io",
812+
"log/slog",
812813
"net/http",
813814
"net/url",
814815
"strconv",
@@ -820,6 +821,7 @@ func (a *API) GenerateCode() ([]byte, error) {
820821
if a.Name == "storage" {
821822
pn(" %q", "github.com/googleapis/gax-go/v2")
822823
}
824+
pn(" %q", "github.com/googleapis/gax-go/v2/internallog")
823825
for _, imp := range []struct {
824826
pkg string
825827
lname string
@@ -895,7 +897,10 @@ func (a *API) GenerateCode() ([]byte, error) {
895897

896898
pn("client, endpoint, err := htransport.NewClient(ctx, opts...)")
897899
pn("if err != nil { return nil, err }")
898-
pn("s, err := New(client)")
900+
pn("s := &%s{client: client, BasePath: basePath, logger: internaloption.GetLogger(opts)}", service)
901+
for _, res := range a.doc.Resources { // add top level resources.
902+
pn("s.%s = New%s(s)", resourceGoField(res, nil), resourceGoType(res))
903+
}
899904
pn("if err != nil { return nil, err }")
900905
pn(`if endpoint != "" { s.BasePath = endpoint }`)
901906
pn("return s, nil")
@@ -908,15 +913,12 @@ func (a *API) GenerateCode() ([]byte, error) {
908913
pn("// If you are using google.golang.org/api/googleapis/transport.APIKey, use option.WithAPIKey with NewService instead.")
909914
pn("func New(client *http.Client) (*%s, error) {", service)
910915
pn("if client == nil { return nil, errors.New(\"client is nil\") }")
911-
pn("s := &%s{client: client, BasePath: basePath}", service)
912-
for _, res := range a.doc.Resources { // add top level resources.
913-
pn("s.%s = New%s(s)", resourceGoField(res, nil), resourceGoType(res))
914-
}
915-
pn("return s, nil")
916+
pn("return NewService(context.Background(), option.WithHTTPClient(client))")
916917
pn("}")
917918

918919
pn("\ntype %s struct {", service)
919920
pn(" client *http.Client")
921+
pn(" logger *slog.Logger")
920922
pn(" BasePath string // API endpoint base URL")
921923
pn(" UserAgent string // optional additional User-Agent fragment")
922924

@@ -995,6 +997,7 @@ func splitFileHeading(w io.Writer, pkg string) {
995997
"context",
996998
"fmt",
997999
"io",
1000+
"log/slog",
9981001
"net/http",
9991002
} {
10001003
pn(" %q", imp)
@@ -2279,34 +2282,44 @@ func (meth *Method) generateCode() {
22792282
pn(` reqHeaders.Set("If-None-Match", c.ifNoneMatch_)`)
22802283
pn("}")
22812284
}
2282-
pn("var body io.Reader = nil")
2285+
var hasBody bool
22832286
if meth.IsRawRequest() {
2284-
pn("body = c.body_")
2287+
pn("body := bytes.NewBuffer(nil)")
2288+
pn("_, err := body.ReadFrom(c.body_)")
2289+
pn("if err != nil { return nil, err }")
2290+
hasBody = true
22852291
} else if meth.IsProtoStructRequest() {
22862292
pn("protoBytes, err := json.Marshal(c.req)")
22872293
pn("if err != nil { return nil, err }")
2288-
pn("body = bytes.NewReader(protoBytes)")
2294+
pn("body := bytes.NewReader(protoBytes)")
2295+
hasBody = true
22892296
} else {
22902297
if ba := args.bodyArg(); ba != nil && httpMethod != "GET" {
22912298
if meth.m.ID == "ml.projects.predict" {
22922299
// TODO(cbro): move ML API to rawHTTP (it will be a breaking change)
2293-
// Skip JSONReader for APIs that require clients to pass in JSON already.
2294-
pn("body = strings.NewReader(c.%s.HttpBody.Data)", ba.goname)
2300+
// Skip JSONBuffer for APIs that require clients to pass in JSON already.
2301+
pn("body := bytes.NewBufferString(c.%s.HttpBody.Data)", ba.goname)
22952302
} else {
22962303
style := "WithoutDataWrapper"
22972304
if a.needsDataWrapper() {
22982305
style = "WithDataWrapper"
22992306
}
2300-
pn("body, err := googleapi.%s.JSONReader(c.%s)", style, ba.goname)
2307+
pn("body, err := googleapi.%s.JSONBuffer(c.%s)", style, ba.goname)
23012308
pn("if err != nil { return nil, err }")
23022309
}
2310+
hasBody = true
23032311
}
23042312
pn(`c.urlParams_.Set("alt", alt)`)
23052313
pn(`c.urlParams_.Set("prettyPrint", "false")`)
23062314
}
2315+
body := "nil"
2316+
if hasBody {
2317+
body = body
2318+
}
23072319

23082320
pn("urls := googleapi.ResolveRelative(c.s.BasePath, %q)", meth.m.Path)
23092321
if meth.supportsMediaUpload() {
2322+
body = "newBody"
23102323
pn("if c.mediaInfo_ != nil {")
23112324
pn(" urls = googleapi.ResolveRelative(c.s.BasePath, %q)", meth.mediaUploadPath())
23122325
pn(` c.urlParams_.Set("uploadType", c.mediaInfo_.UploadType())`)
@@ -2316,11 +2329,11 @@ func (meth *Method) generateCode() {
23162329
pn(" body = new(bytes.Buffer)")
23172330
pn(` reqHeaders.Set("Content-Type", "application/json")`)
23182331
pn("}")
2319-
pn("body, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body)")
2332+
pn("newBody, getBody, cleanup := c.mediaInfo_.UploadRequest(reqHeaders, body)")
23202333
pn("defer cleanup()")
23212334
}
23222335
pn(`urls += "?" + c.urlParams_.Encode()`)
2323-
pn("req, err := http.NewRequest(%q, urls, body)", httpMethod)
2336+
pn("req, err := http.NewRequest(%q, urls, %s)", httpMethod, body)
23242337
pn("if err != nil { return nil, err }")
23252338
pn("req.Header = reqHeaders")
23262339
if meth.supportsMediaUpload() {
@@ -2337,12 +2350,18 @@ func (meth *Method) generateCode() {
23372350
}
23382351
pn(`})`)
23392352
}
2353+
logBody := "nil"
2354+
if hasBody {
2355+
logBody = "body.Bytes()"
2356+
}
23402357
if meth.supportsMediaUpload() && meth.api.Name == "storage" {
2358+
pn(`c.s.logger.DebugContext(c.ctx_, "api request", "serviceName", apiName, "rpcName", %q, "request", internallog.HTTPRequest(req, %s))`, meth.Id(), logBody)
23412359
pn("if c.retry != nil {")
23422360
pn(" return gensupport.SendRequestWithRetry(c.ctx_, c.s.client, req, c.retry)")
23432361
pn("}")
23442362
pn("return gensupport.SendRequest(c.ctx_, c.s.client, req)")
23452363
} else {
2364+
pn(`c.s.logger.DebugContext(c.ctx_, "api request", "serviceName", apiName, "rpcName", %q, "request", internallog.HTTPRequest(req, %s))`, meth.Id(), logBody)
23462365
pn("return gensupport.SendRequest(c.ctx_, c.s.client, req)")
23472366
}
23482367
pn("}")
@@ -2421,6 +2440,7 @@ func (meth *Method) generateCode() {
24212440
pn("}")
24222441
}
24232442
if retTypeComma == "" {
2443+
pn(`c.s.logger.DebugContext(c.ctx_, "api response", "serviceName", apiName, "rpcName", %q, "response", internallog.HTTPResponse(res, nil))`, meth.Id())
24242444
pn("return nil")
24252445
} else {
24262446
if meth.IsProtoStructResponse() {
@@ -2449,8 +2469,11 @@ func (meth *Method) generateCode() {
24492469
pn("if err := res.Body.Close(); err != nil { return nil, err }")
24502470
pn("if err := json.NewDecoder(bytes.NewReader(b.Bytes())).Decode(target); err != nil { return nil, err }")
24512471
pn("ret.Data = b.String()")
2472+
pn(`c.s.logger.DebugContext(c.ctx_, "api response", "serviceName", apiName, "rpcName", %q, "response", internallog.HTTPResponse(res, b.Bytes()))`, meth.Id())
24522473
} else {
2453-
pn("if err := gensupport.DecodeResponse(target, res); err != nil { return nil, err }")
2474+
pn("b, err := gensupport.DecodeResponseBytes(target, res)")
2475+
pn("if err != nil { return nil, err }")
2476+
pn(`c.s.logger.DebugContext(c.ctx_, "api response", "serviceName", apiName, "rpcName", %q, "response", internallog.HTTPResponse(res, b))`, meth.Id())
24542477
}
24552478
pn("return ret, nil")
24562479
}

0 commit comments

Comments
 (0)