|
9 | 9 | "testing"
|
10 | 10 | "time"
|
11 | 11 |
|
| 12 | + sl "github.com/cortexproject/cortex/pkg/util/spanlogger" |
| 13 | + "github.com/opentracing/opentracing-go" |
| 14 | + "github.com/opentracing/opentracing-go/mocktracer" |
12 | 15 | "github.com/prometheus/common/model"
|
13 | 16 | "github.com/prometheus/prometheus/pkg/labels"
|
14 | 17 | "github.com/prometheus/prometheus/storage"
|
@@ -37,7 +40,11 @@ func (m *mockTenantQueryableWithFilter) Querier(ctx context.Context, _, _ int64)
|
37 | 40 | return nil, err
|
38 | 41 | }
|
39 | 42 |
|
40 |
| - q := mockTenantQuerier{tenant: tenantIDs[0], extraLabels: m.extraLabels} |
| 43 | + q := mockTenantQuerier{ |
| 44 | + tenant: tenantIDs[0], |
| 45 | + extraLabels: m.extraLabels, |
| 46 | + ctx: ctx, |
| 47 | + } |
41 | 48 |
|
42 | 49 | // set warning if exists
|
43 | 50 | if m.warningsByTenant != nil {
|
@@ -66,6 +73,7 @@ type mockTenantQuerier struct {
|
66 | 73 |
|
67 | 74 | warnings storage.Warnings
|
68 | 75 | queryErr error
|
| 76 | + ctx context.Context |
69 | 77 | }
|
70 | 78 |
|
71 | 79 | func (m mockTenantQuerier) matrix() model.Matrix {
|
@@ -135,6 +143,8 @@ func (m *mockSeriesSet) Warnings() storage.Warnings {
|
135 | 143 | }
|
136 | 144 |
|
137 | 145 | func (m mockTenantQuerier) Select(_ bool, sp *storage.SelectHints, matchers ...*labels.Matcher) storage.SeriesSet {
|
| 146 | + log, _ := sl.New(m.ctx, "mockTenantQuerier.select") |
| 147 | + defer log.Span.Finish() |
138 | 148 | var matrix model.Matrix
|
139 | 149 |
|
140 | 150 | for _, s := range m.matrix() {
|
@@ -478,3 +488,64 @@ func TestSetLabelsRetainExisting(t *testing.T) {
|
478 | 488 | assert.Equal(t, tc.expected, setLabelsRetainExisting(tc.labels, tc.additionalLabels...))
|
479 | 489 | }
|
480 | 490 | }
|
| 491 | + |
| 492 | +func TestTracingMergeQueryable(t *testing.T) { |
| 493 | + mockTracer := mocktracer.New() |
| 494 | + opentracing.SetGlobalTracer(mockTracer) |
| 495 | + ctx := user.InjectOrgID(context.Background(), "team-a|team-b") |
| 496 | + |
| 497 | + // set a multi tenant resolver |
| 498 | + tenant.WithDefaultResolver(tenant.NewMultiResolver()) |
| 499 | + filter := mockTenantQueryableWithFilter{} |
| 500 | + q := NewQueryable(&filter, false) |
| 501 | + // retrieve querier if set |
| 502 | + querier, err := q.Querier(ctx, mint, maxt) |
| 503 | + require.NoError(t, err) |
| 504 | + |
| 505 | + seriesSet := querier.Select(true, &storage.SelectHints{Start: mint, |
| 506 | + End: maxt}) |
| 507 | + |
| 508 | + require.NoError(t, seriesSet.Err()) |
| 509 | + spans := mockTracer.FinishedSpans() |
| 510 | + assertSpanExist(t, spans, "mergeQuerier.select", map[string]string{sl.TenantIdTagName: "team-a|team-b"}) |
| 511 | + assertSpanExist(t, spans, "mockTenantQuerier.select", map[string]string{sl.TenantIdTagName: "team-a"}) |
| 512 | + assertSpanExist(t, spans, "mockTenantQuerier.select", map[string]string{sl.TenantIdTagName: "team-b"}) |
| 513 | +} |
| 514 | + |
| 515 | +func assertSpanExist(t *testing.T, |
| 516 | + actualSpans []*mocktracer.MockSpan, |
| 517 | + name string, |
| 518 | + expectedTags map[string]string) { |
| 519 | + for _, span := range actualSpans { |
| 520 | + if span.OperationName == name && containsTags(span, expectedTags) { |
| 521 | + return |
| 522 | + } |
| 523 | + } |
| 524 | + require.FailNow(t, "can not find span matching params", |
| 525 | + "expected span with name `%v` and with "+ |
| 526 | + "tags %v to be present but it was not. actual spans: %+v", |
| 527 | + name, expectedTags, extractNameWithTags(actualSpans)) |
| 528 | +} |
| 529 | + |
| 530 | +type spanWithTags struct { |
| 531 | + name string |
| 532 | + tags map[string]interface{} |
| 533 | +} |
| 534 | + |
| 535 | +func extractNameWithTags(actualSpans []*mocktracer.MockSpan) []spanWithTags { |
| 536 | + result := make([]spanWithTags, len(actualSpans)) |
| 537 | + for i, span := range actualSpans { |
| 538 | + result[i] = spanWithTags{span.OperationName, span.Tags()} |
| 539 | + } |
| 540 | + return result |
| 541 | +} |
| 542 | + |
| 543 | +func containsTags(span *mocktracer.MockSpan, |
| 544 | + expectedTags map[string]string) bool { |
| 545 | + for k, expectedVal := range expectedTags { |
| 546 | + if span.Tag(k) == expectedVal { |
| 547 | + return true |
| 548 | + } |
| 549 | + } |
| 550 | + return false |
| 551 | +} |
0 commit comments