Skip to content

Commit cec107f

Browse files
authored
Handle FOLLOWS_FROM ref type (#118)
* Handle FOLLOWS_FROM refs when making span tree * Add test-case for issue #115 * Handle FOLLOWS_FROM in scrolling shortcuts Signed-off-by: Joe Farro <joef@uber.com>
1 parent f31ba92 commit cec107f

File tree

5 files changed

+84
-12
lines changed

5 files changed

+84
-12
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Changes merged into master
22

33

4+
### [#118](https://github.com/jaegertracing/jaeger-ui/pull/118) Handle `FOLLOWS_FROM` reference type
5+
6+
Fix issue processing `FOLLOWS_FROM` references to parent spans. Fixes [#115](https://github.com/jaegertracing/jaeger-ui/issues/115).
7+
8+
49
### [#110](https://github.com/jaegertracing/jaeger-ui/pull/110) Fix browser back button not working correctly
510

611
Fix bug causing browser back button to not work correctly. Fixes [#94](https://github.com/jaegertracing/jaeger-ui/issues/94).

src/components/TracePage/ScrollManager.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function isSpanHidden(span: Span, childrenAreHidden: Set<string>, spansMap: Map<
5959
let { references } = span;
6060
let parentID: ?string;
6161
const checkRef = ref => {
62-
if (ref.refType === 'CHILD_OF') {
62+
if (ref.refType === 'CHILD_OF' || ref.refType === 'FOLLOWS_FROM') {
6363
parentID = ref.spanID;
6464
parentIDs.add(parentID);
6565
return childrenAreHidden.has(parentID);

src/selectors/trace.fixture.js

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright (c) 2017 Uber Technologies, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
// See https://github.com/jaegertracing/jaeger-ui/issues/115 for details.
16+
// eslint-disable-next-line import/prefer-default-export
17+
export const followsFromRef = {
18+
processes: {
19+
p1: {
20+
serviceName: 'issue115',
21+
tags: [],
22+
},
23+
},
24+
spans: [
25+
{
26+
duration: 1173,
27+
flags: 1,
28+
logs: [],
29+
operationName: 'thread',
30+
processID: 'p1',
31+
references: [
32+
{
33+
refType: 'FOLLOWS_FROM',
34+
spanID: 'ea7cfaca83f0724b',
35+
traceID: '2992f2a5b5d037a8aabffd08ef384237',
36+
},
37+
],
38+
spanID: '1bdf4201221bb2ac',
39+
startTime: 1509533706521220,
40+
tags: [],
41+
traceID: '2992f2a5b5d037a8aabffd08ef384237',
42+
warnings: null,
43+
},
44+
{
45+
duration: 70406,
46+
flags: 1,
47+
logs: [],
48+
operationName: 'demo',
49+
processID: 'p1',
50+
references: [],
51+
spanID: 'ea7cfaca83f0724b',
52+
startTime: 1509533706470949,
53+
tags: [],
54+
traceID: '2992f2a5b5d037a8aabffd08ef384237',
55+
warnings: null,
56+
},
57+
],
58+
traceID: '2992f2a5b5d037a8aabffd08ef384237',
59+
warnings: null,
60+
};

src/selectors/trace.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export function getTraceSpanIdsAsTree(trace) {
7070
const node = nodesById.get(span.spanID);
7171
if (Array.isArray(span.references) && span.references.length) {
7272
const { refType, spanID: parentID } = span.references[0];
73-
if (refType === 'CHILD_OF') {
73+
if (refType === 'CHILD_OF' || refType === 'FOLLOWS_FROM') {
7474
const parent = nodesById.get(parentID) || root;
7575
parent.children.push(node);
7676
} else {

src/selectors/trace.test.js

+17-10
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414

1515
import _values from 'lodash/values';
1616

17-
import traceGenerator from '../../src/demo/trace-generators';
18-
import * as traceSelectors from '../../src/selectors/trace';
17+
import { followsFromRef } from './trace.fixture';
1918
import {
2019
getSpanId,
2120
getSpanName,
@@ -24,7 +23,9 @@ import {
2423
getSpanProcessId,
2524
getSpanServiceName,
2625
getSpanTimestamp,
27-
} from '../../src/selectors/span';
26+
} from './span';
27+
import * as traceSelectors from './trace';
28+
import traceGenerator from '../../src/demo/trace-generators';
2829
import { numberSortComparator } from '../../src/utils/sort';
2930

3031
const generatedTrace = traceGenerator.trace({ numberOfSpans: 45 });
@@ -49,16 +50,22 @@ it('getTraceSpansAsMap() should return a map of all of the spans', () => {
4950
}
5051
});
5152

52-
it('getTraceSpanIdsAsTree() should build the tree properly', () => {
53-
const tree = traceSelectors.getTraceSpanIdsAsTree(generatedTrace);
54-
const spanMap = traceSelectors.getTraceSpansAsMap(generatedTrace);
53+
describe('getTraceSpanIdsAsTree()', () => {
54+
it('builds the tree properly', () => {
55+
const tree = traceSelectors.getTraceSpanIdsAsTree(generatedTrace);
56+
const spanMap = traceSelectors.getTraceSpansAsMap(generatedTrace);
5557

56-
tree.walk((value, node) => {
57-
const expectedParentValue = value === traceSelectors.TREE_ROOT_ID ? null : value;
58-
node.children.forEach(childNode => {
59-
expect(getSpanParentId(spanMap.get(childNode.value))).toBe(expectedParentValue);
58+
tree.walk((value, node) => {
59+
const expectedParentValue = value === traceSelectors.TREE_ROOT_ID ? null : value;
60+
node.children.forEach(childNode => {
61+
expect(getSpanParentId(spanMap.get(childNode.value))).toBe(expectedParentValue);
62+
});
6063
});
6164
});
65+
66+
it('#115 - handles FOLLOW_FROM refs', () => {
67+
expect(() => traceSelectors.getTraceSpanIdsAsTree(followsFromRef)).not.toThrow();
68+
});
6269
});
6370

6471
it('getParentSpan() should return the parent span of the tree', () => {

0 commit comments

Comments
 (0)