Skip to content

Commit 0dc365c

Browse files
authored
[IGNORE] VictoriaLogs: Fix linter issues in VictoriaLogs plugin (#527)
* Run `npx eslint src --ext .ts,.tsx --fix` on the victorialogs plugin Signed-off-by: Jeremy Rickards <jeremy.rickards@sap.com> * Remove unused imports in victorialogs Signed-off-by: Jeremy Rickards <jeremy.rickards@sap.com> * Remove unused variable Signed-off-by: Jeremy Rickards <jeremy.rickards@sap.com> * Adapt code violating `no-constant-condition` in stream processing Although stream processing is probably a fine use of while(true), the linter complains. The `ReadableStreamDefaultReader` interface's `read()` method resolves the Promise with an object that contains a `done` property. Therefore this commit adapts the implementation to use that property instead. See more: https://developer.mozilla.org/en-US/docs/Web/API/ReadableStreamDefaultReader/read#return_value Signed-off-by: Jeremy Rickards <jeremy.rickards@sap.com> * Add lint script to victorialogs plugin Uses the monorepo root `.eslintrc.js`. Signed-off-by: Jeremy Rickards <jeremy.rickards@sap.com> --------- Signed-off-by: Jeremy Rickards <jeremy.rickards@sap.com>
1 parent f5369ba commit 0dc365c

File tree

13 files changed

+119
-100
lines changed

13 files changed

+119
-100
lines changed

victorialogs/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"build:cjs": "swc ./src -d dist/lib/cjs --strip-leading-paths --config-file ../.cjs.swcrc",
99
"build:esm": "swc ./src -d dist/lib --strip-leading-paths --config-file ../.swcrc",
1010
"build:types": "tsc --project tsconfig.build.json",
11+
"lint": "eslint src --ext .ts,.tsx",
1112
"test": "cross-env LC_ALL=C TZ=UTC jest",
1213
"type-check": "tsc --noEmit"
1314
},

victorialogs/src/bootstrap.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
// See the License for the specific language governing permissions and
1212
// limitations under the License.
1313

14-
import React from "react";
15-
import ReactDOM from "react-dom/client";
14+
import React from 'react';
15+
import ReactDOM from 'react-dom/client';
1616

17-
const root = ReactDOM.createRoot(document.getElementById("root")!);
17+
const root = ReactDOM.createRoot(document.getElementById('root')!);
1818
root.render(<React.StrictMode></React.StrictMode>);

victorialogs/src/datasources/victorialogs-datasource/VictoriaLogsDatasource.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,14 @@
1212
// limitations under the License.
1313

1414
import { DatasourcePlugin } from '@perses-dev/plugin-system';
15-
import {
16-
VictoriaLogsClient,
17-
streamQueryRange,
18-
statsQueryRange,
19-
fieldNames,
20-
fieldValues,
21-
} from '../../model/client';
15+
import { VictoriaLogsClient, streamQueryRange, statsQueryRange, fieldNames, fieldValues } from '../../model/client';
2216
import { VictoriaLogsDatasourceSpec } from './types';
2317
import { VictoriaLogsDatasourceEditor } from './VictoriaLogsDatasourceEditor';
2418

