diff --git a/pkg/services/live/live.go b/pkg/services/live/live.go index e3f618e8dda..58a0fd0d7a0 100644 --- a/pkg/services/live/live.go +++ b/pkg/services/live/live.go @@ -173,7 +173,9 @@ func ProvideService(plugCtxProvider *plugincontext.Provider, cfg *setting.Cfg, r FrameStorage: pipeline.NewFrameStorage(), } } else { - storage := &pipeline.FileStorage{} + storage := &pipeline.FileStorage{ + DataPath: cfg.DataPath, + } g.channelRuleStorage = storage builder = &pipeline.StorageRuleBuilder{ Node: node, diff --git a/pkg/services/live/pipeline/storage_file.go b/pkg/services/live/pipeline/storage_file.go index 2ab33a6efae..384f298921d 100644 --- a/pkg/services/live/pipeline/storage_file.go +++ b/pkg/services/live/pipeline/storage_file.go @@ -3,19 +3,25 @@ package pipeline import ( "context" "encoding/json" + "fmt" "io/ioutil" - "os" + "path/filepath" ) // FileStorage can load channel rules from a file on disk. -type FileStorage struct{} +type FileStorage struct { + DataPath string +} func (f *FileStorage) ListRemoteWriteBackends(_ context.Context, orgID int64) ([]RemoteWriteBackend, error) { - backendBytes, _ := ioutil.ReadFile(os.Getenv("GF_LIVE_REMOTE_WRITE_BACKENDS_FILE")) - var remoteWriteBackends RemoteWriteBackends - err := json.Unmarshal(backendBytes, &remoteWriteBackends) + backendBytes, err := ioutil.ReadFile(filepath.Join(f.DataPath, "pipeline", "remote-write-backends.json")) if err != nil { - return nil, err + return nil, fmt.Errorf("can't read ./pipeline/remote-write-backends.json file: %w", 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 { @@ -27,11 +33,14 @@ func (f *FileStorage) ListRemoteWriteBackends(_ context.Context, orgID int64) ([ } func (f *FileStorage) ListChannelRules(_ context.Context, orgID int64) ([]ChannelRule, error) { - ruleBytes, _ := ioutil.ReadFile(os.Getenv("GF_LIVE_CHANNEL_RULES_FILE")) - var channelRules ChannelRules - err := json.Unmarshal(ruleBytes, &channelRules) + ruleBytes, err := ioutil.ReadFile(filepath.Join(f.DataPath, "pipeline", "live-channel-rules.json")) if err != nil { - return nil, err + return nil, fmt.Errorf("can't read ./data/live-channel-rules.json file: %w", err) + } + var channelRules ChannelRules + err = json.Unmarshal(ruleBytes, &channelRules) + if err != nil { + return nil, fmt.Errorf("can't unmarshal live-channel-rules.json data: %w", err) } var rules []ChannelRule for _, r := range channelRules.Rules { diff --git a/public/app/features/live/pages/CloudAdminPage.tsx b/public/app/features/live/pages/CloudAdminPage.tsx index ed23dbed4d5..70699cd3229 100644 --- a/public/app/features/live/pages/CloudAdminPage.tsx +++ b/public/app/features/live/pages/CloudAdminPage.tsx @@ -10,6 +10,7 @@ import { GrafanaCloudBackend } from './types'; export default function CloudAdminPage() { const navModel = useNavModel('live-cloud'); const [cloud, setCloud] = useState([]); + const [error, setError] = useState(); const styles = useStyles(getStyles); useEffect(() => { @@ -18,12 +19,17 @@ export default function CloudAdminPage() { .then((data) => { setCloud(data.remoteWriteBackends); }) - .catch((e) => console.error(e)); + .catch((e) => { + if (e.data) { + setError(JSON.stringify(e.data, null, 2)); + } + }); }, []); return ( + {error &&
{error}
} {!cloud && <>Loading cloud definitions} {cloud && cloud.map((v) => { diff --git a/public/app/features/live/pages/PipelineAdminPage.tsx b/public/app/features/live/pages/PipelineAdminPage.tsx index 0d18f6da25b..b7d03506046 100644 --- a/public/app/features/live/pages/PipelineAdminPage.tsx +++ b/public/app/features/live/pages/PipelineAdminPage.tsx @@ -24,6 +24,7 @@ export default function PipelineAdminPage() { const [selectedRule, setSelectedRule] = useState(); const [defaultRules, setDefaultRules] = useState([]); const navModel = useNavModel('live-pipeline'); + const [error, setError] = useState(); const styles = useStyles(getStyles); useEffect(() => { @@ -33,7 +34,11 @@ export default function PipelineAdminPage() { setRules(data.rules); setDefaultRules(data.rules); }) - .catch((e) => console.error(e)); + .catch((e) => { + if (e.data) { + setError(JSON.stringify(e.data, null, 2)); + } + }); }, []); const onRowClick = (event: any) => { @@ -57,6 +62,7 @@ export default function PipelineAdminPage() { return ( + {error &&
{error}
}