Skip to content

Commit 8f90fbc

Browse files
Merge pull request #84 from shwetaap/tracing
Add support for trace
2 parents 6be7e93 + 28c386a commit 8f90fbc

12 files changed

Lines changed: 128 additions & 41 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { TraceNode } from '../korrel8r/trace';
2+
3+
const roundtrip = [
4+
{
5+
url: `observe/traces?name=platform&namespace=openshift-tracing&tenant=platform&
6+
q=${encodeURIComponent('{resource.service.name = "article-service"}')}`,
7+
query: `trace:trace:{resource.service.name = "article-service"}`,
8+
},
9+
];
10+
11+
describe('TraceNode.fromURL', () => {
12+
it.each(roundtrip)('$url', ({ url, query }) =>
13+
expect(TraceNode.fromURL(url)?.toQuery()).toEqual(query),
14+
);
15+
});
16+
17+
describe('TraceNode.fromQuery', () => {
18+
it.each(roundtrip)('$query', ({ query, url }) =>
19+
expect(TraceNode.fromQuery(query)?.toURL()).toEqual(url),
20+
);
21+
22+
it('Query => URL => Query', () => {
23+
const query = 'trace:trace:{resource.service.name="shop-backend"}';
24+
const expectedKorrel8rURL =
25+
'observe/traces?name=platform&namespace=openshift-tracing&tenant=platform&q=%7Bresource.service.name%3D%22shop-backend%22%7D';
26+
const actualKorrel8rURL = TraceNode.fromQuery(query)?.toURL();
27+
expect(actualKorrel8rURL).toEqual(expectedKorrel8rURL);
28+
expect(TraceNode.fromURL(actualKorrel8rURL)?.toQuery()).toEqual(query);
29+
});
30+
});

