Logger: Add feature toggle for errors in HTTP request logs (#64425)
This commit is contained in:
@@ -31,6 +31,7 @@ import (
|
||||
"github.com/grafana/grafana/pkg/login/social"
|
||||
"github.com/grafana/grafana/pkg/middleware"
|
||||
"github.com/grafana/grafana/pkg/middleware/csrf"
|
||||
"github.com/grafana/grafana/pkg/middleware/loggermw"
|
||||
"github.com/grafana/grafana/pkg/plugins"
|
||||
"github.com/grafana/grafana/pkg/plugins/pluginscdn"
|
||||
"github.com/grafana/grafana/pkg/registry/corekind"
|
||||
@@ -148,6 +149,7 @@ type HTTPServer struct {
|
||||
httpEntityStore httpentitystore.HTTPEntityStore
|
||||
SearchV2HTTPService searchV2.SearchHTTPService
|
||||
ContextHandler *contexthandler.ContextHandler
|
||||
LoggerMiddleware loggermw.Logger
|
||||
SQLStore db.DB
|
||||
AlertEngine *alerting.AlertEngine
|
||||
AlertNG *ngalert.AlertNG
|
||||
@@ -226,7 +228,7 @@ func ProvideHTTPServer(opts ServerOptions, cfg *setting.Cfg, routeRegister routi
|
||||
loginService login.Service, authenticator loginpkg.Authenticator, accessControl accesscontrol.AccessControl,
|
||||
dataSourceProxy *datasourceproxy.DataSourceProxyService, searchService *search.SearchService,
|
||||
live *live.GrafanaLive, livePushGateway *pushhttp.Gateway, plugCtxProvider *plugincontext.Provider,
|
||||
contextHandler *contexthandler.ContextHandler, features *featuremgmt.FeatureManager,
|
||||
contextHandler *contexthandler.ContextHandler, loggerMiddleware loggermw.Logger, features *featuremgmt.FeatureManager,
|
||||
alertNG *ngalert.AlertNG, libraryPanelService librarypanels.Service, libraryElementService libraryelements.Service,
|
||||
quotaService quota.Service, socialService social.Service, tracer tracing.Tracer,
|
||||
encryptionService encryption.Internal, grafanaUpdateChecker *updatechecker.GrafanaService,
|
||||
@@ -296,6 +298,7 @@ func ProvideHTTPServer(opts ServerOptions, cfg *setting.Cfg, routeRegister routi
|
||||
LivePushGateway: livePushGateway,
|
||||
PluginContextProvider: plugCtxProvider,
|
||||
ContextHandler: contextHandler,
|
||||
LoggerMiddleware: loggerMiddleware,
|
||||
AlertNG: alertNG,
|
||||
LibraryPanelService: libraryPanelService,
|
||||
LibraryElementService: libraryElementService,
|
||||
@@ -579,7 +582,7 @@ func (hs *HTTPServer) addMiddlewaresAndStaticRoutes() {
|
||||
m.Use(middleware.RequestTracing(hs.tracer))
|
||||
m.Use(middleware.RequestMetrics(hs.Features))
|
||||
|
||||
m.UseMiddleware(middleware.Logger(hs.Cfg))
|
||||
m.UseMiddleware(hs.LoggerMiddleware.Middleware())
|
||||
|
||||
if hs.Cfg.EnableGzip {
|
||||
m.UseMiddleware(middleware.Gziper())
|
||||
|
||||
@@ -80,21 +80,11 @@ func (r *NormalResponse) ErrMessage() string {
|
||||
|
||||
func (r *NormalResponse) WriteTo(ctx *contextmodel.ReqContext) {
|
||||
if r.err != nil {
|
||||
v := map[string]interface{}{}
|
||||
traceID := tracing.TraceIDFromContext(ctx.Req.Context(), false)
|
||||
if err := json.Unmarshal(r.body.Bytes(), &v); err == nil {
|
||||
v["traceID"] = traceID
|
||||
if b, err := json.Marshal(v); err == nil {
|
||||
r.body = bytes.NewBuffer(b)
|
||||
}
|
||||
if errutil.HasUnifiedLogging(ctx.Req.Context()) {
|
||||
ctx.Error = r.err
|
||||
} else {
|
||||
r.writeLogLine(ctx)
|
||||
}
|
||||
|
||||
logger := ctx.Logger.Error
|
||||
var gfErr *errutil.Error
|
||||
if errors.As(r.err, &gfErr) {
|
||||
logger = gfErr.LogLevel.LogFunc(ctx.Logger)
|
||||
}
|
||||
logger(r.errMessage, "error", r.err, "remote_addr", ctx.RemoteAddr(), "traceID", traceID)
|
||||
}
|
||||
|
||||
header := ctx.Resp.Header()
|
||||
@@ -107,6 +97,24 @@ func (r *NormalResponse) WriteTo(ctx *contextmodel.ReqContext) {
|
||||
}
|
||||
}
|
||||
|
||||
func (r *NormalResponse) writeLogLine(c *contextmodel.ReqContext) {
|
||||
v := map[string]interface{}{}
|
||||
traceID := tracing.TraceIDFromContext(c.Req.Context(), false)
|
||||
if err := json.Unmarshal(r.body.Bytes(), &v); err == nil {
|
||||
v["traceID"] = traceID
|
||||
if b, err := json.Marshal(v); err == nil {
|
||||
r.body = bytes.NewBuffer(b)
|
||||
}
|
||||
}
|
||||
|
||||
logger := c.Logger.Error
|
||||
var gfErr errutil.Error
|
||||
if errors.As(r.err, &gfErr) {
|
||||
logger = gfErr.LogLevel.LogFunc(c.Logger)
|
||||
}
|
||||
logger(r.errMessage, "error", r.err, "remote_addr", c.RemoteAddr(), "traceID", traceID)
|
||||
}
|
||||
|
||||
func (r *NormalResponse) SetHeader(key, value string) *NormalResponse {
|
||||
r.header.Set(key, value)
|
||||
return r
|
||||
@@ -253,8 +261,8 @@ func Error(status int, message string, err error) *NormalResponse {
|
||||
|
||||
// Err creates an error response based on an errutil.Error error.
|
||||
func Err(err error) *NormalResponse {
|
||||
grafanaErr := &errutil.Error{}
|
||||
if !errors.As(err, grafanaErr) {
|
||||
grafanaErr := errutil.Error{}
|
||||
if !errors.As(err, &grafanaErr) {
|
||||
return Error(http.StatusInternalServerError, "", fmt.Errorf("unexpected error type [%s]: %w", reflect.TypeOf(err), err))
|
||||
}
|
||||
|
||||
@@ -273,8 +281,8 @@ func Err(err error) *NormalResponse {
|
||||
// rename this to Error when we're confident that that would be safe to
|
||||
// do.
|
||||
func ErrOrFallback(status int, message string, err error) *NormalResponse {
|
||||
grafanaErr := &errutil.Error{}
|
||||
if errors.As(err, grafanaErr) {
|
||||
grafanaErr := errutil.Error{}
|
||||
if errors.As(err, &grafanaErr) {
|
||||
return Err(err)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user