Skip to content

Commit

Permalink
chore: echarts gauge
Browse files Browse the repository at this point in the history
  • Loading branch information
echarles committed Jun 27, 2023
1 parent ac46331 commit 1eef697
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 102 deletions.
3 changes: 1 addition & 2 deletions jupyter_rtc_test/stresser/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ async def send(self, message):


def _start_stress(self, scenario):
self.log.info('Starting stress tests.')
WsStresserHandler.nodejs_pool = ThreadPool()
WsStresserHandler.python_pool = ThreadPool()
WsStresserHandler.doc = YDoc()
Expand Down Expand Up @@ -111,7 +110,7 @@ def open(self, *args, **kwargs):
def on_message(self, m):
"""WsStresser Handler on message."""
payload = str(m)
self.log.debug('WsStresser Handler message payload: ' + m)
# self.log.debug('WsStresser Handler message', payload)
message = json.loads(payload)
action = message['action']
if action == 'start':
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,13 +111,14 @@
"@jupyterlab/coreutils": "6.0.0",
"@jupyterlab/services": "7.0.0",
"@jupyterlab/settingregistry": "4.0.0",
"echarts": "5.4.2",
"echarts-for-react": "3.0.2",
"lodash.debounce": "4.0.8",
"mobx": "6.7.0",
"mobx-react": "7.6.0",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-use-websocket": "4.3.1",
"reaviz": "14.7.4",
"styled-components": "5.3.10",
"yjs": "13.5.47",
"ywasm": "0.16.6"
Expand Down
3 changes: 1 addition & 2 deletions src/components/stress/Stresser.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ import AboutTab from './tabs/AboutTab';

import '@primer/react-brand/lib/css/main.css';

import './../../../style/reaviz.css'

import appState from "../../state";


