grab team headers from JSON data in datasource instance settings

This commit is contained in:
Jocelyn Collado-Kuri
2026-01-07 13:34:09 -08:00
parent 88bc65d383
commit e347d500d0
2 changed files with 24 additions and 9 deletions
+1
View File
@@ -67,6 +67,7 @@ func (s *Service) runSearchStream(ctx context.Context, req *backend.RunStreamReq
// Ideally this would be pushed higher, so it's set once for all rpc calls, but we have only one now.
ctx = metadata.AppendToOutgoingContext(ctx, "User-Agent", backend.UserAgentFromContext(ctx).String())
// append the rest of the headers
backend.Logger.Warn("Headers:", "headers", req.Headers)
for key, value := range req.Headers {
ctx = metadata.AppendToOutgoingContext(ctx, key, value)
}
+23 -9
View File
@@ -6,6 +6,8 @@ import (
"strings"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/services/datasources"
)
func (s *Service) SubscribeStream(_ context.Context, req *backend.SubscribeStreamRequest) (*backend.SubscribeStreamResponse, error) {
@@ -39,19 +41,31 @@ func (s *Service) PublishStream(_ context.Context, _ *backend.PublishStreamReque
func (s *Service) RunStream(ctx context.Context, request *backend.RunStreamRequest, sender *backend.StreamSender) error {
s.logger.Debug("New stream call", "path", request.Path)
tempoDatasource, err := s.getDSInfo(ctx, request.PluginContext)
tempoDatasource, dsInfoErr := s.getDSInfo(ctx, request.PluginContext)
// get team http headers.
plugin := backend.PluginConfigFromContext(ctx)
opts, err := plugin.DataSourceInstanceSettings.HTTPClientOptions(ctx)
headers := map[string]string{}
for name, values := range opts.Header {
for _, value := range values {
headers[name] = value
b := plugin.DataSourceInstanceSettings.JSONData
js, err := simplejson.NewJson(b)
if err != nil {
return err
}
teamHttpHeaders, err := datasources.GetTeamHTTPHeaders(js)
if err != nil {
return err
}
for _, ruleValue := range teamHttpHeaders.Headers {
for _, accessRule := range ruleValue {
headers[accessRule.Header] = accessRule.LBACRule
}
}
backend.Logger.Warn("Team HTTP Headers: %v", headers)
request.Headers = headers
if strings.HasPrefix(request.Path, SearchPathPrefix) {
if err != nil {
return backend.DownstreamErrorf("failed to get datasource information: %w", err)
if dsInfoErr != nil {
return backend.DownstreamErrorf("failed to get datasource information: %w", dsInfoErr)
}
if err = s.runSearchStream(ctx, request, sender, tempoDatasource); err != nil {
return sendError(err, sender)
@@ -60,8 +74,8 @@ func (s *Service) RunStream(ctx context.Context, request *backend.RunStreamReque
}
}
if strings.HasPrefix(request.Path, MetricsPathPrefix) {
if err != nil {
return backend.DownstreamErrorf("failed to get datasource information: %w", err)
if dsInfoErr != nil {
return backend.DownstreamErrorf("failed to get datasource information: %w", dsInfoErr)
}
if err = s.runMetricsStream(ctx, request, sender, tempoDatasource); err != nil {
return sendError(err, sender)