openreplay/frontend/app/components/Dashboard/Widgets/PredefinedWidgets/ResponseTimeDistribution/ResponseTimeDistribution.tsx
Andrey Babushkin fd5c0c9747
Add lokalisation (#3092)
* applied eslint

* add locales and lint the project

* removed error boundary

* updated locales

* fix min files

* fix locales
2025-03-06 17:43:15 +01:00

171 lines
4.4 KiB
TypeScript

import React from 'react';
import { NoContent } from 'UI';
import {
ComposedChart,
Bar,
BarChart,
CartesianGrid,
ResponsiveContainer,
XAxis,
YAxis,
ReferenceLine,
Tooltip,
} from 'recharts';
import { NO_METRIC_DATA } from 'App/constants/messages';
import { InfoCircleOutlined } from '@ant-design/icons';
import { Styles, AvgLabel } from '../../common';
function PercentileLine(props) {
const {
viewBox: { x, y },
xoffset,
yheight,
height,
label,
} = props;
return (
<svg>
<line
x1={x + xoffset}
x2={x + xoffset}
y1={height + 10}
y2={205}
{...props}
/>
<text
x={x + 5}
y={height + 20}
fontSize="8"
fontFamily="Roboto"
fill="#000000"
textAnchor="start"
>
{label}
</text>
</svg>
);
}
interface Props {
data: any;
}
function ResponseTimeDistribution(props: Props) {
const { data } = props;
const { colors } = Styles;
return (
<NoContent
size="small"
title={
<div className="flex items-center gap-2 text-base font-normal">
<InfoCircleOutlined size={12} /> {NO_METRIC_DATA}
</div>
}
show={data.chart.length === 0}
style={{ height: '240px' }}
>
<div className="flex items-center justify-end mb-3">
<AvgLabel text="Avg" unit="ms" className="ml-3" count={data.value} />
</div>
<div className="flex mb-4">
<ResponsiveContainer height={240} width="100%">
<ComposedChart
data={data.chart}
margin={Styles.chartMargins}
barSize={50}
>
<CartesianGrid
strokeDasharray="3 3"
vertical={false}
stroke="#EEEEEE"
/>
<XAxis
{...Styles.xaxis}
dataKey="responseTime"
label={{
...Styles.axisLabelLeft,
angle: 0,
offset: 0,
value: 'Page Response Time (ms)',
style: { textAnchor: 'middle' },
position: 'insideBottom',
}}
/>
<YAxis
{...Styles.yaxis}
allowDecimals={false}
label={{
...Styles.axisLabelLeft,
value: 'Number of Calls',
}}
/>
<Bar
minPointSize={1}
name="Calls"
dataKey="count"
stackId="a"
fill={colors[2]}
label="Backend"
/>
<Tooltip
{...Styles.tooltip}
labelFormatter={(val) => `Page Response Time: ${val}`}
/>
{data.percentiles &&
data.percentiles.map((item: any, i: number) => (
<ReferenceLine
key={i}
label={
<PercentileLine
xoffset={0}
// y={130}
height={i * 20}
stroke="#000"
strokeWidth={0.5}
strokeOpacity={1}
label={`${item.percentile}th Percentile (${item.responseTime}ms)`}
/>
}
// allowDecimals={false}
x={item.responseTime}
strokeWidth={0}
strokeOpacity={1}
/>
))}
</ComposedChart>
</ResponsiveContainer>
<ResponsiveContainer height={240} width="10%">
<BarChart
data={data.extremeValues}
margin={Styles.chartMargins}
barSize={40}
>
<CartesianGrid
strokeDasharray="3 3"
vertical={false}
stroke="#EEEEEE"
/>
<XAxis {...Styles.xaxis} dataKey="time" />
<YAxis
hide
type="number"
domain={[0, data.total]}
{...Styles.yaxis}
allowDecimals={false}
/>
<Tooltip {...Styles.tooltip} />
<Bar
minPointSize={1}
name="Extreme Values"
dataKey="count"
stackId="a"
fill={colors[0]}
/>
</BarChart>
</ResponsiveContainer>
</div>
</NoContent>
);
}
export default ResponseTimeDistribution;