Elasticsearch: Add tracing to data source (#74750)
* Elasticsearch: Add tracing do data source * Fix tests * Address feedback * Update pkg/tsdb/elasticsearch/response_parser.go Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com> * Update pkg/tsdb/elasticsearch/response_parser.go Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com> * Track error across both spans * Add span for decoding of response * Fix test * Update setting of errors + fix test --------- Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>
This commit is contained in:
co-authored by
Sven Grossmann
parent
c7b6ac065a
commit
4f0b31d21b
@@ -13,9 +13,12 @@ import (
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
"github.com/grafana/grafana-plugin-sdk-go/data"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/codes"
|
||||
|
||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
es "github.com/grafana/grafana/pkg/tsdb/elasticsearch/client"
|
||||
)
|
||||
|
||||
@@ -41,21 +44,29 @@ const (
|
||||
|
||||
var searchWordsRegex = regexp.MustCompile(regexp.QuoteMeta(es.HighlightPreTagsString) + `(.*?)` + regexp.QuoteMeta(es.HighlightPostTagsString))
|
||||
|
||||
func parseResponse(ctx context.Context, responses []*es.SearchResponse, targets []*Query, configuredFields es.ConfiguredFields, logger log.Logger) (*backend.QueryDataResponse, error) {
|
||||
func parseResponse(ctx context.Context, responses []*es.SearchResponse, targets []*Query, configuredFields es.ConfiguredFields, logger log.Logger, tracer tracing.Tracer) (*backend.QueryDataResponse, error) {
|
||||
result := backend.QueryDataResponse{
|
||||
Responses: backend.Responses{},
|
||||
}
|
||||
if responses == nil {
|
||||
return &result, nil
|
||||
}
|
||||
ctx, span := tracer.Start(ctx, "datasource.elastic.parseResponse")
|
||||
span.SetAttributes("responseLength", len(responses), attribute.Key("responseLength").Int(len(responses)))
|
||||
defer span.End()
|
||||
|
||||
for i, res := range responses {
|
||||
_, resSpan := tracer.Start(ctx, "datasource.elastic.parseResponse.response")
|
||||
resSpan.SetAttributes("queryMetricType", targets[i].Metrics[0].Type, attribute.Key("queryMetricType").String(targets[i].Metrics[0].Type))
|
||||
start := time.Now()
|
||||
target := targets[i]
|
||||
|
||||
if res.Error != nil {
|
||||
mt, _ := json.Marshal(target)
|
||||
me, _ := json.Marshal(res.Error)
|
||||
resSpan.RecordError(errors.New(string(me)))
|
||||
resSpan.SetStatus(codes.Error, string(me))
|
||||
resSpan.End()
|
||||
logger.Error("Processing error response from Elasticsearch", "error", string(me), "query", string(mt))
|
||||
errResult := getErrorFromElasticResponse(res)
|
||||
result.Responses[target.RefID] = backend.DataResponse{
|
||||
@@ -94,6 +105,11 @@ func parseResponse(ctx context.Context, responses []*es.SearchResponse, targets
|
||||
logger.Debug("Processed metric query response")
|
||||
if err != nil {
|
||||
mt, _ := json.Marshal(target)
|
||||
span.RecordError(err)
|
||||
span.SetStatus(codes.Error, err.Error())
|
||||
resSpan.RecordError(err)
|
||||
resSpan.SetStatus(codes.Error, err.Error())
|
||||
resSpan.End()
|
||||
logger.Error("Error processing buckets", "error", err, "query", string(mt), "aggregationsLength", len(res.Aggregations))
|
||||
return &backend.QueryDataResponse{}, err
|
||||
}
|
||||
@@ -102,9 +118,9 @@ func parseResponse(ctx context.Context, responses []*es.SearchResponse, targets
|
||||
|
||||
result.Responses[target.RefID] = queryRes
|
||||
}
|
||||
resSpan.End()
|
||||
logger.Info("Finished processing of response", "duration", time.Since(start), "stage", es.StageParseResponse)
|
||||
}
|
||||
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user