Skip to content
This repository was archived by the owner on Apr 2, 2024. It is now read-only.

Commit 31acf45

Browse files
committed
Make Jaeger Event queryable using name and tags
So far we were matching tags present only in span, however Jaeger supports query on tags present in Event too. Fixes #1552 Signed-off-by: Arunprasad Rajkumar <[email protected]>
1 parent 9c1653a commit 31acf45

File tree

3 files changed

+70
-4
lines changed

3 files changed

+70
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ We use the following categories for changes:
1717

1818
### Added
1919
- Implement Jaeger gRPC remote storage writer interface [#1543]
20-
2120
- Helm chart now ships a JSON Schema for imposing a structure of the values.yaml file [#1551]
21+
- Make Jaeger Event queryable using name and tags [#1553]
2222

2323
### Changed
2424

pkg/jaeger/store/trace_query.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,13 @@ const (
8585
trace_sub.trace_id, start_time_max - $%[1]d::interval as time_low, start_time_max + $%[1]d::interval as time_high
8686
FROM (
8787
SELECT
88-
trace_id,
88+
s.trace_id,
8989
max(start_time) as start_time_max
9090
FROM _ps_trace.span s
91+
LEFT JOIN _ps_trace.event e ON(s.trace_id = e.trace_id AND s.span_id = e.span_id)
9192
WHERE
9293
%[2]s
93-
GROUP BY trace_id
94+
GROUP BY s.trace_id
9495
) as trace_sub
9596
ORDER BY trace_sub.start_time_max DESC
9697
`
@@ -117,6 +118,7 @@ const (
117118
TagJaegerVersion = "jaeger.version"
118119
TagSpanKind = "span.kind"
119120
TagW3CTraceState = "w3c.tracestate"
121+
TagEventName = "event"
120122
)
121123

122124
var digitCheck = regexp.MustCompile(`^\d*\.?\d+$`) // Ints or Floats.
@@ -239,6 +241,10 @@ func (b *Builder) buildTraceIDSubquery(q *spanstore.TraceQueryParameters) (strin
239241
params = append(params, v)
240242
qual := fmt.Sprintf(`s.trace_state = $%d`, len(params))
241243
clauses = append(clauses, qual)
244+
case TagEventName:
245+
params = append(params, v)
246+
qual := fmt.Sprintf(`e.name = $%d`, len(params))
247+
clauses = append(clauses, qual)
242248
default:
243249
//TODO make sure this is optimized correctly
244250
val := "\"" + v + "\""
@@ -249,8 +255,9 @@ func (b *Builder) buildTraceIDSubquery(q *spanstore.TraceQueryParameters) (strin
249255
params = append(params, k, val)
250256
// Note: We do not need to check resource tags in above cases, since they
251257
// come from Jaeger conversion that are specific to span_tags.
258+
// Tags are spread into _ps_trace.span and _ps_trace.event tables.
252259
qual := fmt.Sprintf(
253-
`(_ps_trace.tag_map_denormalize(s.span_tags)->$%[1]d = $%[2]d OR _ps_trace.tag_map_denormalize(s.resource_tags)->$%[1]d = $%[2]d)`,
260+
`(_ps_trace.tag_map_denormalize(s.span_tags)->$%[1]d = $%[2]d OR _ps_trace.tag_map_denormalize(s.resource_tags)->$%[1]d = $%[2]d OR _ps_trace.tag_map_denormalize(e.tags)->$%[1]d = $%[2]d)`,
254261
len(params)-1, len(params))
255262
clauses = append(clauses, qual)
256263
}

pkg/tests/end_to_end_tests/ingest_trace_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,65 @@ func findTraceTest(t testing.TB, q *store.Store) {
144144
require.NoError(t, err)
145145
require.Equal(t, 1, len(traces))
146146

147+
// Query Event by name.
148+
request = &spanstore.TraceQueryParameters{
149+
Tags: map[string]string{
150+
"event": "event",
151+
},
152+
}
153+
traces, err = q.FindTraces(context.Background(), request)
154+
require.NoError(t, err)
155+
require.Equal(t, 1, len(traces))
156+
157+
// Query Event by tag, service and operation.
158+
request = &spanstore.TraceQueryParameters{
159+
ServiceName: "service-name-0",
160+
OperationName: "operationA",
161+
Tags: map[string]string{
162+
"span-event-attr": "span-event-attr-val",
163+
},
164+
}
165+
traces, err = q.FindTraces(context.Background(), request)
166+
require.NoError(t, err)
167+
require.Equal(t, 1, len(traces))
168+
169+
// Query Event by name, service and operation.
170+
request = &spanstore.TraceQueryParameters{
171+
ServiceName: "service-name-0",
172+
OperationName: "operationA",
173+
Tags: map[string]string{
174+
"event": "event-with-attr",
175+
},
176+
}
177+
traces, err = q.FindTraces(context.Background(), request)
178+
require.NoError(t, err)
179+
require.Equal(t, 1, len(traces))
180+
181+
// Query Event by name, non existent tag, service and operation.
182+
request = &spanstore.TraceQueryParameters{
183+
ServiceName: "service-name-0",
184+
OperationName: "operationA",
185+
Tags: map[string]string{
186+
"event": "event-with-attr",
187+
"span-event-attr": "not-exist",
188+
},
189+
}
190+
traces, err = q.FindTraces(context.Background(), request)
191+
require.NoError(t, err)
192+
require.Equal(t, 0, len(traces))
193+
194+
// Query non existent Event by name, service and operation.
195+
request = &spanstore.TraceQueryParameters{
196+
ServiceName: "service-name-0",
197+
OperationName: "operationA",
198+
Tags: map[string]string{
199+
"event": "not-exists",
200+
},
201+
}
202+
traces, err = q.FindTraces(context.Background(), request)
203+
require.NoError(t, err)
204+
require.Equal(t, 0, len(traces))
205+
147206
request = &spanstore.TraceQueryParameters{
148207
ServiceName: "service-name-0",
149208
OperationName: "operationA",

0 commit comments

Comments
 (0)