mirror of
https://github.com/grafana/grafana.git
synced 2025-08-01 23:23:12 +08:00
Loki: Refactor getting of panel/dashboard title headers as part of decoupling (#106829)
* Loki: Refactor getting of panel/dashboard title headers as part of decoupling * Add headers to be passed to api server * Address review comments
This commit is contained in:
@ -5,6 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
|
queryService "github.com/grafana/grafana/pkg/services/query"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Set of headers that we want to forward to the datasource api servers. Those are used i.e. for
|
// Set of headers that we want to forward to the datasource api servers. Those are used i.e. for
|
||||||
@ -13,6 +14,9 @@ import (
|
|||||||
// The headers related to grafana alerting (x-rule-*), should match the list at
|
// The headers related to grafana alerting (x-rule-*), should match the list at
|
||||||
// https://github.com/grafana/grafana/blob/f8ae71e4583499dd461ebaed31451966be04220b/pkg/services/pluginsintegration/clientmiddleware/usealertingheaders_middleware.go#L23
|
// https://github.com/grafana/grafana/blob/f8ae71e4583499dd461ebaed31451966be04220b/pkg/services/pluginsintegration/clientmiddleware/usealertingheaders_middleware.go#L23
|
||||||
//
|
//
|
||||||
|
// The headers related to grafana query should match the list at
|
||||||
|
// https://github.com/grafana/grafana/blob/f8ae71e4583499dd461ebaed31451966be04220b/pkg/services/pluginsintegration/clientmiddleware/tracing_header_middleware.go#L36
|
||||||
|
//
|
||||||
// The usage of strings.ToLower is because the server would convert `FromAlert` to `Fromalert`. So the make matching
|
// The usage of strings.ToLower is because the server would convert `FromAlert` to `Fromalert`. So the make matching
|
||||||
// easier, we just match all headers in lower case.
|
// easier, we just match all headers in lower case.
|
||||||
var expectedHeaders = map[string]string{
|
var expectedHeaders = map[string]string{
|
||||||
@ -25,6 +29,14 @@ var expectedHeaders = map[string]string{
|
|||||||
strings.ToLower("X-Rule-Type"): "X-Rule-Type",
|
strings.ToLower("X-Rule-Type"): "X-Rule-Type",
|
||||||
strings.ToLower("X-Rule-Version"): "X-Rule-Version",
|
strings.ToLower("X-Rule-Version"): "X-Rule-Version",
|
||||||
strings.ToLower("X-Grafana-Org-Id"): "X-Grafana-Org-Id",
|
strings.ToLower("X-Grafana-Org-Id"): "X-Grafana-Org-Id",
|
||||||
|
strings.ToLower(queryService.HeaderQueryGroupID): queryService.HeaderQueryGroupID,
|
||||||
|
strings.ToLower(queryService.HeaderPanelID): queryService.HeaderPanelID,
|
||||||
|
strings.ToLower(queryService.HeaderDashboardUID): queryService.HeaderDashboardUID,
|
||||||
|
strings.ToLower(queryService.HeaderDatasourceUID): queryService.HeaderDatasourceUID,
|
||||||
|
strings.ToLower(queryService.HeaderFromExpression): queryService.HeaderFromExpression,
|
||||||
|
strings.ToLower(queryService.HeaderPanelPluginId): queryService.HeaderPanelPluginId,
|
||||||
|
strings.ToLower(queryService.HeaderDashboardTitle): queryService.HeaderDashboardTitle,
|
||||||
|
strings.ToLower(queryService.HeaderPanelTitle): queryService.HeaderPanelTitle,
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExtractKnownHeaders(header http.Header) map[string]string {
|
func ExtractKnownHeaders(header http.Header) map[string]string {
|
||||||
|
@ -33,7 +33,17 @@ func (m *TracingHeaderMiddleware) applyHeaders(ctx context.Context, req backend.
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var headersList = []string{query.HeaderQueryGroupID, query.HeaderPanelID, query.HeaderDashboardUID, query.HeaderDatasourceUID, query.HeaderFromExpression, `X-Grafana-Org-Id`, query.HeaderPanelPluginId}
|
var headersList = []string{
|
||||||
|
query.HeaderQueryGroupID,
|
||||||
|
query.HeaderPanelID,
|
||||||
|
query.HeaderDashboardUID,
|
||||||
|
query.HeaderDatasourceUID,
|
||||||
|
query.HeaderFromExpression,
|
||||||
|
`X-Grafana-Org-Id`,
|
||||||
|
query.HeaderPanelPluginId,
|
||||||
|
query.HeaderDashboardTitle,
|
||||||
|
query.HeaderPanelTitle,
|
||||||
|
}
|
||||||
|
|
||||||
for _, headerName := range headersList {
|
for _, headerName := range headersList {
|
||||||
gotVal := reqCtx.Req.Header.Get(headerName)
|
gotVal := reqCtx.Req.Header.Get(headerName)
|
||||||
|
@ -33,6 +33,8 @@ const (
|
|||||||
HeaderDatasourceUID = "X-Datasource-Uid" // can be used for routing/ load balancing
|
HeaderDatasourceUID = "X-Datasource-Uid" // can be used for routing/ load balancing
|
||||||
HeaderDashboardUID = "X-Dashboard-Uid" // mainly useful for debugging slow queries
|
HeaderDashboardUID = "X-Dashboard-Uid" // mainly useful for debugging slow queries
|
||||||
HeaderPanelID = "X-Panel-Id" // mainly useful for debugging slow queries
|
HeaderPanelID = "X-Panel-Id" // mainly useful for debugging slow queries
|
||||||
|
HeaderDashboardTitle = "X-Dashboard-Title" // used for identifying the dashboard with heavy query load
|
||||||
|
HeaderPanelTitle = "X-Panel-Title" // used for identifying the panel with heavy query load
|
||||||
HeaderPanelPluginId = "X-Panel-Plugin-Id"
|
HeaderPanelPluginId = "X-Panel-Plugin-Id"
|
||||||
HeaderQueryGroupID = "X-Query-Group-Id" // mainly useful for finding related queries with query chunking
|
HeaderQueryGroupID = "X-Query-Group-Id" // mainly useful for finding related queries with query chunking
|
||||||
HeaderFromExpression = "X-Grafana-From-Expr" // used by datasources to identify expression queries
|
HeaderFromExpression = "X-Grafana-From-Expr" // used by datasources to identify expression queries
|
||||||
|
@ -24,7 +24,6 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||||
"github.com/grafana/grafana/pkg/promlib/models"
|
"github.com/grafana/grafana/pkg/promlib/models"
|
||||||
"github.com/grafana/grafana/pkg/services/contexthandler"
|
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
ngalertmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
|
ngalertmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
"github.com/grafana/grafana/pkg/tsdb/loki/kinds/dataquery"
|
"github.com/grafana/grafana/pkg/tsdb/loki/kinds/dataquery"
|
||||||
@ -56,9 +55,6 @@ var (
|
|||||||
stagePrepareRequest = "prepareRequest"
|
stagePrepareRequest = "prepareRequest"
|
||||||
stageDatabaseRequest = "databaseRequest"
|
stageDatabaseRequest = "databaseRequest"
|
||||||
stageParseResponse = "parseResponse"
|
stageParseResponse = "parseResponse"
|
||||||
|
|
||||||
dashboardTitleHeader = "X-Dashboard-Title"
|
|
||||||
panelTitleHeader = "X-Panel-Title"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type datasourceInfo struct {
|
type datasourceInfo struct {
|
||||||
@ -184,30 +180,9 @@ func (s *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest)
|
|||||||
logsDataplane: isFeatureEnabled(ctx, featuremgmt.FlagLokiLogsDataplane),
|
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), isFeatureEnabled(ctx, featuremgmt.FlagLogQLScope))
|
return queryData(ctx, req, dsInfo, responseOpts, s.tracer, logger, isFeatureEnabled(ctx, featuremgmt.FlagLokiRunQueriesInParallel), isFeatureEnabled(ctx, featuremgmt.FlagLokiStructuredMetadata), isFeatureEnabled(ctx, featuremgmt.FlagLogQLScope))
|
||||||
}
|
}
|
||||||
|
|
||||||
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, logQLScopes bool) (*backend.QueryDataResponse, error) {
|
func queryData(ctx context.Context, req *backend.QueryDataRequest, dsInfo *datasourceInfo, responseOpts ResponseOpts, tracer tracing.Tracer, plog log.Logger, runInParallel bool, requestStructuredMetadata, logQLScopes bool) (*backend.QueryDataResponse, error) {
|
||||||
result := backend.NewQueryDataResponse()
|
result := backend.NewQueryDataResponse()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user