Plugins: Enhanced plugin instrumentation (#90199)

* Plugins: Enhanced plugin instrumentation

* use backend.CallResourceResponseSenderFunc

* sdk v0.237.0

* support admission control

* cover all handlers in log and metrics middlewares

* fix after review
This commit is contained in:
Marcus Efraimsson
2024-07-09 15:03:46 +02:00
committed by GitHub
parent 2a4a73e03d
commit c8af659f02
40 changed files with 700 additions and 472 deletions

View File

@ -8,6 +8,7 @@ import (
"github.com/grafana/grafana/pkg/infra/log"
"github.com/grafana/grafana/pkg/plugins"
"github.com/grafana/grafana/pkg/plugins/instrumentationutils"
plog "github.com/grafana/grafana/pkg/plugins/log"
"github.com/grafana/grafana/pkg/plugins/pluginrequestmeta"
)
@ -30,13 +31,13 @@ type LoggerMiddleware struct {
logger plog.Logger
}
func (m *LoggerMiddleware) logRequest(ctx context.Context, fn func(ctx context.Context) (requestStatus, error)) error {
func (m *LoggerMiddleware) logRequest(ctx context.Context, fn func(ctx context.Context) (instrumentationutils.RequestStatus, error)) error {
start := time.Now()
timeBeforePluginRequest := log.TimeSinceStart(ctx, start)
status, err := fn(ctx)
logParams := []any{
"status", status,
"status", status.String(),
"duration", time.Since(start),
"eventName", "grafana-data-egress",
"time_before_plugin_request", timeBeforePluginRequest,
@ -48,7 +49,7 @@ func (m *LoggerMiddleware) logRequest(ctx context.Context, fn func(ctx context.C
ctxLogger := m.logger.FromContext(ctx)
logFunc := ctxLogger.Info
if status > requestStatusOK {
if status > instrumentationutils.RequestStatusOK {
logFunc = ctxLogger.Error
}
@ -63,11 +64,12 @@ func (m *LoggerMiddleware) QueryData(ctx context.Context, req *backend.QueryData
}
var resp *backend.QueryDataResponse
err := m.logRequest(ctx, func(ctx context.Context) (status requestStatus, innerErr error) {
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.QueryData(ctx, req)
if innerErr != nil {
return requestStatusFromError(innerErr), innerErr
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
}
ctxLogger := m.logger.FromContext(ctx)
@ -83,7 +85,7 @@ func (m *LoggerMiddleware) QueryData(ctx context.Context, req *backend.QueryData
}
}
return requestStatusFromQueryDataResponse(resp, innerErr), innerErr
return instrumentationutils.RequestStatusFromQueryDataResponse(resp, innerErr), innerErr
})
return resp, err
@ -94,9 +96,9 @@ func (m *LoggerMiddleware) CallResource(ctx context.Context, req *backend.CallRe
return m.next.CallResource(ctx, req, sender)
}
err := m.logRequest(ctx, func(ctx context.Context) (status requestStatus, innerErr error) {
innerErr = m.next.CallResource(ctx, req, sender)
return requestStatusFromError(innerErr), innerErr
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
innerErr := m.next.CallResource(ctx, req, sender)
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return err
@ -108,9 +110,10 @@ func (m *LoggerMiddleware) CheckHealth(ctx context.Context, req *backend.CheckHe
}
var resp *backend.CheckHealthResult
err := m.logRequest(ctx, func(ctx context.Context) (status requestStatus, innerErr error) {
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.CheckHealth(ctx, req)
return requestStatusFromError(innerErr), innerErr
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return resp, err
@ -122,9 +125,98 @@ func (m *LoggerMiddleware) CollectMetrics(ctx context.Context, req *backend.Coll
}
var resp *backend.CollectMetricsResult
err := m.logRequest(ctx, func(ctx context.Context) (status requestStatus, innerErr error) {
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.CollectMetrics(ctx, req)
return requestStatusFromError(innerErr), innerErr
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return resp, err
}
func (m *LoggerMiddleware) SubscribeStream(ctx context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
if req == nil {
return m.next.SubscribeStream(ctx, req)
}
var resp *backend.SubscribeStreamResponse
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.SubscribeStream(ctx, req)
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return resp, err
}
func (m *LoggerMiddleware) PublishStream(ctx context.Context, req *backend.PublishStreamRequest) (*backend.PublishStreamResponse, error) {
if req == nil {
return m.next.PublishStream(ctx, req)
}
var resp *backend.PublishStreamResponse
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.PublishStream(ctx, req)
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return resp, err
}
func (m *LoggerMiddleware) RunStream(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error {
if req == nil {
return m.next.RunStream(ctx, req, sender)
}
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
innerErr := m.next.RunStream(ctx, req, sender)
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return err
}
func (m *LoggerMiddleware) ValidateAdmission(ctx context.Context, req *backend.AdmissionRequest) (*backend.ValidationResponse, error) {
if req == nil {
return m.next.ValidateAdmission(ctx, req)
}
var resp *backend.ValidationResponse
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.ValidateAdmission(ctx, req)
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return resp, err
}
func (m *LoggerMiddleware) MutateAdmission(ctx context.Context, req *backend.AdmissionRequest) (*backend.MutationResponse, error) {
if req == nil {
return m.next.MutateAdmission(ctx, req)
}
var resp *backend.MutationResponse
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.MutateAdmission(ctx, req)
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return resp, err
}
func (m *LoggerMiddleware) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if req == nil {
return m.next.ConvertObject(ctx, req)
}
var resp *backend.ConversionResponse
err := m.logRequest(ctx, func(ctx context.Context) (instrumentationutils.RequestStatus, error) {
var innerErr error
resp, innerErr = m.next.ConvertObject(ctx, req)
return instrumentationutils.RequestStatusFromError(innerErr), innerErr
})
return resp, err