Skip to content

Commit edeb656

Browse files
Add Visual Studio Webview support (#77)
* Add Visual Studio Webview support * Add Endpoint Scaling insight support
1 parent 0e6796c commit edeb656

File tree

12 files changed

+172
-36
lines changed

12 files changed

+172
-36
lines changed

packages/jaeger-ui/src/api/digma/index.ts

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import logger from '../../logging';
2+
import { platform } from '../../platform';
23
import isObject from '../../utils/ts/typeGuards/isObject';
34
import ActionDispatcher from './ActionDispatcher';
5+
import convertToDigmaJsonRpcRequest from './json-rpc/convertToDigmaJsonRpcRequest';
6+
import convertToDigmaMessageData from './json-rpc/convertToDigmaMessageData';
7+
import isDigmaJsonRpcRequest from './json-rpc/isDigmaJsonRpcRequest';
48
import { updateState } from './state';
5-
import { DigmaMessageEvent, IDigmaOutgoingMessageData } from './types';
9+
import { DigmaMessageEvent, IDigmaIncomingMessageData, IDigmaOutgoingMessageData } from './types';
610

711
const isDigmaMessageEvent = (e: MessageEvent): e is DigmaMessageEvent =>
812
isObject(e.data) && e.data.type === 'digma';
@@ -13,25 +17,61 @@ const INCOMING_MESSAGE_ACTION_ID_CONSOLE_STYLE = 'color: green; font-weight: bol
1317

1418
export const initializeDigmaMessageListener = (dispatcher: ActionDispatcher) => {
1519
const handleDigmaMessage = (e: MessageEvent) => {
20+
let data: IDigmaIncomingMessageData | undefined;
21+
22+
if (isDigmaJsonRpcRequest(e)) {
23+
data = convertToDigmaMessageData(e.data);
24+
}
25+
1626
if (isDigmaMessageEvent(e)) {
17-
logger.debug(
18-
`Message received: %c${e.data.action}
27+
data = e.data;
28+
}
29+
30+
if (!data) {
31+
return;
32+
}
33+
34+
logger.debug(
35+
`Message received: %c${e.data.action}
1936
%cRaw message: %O`,
20-
INCOMING_MESSAGE_ACTION_ID_CONSOLE_STYLE,
21-
null,
22-
e.data
23-
);
37+
INCOMING_MESSAGE_ACTION_ID_CONSOLE_STYLE,
38+
null,
39+
e.data
40+
);
2441

25-
updateState(e.data.action, e.data.payload);
42+
updateState(e.data.action, e.data.payload);
2643

27-
dispatcher.dispatch(e.timeStamp, e.data.action, e.data.payload, e.data.error);
28-
}
44+
dispatcher.dispatch(e.timeStamp, e.data.action, e.data.payload, e.data.error);
2945
};
3046

47+
switch (platform) {
48+
case 'Visual Studio':
49+
if (window.chrome?.webview) {
50+
window.chrome.webview.addEventListener('message', handleDigmaMessage);
51+
}
52+
break;
53+
case 'JetBrains':
54+
window.addEventListener('message', handleDigmaMessage);
55+
break;
56+
default:
57+
break;
58+
}
59+
3160
window.addEventListener('message', handleDigmaMessage);
3261

3362
return () => {
34-
window.removeEventListener('message', handleDigmaMessage);
63+
switch (platform) {
64+
case 'Visual Studio':
65+
if (window.chrome?.webview) {
66+
window.chrome.webview.removeEventListener('message', handleDigmaMessage);
67+
}
68+
break;
69+
case 'JetBrains':
70+
window.removeEventListener('message', handleDigmaMessage);
71+
break;
72+
default:
73+
break;
74+
}
3575
};
3676
};
3777

@@ -45,6 +85,21 @@ Raw message: %O`,
4585
updateState(message.action, message.payload);
4686

4787
switch (window.platform) {
88+
case 'Visual Studio': {
89+
const jsonRpcMessage = convertToDigmaJsonRpcRequest(message);
90+
91+
if (window.chrome?.webview) {
92+
window.chrome.webview?.postMessage(jsonRpcMessage);
93+
logger.debug(
94+
`Message has been successfully sent to Visual Studio: %c${jsonRpcMessage.method}
95+
%cRaw message: %O`,
96+
OUTGOING_MESSAGE_ACTION_ID_CONSOLE_STYLE,
97+
null,
98+
jsonRpcMessage
99+
);
100+
}
101+
break;
102+
}
48103
case 'VS Code':
49104
if (window.sendMessageToVSCode) {
50105
window.sendMessageToVSCode(message);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import isObject from '../../../utils/ts/typeGuards/isObject';
2+
import type { IDigmaOutgoingMessageData } from '../types';
3+
import { DigmaJSONRPCRequest } from './types';
4+
5+
const convertToDigmaJsonRpcRequest = (data: IDigmaOutgoingMessageData<unknown>): DigmaJSONRPCRequest => ({
6+
meta: {
7+
channel: 'digma',
8+
},
9+
jsonrpc: '2.0',
10+
method: data.action,
11+
...(isObject(data.payload) ? { params: data.payload } : {}),
12+
});
13+
14+
export default convertToDigmaJsonRpcRequest;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import type { IDigmaIncomingMessageData } from '../types';
2+
import type { DigmaJSONRPCRequest } from './types';
3+
4+
const convertToDigmaMessageData = (data: DigmaJSONRPCRequest): IDigmaIncomingMessageData => ({
5+
type: 'digma',
6+
action: data.method,
7+
...(data.params ? { payload: data.params } : {}),
8+
});
9+
10+
export default convertToDigmaMessageData;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import isObject from '../../../utils/ts/typeGuards/isObject';
2+
import type { DigmaJSONRPCRequest } from './types';
3+
4+
const isDigmaJsonRpcRequest = (e: MessageEvent): e is MessageEvent<DigmaJSONRPCRequest> =>
5+
isObject(e.data) && e.data.jsonrpc === '2.0' && isObject(e.data.meta) && e.data.meta.channel === 'digma';
6+
7+
export default isDigmaJsonRpcRequest;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
export type JSONRPCID = string | number | null;
2+
3+
export interface IJSONRPCRequest {
4+
jsonrpc: '2.0';
5+
method: string;
6+
params?: unknown[] | Record<string, unknown>;
7+
id?: JSONRPCID;
8+
}
9+
10+
export interface IJSONRPCSuccessResponse {
11+
jsonrpc: '2.0';
12+
result: unknown;
13+
id: JSONRPCID;
14+
}
15+
16+
export interface IJSONRPCError {
17+
code: number;
18+
message: string;
19+
data?: unknown;
20+
}
21+
22+
export interface IJSONRPCErrorResponse {
23+
jsonrpc: '2.0';
24+
error: IJSONRPCError;
25+
id: JSONRPCID;
26+
}
27+
28+
export interface IDigmaJSONRPCExtension {
29+
meta: {
30+
channel: 'digma';
31+
};
32+
}
33+
34+
export type DigmaJSONRPCRequest = IJSONRPCRequest & IDigmaJSONRPCExtension;
35+
36+
export type DigmaJSONRPCErrorResponse = IJSONRPCErrorResponse & IDigmaJSONRPCExtension;
37+
38+
export type DigmaJSONRPCSuccessResponse = IJSONRPCSuccessResponse & IDigmaJSONRPCExtension;

packages/jaeger-ui/src/components/common/InsightIcon/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ export enum InsightType {
3333
EndpointQueryOptimizationV2 = 'EndpointQueryOptimizationV2',
3434
EndpointSlowdownSource = 'EndpointSlowdownSource',
3535
SpanPerformanceAnomaly = 'SpanPerformanceAnomaly',
36+
EndpointScaling = 'EndpointScaling',
3637
}

packages/jaeger-ui/src/components/common/InsightIcon/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ export const getInsightTypeInfo = (
7676
icon: ScalesIcon,
7777
label: 'Scaling Issue Found',
7878
},
79+
[InsightType.EndpointScaling]: {
80+
icon: ScalesIcon,
81+
label: 'Scaling Issue Found',
82+
},
7983
[InsightType.SpanUsages]: {
8084
icon: SineIcon,
8185
label: 'Top Usage',

packages/jaeger-ui/src/logging/Logger.ts

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import moment from 'moment';
2-
import LOG_LEVEL from './types';
2+
import LogLevel from './types';
33

44
class Logger {
55
private minLogLevel: number;
66
private showTimeStamp: boolean;
77
private showLogLevel: boolean;
88

9-
constructor(minLogLevel: LOG_LEVEL, showTimeStamp = true, showLogLevel = true) {
9+
constructor(minLogLevel: LogLevel, showTimeStamp = true, showLogLevel = true) {
1010
this.minLogLevel = minLogLevel;
1111
this.showTimeStamp = showTimeStamp;
1212
this.showLogLevel = showLogLevel;
@@ -17,7 +17,7 @@ class Logger {
1717
}
1818

1919
private getLogLevelTag(): string {
20-
return LOG_LEVEL[this.minLogLevel];
20+
return LogLevel[this.minLogLevel];
2121
}
2222

2323
private getFormattedMessage(tags: string[], message: unknown): string {
@@ -34,31 +34,31 @@ class Logger {
3434
return `${tagsString}: ${message as string}`;
3535
}
3636

37-
public setLogLevel(logLevel: LOG_LEVEL): void {
37+
public setLogLevel(logLevel: LogLevel): void {
3838
this.minLogLevel = logLevel;
3939
}
4040

41-
public log(level: LOG_LEVEL, tags: string[], message?: unknown, ...optionalParams: unknown[]): void {
41+
public log(level: LogLevel, tags: string[], message?: unknown, ...optionalParams: unknown[]): void {
4242
const formattedMessage = this.getFormattedMessage(tags, message);
4343

4444
if (this.minLogLevel > level) {
4545
return;
4646
}
4747

4848
switch (level) {
49-
case LOG_LEVEL.DEBUG:
49+
case LogLevel.Debug:
5050
// eslint-disable-next-line no-console
5151
console.debug(formattedMessage, ...optionalParams);
5252
break;
53-
case LOG_LEVEL.INFO:
53+
case LogLevel.Info:
5454
// eslint-disable-next-line no-console
5555
console.info(formattedMessage, ...optionalParams);
5656
break;
57-
case LOG_LEVEL.WARN:
57+
case LogLevel.Warn:
5858
// eslint-disable-next-line no-console
5959
console.warn(formattedMessage, ...optionalParams);
6060
break;
61-
case LOG_LEVEL.ERROR:
61+
case LogLevel.Error:
6262
// eslint-disable-next-line no-console
6363
console.error(formattedMessage, ...optionalParams);
6464
break;
@@ -68,19 +68,19 @@ class Logger {
6868
}
6969

7070
public debug(message?: unknown, ...optionalParams: unknown[]): void {
71-
this.log(LOG_LEVEL.DEBUG, [], message, ...optionalParams);
71+
this.log(LogLevel.Debug, [], message, ...optionalParams);
7272
}
7373

7474
public info(message?: unknown, ...optionalParams: unknown[]): void {
75-
this.log(LOG_LEVEL.INFO, [], message, ...optionalParams);
75+
this.log(LogLevel.Info, [], message, ...optionalParams);
7676
}
7777

7878
public warn(message?: unknown, ...optionalParams: unknown[]): void {
79-
this.log(LOG_LEVEL.WARN, [], message, ...optionalParams);
79+
this.log(LogLevel.Warn, [], message, ...optionalParams);
8080
}
8181

8282
public error(message?: unknown, ...optionalParams: unknown[]): void {
83-
this.log(LOG_LEVEL.ERROR, [], message, ...optionalParams);
83+
this.log(LogLevel.Error, [], message, ...optionalParams);
8484
}
8585
}
8686

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Logger from './Logger';
2-
import LOG_LEVEL from './types';
2+
import LogLevel from './types';
33

4-
const logger = new Logger(window.isLoggingEnabled === true ? LOG_LEVEL.DEBUG : LOG_LEVEL.NONE);
4+
const logger = new Logger(window.isLoggingEnabled === true ? LogLevel.Debug : LogLevel.None);
55

66
export default logger;
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
enum LOG_LEVEL {
2-
DEBUG = 0,
3-
INFO = 1,
4-
WARN = 2,
5-
ERROR = 3,
6-
NONE = 4,
1+
enum LogLevel {
2+
Debug = 0,
3+
Info = 1,
4+
Warn = 2,
5+
Error = 3,
6+
None = 4,
77
}
88

9-
export default LOG_LEVEL;
9+
export default LogLevel;

0 commit comments

Comments
 (0)