25-
const createClient: DatasourcePlugin<VictoriaLogsDatasourceSpec, VictoriaLogsClient>['createClient'] = (spec, options) => {
19+
const createClient: DatasourcePlugin<VictoriaLogsDatasourceSpec, VictoriaLogsClient>['createClient'] = (
20+
spec,
21+
options
22+
) => {
2623
const { directUrl, proxy } = spec;
2724
const { proxyUrl } = options;
2825

victorialogs/src/model/client.ts

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
VictoriaLogsStatsQueryRangeResponse,
1717
VictoriaLogsFieldNamesResponse,
1818
VictoriaLogsFieldValuesResponse,
19-
VictoriaLogsIndexStatsResponse,
2019
VictoriaLogsRequestHeaders,
2120
} from './types';
2221

@@ -54,10 +53,22 @@ export interface VictoriaLogsClient {
5453
options: {
5554
datasourceUrl: string;
5655
};
57-
streamQueryRange: (params: VictoriaLogsStreamQueryRangeParams, headers?: VictoriaLogsRequestHeaders) => Promise<VictoriaLogsStreamQueryRangeResponse>;
58-
statsQueryRange: (params: VictoriaLogsStatsQueryRangeParams, headers?: VictoriaLogsRequestHeaders) => Promise<VictoriaLogsStatsQueryRangeResponse>;
59-
fieldNames: (params: VictoriaLogsFieldNamesParams, headers?: VictoriaLogsRequestHeaders) => Promise<VictoriaLogsFieldNamesResponse>;
60-
fieldValues: (params: VictoriaLogsFieldValuesParams, headers?: VictoriaLogsRequestHeaders) => Promise<VictoriaLogsFieldValuesResponse>;
56+
streamQueryRange: (
57+
params: VictoriaLogsStreamQueryRangeParams,
58+
headers?: VictoriaLogsRequestHeaders
59+
) => Promise<VictoriaLogsStreamQueryRangeResponse>;
60+
statsQueryRange: (
61+
params: VictoriaLogsStatsQueryRangeParams,
62+
headers?: VictoriaLogsRequestHeaders
63+
) => Promise<VictoriaLogsStatsQueryRangeResponse>;
64+
fieldNames: (
65+
params: VictoriaLogsFieldNamesParams,
66+
headers?: VictoriaLogsRequestHeaders
67+
) => Promise<VictoriaLogsFieldNamesResponse>;
68+
fieldValues: (
69+
params: VictoriaLogsFieldValuesParams,
70+
headers?: VictoriaLogsRequestHeaders
71+
) => Promise<VictoriaLogsFieldValuesResponse>;
6172
}
6273

6374
function buildUrl(path: string, datasourceUrl: string): URL {
@@ -86,7 +97,7 @@ export async function streamQueryRange(
8697
const postData: Record<string, string> = {
8798
query: params.query,
8899
start: params.start,
89-
end: params.end
100+
end: params.end,
90101
};
91102
if (params?.limit) postData['limit'] = params.limit.toString();
92103
if (params?.offset) postData['offset'] = params.offset.toString();
@@ -96,7 +107,7 @@ export async function streamQueryRange(
96107
method: 'POST',
97108
headers: {
98109
'Content-Type': 'application/x-www-form-urlencoded',
99-
'Accept': 'application/stream+json',
110+
Accept: 'application/stream+json',
100111
...options.headers,
101112
},
102113
body: data,
@@ -108,21 +119,20 @@ export async function streamQueryRange(
108119

109120
if (!response?.body) return output;
110121
const reader = response.body.getReader();
111-
const decoder = new TextDecoder("utf-8");
122+
const decoder = new TextDecoder('utf-8');
112123
let buffer = '';
113124

114-
while (true) {
115-
const { value, done } = await reader.read();
116-
if (done) break;
117-
118-
buffer += decoder.decode(value, { stream: true });
125+
let result = await reader.read();
126+
while (!result.done) {
127+
buffer += decoder.decode(result.value, { stream: true });
119128
let boundary = buffer.indexOf('\n');
120129
while (boundary !== -1) {
121130
const line = buffer.slice(0, boundary);
122131
buffer = buffer.slice(boundary + 1);
123132
output.push(JSON.parse(line));
124133
boundary = buffer.indexOf('\n');
125134
}
135+
result = await reader.read();
126136
}
127137
if (buffer.trim().length > 0) {
128138
output.push(JSON.parse(buffer));
@@ -147,7 +157,7 @@ export async function statsQueryRange(
147157
method: 'POST',
148158
headers: {
149159
'Content-Type': 'application/x-www-form-urlencoded',
150-
'Accept': 'application/json',
160+
Accept: 'application/json',
151161
...options.headers,
152162
},
153163
body: data,
@@ -171,7 +181,7 @@ export async function fieldNames(
171181
method: 'POST',
172182
headers: {
173183
'Content-Type': 'application/x-www-form-urlencoded',
174-
'Accept': 'application/json',
184+
Accept: 'application/json',
175185
...options.headers,
176186
},
177187
body: data,
@@ -196,7 +206,7 @@ export async function fieldValues(
196206
method: 'POST',
197207
headers: {
198208
'Content-Type': 'application/x-www-form-urlencoded',
199-
'Accept': 'application/json',
209+
Accept: 'application/json',
200210
...options.headers,
201211
},
202212
body: data,

victorialogs/src/model/selectors.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ export interface VictoriaLogsDatasourceSelector extends DatasourceSelector {
2222

2323
export const DEFAULT_VICTORIALOGS: VictoriaLogsDatasourceSelector = { kind: VICTORIALOGS_DATASOURCE_KIND };
2424

25-
export function isDefaultVictoriaLogsSelector(datasourceSelectValue: DatasourceSelectValue<VictoriaLogsDatasourceSelector>): boolean {
25+
export function isDefaultVictoriaLogsSelector(
26+
datasourceSelectValue: DatasourceSelectValue<VictoriaLogsDatasourceSelector>
27+
): boolean {
2628
return !isVariableDatasource(datasourceSelectValue) && datasourceSelectValue.name === undefined;
2729
}
2830

victorialogs/src/model/types.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,30 @@ export type VictoriaLogsLogEntry = {
2424
_msg: string;
2525
_time: string;
2626
[key: string]: string;
27-
}
27+
};
2828

2929
export type VictoriaLogsStreamQueryRangeResponse = VictoriaLogsLogEntry[];
3030

3131
export type VictoriaLogsStatsQueryRangeResult = {
3232
metric: Record<string, string>;
3333
values: Array<[number, string]>;
34-
}
34+
};
3535

3636
export type VictoriaLogsStatsQueryRangeData = {
3737
resultType: string;
3838
result: VictoriaLogsStatsQueryRangeResult[];
39-
}
39+
};
4040

4141
export type VictoriaLogsStatsQueryRangeResponse = {
4242
status: 'success' | 'error';
4343
error?: string;
4444
data: VictoriaLogsStatsQueryRangeData;
45-
}
45+
};
4646

4747
export type VictoriaLogsFieldItem = {
4848
value: string;
4949
hits: number;
50-
}
50+
};
5151

5252
export interface VictoriaLogsFieldNamesResponse {
5353
values: VictoriaLogsFieldItem[];

victorialogs/src/queries/victorialogs-log-query/VictoriaLogsLogQueryEditor.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ import {
1818
OptionsEditorProps,
1919
useDatasourceSelectValueToSelector,
2020
} from '@perses-dev/plugin-system';
21-
import { InputLabel, Stack, ToggleButton, ToggleButtonGroup } from '@mui/material';
21+
import { InputLabel, Stack } from '@mui/material';
2222
import { ReactElement, useCallback, useState, useEffect } from 'react';
23-
import { produce } from 'immer';
24-
import { OptionsEditorControl } from '@perses-dev/components';
2523
import { LogsQLEditor } from '../../components/logsql-editor';
2624
import { VICTORIALOGS_DATASOURCE_KIND, VictoriaLogsDatasourceSelector } from '../../model';
2725
import { DATASOURCE_KIND, DEFAULT_DATASOURCE } from '../constants';

victorialogs/src/queries/victorialogs-log-query/query.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212
// limitations under the License.
1313

1414
import { replaceVariables } from '@perses-dev/plugin-system';
15+
import { LogEntry, LogData } from '@perses-dev/core';
1516
import { VictoriaLogsStreamQueryRangeResponse } from '../../model/types';
1617
import { VictoriaLogsClient } from '../../model/client';
17-
import { LogEntry, LogData } from '@perses-dev/core';
1818
import { DEFAULT_DATASOURCE } from '../constants';
1919
import { VictoriaLogsLogQuerySpec } from './types';
2020
import { LogQueryPlugin, LogQueryContext } from './interface';
@@ -24,10 +24,10 @@ function convertStreamToLogs(data: VictoriaLogsStreamQueryRangeResponse, default
2424

2525
data.forEach((entry) => {
2626
const { _msg, _time, ...labels } = entry;
27-
const time = (!_time && !_msg) ? defaultTime : Date.parse(_time);
27+
const time = !_time && !_msg ? defaultTime : Date.parse(_time);
2828
entries.push({
2929
timestamp: Number(time) / 1000,
30-
line: _msg || "",
30+
line: _msg || '',
3131
labels: labels,
3232
});
3333
});

victorialogs/src/queries/victorialogs-time-series-query/query.ts

Lines changed: 49 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ function convertMatrixToTimeSeries(matrix: VictoriaLogsMatrixResult[]): TimeSeri
8383
if (_stream) {
8484
const match = _stream.match(/{([^}]+)}/);
8585
if (match && match[1]) {
86-
const labelsStr = match[1].split(',').forEach(labelPair => {
87-
const [key, val] = labelPair.split('=').map(s => s.trim().replace(/^"|"$/g, ''));
86+
match[1].split(',').forEach((labelPair) => {
87+
const [key, val] = labelPair.split('=').map((s) => s.trim().replace(/^"|"$/g, ''));
8888
if (key && val) labels[key] = val;
8989
});
9090
}
@@ -103,51 +103,54 @@ function convertMatrixToTimeSeries(matrix: VictoriaLogsMatrixResult[]): TimeSeri
103103
});
104104
}
105105

106-
export const getVictoriaLogsTimeSeriesData: TimeSeriesQueryPlugin<VictoriaLogsTimeSeriesQuerySpec>['getTimeSeriesData'] = async (
107-
spec,
108-
context
109-
) => {
110-
if (!spec.query) {
111-
return {
112-
series: [],
113-
timeRange: { start: context.timeRange.start, end: context.timeRange.end },
114-
stepMs: DEFAULT_MIN_STEP_SECONDS * 1000,
115-
};
116-
}
117-
118-
const query = replaceVariables(spec.query, context.variableState);
119-
const client = (await context.datasourceStore.getDatasourceClient<VictoriaLogsClient>(
120-
spec.datasource ?? DEFAULT_DATASOURCE
121-
)) as VictoriaLogsClient;
122-
123-
const { start, end } = context.timeRange;
124-
125-
const minStepSeconds = spec.step
126-
? (getDurationStringSeconds(spec.step as DurationString) ?? DEFAULT_MIN_STEP_SECONDS)
127-
: DEFAULT_MIN_STEP_SECONDS;
128-
const stepSeconds = getVictoriaLogsRangeStep(start.getTime(), end.getTime(), minStepSeconds, context.suggestedStepMs);
129-
const stepString = formatStepForVictoriaLogs(stepSeconds);
130-
const stepMs = stepSeconds * 1000;
131-
132-
const response: VictoriaLogsStatsQueryRangeResponse = await client.statsQueryRange({
133-
query,
134-
step: stepString,
135-
start: start.toISOString(),
136-
end: end.toISOString(),
137-
});
106+
export const getVictoriaLogsTimeSeriesData: TimeSeriesQueryPlugin<VictoriaLogsTimeSeriesQuerySpec>['getTimeSeriesData'] =
107+
async (spec, context) => {
108+
if (!spec.query) {
109+
return {
110+
series: [],
111+
timeRange: { start: context.timeRange.start, end: context.timeRange.end },
112+
stepMs: DEFAULT_MIN_STEP_SECONDS * 1000,
113+
};
114+
}
138115

139-
if (response.status === 'error') {
140-
throw new Error(response.error)
141-
}
116+
const query = replaceVariables(spec.query, context.variableState);
117+
const client = (await context.datasourceStore.getDatasourceClient<VictoriaLogsClient>(
118+
spec.datasource ?? DEFAULT_DATASOURCE
119+
)) as VictoriaLogsClient;
120+
121+
const { start, end } = context.timeRange;
122+
123+
const minStepSeconds = spec.step
124+
? (getDurationStringSeconds(spec.step as DurationString) ?? DEFAULT_MIN_STEP_SECONDS)
125+
: DEFAULT_MIN_STEP_SECONDS;
126+
const stepSeconds = getVictoriaLogsRangeStep(
127+
start.getTime(),
128+
end.getTime(),
129+
minStepSeconds,
130+
context.suggestedStepMs
131+
);
132+
const stepString = formatStepForVictoriaLogs(stepSeconds);
133+
const stepMs = stepSeconds * 1000;
134+
135+
const response: VictoriaLogsStatsQueryRangeResponse = await client.statsQueryRange({
136+
query,
137+
step: stepString,
138+
start: start.toISOString(),
139+
end: end.toISOString(),
140+
});
141+
142+
if (response.status === 'error') {
143+
throw new Error(response.error);
144+
}
142145

143-
const series = convertMatrixToTimeSeries(response.data.result as VictoriaLogsMatrixResult[]);
146+
const series = convertMatrixToTimeSeries(response.data.result as VictoriaLogsMatrixResult[]);
144147

145-
return {
146-
series: series,
147-
timeRange: { start, end },
148-
stepMs,
149-
metadata: {
150-
executedQueryString: query,
151-
},
148+
return {
149+
series: series,
150+
timeRange: { start, end },
151+
stepMs,
152+
metadata: {
153+
executedQueryString: query,
154+
},
155+
};
152156
};
153-
};

victorialogs/src/variables/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
// limitations under the License.
1313

1414
import { DatasourceSelectValue } from '@perses-dev/plugin-system';
15-
import { VictoriaLogsDatasourceSelector } from "../model";
15+
import { VictoriaLogsDatasourceSelector } from '../model';
1616

1717
export interface VictoriaLogsVariableOptionsBase {
1818
datasource?: DatasourceSelectValue<VictoriaLogsDatasourceSelector>;

0 commit comments

Comments
 (0)