internal/clients/config/debug.go (61 lines of code) (raw):

package config import ( "context" "fmt" "net/http" "net/http/httputil" "time" "github.com/elastic/elastic-transport-go/v8/elastictransport" "github.com/elastic/terraform-provider-elasticstack/internal/utils" "github.com/hashicorp/terraform-plugin-log/tflog" ) const logReqMsg = `%s API Request Details: ---[ REQUEST ]--------------------------------------- %s -----------------------------------------------------` const logRespMsg = `%s API Response for [%s] Details: ---[ RESPONSE ]-------------------------------------- %s -----------------------------------------------------` var _ elastictransport.Logger = &debugLogger{} type debugLogger struct { Name string } func (l *debugLogger) LogRoundTrip(req *http.Request, resp *http.Response, err error, start time.Time, duration time.Duration) error { ctx := req.Context() requestId := "<nil>" if req != nil { requestId = fmt.Sprintf("%s %s", req.Method, req.URL) } tflog.Debug(ctx, fmt.Sprintf("%s request [%s] executed. Took %s. %#v", l.Name, requestId, duration, err)) if req != nil && req.Body != nil { l.logRequest(ctx, req, requestId) } if resp != nil && resp.Body != nil { l.logResponse(ctx, resp, requestId) } if resp == nil { tflog.Debug(ctx, fmt.Sprintf("%s response for [%s] is nil", l.Name, requestId)) } return nil } func (l *debugLogger) logRequest(ctx context.Context, req *http.Request, requestId string) { defer req.Body.Close() reqData, err := httputil.DumpRequestOut(req, true) if err == nil { tflog.Debug(ctx, fmt.Sprintf(logReqMsg, l.Name, utils.PrettyPrintJSONLines(reqData))) } else { tflog.Debug(ctx, fmt.Sprintf("%s API request dump error: %#v", l.Name, err)) } } func (l *debugLogger) logResponse(ctx context.Context, resp *http.Response, requestId string) { defer resp.Body.Close() respData, err := httputil.DumpResponse(resp, true) if err == nil { tflog.Debug(ctx, fmt.Sprintf(logRespMsg, l.Name, requestId, utils.PrettyPrintJSONLines(respData))) } else { tflog.Debug(ctx, fmt.Sprintf("%s API response for [%s] dump error: %#v", l.Name, requestId, err)) } } func (l *debugLogger) RequestBodyEnabled() bool { return true } func (l *debugLogger) ResponseBodyEnabled() bool { return true }