Prometheus: (Instrumentation) Add rawExpr (pre-interpolation) to traces (#86449)

This commit is contained in:
Kyle Brandt
2024-04-17 19:53:38 +02:00
committed by GitHub
parent ed8eacbc7e
commit 46efe41e33
3 changed files with 85 additions and 49 deletions
+31 -1
View File
@@ -3,6 +3,7 @@ package models
import (
"embed"
"encoding/json"
"fmt"
"math"
"strconv"
"strings"
@@ -12,6 +13,8 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend/gtime"
sdkapi "github.com/grafana/grafana-plugin-sdk-go/experimental/apis/data/v0alpha1"
"github.com/prometheus/prometheus/model/labels"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
"github.com/grafana/grafana/pkg/promlib/intervalv2"
)
@@ -169,11 +172,12 @@ type Scope struct {
Matchers []*labels.Matcher
}
func Parse(query backend.DataQuery, dsScrapeInterval string, intervalCalculator intervalv2.Calculator, fromAlert bool, enableScope bool) (*Query, error) {
func Parse(span trace.Span, query backend.DataQuery, dsScrapeInterval string, intervalCalculator intervalv2.Calculator, fromAlert bool, enableScope bool) (*Query, error) {
model := &QueryModel{}
if err := json.Unmarshal(query.JSON, model); err != nil {
return nil, err
}
span.SetAttributes(attribute.String("rawExpr", model.Expr))
// Final step value for prometheus
calculatedStep, err := calculatePrometheusInterval(model.Interval, dsScrapeInterval, int64(model.IntervalMS), model.IntervalFactor, query, intervalCalculator)
@@ -198,6 +202,26 @@ func Parse(query backend.DataQuery, dsScrapeInterval string, intervalCalculator
scopeFilters = model.Scope.Filters
}
if len(scopeFilters) > 0 {
span.SetAttributes(attribute.StringSlice("scopeFilters", func() []string {
var filters []string
for _, f := range scopeFilters {
filters = append(filters, fmt.Sprintf("%q %q %q", f.Key, f.Operator, f.Value))
}
return filters
}()))
}
if len(model.AdhocFilters) > 0 {
span.SetAttributes(attribute.StringSlice("adhocFilters", func() []string {
var filters []string
for _, f := range model.AdhocFilters {
filters = append(filters, fmt.Sprintf("%q %q %q", f.Key, f.Operator, f.Value))
}
return filters
}()))
}
expr, err = ApplyQueryFilters(expr, scopeFilters, model.AdhocFilters)
if err != nil {
return nil, err
@@ -214,6 +238,12 @@ func Parse(query backend.DataQuery, dsScrapeInterval string, intervalCalculator
model.Exemplar = false
}
span.SetAttributes(
attribute.String("expr", expr),
attribute.Int64("start_unixnano", query.TimeRange.From.UnixNano()),
attribute.Int64("stop_unixnano", query.TimeRange.To.UnixNano()),
)
return &Query{
Expr: expr,
Step: calculatedStep,