Skip to content

Commit c7220a1

Browse files
committed
feat: 监控trace datasource插件开发
# Reviewed, transaction id: 25591
1 parent 69d0be7 commit c7220a1

File tree

10 files changed

+258
-368
lines changed

10 files changed

+258
-368
lines changed

Dockerfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ RUN pnpm i \
1616
&& mkdir -p build/alert \
1717
&& mkdir -p build/event \
1818
&& mkdir -p build/timeseries \
19+
&& mkdir -p build/trace \
1920
&& mv src/alert/dist/* build/alert \
2021
&& mv src/event/dist/* build/event \
21-
&& mv src/timeseries/dist/* build/timeseries
22+
&& mv src/timeseries/dist/* build/timeseries \
23+
&& mv src/trace/dist/* build/trace
2224

2325
RUN tar -czvf frontend.tar.gz build
2426

src/trace/LICENSE

Lines changed: 183 additions & 183 deletions
Large diffs are not rendered by default.

src/trace/src/CheatSheet.tsx

Lines changed: 0 additions & 57 deletions
This file was deleted.

src/trace/src/components/QueryEditor.tsx

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import { css } from '@emotion/css';
2-
import { type QueryEditorProps, type SelectableValue } from '@grafana/data';
2+
import type { QueryEditorProps, SelectableValue } from '@grafana/data';
33
import {
4-
FileDropzone,
54
HorizontalGroup,
65
InlineField,
76
InlineFieldRow,
8-
Modal,
97
QueryField,
108
RadioButtonGroup,
119
Select,
@@ -23,11 +21,9 @@ import { getTemplateSrv } from '@grafana/runtime';
2321
type Props = QueryEditorProps<TraceDatasource, TraceQuery>;
2422

2523
export function QueryEditor({ datasource, query, onChange, onRunQuery }: Props) {
26-
const [uploadModalOpen, setUploadModalOpen] = useState(false);
2724
const [appLoading, setAppLoading] = useState(false);
2825
const [appOptions, setAppOptions] = useState<Array<SelectableValue<string>>>();
2926

30-
const theme = useTheme2();
3127
const styles = useStyles2(getStyles);
3228

3329
useEffect(() => {
@@ -60,11 +56,11 @@ export function QueryEditor({ datasource, query, onChange, onRunQuery }: Props)
6056
},
6157
});
6258
}, [datasource]);
59+
// trace_id查询图表
6360
const onChangeQuery = (value: string) => {
6461
const nextQuery: TraceQuery = { ...query, query: value };
6562
onChange(nextQuery);
6663
};
67-
6864
const renderEditorBody = () => {
6965
switch (query.queryType) {
7066
case 'search':
@@ -100,26 +96,6 @@ export function QueryEditor({ datasource, query, onChange, onRunQuery }: Props)
10096

10197
return (
10298
<>
103-
<Modal
104-
isOpen={uploadModalOpen}
105-
title={'Upload trace'}
106-
onDismiss={() => setUploadModalOpen(false)}
107-
>
108-
<div className={css({ padding: theme.spacing(2) })}>
109-
<FileDropzone
110-
options={{ multiple: false }}
111-
onLoad={result => {
112-
datasource.uploadedJson = result;
113-
onChange({
114-
...query,
115-
queryType: 'upload',
116-
});
117-
setUploadModalOpen(false);
118-
onRunQuery();
119-
}}
120-
/>
121-
</div>
122-
</Modal>
12399
<div className={styles.container}>
124100
<InlineFieldRow>
125101
<InlineField
@@ -146,15 +122,6 @@ export function QueryEditor({ datasource, query, onChange, onRunQuery }: Props)
146122
})
147123
}
148124
/>
149-
{/* <Button
150-
size='sm'
151-
variant='secondary'
152-
onClick={() => {
153-
setUploadModalOpen(true);
154-
}}
155-
>
156-
Import trace
157-
</Button> */}
158125
</HorizontalGroup>
159126
</InlineField>
160127
</InlineFieldRow>
@@ -177,7 +144,7 @@ export function QueryEditor({ datasource, query, onChange, onRunQuery }: Props)
177144
onChange={v => {
178145
onChange({
179146
...query,
180-
app_name: v?.value!,
147+
app_name: v?.value,
181148
service: query.app_name !== v?.value ? [] : query.service,
182149
spans: query.app_name !== v?.value ? [] : query.spans,
183150
});

src/trace/src/components/SearchForm.tsx

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
import { css } from '@emotion/css';
2-
import { type SelectableValue, toOption } from '@grafana/data';
3-
import { getTemplateSrv } from '@grafana/runtime';
2+
import type { SelectableValue } from '@grafana/data';
43
import { fuzzyMatch, InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';
5-
// import { notifyApp } from 'grafana/app/core/actions';
6-
// import { createErrorNotification } from 'grafana/app/core/copy/appNotification';
7-
// import { dispatch } from 'grafana/app/store/store';
84
import React, { useCallback, useEffect, useState } from 'react';
95

106
import type TraceDatasource from '../datasource';
117
import type { TraceQuery } from '../types';
128
import { transformToLogfmt } from '../util';
139
import { t } from 'common/utils/utils';
10+
import { getTemplateSrv } from '@grafana/runtime';
1411

1512
const durationPlaceholder = 'e.g. 1.2s, 100ms, 500us';
1613

@@ -40,16 +37,15 @@ export function SearchForm({ datasource, query, onChange }: Props) {
4037
setIsLoading(prevValue => ({ ...prevValue, [loaderOfType]: true }));
4138

4239
try {
43-
const values = await datasource.loadOptions(query.app_name!, field);
40+
if (!query.app_name) return [];
41+
const values = await datasource.loadOptions(query.app_name, field);
4442
if (!values?.length) {
4543
return [{ label: `No ${loaderOfType} found`, value: `No ${loaderOfType} found` }];
4644
}
47-
4845
const options: SelectableValue[] = values.sort().map(option => ({
4946
label: option.text,
5047
value: option.value,
5148
}));
52-
5349
const filteredOptions = options.filter(item => (item.value ? fuzzyMatch(item.value, keyword).found : false));
5450
return filteredOptions;
5551
} catch (error) {
@@ -65,28 +61,26 @@ export function SearchForm({ datasource, query, onChange }: Props) {
6561
);
6662

6763
useEffect(() => {
68-
const getOperations = async () => {
64+
const getSpans = async () => {
6965
const spansOptions = await loadOptions('spans', 'span_name');
70-
// if (query.spans && getTemplateSrv().containsTemplate(query.spans)) {
71-
// spans.push(toOption(query.spans));
72-
// }
7366
setOperationOptions([...spansOptions]);
7467
};
75-
if (query.app_name) {
76-
getOperations();
77-
}
68+
query.app_name && getSpans();
7869
}, [datasource, query.app_name, loadOptions]);
7970
useEffect(() => {
8071
const getServices = async () => {
8172
const serviceOptions = await loadOptions('services', 'resource.service.name');
82-
// if (query.service && getTemplateSrv().containsTemplate(query.service)) {
83-
// spans.push(toOption(query.service));
84-
// }
73+
if (query.service?.length && getTemplateSrv().containsTemplate()) {
74+
for (const service of query.service) {
75+
serviceOptions.push({
76+
label: service,
77+
value: service,
78+
});
79+
}
80+
}
8581
setServiceOptions([...serviceOptions]);
8682
};
87-
if (query.app_name) {
88-
getServices();
89-
}
83+
query.app_name && getServices();
9084
}, [datasource, query.app_name, loadOptions]);
9185
return (
9286
<div className={css({ maxWidth: '500px' })}>
@@ -210,14 +204,15 @@ export function SearchForm({ datasource, query, onChange }: Props) {
210204
<InlineField
211205
label='Limit'
212206
labelWidth={14}
213-
tooltip='Maximum number of returned results'
207+
tooltip='Maximum number of returned results, default is 10'
214208
grow
215209
>
216210
<Input
217211
id='limit'
218212
name='limit'
219213
type='number'
220214
value={query.limit || ''}
215+
placeholder='e.g. 10'
221216
onChange={v =>
222217
onChange({
223218
...query,

0 commit comments

Comments
 (0)