Loki: Add dashboard and panel names as headers (#92096)
* feat(nameHeaders): add feature flag * add safe parsing of headers * use headers in loki datasource * Loki: add option to pass headers to Loki * Loki: add datasource tests for dashboard names * cleanup * DataSourceWithBackend: add test * rename to `sanitizeHeader` * Loki: add condition when to add headers * Loki: add e2e tests * Loki: change test name
This commit is contained in:
+25
-3
@@ -22,6 +22,7 @@ import (
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
|
||||
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
"github.com/grafana/grafana/pkg/services/contexthandler"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
ngalertmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||
"github.com/grafana/grafana/pkg/tsdb/loki/kinds/dataquery"
|
||||
@@ -49,13 +50,13 @@ func ProvideService(httpClientProvider *httpclient.Provider, tracer tracing.Trac
|
||||
|
||||
var (
|
||||
legendFormat = regexp.MustCompile(`\{\{\s*(.+?)\s*\}\}`)
|
||||
)
|
||||
|
||||
// Used in logging to mark a stage
|
||||
var (
|
||||
stagePrepareRequest = "prepareRequest"
|
||||
stageDatabaseRequest = "databaseRequest"
|
||||
stageParseResponse = "parseResponse"
|
||||
|
||||
dashboardTitleHeader = "X-Dashboard-Title"
|
||||
panelTitleHeader = "X-Panel-Title"
|
||||
)
|
||||
|
||||
type datasourceInfo struct {
|
||||
@@ -163,9 +164,30 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
||||
logsDataplane: isFeatureEnabled(ctx, featuremgmt.FlagLokiLogsDataplane),
|
||||
}
|
||||
|
||||
if isFeatureEnabled(ctx, featuremgmt.FlagLokiSendDashboardPanelNames) {
|
||||
s.applyHeaders(ctx, req)
|
||||
}
|
||||
|
||||
return queryData(ctx, req, dsInfo, responseOpts, s.tracer, logger, isFeatureEnabled(ctx, featuremgmt.FlagLokiRunQueriesInParallel), isFeatureEnabled(ctx, featuremgmt.FlagLokiStructuredMetadata))
|
||||
}
|
||||
|
||||
func (s *Service) applyHeaders(ctx context.Context, req backend.ForwardHTTPHeaders) {
|
||||
reqCtx := contexthandler.FromContext(ctx)
|
||||
if req == nil || reqCtx == nil || reqCtx.Req == nil {
|
||||
return
|
||||
}
|
||||
|
||||
var hList = []string{dashboardTitleHeader, panelTitleHeader}
|
||||
|
||||
for _, hName := range hList {
|
||||
hVal := reqCtx.Req.Header.Get(hName)
|
||||
if hVal == "" {
|
||||
continue
|
||||
}
|
||||
req.SetHTTPHeader(hName, hVal)
|
||||
}
|
||||
}
|
||||
|
||||
func queryData(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datasourceInfo, responseOpts ResponseOpts, tracer tracing.Tracer, plog log.Logger, runInParallel bool, requestStructuredMetadata bool) (*backend.QueryDataResponse, error) {
|
||||
result := backend.NewQueryDataResponse()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user