Skip to content

Commit d46809e

Browse files
alanconwayshwetaap
authored andcommitted
WIP: tracing support incomplete, see FIXME comments.
1 parent 201c5ad commit d46809e

5 files changed

Lines changed: 75 additions & 30 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { TraceNode } from '../korrel8r/trace';
2+
3+
const roundtrip = [
4+
{
5+
url: `observe/traces?tempostack=NAME&namespace=NAMESPACE&tenant=TENANT&q=${encodeURIComponent(
6+
'{resource.service.name = "article-service"}',
7+
)}`,
8+
query: `trace:trace:{resource.service.name = "article-service"}`,
9+
},
10+
];
11+
12+
describe('TraceNode.fromURL', () => {
13+
it.each(roundtrip)('$url', ({ url, query }) =>
14+
expect(TraceNode.fromURL(url)?.toQuery()).toEqual(query),
15+
);
16+
});
17+
18+
describe('TraceNode.fromQuery', () => {
19+
it.each(roundtrip)('$query', ({ query, url }) =>
20+
expect(TraceNode.fromQuery(query)?.toURL()).toEqual(url),
21+
);
22+
});

web/src/korrel8r/korrel8r.types.ts

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

910
export abstract class Korrel8rNode {
@@ -18,3 +19,10 @@ export class NodeError extends Error {
1819
super(reason);
1920
}
2021
}
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/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
}

web/src/korrel8r/query-url.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { NodeError } from './korrel8r.types';
1+
import { NodeError, WrongDomainError } from './korrel8r.types';
22

33
// Return URL path and query parameters. Throw if URL does not match pattern.
44
export const parseURL = (
@@ -7,7 +7,7 @@ export const parseURL = (
77
url: string,
88
): [path: string, params: URLSearchParams] => {
99
if (pattern && !url.match(new RegExp(`(${pattern})([/?]|$)`))) {
10-
throw new NodeError(`Expected ${domain} URL: ${url}`);
10+
throw new WrongDomainError(`Expected ${domain} URL: ${url}`);
1111
}
1212
try {
1313
const u = new URL(url, 'http://dummy'); // Need dummy scheme & host for URL parser.

web/src/korrel8r/trace.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
import { Korrel8rNode } from './korrel8r.types';
22
import { parseQuery, parseURL } from './query-url';
33

4+
// URL format: `observe/traces?namespace=<tempoNamespace>&name=<tempoName>&tenant=<tempoTenant>&q=<traceQL>` +
5+
6+
// FIXME hard-coded tempo location, need to make this configurable/agreed between console & korrel8r.
7+
// Get from the console page environment (change from using URL as context?)
8+
const [tempoNamespace, tempoName, tempoTenant] = ['NAMESPACE', 'NAME', 'TENANT'];
9+
410
export class TraceNode extends Korrel8rNode {
511
query: string;
612
url: string;
@@ -11,18 +17,18 @@ export class TraceNode extends Korrel8rNode {
1117
this.url = url;
1218
}
1319

14-
// TODO: Add support for pulling parameters from filter query parameters
1520
static fromURL(url: string): Korrel8rNode {
1621
const [, params] = parseURL('trace', 'observe/traces', url);
1722
const traceQL = params.get('q');
23+
// FIXME need to handle store location params also.
1824
return new TraceNode(url, `trace:trace:${traceQL}`);
1925
}
2026

2127
static fromQuery(query: string): Korrel8rNode {
2228
const [, traceQL] = parseQuery('trace', query);
2329
// FIME get variable tempo address info from query or config...
2430
return new TraceNode(
25-
`observe/traces?namespace=openshift-tracing&name=platform&tenant=platform&` +
31+
`observe/traces?tempostack=${tempoName}&namespace=${tempoNamespace}&tenant=${tempoTenant}&` +
2632
`q=${encodeURIComponent(traceQL)}`,
2733
query,
2834
);

0 commit comments

Comments
 (0)