From df8565242e5e1621200e7a1f5dfecdf3e408bd60 Mon Sep 17 00:00:00 2001 From: Mikhail Volkov <47795110+mikhailredis@users.noreply.github.com> Date: Mon, 6 Dec 2021 21:46:17 -0500 Subject: [PATCH] Add Redis CPU Usage panel (#96) * Add Redis CPU Usage panel * Fix tests --- CHANGELOG.md | 1 + src/img/redis-cpu-usage-graph.png | Bin 0 -> 138555 bytes src/plugin.json | 8 + src/redis-cpu-panel/components/index.ts | 2 + .../components/redis-cpu-panel-graph/index.ts | 1 + .../redis-cpu-panel-graph.test.tsx | 107 +++++ .../redis-cpu-panel-graph.tsx | 194 ++++++++ .../components/redis-cpu-panel/index.ts | 1 + .../redis-cpu-panel/redis-cpu-panel.test.tsx | 426 ++++++++++++++++++ .../redis-cpu-panel/redis-cpu-panel.tsx | 266 +++++++++++ src/redis-cpu-panel/constants.ts | 25 + src/redis-cpu-panel/img/logo.svg | 38 ++ src/redis-cpu-panel/module.test.ts | 28 ++ src/redis-cpu-panel/module.ts | 29 ++ src/redis-cpu-panel/plugin.json | 16 + src/redis-cpu-panel/types.ts | 88 ++++ 16 files changed, 1230 insertions(+) create mode 100644 src/img/redis-cpu-usage-graph.png create mode 100644 src/redis-cpu-panel/components/index.ts create mode 100644 src/redis-cpu-panel/components/redis-cpu-panel-graph/index.ts create mode 100644 src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.test.tsx create mode 100644 src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.tsx create mode 100644 src/redis-cpu-panel/components/redis-cpu-panel/index.ts create mode 100644 src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.test.tsx create mode 100644 src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.tsx create mode 100644 src/redis-cpu-panel/constants.ts create mode 100644 src/redis-cpu-panel/img/logo.svg create mode 100644 src/redis-cpu-panel/module.test.ts create mode 100644 src/redis-cpu-panel/module.ts create mode 100644 src/redis-cpu-panel/plugin.json create mode 100644 src/redis-cpu-panel/types.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 0999d9a..b8b1286 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Fix Docker plugins provisioning (#90) - Upgrade to Grafana 8.3.0 (#93) - Fix LGTM and Update Panel Options (#95) +- Add Redis CPU Usage panel (#96) ## 2.1.0 (2021-11-10) diff --git a/src/img/redis-cpu-usage-graph.png b/src/img/redis-cpu-usage-graph.png new file mode 100644 index 0000000000000000000000000000000000000000..874f3129f924716b6b7c5217b647a87a6b50fc69 GIT binary patch literal 138555 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 z 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 literal 0 HcmV?d00001 diff --git a/src/plugin.json b/src/plugin.json index a9bc205..f5f4dd0 100644 --- a/src/plugin.json +++ b/src/plugin.json @@ -78,6 +78,10 @@ { "name": "RedisGears Panel", "type": "panel" + }, + { + "name": "Redis CPU Panel", + "type": "panel" } ], "info": { @@ -125,6 +129,10 @@ { "name": "Max Memory Keys Panel", "path": "img/redis-keys-panel.png" + }, + { + "name": "Redis CPU Panel", + "path": "img/redis-cpu-usage-graph.png" } ], "updated": "%TODAY%", diff --git a/src/redis-cpu-panel/components/index.ts b/src/redis-cpu-panel/components/index.ts new file mode 100644 index 0000000..e4a8c6c --- /dev/null +++ b/src/redis-cpu-panel/components/index.ts @@ -0,0 +1,2 @@ +export * from './redis-cpu-panel-graph'; +export * from './redis-cpu-panel'; diff --git a/src/redis-cpu-panel/components/redis-cpu-panel-graph/index.ts b/src/redis-cpu-panel/components/redis-cpu-panel-graph/index.ts new file mode 100644 index 0000000..9dae8b9 --- /dev/null +++ b/src/redis-cpu-panel/components/redis-cpu-panel-graph/index.ts @@ -0,0 +1 @@ +export * from './redis-cpu-panel-graph'; diff --git a/src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.test.tsx b/src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.test.tsx new file mode 100644 index 0000000..83dc74a --- /dev/null +++ b/src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.test.tsx @@ -0,0 +1,107 @@ +import { shallow } from 'enzyme'; +import React from 'react'; +import { DataFrame, dateTime, dateTimeParse } from '@grafana/data'; +import { RedisCPUPanelGraph } from './redis-cpu-panel-graph'; + +/** + * Table View + */ +describe('RedisCPUPanelGraph', () => { + /** + * getGraphSeries + */ + describe('getGraphSeries', () => { + it('Should return series for each command', () => { + const seriesMap = { + get: [ + { + time: dateTime(), + value: 0, + }, + { + time: dateTime(), + value: 0, + }, + ], + info: [ + { + time: dateTime(), + value: 10, + }, + { + time: dateTime().add(10, 'seconds'), + value: 20, + }, + ], + }; + const result: DataFrame[] = RedisCPUPanelGraph.getGraphDataFrame(seriesMap); + expect(result[0].length).toEqual(2); + expect(result[0].fields[0].values.length).toEqual(2); + expect(result[1].length).toEqual(2); + }); + }); + + /** + * Get Time Range + */ + describe('getTimeRange', () => { + it('Should apply timeRange.raw.from and find series with the biggest items and take time', () => { + const timeRange = { + from: dateTime(), + to: dateTime(), + raw: { + from: '6h', + to: 'now', + }, + }; + const result = RedisCPUPanelGraph.getTimeRange(timeRange, 'browser'); + expect(result.from.valueOf()).toEqual(dateTimeParse('6h').valueOf()); + expect(result.to.startOf('hour').valueOf()).toEqual(dateTime().startOf('hour').valueOf()); + }); + }); + + /** + * Getting new props + */ + describe('Getting new props', () => { + const getComponent = (props: any = {}) => ; + + it('Should update timeRange when gets a new seriesMap or timeRange', () => { + const wrapper = shallow( + getComponent({ + seriesMap: { get: [{ time: dateTime(), value: 1 }] }, + timeRange: { raw: { from: dateTime() } }, + }) + ); + const currentTimeRange = wrapper.state().timeRange; + wrapper.setProps({ + seriesMap: { get: [{ time: dateTime(), value: 2 }] }, + }); + expect(currentTimeRange !== wrapper.state().timeRange).toBeTruthy(); + }); + + it('Should return gathering results div if data frame is empty', () => { + const wrapper = shallow( + getComponent({ + seriesMap: {}, + timeRange: { raw: { from: dateTime() } }, + }) + ); + + const div = wrapper.findWhere((node) => node.name() === 'div'); + expect(div.exists()).toBeTruthy(); + }); + + it('Should return Time Series if data frame has data', () => { + const wrapper = shallow( + getComponent({ + seriesMap: { get: [{ time: dateTime(), value: 1 }] }, + timeRange: { raw: { from: dateTime() } }, + }) + ); + + const timeSeries = wrapper.findWhere((node) => node.name() === 'TimeSeries'); + expect(timeSeries.exists()).toBeTruthy(); + }); + }); +}); diff --git a/src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.tsx b/src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.tsx new file mode 100644 index 0000000..9d81340 --- /dev/null +++ b/src/redis-cpu-panel/components/redis-cpu-panel-graph/redis-cpu-panel-graph.tsx @@ -0,0 +1,194 @@ +import React, { PureComponent } from 'react'; +import { + DataFrame, + DateTime, + dateTimeParse, + FieldColorModeId, + FieldType, + getDisplayProcessor, + GraphSeriesValue, + PanelProps, + TimeRange, + TimeZone, + toDataFrame, +} from '@grafana/data'; +import { config } from '@grafana/runtime'; +import { colors, LegendDisplayMode, TimeSeries, TooltipDisplayMode, TooltipPlugin } from '@grafana/ui'; +import { PanelOptions, SeriesMap, SeriesValue } from '../../types'; + +/** + * Graph Properties + */ +interface Props extends PanelProps { + /** + * Series + * + * @type {SeriesMap} + */ + seriesMap: SeriesMap; +} + +/** + * State + */ +interface State { + /** + * Time Range + * + * @type {TimeRange} + */ + timeRange: TimeRange; +} + +/** + * Graph View + */ +export class RedisCPUPanelGraph extends PureComponent { + /** + * Convert seriesMap to Data Frames + * @param seriesMap + */ + static getGraphDataFrame(seriesMap: SeriesMap): DataFrame[] { + return Object.entries(seriesMap).reduce( + (acc: DataFrame[], [command, seriesValues]: [string, SeriesValue[]], index) => { + const { times, values } = seriesValues.reduce( + (acc: { times: DateTime[]; values: number[] }, { time, value }) => { + return { + times: acc.times.concat([time]), + values: acc.values.concat([value]), + }; + }, + { times: [], values: [] } + ); + + /** + * Color + */ + const color = colors[index % colors.length]; + + /** + * Data Frame + */ + const seriesDataFrame = toDataFrame({ + name: command, + fields: [ + { + type: FieldType.time, + name: 'time', + values: times, + }, + { + type: FieldType.number, + name: ' ', + values, + config: { + unit: 'percent', + color: { + fixedColor: color, + mode: FieldColorModeId.Fixed, + }, + }, + }, + ], + }); + + /** + * Fields + */ + seriesDataFrame.fields = seriesDataFrame.fields.map((field) => ({ + ...field, + display: getDisplayProcessor({ field, theme: config.theme2 }), + })); + + /** + * Push values + */ + const data: GraphSeriesValue[][] = []; + for (let i = 0; i < times.length; i++) { + data.push([times[i].valueOf(), values[i]]); + } + + return acc.concat(seriesDataFrame); + }, + [] + ); + } + + /** + * Get timeRange from timeRange.raw + * + * @param timeRange + */ + static getTimeRange(timeRange: TimeRange, timeZone: TimeZone): TimeRange { + let fromTime = dateTimeParse(timeRange.raw.from, { timeZone }); + const toTime = dateTimeParse(timeRange.raw.to, { timeZone }); + + return { + from: fromTime, + to: toTime, + raw: { + from: timeRange.raw.from, + to: toTime, + }, + }; + } + + /** + * State + */ + state = { + timeRange: RedisCPUPanelGraph.getTimeRange(this.props.timeRange, this.props.timeZone), + }; + + /** + * getDerivedStateFromProps + * + * @param props + */ + static getDerivedStateFromProps(props: Readonly) { + return { + timeRange: RedisCPUPanelGraph.getTimeRange(props.timeRange, props.timeZone), + }; + } + + /** + * Render + */ + render() { + const { width, height, seriesMap } = this.props; + const { timeRange } = this.state; + + /** + * Convert to Data Frames + */ + const dataFrames = RedisCPUPanelGraph.getGraphDataFrame(seriesMap); + if (!dataFrames.length) { + return
Gathering usage data...
; + } + + /** + * Return Time Series + */ + return ( + + {(config, alignedDataFrame) => { + return ( + + ); + }} + + ); + } +} diff --git a/src/redis-cpu-panel/components/redis-cpu-panel/index.ts b/src/redis-cpu-panel/components/redis-cpu-panel/index.ts new file mode 100644 index 0000000..865ea80 --- /dev/null +++ b/src/redis-cpu-panel/components/redis-cpu-panel/index.ts @@ -0,0 +1 @@ +export * from './redis-cpu-panel'; diff --git a/src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.test.tsx b/src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.test.tsx new file mode 100644 index 0000000..b09f968 --- /dev/null +++ b/src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.test.tsx @@ -0,0 +1,426 @@ +import { shallow } from 'enzyme'; +import React from 'react'; +import { Observable } from 'rxjs'; +import { FieldType, toDataFrame } from '@grafana/data'; +import { DefaultInterval, FieldName } from '../../constants'; +import { RedisCPUPanelGraph } from '../redis-cpu-panel-graph'; +import { RedisCPUPanel } from './redis-cpu-panel'; + +/** + * Query Result + */ +const getDataSourceQueryResult = (fields: Array<{ name: FieldName; type: FieldType; values: number[] }>) => ({ + data: [ + toDataFrame({ + name: 'data', + fields, + }), + ], +}); + +/* + DataSource + */ +const dataSourceMock = { + query: jest.fn().mockImplementation( + () => + new Observable((subscriber) => { + subscriber.next( + getDataSourceQueryResult([ + { + type: FieldType.number, + name: FieldName.User, + values: [2000, 3000], + }, + { + type: FieldType.number, + name: FieldName.System, + values: [10, 20], + }, + ]) + ); + subscriber.complete(); + }) + ), + name: 'datasource', +}; + +const dataSourceSrvGetMock = jest.fn().mockImplementation(() => Promise.resolve(dataSourceMock)); + +/** + * Mock getDataSourceSrv function + */ +jest.mock('@grafana/runtime', () => ({ + getDataSourceSrv: () => ({ + get: dataSourceSrvGetMock, + }), +})); + +/** + * CPU Panel + */ +describe('RedisCPUPanel', () => { + const getComponent = ({ options = { interval: 1000 }, ...restProps }: any) => { + const data = { + request: { + targets: [ + { + datasource: 'Redis', + }, + ], + }, + }; + return ; + }; + + beforeEach(() => { + dataSourceSrvGetMock.mockClear(); + dataSourceMock.query.mockClear(); + }); + + /** + * makeQuery + */ + describe('makeQuery', () => { + it('If no targets nothing should be loaded and shown', async () => { + const wrapper = shallow(getComponent({ data: { request: { targets: [] } } })); + const data = await wrapper.instance().makeQuery(); + expect(data).toBeNull(); + }); + + it('Should use default command if command empty in targets', async () => { + const wrapper = shallow( + getComponent({ + data: { + request: { + targets: [{ datasource: 'Redis111' }], + }, + }, + }) + ); + + /** + * Query + */ + await wrapper.instance().makeQuery(); + expect(dataSourceSrvGetMock).toHaveBeenCalledWith('Redis111'); + expect(dataSourceMock.query).toHaveBeenCalledWith({ + targets: [ + { + datasource: 'Redis111', + command: 'info', + section: 'cpu', + }, + ], + }); + }); + + it('Should use query params from props if there are', async () => { + const wrapper = shallow( + getComponent({ + data: { + request: { + targets: [{ datasource: 'Redis111', command: 'command', section: 'section', type: 'type' }], + }, + }, + }) + ); + + /** + * Query + */ + await wrapper.instance().makeQuery(); + expect(dataSourceSrvGetMock).toHaveBeenCalledWith('Redis111'); + expect(dataSourceMock.query).toHaveBeenCalledWith({ + targets: [ + { + datasource: 'Redis111', + command: 'command', + section: 'section', + type: 'type', + }, + ], + }); + }); + }); + + /** + * getValuesForCalculation + */ + describe('getValuesForCalculation', () => { + it('Should return calls and duration field values', () => { + const dataFrame = toDataFrame({ + name: 'dataFrame', + fields: [ + { + name: FieldName.User, + type: FieldType.number, + values: [1, 2], + }, + { + name: FieldName.System, + type: FieldType.number, + values: [100, 200], + }, + ], + }); + expect(RedisCPUPanel.getValuesForCalculation(dataFrame).system).toEqual(100); + expect(RedisCPUPanel.getValuesForCalculation(dataFrame).user).toEqual(1); + }); + + it('Should work if no needed fields', () => { + const dataFrame = toDataFrame({ + name: 'dataFrame', + fields: [ + { + name: 'abc', + type: FieldType.number, + values: [1, 2], + }, + ], + }); + expect(RedisCPUPanel.getValuesForCalculation(dataFrame).system).toBeUndefined(); + expect(RedisCPUPanel.getValuesForCalculation(dataFrame).user).toBeUndefined(); + }); + }); + + /** + * RequestData + */ + describe('RequestData', () => { + const data = { + series: [ + toDataFrame({ + name: 'data', + fields: [ + { + type: FieldType.number, + name: FieldName.User, + values: [200, 300], + }, + { + type: FieldType.number, + name: FieldName.System, + values: [1, 2], + }, + ], + }), + ], + }; + + /** + * Mount + */ + describe('Mount', () => { + it('If options.interval is filled should set interval', () => { + const wrapper = shallow(getComponent({ data })); + const testedMethod = jest + .spyOn(wrapper.instance(), 'setRequestDataInterval') + .mockImplementation(() => Promise.resolve()); + wrapper.instance().componentDidMount(); + expect(testedMethod).toHaveBeenCalled(); + }); + + it('If options.interval is empty should not set interval', () => { + const options = {}; + const wrapper = shallow(getComponent({ data, options })); + const testedMethod = jest + .spyOn(wrapper.instance(), 'setRequestDataInterval') + .mockImplementation(() => Promise.resolve()); + wrapper.instance().componentDidMount(); + expect(testedMethod).not.toHaveBeenCalled(); + }); + }); + + /** + * Update + */ + describe('Update', () => { + it('If options.interval was changed should set interval', () => { + const wrapper = shallow(getComponent({ data })); + const testedMethod = jest + .spyOn(wrapper.instance(), 'setRequestDataInterval') + .mockImplementation(() => Promise.resolve()); + wrapper.instance().componentDidMount(); + expect(testedMethod).toHaveBeenCalled(); + + testedMethod.mockClear(); + wrapper.setProps({ + options: { interval: 2000, maxItemsPerSeries: 1000 }, + }); + expect(testedMethod).toHaveBeenCalled(); + + testedMethod.mockClear(); + wrapper.setProps({ + options: { interval: 2000, maxItemsPerSeries: 1000 }, + }); + expect(testedMethod).not.toHaveBeenCalled(); + }); + }); + + /** + * Unmount + */ + describe('Unmount', () => { + it('Should clear interval', () => { + const wrapper = shallow(getComponent({ data })); + const testedMethod = jest.spyOn(wrapper.instance(), 'clearRequestDataInterval').mockImplementation(() => {}); + wrapper.instance().componentWillUnmount(); + expect(testedMethod).toHaveBeenCalled(); + }); + }); + + /** + * Update seriesMap + */ + describe('Update seriesMap', () => { + it('Should set timer and request data with interval', (done) => { + const options = { + interval: 1000, + maxItemsPerSeries: 1, + }; + const wrapper = shallow(getComponent({ data, options })); + const testedMethod = jest.spyOn(wrapper.instance(), 'updateData'); + + setImmediate(() => { + testedMethod.mockClear(); + let checksCount = 2; + + const check = () => { + expect(testedMethod).toHaveBeenCalled(); + + checksCount--; + if (checksCount > 0) { + testedMethod.mockClear(); + setTimeout(check, options.interval); + } else { + done(); + } + }; + setTimeout(check, options.interval); + }); + }); + + it('Should set timer with default interval if no interval option and request data with interval', (done) => { + const options = { + interval: null, + }; + const wrapper = shallow(getComponent({ data, options })); + const testedMethod = jest.spyOn(wrapper.instance(), 'updateData'); + + setImmediate(() => { + testedMethod.mockClear(); + let checksCount = 2; + const check = () => { + expect(testedMethod).toHaveBeenCalled(); + + checksCount--; + if (checksCount > 0) { + testedMethod.mockClear(); + setTimeout(check, DefaultInterval); + } else { + done(); + } + }; + setTimeout(check, DefaultInterval); + }); + }); + + it('Should clear interval before setting new one', (done) => { + const options = { + interval: 1000, + maxItemsPerSeries: 1000, + }; + + const wrapper = shallow(getComponent({ data, options })); + const testedMethod = jest.spyOn(wrapper.instance(), 'clearRequestDataInterval'); + + setImmediate(() => { + wrapper.instance().setRequestDataInterval(); + expect(testedMethod).toHaveBeenCalled(); + done(); + }); + }); + + it('Should use passed datasource', (done) => { + const options = { + interval: 1000, + maxItemsPerSeries: 1000, + }; + + const overrideData = { + ...data, + request: { + targets: [ + { + datasource: 'redis', + }, + ], + }, + }; + shallow(getComponent({ data: overrideData, options })); + setImmediate(() => { + expect(dataSourceSrvGetMock).toHaveBeenCalledWith('redis'); + done(); + }); + }); + + it('Should not update values if no dataFrame', async () => { + const options = { + interval: 1000, + }; + + const wrapper = shallow(getComponent({ data, options }), { disableLifecycleMethods: true }); + jest.spyOn(wrapper.instance(), 'makeQuery').mockImplementation(() => + Promise.resolve({ + data: [], + }) + ); + + const setStateMock = jest.spyOn(wrapper.instance(), 'setState'); + await wrapper.instance().updateData(); + expect(setStateMock).not.toHaveBeenCalled(); + }); + }); + + /** + * clearRequestDataInterval + */ + describe('clearRequestDataInterval', () => { + it('Should clear interval', (done) => { + const options = { + interval: 1000, + maxItemsPerSeries: 1000, + }; + + const wrapper = shallow(getComponent({ data, options })); + setImmediate(() => { + expect(wrapper.instance().requestDataTimer).toBeDefined(); + wrapper.instance().clearRequestDataInterval(); + expect(wrapper.instance().requestDataTimer).not.toBeDefined(); + wrapper.instance().clearRequestDataInterval(); + expect(wrapper.instance().requestDataTimer).not.toBeDefined(); + done(); + }); + }); + }); + }); + + /** + * Rendering + */ + describe('Rendering', () => { + it('Should render graph', (done) => { + const wrapper = shallow(getComponent({ options: { interval: 1000, maxItemsPerSeries: 1000 } })); + + setImmediate(() => { + expect(wrapper.find(RedisCPUPanelGraph).exists()).toBeTruthy(); + done(); + }); + }); + }); + + afterAll(() => { + jest.resetAllMocks(); + }); +}); diff --git a/src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.tsx b/src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.tsx new file mode 100644 index 0000000..e096f61 --- /dev/null +++ b/src/redis-cpu-panel/components/redis-cpu-panel/redis-cpu-panel.tsx @@ -0,0 +1,266 @@ +import React, { PureComponent } from 'react'; +import { lastValueFrom, Observable } from 'rxjs'; +import { + DataFrame, + DataQueryRequest, + DataQueryResponse, + DataSourceRef, + DateTime, + dateTime, + PanelProps, +} from '@grafana/data'; +import { getDataSourceSrv } from '@grafana/runtime'; +import { DefaultInterval, FieldName, MaxItemsPerSeries } from '../../constants'; +import { PanelOptions, RedisQuery, SeriesMap, ValuesForCalculation } from '../../types'; +import { RedisCPUPanelGraph } from '../redis-cpu-panel-graph'; + +/** + * Properties + */ +interface Props extends PanelProps {} + +/** + * State + */ +interface State { + /** + * Values + * + * @type {ValuesForCalculation} + */ + values?: ValuesForCalculation; + + /** + * Series + * + * @type {SeriesMap} + */ + seriesMap: SeriesMap; +} + +/** + * Redis CPU Panel + */ +export class RedisCPUPanel extends PureComponent { + /** + * Get Values + * + * @param dataFrame {DataFrame} Data Frame + */ + static getValuesForCalculation(dataFrame: DataFrame): ValuesForCalculation { + const userField = dataFrame.fields.find((field) => field.name === FieldName.User); + const systemField = dataFrame.fields.find((field) => field.name === FieldName.System); + + /** + * Return Values + */ + return { + time: dateTime(), + user: userField?.values.toArray().map((value) => value)[0], + system: systemField?.values.toArray().map((value) => value)[0], + }; + } + + /** + * Get updated series map and limit max items per series + * @param seriesMap + * @param values + * @param newValues + * @param itemsLimit + */ + static getSeriesMap( + seriesMap: SeriesMap, + values: ValuesForCalculation, + newValues: ValuesForCalculation, + itemsLimit = 1000 + ): SeriesMap { + const result = { + ...seriesMap, + }; + + const user = ((newValues.user - values.user) / (newValues.time.diff(values.time) / 1000)) * 100; + const system = ((newValues.system - values.system) / (newValues.time.diff(values.time) / 1000)) * 100; + /** + * Calculate Usage + */ + const value: { [id: string]: { time: DateTime; value: number } } = { + user: { + time: dateTime(), + value: user >= 0 ? user : 0, + }, + system: { + time: dateTime(), + value: system >= 0 ? system : 0, + }, + }; + + ['user', 'system'].forEach((id) => { + if (!result[id]) { + result[id] = [value[id]]; + } else if (result[id].length + 1 > itemsLimit) { + result[id] = [...result[id].slice(1, result[id].length), value[id]]; + } else { + result[id] = result[id].concat(value[id]); + } + }); + + return result; + } + + /** + * State + */ + state: State = { + seriesMap: {}, + }; + + /** + * Request Data Timer + */ + requestDataTimer?: NodeJS.Timeout | undefined; + + /** + * Mount + */ + componentDidMount(): void { + this.updateData(); + + if (this.props.options.interval !== undefined) { + this.setRequestDataInterval(); + } + } + + /** + * Update + */ + componentDidUpdate(prevProps: Readonly, prevState: Readonly): void { + if (prevProps.options.interval !== this.props.options.interval) { + this.setRequestDataInterval(); + } + } + + /** + * Unmount + */ + componentWillUnmount(): void { + this.clearRequestDataInterval(); + } + + /** + * makeQuery using request.targets with default commands + */ + async makeQuery(): Promise { + const targets = this.props.data.request?.targets; + let datasource: string | DataSourceRef = ''; + if (targets && targets.length && targets[0].datasource) { + datasource = targets[0].datasource; + } + + if (!datasource || !targets) { + return Promise.resolve(null); + } + + /** + * Data Source + */ + const ds = await getDataSourceSrv().get(datasource); + + /** + * Override default values if was set query params + */ + const targetsWithCommands = targets.map((target: RedisQuery) => ({ + command: 'info', + section: 'cpu', + ...target, + })); + + const query = ds.query({ + ...this.props.data.request, + targets: targetsWithCommands, + } as DataQueryRequest) as unknown; + + return lastValueFrom(query as Observable); + } + + /** + * Request data and update dataFrame and seriesMap in state + */ + async updateData() { + const response = await this.makeQuery(); + + if (response === null) { + return Promise.resolve(); + } + + let { values, seriesMap } = this.state; + + /** + * New Data Frame + */ + const newDataFrame = response.data[0] as DataFrame; + if (!newDataFrame) { + return Promise.resolve(); + } + + /** + * Get Values + */ + const newValues = RedisCPUPanel.getValuesForCalculation(newDataFrame); + if (!values) { + values = newValues; + } + + /** + * Update Series Map + */ + const itemsLimit = this.props.options.maxItemsPerSeries || MaxItemsPerSeries; + const newSeriesMap = RedisCPUPanel.getSeriesMap(seriesMap, values, newValues, itemsLimit); + + /** + * Set State + */ + this.setState({ + values: newValues, + seriesMap: newSeriesMap, + }); + } + + /** + * Request Interval + */ + setRequestDataInterval() { + if (this.requestDataTimer !== undefined) { + this.clearRequestDataInterval(); + } + + /** + * Interval + */ + this.requestDataTimer = setInterval(() => { + /** + * Update data + */ + this.updateData(); + }, this.props.options.interval || DefaultInterval); + } + + /** + * Clear Interval + */ + clearRequestDataInterval() { + if (this.requestDataTimer !== undefined) { + clearTimeout(this.requestDataTimer); + delete this.requestDataTimer; + } + } + + /** + * Render + */ + render() { + const { height } = this.props; + const { seriesMap } = this.state; + + return ; + } +} diff --git a/src/redis-cpu-panel/constants.ts b/src/redis-cpu-panel/constants.ts new file mode 100644 index 0000000..995b61c --- /dev/null +++ b/src/redis-cpu-panel/constants.ts @@ -0,0 +1,25 @@ +/** + * Default refresh interval + */ +export const DefaultInterval = 1000; + +/** + * Max items per series + */ +export const MaxItemsPerSeries = 300; + +/** + * Fields + */ +export enum FieldName { + User = 'used_cpu_user', + System = 'used_cpu_sys', +} + +/** + * Table Field names + */ +export const DisplayNameByFieldName = { + [FieldName.System]: 'System', + [FieldName.User]: 'User', +}; diff --git a/src/redis-cpu-panel/img/logo.svg b/src/redis-cpu-panel/img/logo.svg new file mode 100644 index 0000000..0bb53c2 --- /dev/null +++ b/src/redis-cpu-panel/img/logo.svg @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/src/redis-cpu-panel/module.test.ts b/src/redis-cpu-panel/module.test.ts new file mode 100644 index 0000000..18157ee --- /dev/null +++ b/src/redis-cpu-panel/module.test.ts @@ -0,0 +1,28 @@ +import { PanelPlugin } from '@grafana/data'; +import { plugin } from './module'; + +/** + * CPU Panel + */ +describe('RedisCPUPanel', () => { + it('Should be instance of PanelPlugin', () => { + expect(plugin).toBeInstanceOf(PanelPlugin); + }); + + it('Should add interval input', () => { + /** + * Builder + */ + const builder: any = { + addSliderInput: jest.fn().mockImplementation(() => builder), + addRadio: jest.fn().mockImplementation(() => builder), + }; + + plugin['optionsSupplier'](builder); + + /** + * Interval + */ + expect(builder.addSliderInput).toHaveBeenCalled(); + }); +}); diff --git a/src/redis-cpu-panel/module.ts b/src/redis-cpu-panel/module.ts new file mode 100644 index 0000000..88ac605 --- /dev/null +++ b/src/redis-cpu-panel/module.ts @@ -0,0 +1,29 @@ +import { PanelPlugin } from '@grafana/data'; +import { RedisCPUPanel } from './components'; +import { DefaultInterval, MaxItemsPerSeries } from './constants'; +import { PanelOptions } from './types'; + +/** + * Panel Plugin + */ +export const plugin = new PanelPlugin(RedisCPUPanel).setPanelOptions((builder) => { + return builder + .addSliderInput({ + path: 'interval', + name: 'Interval to run INFO command, ms', + settings: { + min: 100, + max: 30000, + }, + defaultValue: DefaultInterval, + }) + .addSliderInput({ + path: 'maxItemsPerSeries', + name: 'Number of Samples', + settings: { + min: 10, + max: 500, + }, + defaultValue: MaxItemsPerSeries, + }); +}); diff --git a/src/redis-cpu-panel/plugin.json b/src/redis-cpu-panel/plugin.json new file mode 100644 index 0000000..61ac541 --- /dev/null +++ b/src/redis-cpu-panel/plugin.json @@ -0,0 +1,16 @@ +{ + "id": "redis-cpu-panel", + "info": { + "author": { + "name": "RedisGrafana", + "url": "https://redisgrafana.github.io" + }, + "description": "Redis CPU panel", + "logos": { + "large": "img/logo.svg", + "small": "img/logo.svg" + } + }, + "name": "Redis CPU Usage", + "type": "panel" +} diff --git a/src/redis-cpu-panel/types.ts b/src/redis-cpu-panel/types.ts new file mode 100644 index 0000000..5cc6575 --- /dev/null +++ b/src/redis-cpu-panel/types.ts @@ -0,0 +1,88 @@ +import { DataQuery, DateTime } from '@grafana/data'; + +/** + * Panel Options + */ +export interface PanelOptions { + /** + * Interval + * + * @type {number} + */ + interval: number; + + /** + * Max Items + * + * @type {number} + */ + maxItemsPerSeries: number; +} + +/** + * Redis Query + */ +export interface RedisQuery extends DataQuery { + /** + * Query command + * + * @type {string} + */ + query?: string; + + /** + * Redis Command type + * + * @type {string} + */ + type?: string; + + /** + * Redis Command + * + * @type {string} + */ + command?: string; + + /** + * Redis Section + * + * @type {string} + */ + section?: string; +} + +/** + * Object which keeps SeriesValue[] by command name + */ +export interface SeriesMap { + [key: string]: SeriesValue[]; +} + +/** + * Series Value + */ +export interface SeriesValue { + time: DateTime; + value: number; +} + +/** + * Calculation + */ +export interface ValuesForCalculation { + /** + * Time + */ + time: DateTime; + + /** + * User + */ + user: number; + + /** + * System + */ + system: number; +}