web/src/korrel8r-utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ export const nodeToLabel = (node: QueryNode): string => {
2323
return `${nodeClass} (${node.count})`;
2424
case Korrel8rDomain.Netflow:
2525
return `Network (${node.count})`;
26+
case Korrel8rDomain.Trace:
27+
return `Trace (${node.count})`;
2628
default:
2729
// eslint-disable-next-line no-console
2830
console.warn(`Unknown node type: ${node.class}`);

web/src/korrel8r/alert.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { Korrel8rDomain, Korrel8rNode, NodeError } from './korrel8r.types';
1+
import { Korrel8rNode, NodeError } from './korrel8r.types';
22
import { keyValueList, parseKeyValueList, parseQuery, parseURL } from './query-url';
33

44
const domain = 'alert';
55

66
export class AlertNode extends Korrel8rNode {
7-
domain: Korrel8rDomain = Korrel8rDomain.Alert;
87
query: string;
98
url: string;
109

web/src/korrel8r/invalid.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import { Korrel8rDomain, Korrel8rNode } from './korrel8r.types';
1+
import { Korrel8rNode } from './korrel8r.types';
22

33
export class InvalidNode extends Korrel8rNode {
4-
domain: Korrel8rDomain = Korrel8rDomain.Alert;
54
query: string;
65
url: string;
76

web/src/korrel8r/k8s.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getCachedResources } from '../getResources';
2-
import { Korrel8rDomain, Korrel8rNode, NodeError } from './korrel8r.types';
2+
import { Korrel8rNode, NodeError } from './korrel8r.types';
33
import { keyValueList, parseQuery, parseURL } from './query-url';
44

55
type GroupVersionKind = {
@@ -33,7 +33,6 @@ const pathRegex = new RegExp(
3333
);
3434

3535
export class K8sNode extends Korrel8rNode {
36-
domain: Korrel8rDomain = Korrel8rDomain.Alert;
3736
query: string;
3837
url: string;
3938

web/src/korrel8r/korrel8r.types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ export enum Korrel8rDomain {
44
Alert = 'alert',
55
K8s = 'k8s',
66
Log = 'log',
7+
Trace = 'trace',
78
}
89

910
export abstract class Korrel8rNode {
10-
domain: Korrel8rDomain;
1111
static fromURL: (url: string) => Korrel8rNode;
1212
static fromQuery: (query: string) => Korrel8rNode;
1313
abstract toURL(): string;
@@ -19,3 +19,10 @@ export class NodeError extends Error {
1919
super(reason);
2020
}
2121
}
22+
23+
// Thrown when a URL or Query does not match the Korrel8rNode class trying to parse it.
24+
export class WrongDomainError extends NodeError {
25+
constructor(reason: string) {
26+
super(reason);
27+
}
28+
}

web/src/korrel8r/log.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Korrel8rDomain, Korrel8rNode, NodeError } from './korrel8r.types';
1+
import { Korrel8rNode, NodeError } from './korrel8r.types';
22
import { parseQuery, parseURL } from './query-url';
33

44
enum LogClass {
@@ -12,7 +12,6 @@ const addJSON = (logQL: string): string => {
1212
};
1313

1414
export class LogNode extends Korrel8rNode {
15-
domain: Korrel8rDomain = Korrel8rDomain.Alert;
1615
logClass: LogClass;
1716
query: string;
1817
url: string;

web/src/korrel8r/metric.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { Korrel8rDomain, Korrel8rNode, NodeError } from './korrel8r.types';
1+
import { Korrel8rNode, NodeError } from './korrel8r.types';
22
import { parseURL } from './query-url';
33

44
export class MetricNode extends Korrel8rNode {
5-
domain: Korrel8rDomain = Korrel8rDomain.Alert;
65
query: string;
76
url: string;
87

web/src/korrel8r/netflow.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Korrel8rDomain, Korrel8rNode, NodeError } from './korrel8r.types';
1+
import { Korrel8rNode, NodeError } from './korrel8r.types';
22
import { parseQuery, parseURL } from './query-url';
33

44
// https://docs.openshift.com/container-platform/4.15/observability/network_observability/json-flows-format-reference.html
@@ -25,7 +25,6 @@ const urlToQueryName = Object.entries(queryToURLName).reduce((result, [key, valu
2525
}, {});
2626

2727
export class NetflowNode extends Korrel8rNode {
28-
domain: Korrel8rDomain = Korrel8rDomain.Alert;
2928
query: string;
3029
url: string;
3130

web/src/korrel8r/node-factory.ts

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,46 @@
1-
import { Korrel8rNode } from './korrel8r.types';
2-
31
import { AlertNode } from './alert';
2+
import { InvalidNode } from './invalid';
3+
import { K8sNode } from './k8s';
4+
import { Korrel8rNode, WrongDomainError } from './korrel8r.types';
45
import { LogNode } from './log';
56
import { MetricNode } from './metric';
67
import { NetflowNode } from './netflow';
7-
import { K8sNode } from './k8s';
8+
import { TraceNode } from './trace';
89

910
export class Korrel8rNodeFactory {
1011
static fromURL(url: string): Korrel8rNode {
11-
if (url.startsWith('monitoring/alerts')) {
12-
return AlertNode.fromURL(url);
13-
} else if (url.startsWith('monitoring/logs')) {
14-
return LogNode.fromURL(url);
15-
} else if (url.startsWith('monitoring/query-browser')) {
16-
return MetricNode.fromURL(url);
17-
} else if (url.startsWith('netflow-traffic')) {
18-
return NetflowNode.fromURL(url);
19-
} else {
20-
return K8sNode.fromURL(url);
21-
}
12+
[
13+
AlertNode.fromURL,
14+
K8sNode.fromURL,
15+
LogNode.fromURL,
16+
MetricNode.fromURL,
17+
NetflowNode.fromURL,
18+
TraceNode.fromURL,
19+
].forEach((fromURL): Korrel8rNode => {
20+
try {
21+
// eslint-disable-next-line no-console
22+
console.error(`FIXME ${fromURL} ${url}`);
23+
return fromURL(url);
24+
} catch (e) {
25+
if (!(e instanceof WrongDomainError)) {
26+
throw e;
27+
}
28+
}
29+
});
30+
return InvalidNode.fromURL(url);
2231
}
32+
2333
static fromQuery(query: string): Korrel8rNode {
24-
switch (query.split(':').at(0)) {
25-
case 'alert':
26-
return AlertNode.fromQuery(query);
27-
case 'log':
28-
return LogNode.fromQuery(query);
29-
case 'metric':
30-
return MetricNode.fromQuery(query);
31-
case 'netflow':
32-
return NetflowNode.fromQuery(query);
33-
default:
34-
return K8sNode.fromQuery(query);
35-
}
34+
const lookup = {
35+
alert: AlertNode.fromQuery,
36+
k8s: K8sNode.fromQuery,
37+
log: LogNode.fromQuery,
38+
metric: MetricNode.fromQuery,
39+
netflow: NetflowNode.fromQuery,
40+
trace: TraceNode.fromQuery,
41+
};
42+
const fromQuery = lookup[query.split(':').at(0)];
43+
if (fromQuery) return fromQuery(query);
44+
return InvalidNode.fromQuery(query);
3645
}
3746
}

0 commit comments

Comments
 (0)