mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Add logging to legacy datasource look up path (#97065)
This commit is contained in:
parent
54785fb5a8
commit
4b234c4795
@ -12,6 +12,7 @@ import (
|
|||||||
|
|
||||||
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
||||||
"github.com/grafana/grafana/pkg/expr"
|
"github.com/grafana/grafana/pkg/expr"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources/service"
|
"github.com/grafana/grafana/pkg/services/datasources/service"
|
||||||
)
|
)
|
||||||
@ -48,13 +49,15 @@ type queryParser struct {
|
|||||||
legacy service.LegacyDataSourceLookup
|
legacy service.LegacyDataSourceLookup
|
||||||
reader *expr.ExpressionQueryReader
|
reader *expr.ExpressionQueryReader
|
||||||
tracer tracing.Tracer
|
tracer tracing.Tracer
|
||||||
|
logger log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func newQueryParser(reader *expr.ExpressionQueryReader, legacy service.LegacyDataSourceLookup, tracer tracing.Tracer) *queryParser {
|
func newQueryParser(reader *expr.ExpressionQueryReader, legacy service.LegacyDataSourceLookup, tracer tracing.Tracer, logger log.Logger) *queryParser {
|
||||||
return &queryParser{
|
return &queryParser{
|
||||||
reader: reader,
|
reader: reader,
|
||||||
legacy: legacy,
|
legacy: legacy,
|
||||||
tracer: tracer,
|
tracer: tracer,
|
||||||
|
logger: logger,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,6 +85,7 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe
|
|||||||
|
|
||||||
ds, err := p.getValidDataSourceRef(ctx, q.Datasource, q.DatasourceID)
|
ds, err := p.getValidDataSourceRef(ctx, q.Datasource, q.DatasourceID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to get valid datasource ref", "error", err)
|
||||||
return rsp, err
|
return rsp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,14 +97,17 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe
|
|||||||
// but this approach lets us focus on well typed behavior first
|
// but this approach lets us focus on well typed behavior first
|
||||||
raw, err := json.Marshal(q)
|
raw, err := json.Marshal(q)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to marshal query for expression", "error", err)
|
||||||
return rsp, err
|
return rsp, err
|
||||||
}
|
}
|
||||||
iter, err := jsoniter.ParseBytes(jsoniter.ConfigDefault, raw)
|
iter, err := jsoniter.ParseBytes(jsoniter.ConfigDefault, raw)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to parse bytes for expression", "error", err)
|
||||||
return rsp, err
|
return rsp, err
|
||||||
}
|
}
|
||||||
exp, err := p.reader.ReadQuery(q, iter)
|
exp, err := p.reader.ReadQuery(q, iter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Failed to read query for expression", "error", err)
|
||||||
return rsp, NewErrorWithRefID(q.RefID, err)
|
return rsp, NewErrorWithRefID(q.RefID, err)
|
||||||
}
|
}
|
||||||
exp.GraphID = int64(len(expressions) + 1)
|
exp.GraphID = int64(len(expressions) + 1)
|
||||||
@ -170,6 +177,7 @@ func (p *queryParser) parseRequest(ctx context.Context, input *query.QueryDataRe
|
|||||||
// Add the sorted expressions
|
// Add the sorted expressions
|
||||||
sortedNodes, err := topo.SortStabilized(dg, nil)
|
sortedNodes, err := topo.SortStabilized(dg, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
p.logger.Error("Error when sorting nodes", "error", err)
|
||||||
return rsp, makeCyclicError("")
|
return rsp, makeCyclicError("")
|
||||||
}
|
}
|
||||||
for _, v := range sortedNodes {
|
for _, v := range sortedNodes {
|
||||||
|
@ -15,6 +15,7 @@ import (
|
|||||||
|
|
||||||
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
query "github.com/grafana/grafana/pkg/apis/query/v0alpha1"
|
||||||
"github.com/grafana/grafana/pkg/expr"
|
"github.com/grafana/grafana/pkg/expr"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||||
)
|
)
|
||||||
@ -29,7 +30,7 @@ type parserTestObject struct {
|
|||||||
func TestQuerySplitting(t *testing.T) {
|
func TestQuerySplitting(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
parser := newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
parser := newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
||||||
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest())
|
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest(), log.NewNopLogger())
|
||||||
|
|
||||||
t.Run("missing datasource flavors", func(t *testing.T) {
|
t.Run("missing datasource flavors", func(t *testing.T) {
|
||||||
split, err := parser.parseRequest(ctx, &query.QueryDataRequest{
|
split, err := parser.parseRequest(ctx, &query.QueryDataRequest{
|
||||||
|
@ -26,7 +26,7 @@ func TestQueryRestConnectHandler(t *testing.T) {
|
|||||||
},
|
},
|
||||||
tracer: tracing.InitializeTracerForTest(),
|
tracer: tracing.InitializeTracerForTest(),
|
||||||
parser: newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
parser: newQueryParser(expr.NewExpressionQueryReader(featuremgmt.WithFeatures()),
|
||||||
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest()),
|
&legacyDataSourceRetriever{}, tracing.InitializeTracerForTest(), nil),
|
||||||
log: log.New("test"),
|
log: log.New("test"),
|
||||||
}
|
}
|
||||||
qr := newQueryREST(b)
|
qr := newQueryREST(b)
|
||||||
|
@ -75,7 +75,7 @@ func NewQueryAPIBuilder(features featuremgmt.FeatureToggles,
|
|||||||
log: log.New("query_apiserver"),
|
log: log.New("query_apiserver"),
|
||||||
client: client,
|
client: client,
|
||||||
registry: registry,
|
registry: registry,
|
||||||
parser: newQueryParser(reader, legacy, tracer),
|
parser: newQueryParser(reader, legacy, tracer, log.New("query_parser")),
|
||||||
metrics: newQueryMetrics(registerer),
|
metrics: newQueryMetrics(registerer),
|
||||||
tracer: tracer,
|
tracer: tracer,
|
||||||
features: features,
|
features: features,
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
|
data "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
"github.com/grafana/grafana/pkg/apimachinery/identity"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,6 +39,7 @@ type cachingLegacyDataSourceLookup struct {
|
|||||||
retriever DataSourceRetriever
|
retriever DataSourceRetriever
|
||||||
cache map[string]cachedValue
|
cache map[string]cachedValue
|
||||||
cacheMu sync.Mutex
|
cacheMu sync.Mutex
|
||||||
|
log log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type cachedValue struct {
|
type cachedValue struct {
|
||||||
@ -49,15 +51,18 @@ func ProvideLegacyDataSourceLookup(p *Service) LegacyDataSourceLookup {
|
|||||||
return &cachingLegacyDataSourceLookup{
|
return &cachingLegacyDataSourceLookup{
|
||||||
retriever: p,
|
retriever: p,
|
||||||
cache: make(map[string]cachedValue),
|
cache: make(map[string]cachedValue),
|
||||||
|
log: log.New("legacy-datasource-lookup"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *cachingLegacyDataSourceLookup) GetDataSourceFromDeprecatedFields(ctx context.Context, name string, id int64) (*data.DataSourceRef, error) {
|
func (s *cachingLegacyDataSourceLookup) GetDataSourceFromDeprecatedFields(ctx context.Context, name string, id int64) (*data.DataSourceRef, error) {
|
||||||
if id == 0 && name == "" {
|
if id == 0 && name == "" {
|
||||||
|
s.log.Error("missing id and name in GetDataSourceFromDeprecatedFields")
|
||||||
return nil, fmt.Errorf("either name or ID must be set")
|
return nil, fmt.Errorf("either name or ID must be set")
|
||||||
}
|
}
|
||||||
user, err := identity.GetRequester(ctx)
|
user, err := identity.GetRequester(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
s.log.Error("failed to get user from context after getRequester", "error", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
key := fmt.Sprintf("%d/%s/%d", user.GetOrgID(), name, id)
|
key := fmt.Sprintf("%d/%s/%d", user.GetOrgID(), name, id)
|
||||||
@ -74,6 +79,9 @@ func (s *cachingLegacyDataSourceLookup) GetDataSourceFromDeprecatedFields(ctx co
|
|||||||
Name: name,
|
Name: name,
|
||||||
ID: id,
|
ID: id,
|
||||||
})
|
})
|
||||||
|
if err != nil {
|
||||||
|
s.log.Error("failed to get datasource from retriever", "error", err)
|
||||||
|
}
|
||||||
if errors.Is(err, datasources.ErrDataSourceNotFound) && name != "" {
|
if errors.Is(err, datasources.ErrDataSourceNotFound) && name != "" {
|
||||||
ds, err = s.retriever.GetDataSource(ctx, &datasources.GetDataSourceQuery{
|
ds, err = s.retriever.GetDataSource(ctx, &datasources.GetDataSourceQuery{
|
||||||
OrgID: user.GetOrgID(),
|
OrgID: user.GetOrgID(),
|
||||||
|
Loading…
Reference in New Issue
Block a user