const Stresser = observer((): JSX.Element => {
return (
<>
Expand Down
63 changes: 40 additions & 23 deletions src/components/stress/tabs/TesterTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { PauseIcon, RestartIcon } from "@datalayer/icons-react";
import { Grid } from '@primer/react-brand';
import useColors from './../../../hooks/ColorsHook';
import Blankslate from '../blankslate/Blankslate';
import Chart from './charts/Chart';
import UsersGauge from './charts/UsersGauge';

import scenariiJson from './scenarii/scenarii.json';

Expand Down Expand Up @@ -74,10 +74,10 @@ const TesterTab = (): JSX.Element => {
const [ socketUrl, __ ] = useState('ws://localhost:8888/jupyter_rtc_test/stresser');
const [ messageHistory, setMessageHistory ] = useState<MessageEvent[]>([]);
const { sendMessage, lastMessage, readyState } = useWebSocket(socketUrl);
const sendStart = useCallback(() => sendMessage(createMessage(-1, 'start', scenario)), []);
const sendStop = useCallback(() => sendMessage(createMessage(-1, 'stop', scenario)), []);
const sendPause = useCallback(() => sendMessage(createMessage(-1, 'pause', scenario)), []);
const sendRestart = useCallback(() => sendMessage(createMessage(-1, 'restart', scenario)), []);
const sendStart = useCallback(() => sendMessage(createMessage(-1, 'start', scenario)), [scenario]);
const sendStop = useCallback(() => sendMessage(createMessage(-1, 'stop', scenario)), [scenario]);
const sendPause = useCallback(() => sendMessage(createMessage(-1, 'pause', scenario)), [scenario]);
const sendRestart = useCallback(() => sendMessage(createMessage(-1, 'restart', scenario)), [scenario]);
const getColor = (a: string, b: string) => {
return a === b ? okColor : nokColor;
}
Expand All @@ -89,12 +89,13 @@ const TesterTab = (): JSX.Element => {
);
wsProvider.on('status', event => {
if (event.status === 'connected') {
// const t = doc.getText('t');
// t.insert(0, 'C');
setDoc(doc);
}
});
}, []);
return () => {
wsProvider.destroy();
}
}, [doc]);
useEffect(() => {
if (lastMessage !== null) {
setMessageHistory((prev) => prev.concat(lastMessage));
Expand All @@ -112,6 +113,7 @@ const TesterTab = (): JSX.Element => {
const resetScenarioData = () => {
setNodejsUsers(new Map<number, Client>());
setPythonUsers(new Map<number, Client>());
setDoc(new Doc());
setMessageHistory([]);
}
const startTest = () => {
Expand All @@ -121,6 +123,7 @@ const TesterTab = (): JSX.Element => {
const stopTest = () => {
sendStop();
setRunning(false);
setPaused(false);
}
const pauseTest = () => {
sendPause();
Expand All @@ -131,6 +134,24 @@ const TesterTab = (): JSX.Element => {
setPaused(false);
}
const browserText = doc.getText('t').toString();
let okNodejsUsers = 0;
let nokNodejsUsers = 0;
Array.from(nodejsUsers.values()).map(user => {
if (user.text === browserText) {
okNodejsUsers++;
} else {
nokNodejsUsers++;
}
});
let okPythonUsers = 0;
let nokPythonUsers = 0;
Array.from(pythonUsers.values()).map(user => {
if (user.text === browserText) {
okPythonUsers++;
} else {
nokPythonUsers++;
}
});
return (
<>
<Heading sx={{fontSize: 3, paddingBottom: 3}}>Scenario</Heading>
Expand Down Expand Up @@ -170,18 +191,18 @@ const TesterTab = (): JSX.Element => {
<Box mt={3}>
<Text><b>Is typically converging:</b> {scenario.isConverging.toString()}</Text>
</Box>
<Box mt={3}>
<Slider label="Number of remote Node.js users" min={1} max={scenario.maxNumberNodejsClients} value={scenario.numberNodejsClients} disabled={running} onChange={(numberNodejsClients) => setScenario({...scenario, numberNodejsClients})} />
</Box>
<Box mt={3}>
<Text><Label variant="primary">Node.js</Label> <code>{scenario.nodejsScript}</code></Text>
</Box>
<Box mt={3}>
<Slider label="Number of remote Python users" min={1} max={scenario.maxNumberPythonClients} value={scenario.numberPythonClients} disabled={running} onChange={(numberPythonClients) => setScenario({...scenario, numberPythonClients})} />
<Slider label="Number of remote Node.js users" min={1} max={scenario.maxNumberNodejsClients} value={scenario.numberNodejsClients} disabled={running} onChange={(numberNodejsClients) => setScenario({...scenario, numberNodejsClients})} />
</Box>
<Box mt={3}>
<Text><Label variant="accent">Python</Label> <code>{scenario.pythonScript}</code></Text>
</Box>
<Box mt={3}>
<Slider label="Number of remote Python users" min={1} max={scenario.maxNumberPythonClients} value={scenario.numberPythonClients} disabled={running} onChange={(numberPythonClients) => setScenario({...scenario, numberPythonClients})} />
</Box>
<Box mt={3}>
<Slider label="Warmup period (seconds)" min={1} max={scenario.maxWarmupPeriodSeconds} value={scenario.warmupPeriodSeconds} disabled={running} onChange={(warmupPeriodSeconds) => setScenario({...scenario, warmupPeriodSeconds})} />
</Box>
Expand All @@ -196,7 +217,7 @@ const TesterTab = (): JSX.Element => {
{ running ?
<>
<Button leadingVisual={() => <Spinner sx={{paddingTop: 1, paddingBottom: 1}}/>} variant="danger" onClick={stopTest} disabled={readyState !== ReadyState.OPEN}>
Stop users
Terminate users
</Button>
<Box ml={3}/>
{ paused ?
Expand All @@ -220,19 +241,15 @@ const TesterTab = (): JSX.Element => {
</Grid.Column>
{ scenario ?
<>
<Grid.Column span={3}>
<Box>
<Chart/>
</Box>
<Grid.Column span={3}>
<UsersGauge title="Node.js Users" ok={okNodejsUsers} nok={nokNodejsUsers} />
</Grid.Column>
<Grid.Column span={3}>
<Box>
<Chart/>
</Box>
<Grid.Column span={3}>
<UsersGauge title="Python Users" ok={okPythonUsers} nok={nokPythonUsers} />
</Grid.Column>
</>
:
<Grid.Column span={3}>
<Grid.Column span={6}>
</Grid.Column>
}
{ scenario ?
Expand Down Expand Up @@ -291,7 +308,7 @@ const TesterTab = (): JSX.Element => {
messageHistory.reverse().slice(0, 100).map((value, index) => {
const data = (value as any).data;
return <Box key={index}>
{data}
<code>{data}</code>
</Box>
})
}
Expand Down
52 changes: 0 additions & 52 deletions src/components/stress/tabs/charts/Chart.tsx

This file was deleted.

119 changes: 119 additions & 0 deletions src/components/stress/tabs/charts/UsersGauge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import ReactEChartsCore from 'echarts-for-react/lib/core';
import * as echarts from 'echarts/core';
import {
// LineChart,
BarChart,
// PieChart,
// ScatterChart,
// RadarChart,
// MapChart,
// TreeChart,
// TreemapChart,
// GraphChart,
GaugeChart,
// FunnelChart,
// ParallelChart,
// SankeyChart,
// BoxplotChart,
// CandlestickChart,
// EffectScatterChart,
// LinesChart,
// HeatmapChart,
// PictorialBarChart,
// ThemeRiverChart,
// SunburstChart,
// CustomChart,
} from 'echarts/charts';
// import components, all suffixed with Component
import {
// GridSimpleComponent,
GridComponent,
// PolarComponent,
// RadarComponent,
// GeoComponent,
// SingleAxisComponent,
// ParallelComponent,
// CalendarComponent,
// GraphicComponent,
// ToolboxComponent,
TooltipComponent,
// AxisPointerComponent,
// BrushComponent,
TitleComponent,
// TimelineComponent,
// MarkPointComponent,
// MarkLineComponent,
// MarkAreaComponent,
// LegendComponent,
// LegendScrollComponent,
// LegendPlainComponent,
// DataZoomComponent,
// DataZoomInsideComponent,
// DataZoomSliderComponent,
// VisualMapComponent,
// VisualMapContinuousComponent,
// VisualMapPiecewiseComponent,
// AriaComponent,
// TransformComponent,
// DatasetComponent,
} from 'echarts/components';
import {
CanvasRenderer,
// SVGRenderer,
} from 'echarts/renderers';

echarts.use(
[TitleComponent, TooltipComponent, GridComponent, BarChart, CanvasRenderer, GaugeChart]
);

const StackedGauge = (props: { title: string, ok: number, nok: number }) => {
const { title, ok, nok } = props;
const option = {
tooltip: {
formatter: '{a} <br/>{b} : {c}%'
},
series: [
{
name: title,
type: 'gauge',
progress: {
show: true
},
min: 0,
max: ok + nok,
detail: {
formatter: '{value}'
},
data: [
{
value: ok,
name: title
}
]
}
]
};
return (
<ReactEChartsCore
echarts={echarts}
option={option}
style={{ width: "600px", height: "300px" }}
notMerge={true}
lazyUpdate={true}
// theme={"theme_name"}
// onChartReady={this.onChartReadyCallback}
// onEvents={EventsDict}
/>
);
};

const UsersGauge = (props: { title: string, ok: number, nok: number }) => {
const { title, ok, nok } = props;
return (
<>
<StackedGauge title={title} ok={ok} nok={nok}/>
</>
)
}

export default UsersGauge;
1 change: 0 additions & 1 deletion style/index.css
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
@import url('base.css');
@import url('reaviz.css');
21 changes: 0 additions & 21 deletions style/reaviz.css

This file was deleted.

0 comments on commit 1eef697

Please sign in to comment.