From f4e78ea27b31ee1c8cd1385e37c531d60c5e5e13 Mon Sep 17 00:00:00 2001 From: An Date: Tue, 19 Oct 2021 03:50:17 -0400 Subject: [PATCH] Live: Test Converter tab (#40536) --- pkg/api/index.go | 4 +- pkg/services/live/pipeline/registry.go | 4 +- pkg/services/live/pipeline/storage_file.go | 11 +- .../features/live/pages/PipelineAdminPage.tsx | 4 +- public/app/features/live/pages/RuleTest.tsx | 108 ++++++++++++++++++ public/app/features/live/pages/routes.ts | 6 + public/app/features/live/pages/types.ts | 7 +- public/app/features/live/pages/utils.ts | 10 +- 8 files changed, 143 insertions(+), 11 deletions(-) create mode 100644 public/app/features/live/pages/RuleTest.tsx diff --git a/pkg/api/index.go b/pkg/api/index.go index 36211035bca..c566245182d 100644 --- a/pkg/api/index.go +++ b/pkg/api/index.go @@ -314,7 +314,9 @@ func (hs *HTTPServer) getNavTree(c *models.ReqContext, hasEditPerm bool) ([]*dto liveNavLinks = append(liveNavLinks, &dtos.NavLink{ Text: "Cloud", Id: "live-cloud", Url: hs.Cfg.AppSubURL + "/live/cloud", Icon: "cloud-upload", }) - + liveNavLinks = append(liveNavLinks, &dtos.NavLink{ + Text: "Test", Id: "live-test", Url: hs.Cfg.AppSubURL + "/live/test", Icon: "arrow", + }) navTree = append(navTree, &dtos.NavLink{ Id: "live", Text: "Live", diff --git a/pkg/services/live/pipeline/registry.go b/pkg/services/live/pipeline/registry.go index 351031315f2..f60e056f477 100644 --- a/pkg/services/live/pipeline/registry.go +++ b/pkg/services/live/pipeline/registry.go @@ -58,7 +58,9 @@ var ConvertersRegistry = []EntityInfo{ { Type: ConverterTypeInfluxAuto, Description: "accept influx line protocol", - Example: AutoInfluxConverterConfig{}, + Example: AutoInfluxConverterConfig{ + FrameFormat: "labels_column", + }, }, { Type: ConverterTypeJsonFrame, diff --git a/pkg/services/live/pipeline/storage_file.go b/pkg/services/live/pipeline/storage_file.go index 02431dbb0c9..042261355eb 100644 --- a/pkg/services/live/pipeline/storage_file.go +++ b/pkg/services/live/pipeline/storage_file.go @@ -16,16 +16,19 @@ type FileStorage struct { } func (f *FileStorage) ListRemoteWriteBackends(_ context.Context, orgID int64) ([]RemoteWriteBackend, error) { - backendBytes, err := ioutil.ReadFile(filepath.Join(f.DataPath, "pipeline", "remote-write-backends.json")) + cfgfile := filepath.Join(f.DataPath, "pipeline", "remote-write-backends.json") + var backends []RemoteWriteBackend + // Safe to ignore gosec warning G304. + // nolint:gosec + backendBytes, err := ioutil.ReadFile(cfgfile) if err != nil { - return nil, fmt.Errorf("can't read ./pipeline/remote-write-backends.json file: %w", err) + return backends, fmt.Errorf("can't read %s file: %w", cfgfile, err) } var remoteWriteBackends RemoteWriteBackends err = json.Unmarshal(backendBytes, &remoteWriteBackends) if err != nil { return nil, fmt.Errorf("can't unmarshal remote-write-backends.json data: %w", err) } - var backends []RemoteWriteBackend for _, b := range remoteWriteBackends.Backends { if b.OrgId == orgID || (orgID == 1 && b.OrgId == 0) { backends = append(backends, b) @@ -114,7 +117,7 @@ func (f *FileStorage) readRules() (ChannelRules, error) { // nolint:gosec ruleBytes, err := ioutil.ReadFile(ruleFile) if err != nil { - return ChannelRules{}, fmt.Errorf("can't read ./data/live-channel-rules.json file: %w", err) + return ChannelRules{}, fmt.Errorf("can't read pipeline rules: %s: %w", f.ruleFilePath(), err) } var channelRules ChannelRules err = json.Unmarshal(ruleBytes, &channelRules) diff --git a/public/app/features/live/pages/PipelineAdminPage.tsx b/public/app/features/live/pages/PipelineAdminPage.tsx index 8a6120f15b7..99bdf32b2fd 100644 --- a/public/app/features/live/pages/PipelineAdminPage.tsx +++ b/public/app/features/live/pages/PipelineAdminPage.tsx @@ -31,8 +31,8 @@ export default function PipelineAdminPage() { getBackendSrv() .get(`api/live/channel-rules`) .then((data) => { - setRules(data.rules); - setDefaultRules(data.rules); + setRules(data.rules ?? []); + setDefaultRules(data.rules ?? []); }) .catch((e) => { if (e.data) { diff --git a/public/app/features/live/pages/RuleTest.tsx b/public/app/features/live/pages/RuleTest.tsx new file mode 100644 index 00000000000..93a56559219 --- /dev/null +++ b/public/app/features/live/pages/RuleTest.tsx @@ -0,0 +1,108 @@ +import React, { useState, useEffect } from 'react'; +import { Button, CodeEditor, Table, useStyles, Select, Field } from '@grafana/ui'; +import { ChannelFrame, Rule } from './types'; +import Page from 'app/core/components/Page/Page'; +import { useNavModel } from 'app/core/hooks/useNavModel'; +import { getBackendSrv, config } from '@grafana/runtime'; +import { css } from '@emotion/css'; +import { getDisplayProcessor, GrafanaTheme, StreamingDataFrame } from '@grafana/data'; +import { transformLabel } from './utils'; + +export default function RuleTest() { + const navModel = useNavModel('live-test'); + const [response, setResponse] = useState(); + const [data, setData] = useState(); + const [rules, setRules] = useState([]); + const [channelRules, setChannelRules] = useState(); + const [channelSelected, setChannelSelected] = useState(); + const styles = useStyles(getStyles); + useEffect(() => { + getBackendSrv() + .get(`api/live/channel-rules`) + .then((data) => { + setRules(data.rules); + }) + .catch((e) => { + if (e.data) { + console.log(e); + } + }); + }, []); + + const onBlur = (text: string) => { + setData(text); + }; + + const onClick = () => { + getBackendSrv() + .post(`api/live/pipeline-convert-test`, { + channelRules: channelRules, + channel: channelSelected, + data: data, + }) + .then((data: any) => { + const t = data.channelFrames as any[]; + if (t) { + setResponse( + t.map((f) => { + const frame = new StreamingDataFrame(f.frame); + for (const field of frame.fields) { + field.display = getDisplayProcessor({ field, theme: config.theme2 }); + } + return { channel: f.channel, frame }; + }) + ); + } + }) + .catch((e) => { + setResponse(e); + }); + }; + + return ( + + + +