mirror of
https://github.com/SigNoz/signoz.git
synced 2025-12-20 08:56:29 +00:00
98 lines
2.4 KiB
TypeScript
98 lines
2.4 KiB
TypeScript
|
|
import React from "react";
|
||
|
|
import { Line as ChartJSLine } from "react-chartjs-2";
|
||
|
|
import { ChartOptions } from "chart.js";
|
||
|
|
import { withRouter } from "react-router";
|
||
|
|
import { RouteComponentProps } from "react-router-dom";
|
||
|
|
import styled from "styled-components";
|
||
|
|
import { getOptions, borderColors } from "./graphConfig";
|
||
|
|
import { externalMetricsItem } from "../../store/actions/metrics";
|
||
|
|
import { uniqBy, filter } from "lodash";
|
||
|
|
|
||
|
|
const theme = "dark";
|
||
|
|
|
||
|
|
interface ExternalApiGraphProps extends RouteComponentProps<any> {
|
||
|
|
data: externalMetricsItem[];
|
||
|
|
keyIdentifier: string;
|
||
|
|
title: string;
|
||
|
|
dataIdentifier: string;
|
||
|
|
fnDataIdentifier?: (s: number | string) => number | string;
|
||
|
|
}
|
||
|
|
|
||
|
|
interface ExternalApiGraph {
|
||
|
|
chartRef: any;
|
||
|
|
}
|
||
|
|
|
||
|
|
class ExternalApiGraph extends React.Component<ExternalApiGraphProps> {
|
||
|
|
constructor(props: ExternalApiGraphProps) {
|
||
|
|
super(props);
|
||
|
|
this.chartRef = React.createRef();
|
||
|
|
}
|
||
|
|
|
||
|
|
state = {
|
||
|
|
xcoordinate: 0,
|
||
|
|
ycoordinate: 0,
|
||
|
|
showpopUp: false,
|
||
|
|
firstpoint_ts: 0,
|
||
|
|
// graphInfo:{}
|
||
|
|
};
|
||
|
|
|
||
|
|
render() {
|
||
|
|
const {
|
||
|
|
title,
|
||
|
|
data,
|
||
|
|
dataIdentifier,
|
||
|
|
keyIdentifier,
|
||
|
|
fnDataIdentifier,
|
||
|
|
} = this.props;
|
||
|
|
const getDataSets = () => {
|
||
|
|
const uniq = uniqBy(data, keyIdentifier);
|
||
|
|
return uniq.map((obj: externalMetricsItem, i: number) => {
|
||
|
|
const _data = filter(
|
||
|
|
data,
|
||
|
|
(s: externalMetricsItem) => s[keyIdentifier] === obj[keyIdentifier],
|
||
|
|
);
|
||
|
|
return {
|
||
|
|
label: obj[keyIdentifier],
|
||
|
|
data: _data.map((s: externalMetricsItem) =>
|
||
|
|
fnDataIdentifier
|
||
|
|
? fnDataIdentifier(s[dataIdentifier])
|
||
|
|
: s[dataIdentifier],
|
||
|
|
),
|
||
|
|
pointRadius: 0.5,
|
||
|
|
borderColor: borderColors[i] || borderColors[0], // Can also add transparency in border color
|
||
|
|
borderWidth: 2,
|
||
|
|
};
|
||
|
|
});
|
||
|
|
};
|
||
|
|
const data_chartJS = (canvas: any) => {
|
||
|
|
const ctx = canvas.getContext("2d");
|
||
|
|
const gradient = ctx.createLinearGradient(0, 0, 0, 100);
|
||
|
|
gradient.addColorStop(0, "rgba(250,174,50,1)");
|
||
|
|
gradient.addColorStop(1, "rgba(250,174,50,1)");
|
||
|
|
const uniqTimestamp = uniqBy(data, "timestamp");
|
||
|
|
|
||
|
|
return {
|
||
|
|
labels: uniqTimestamp.map(
|
||
|
|
(s: externalMetricsItem) => new Date(s.timestamp / 1000000),
|
||
|
|
),
|
||
|
|
datasets: getDataSets(),
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
return (
|
||
|
|
<div>
|
||
|
|
<div>
|
||
|
|
<div style={{ textAlign: "center" }}>{title}</div>
|
||
|
|
<ChartJSLine
|
||
|
|
ref={this.chartRef}
|
||
|
|
data={data_chartJS}
|
||
|
|
options={getOptions(theme)}
|
||
|
|
/>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export default withRouter(ExternalApiGraph);
|