Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

make ServiceStats an intrinsic #5

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion pkg/traceql/enum_attributes.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ const (
AttributeScopeResource
AttributeScopeSpan
AttributeScopeUnknown
AttributeScopeTrace

none = "none"
duration = "duration"
Expand Down Expand Up @@ -81,6 +80,8 @@ const (
IntrinsicTraceStartTime
IntrinsicSpanID
IntrinsicSpanStartTime

IntrinsicServiceStats
)

var (
Expand Down
6 changes: 1 addition & 5 deletions pkg/traceql/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@ type Condition struct {
Operands Operands
}

const (
ServiceStatsAttributeName = "ServiceStats"
)

func SearchMetaConditions() []Condition {
return []Condition{
{NewIntrinsic(IntrinsicTraceRootService), OpNone, nil},
Expand All @@ -26,7 +22,7 @@ func SearchMetaConditions() []Condition {
{NewIntrinsic(IntrinsicSpanID), OpNone, nil},
{NewIntrinsic(IntrinsicSpanStartTime), OpNone, nil},
{NewIntrinsic(IntrinsicDuration), OpNone, nil},
{Attribute{Scope: AttributeScopeTrace, Name: ServiceStatsAttributeName}, OpNone, nil},
{NewIntrinsic(IntrinsicServiceStats), OpNone, nil},
}
}

Expand Down
4 changes: 2 additions & 2 deletions pkg/traceql/storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func TestMetaConditionsWithout(t *testing.T) {
{NewIntrinsic(IntrinsicTraceStartTime), OpNone, nil},
{NewIntrinsic(IntrinsicSpanID), OpNone, nil},
{NewIntrinsic(IntrinsicSpanStartTime), OpNone, nil},
{Attribute{Scope: AttributeScopeTrace, Name: ServiceStatsAttributeName}, OpNone, nil},
{NewIntrinsic(IntrinsicServiceStats), OpNone, nil},
},
},
{
Expand All @@ -84,7 +84,7 @@ func TestMetaConditionsWithout(t *testing.T) {
{NewIntrinsic(IntrinsicTraceStartTime), OpNone, nil},
{NewIntrinsic(IntrinsicSpanID), OpNone, nil},
{NewIntrinsic(IntrinsicSpanStartTime), OpNone, nil},
{Attribute{Scope: AttributeScopeTrace, Name: ServiceStatsAttributeName}, OpNone, nil},
{NewIntrinsic(IntrinsicServiceStats), OpNone, nil},
},
},
}
Expand Down
2 changes: 1 addition & 1 deletion tempodb/encoding/vparquet/block_traceql.go
Original file line number Diff line number Diff line change
Expand Up @@ -740,7 +740,7 @@ func createAllIterator(ctx context.Context, primaryIter parquetquery.Iterator, c
resourceConditions = append(resourceConditions, cond)
continue

case traceql.AttributeScopeTrace, intrinsicScopeTrace:
case intrinsicScopeTrace:
traceConditions = append(traceConditions, cond)
continue

Expand Down
2 changes: 1 addition & 1 deletion tempodb/encoding/vparquet2/block_traceql.go
Original file line number Diff line number Diff line change
Expand Up @@ -919,7 +919,7 @@ func createAllIterator(ctx context.Context, primaryIter parquetquery.Iterator, c
resourceConditions = append(resourceConditions, cond)
continue

case traceql.AttributeScopeTrace, intrinsicScopeTrace:
case intrinsicScopeTrace:
traceConditions = append(traceConditions, cond)
continue

Expand Down
2 changes: 1 addition & 1 deletion tempodb/encoding/vparquet3/block_traceql.go
Original file line number Diff line number Diff line change
Expand Up @@ -1060,7 +1060,7 @@ func categorizeConditions(conditions []traceql.Condition) (mingled bool, spanCon
resourceConditions = append(resourceConditions, cond)
continue

case traceql.AttributeScopeTrace, intrinsicScopeTrace:
case intrinsicScopeTrace:
traceConditions = append(traceConditions, cond)
continue

Expand Down
15 changes: 9 additions & 6 deletions tempodb/encoding/vparquet4/block_traceql.go
Original file line number Diff line number Diff line change
Expand Up @@ -533,6 +533,8 @@ var intrinsicColumnLookups = map[traceql.Intrinsic]struct {
traceql.IntrinsicTraceDuration: {intrinsicScopeTrace, traceql.TypeString, columnPathDurationNanos},
traceql.IntrinsicTraceID: {intrinsicScopeTrace, traceql.TypeDuration, columnPathTraceID},
traceql.IntrinsicTraceStartTime: {intrinsicScopeTrace, traceql.TypeDuration, columnPathStartTimeUnixNano},

traceql.IntrinsicServiceStats: {intrinsicScopeTrace, traceql.TypeNil, ""}, // Not a real column, this entry is only used to assign default scope.
}

// Lookup table of all well-known attributes with dedicated columns
Expand Down Expand Up @@ -840,7 +842,11 @@ func (i *rebatchIterator) Next() (*parquetquery.IteratorResult, error) {
sp.cbSpanset.StartTimeUnixNanos = ss.StartTimeUnixNanos
}
if len(sp.cbSpanset.ServiceStats) == 0 {
sp.cbSpanset.ServiceStats = map[string]traceql.ServiceStats{}
// If this spanset was created by a GroupOperation, the ServiceStats map is nil and must be allocated first
if sp.cbSpanset.ServiceStats == nil {
sp.cbSpanset.ServiceStats = map[string]traceql.ServiceStats{}
}

for service, stat := range ss.ServiceStats {
sp.cbSpanset.ServiceStats[service] = traceql.ServiceStats{
SpanCount: stat.SpanCount,
Expand Down Expand Up @@ -1073,7 +1079,7 @@ func categorizeConditions(conditions []traceql.Condition) (mingled bool, spanCon
resourceConditions = append(resourceConditions, cond)
continue

case traceql.AttributeScopeTrace, intrinsicScopeTrace:
case intrinsicScopeTrace:
traceConditions = append(traceConditions, cond)
continue

Expand Down Expand Up @@ -1569,10 +1575,7 @@ func createTraceIterator(makeIter makeIterFn, resourceIter parquetquery.Iterator
}
}
traceIters = append(traceIters, makeIter(columnPathRootServiceName, pred, columnPathRootServiceName))
}

switch cond.Attribute.Name {
case traceql.ServiceStatsAttributeName:
case traceql.IntrinsicServiceStats:
traceIters = append(traceIters, createServiceStatsIterator(makeIter))
}
}
Expand Down
14 changes: 10 additions & 4 deletions tempodb/encoding/vparquet4/schema_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ func TestFieldsAreCleared(t *testing.T) {
{
Resource: &v1_resource.Resource{
Attributes: []*v1.KeyValue{
{Key: LabelServiceName, Value: &v1.AnyValue{Value: &v1.AnyValue_StringValue{StringValue: "service1"}}},
{Key: "i", Value: &v1.AnyValue{Value: &v1.AnyValue_DoubleValue{DoubleValue: 123.456}}},
},
},
Expand All @@ -86,7 +87,9 @@ func TestFieldsAreCleared(t *testing.T) {
Spans: []*v1_trace.Span{
{
TraceId: traceID,
Status: &v1_trace.Status{},
Status: &v1_trace.Status{
Code: v1_trace.Status_STATUS_CODE_ERROR,
},
Attributes: []*v1.KeyValue{
// an attribute for every type in order to make sure attributes are reused with different
// type combinations
Expand Down Expand Up @@ -118,17 +121,20 @@ func TestFieldsAreCleared(t *testing.T) {
}

expectedTrace := &Trace{
TraceID: traceID,
TraceIDText: "102030405060708090a0b0c0d0e0f",
ServiceStats: map[string]ServiceStats{"": {SpanCount: 1}},
TraceID: traceID,
TraceIDText: "102030405060708090a0b0c0d0e0f",
RootServiceName: "service1",
ServiceStats: map[string]ServiceStats{"service1": {SpanCount: 1, ErrorCount: 1}},
ResourceSpans: []ResourceSpans{{
Resource: Resource{
ServiceName: "service1",
Attrs: []Attribute{
attr("i", 123.456),
},
},
ScopeSpans: []ScopeSpans{{
Spans: []Span{{
StatusCode: 2,
ParentID: -1,
NestedSetLeft: 1,
NestedSetRight: 2,
Expand Down
Loading