diff --git a/pkg/api/api.go b/pkg/api/api.go
index b6cd4cd72bb..32c929a42e2 100644
--- a/pkg/api/api.go
+++ b/pkg/api/api.go
@@ -4,7 +4,7 @@ import (
"github.com/go-macaron/binding"
"github.com/grafana/grafana/pkg/api/avatar"
"github.com/grafana/grafana/pkg/api/dtos"
- "github.com/grafana/grafana/pkg/live"
+ "github.com/grafana/grafana/pkg/api/live"
"github.com/grafana/grafana/pkg/middleware"
m "github.com/grafana/grafana/pkg/models"
"gopkg.in/macaron.v1"
diff --git a/pkg/live/conn.go b/pkg/api/live/conn.go
similarity index 100%
rename from pkg/live/conn.go
rename to pkg/api/live/conn.go
diff --git a/pkg/live/hub.go b/pkg/api/live/hub.go
similarity index 100%
rename from pkg/live/hub.go
rename to pkg/api/live/hub.go
diff --git a/pkg/api/search.go b/pkg/api/search.go
index 6123db5778c..5ec95971033 100644
--- a/pkg/api/search.go
+++ b/pkg/api/search.go
@@ -1,11 +1,11 @@
package api
import (
+ "strconv"
+
"github.com/grafana/grafana/pkg/bus"
- "github.com/grafana/grafana/pkg/live"
"github.com/grafana/grafana/pkg/middleware"
"github.com/grafana/grafana/pkg/services/search"
- "strconv"
)
func Search(c *middleware.Context) {
@@ -43,6 +43,4 @@ func Search(c *middleware.Context) {
}
c.JSON(200, searchQuery.Result)
-
- live.SendMessage(query)
}
diff --git a/public/app/core/core.ts b/public/app/core/core.ts
index 32ddee02dc7..fac703ba5c2 100644
--- a/public/app/core/core.ts
+++ b/public/app/core/core.ts
@@ -28,6 +28,7 @@ import {infoPopover} from './components/info_popover';
import {colorPicker} from './components/colorpicker';
import {navbarDirective} from './components/navbar/navbar';
import {arrayJoin} from './directives/array_join';
+import {liveSrv} from './live/live_srv';
import 'app/core/controllers/all';
import 'app/core/services/all';
import 'app/core/routes/routes';
@@ -42,5 +43,6 @@ export {
navbarDirective,
searchDirective,
colorPicker,
+ liveSrv,
infoPopover
};
diff --git a/public/app/core/live/live_srv.ts b/public/app/core/live/live_srv.ts
new file mode 100644
index 00000000000..d417597e1ea
--- /dev/null
+++ b/public/app/core/live/live_srv.ts
@@ -0,0 +1,31 @@
+///
+
+import config from 'app/core/config';
+import coreModule from 'app/core/core_module';
+
+export class LiveSrv {
+ conn: any;
+
+ init() {
+ this.conn = new WebSocket("ws://localhost:3000/ws");
+ this.conn.onclose = function(evt) {
+ console.log("WebSocket closed");
+ };
+ this.conn.onmessage = function(evt) {
+ console.log("WebSocket message", evt.data);
+ };
+ this.conn.onopen = function(evt) {
+ console.log("Connection opened");
+ };
+ }
+
+ subscribe(name) {
+ if (!this.conn) {
+ this.init();
+ }
+ }
+
+}
+
+var instance = new LiveSrv();
+export {instance as liveSrv};
diff --git a/public/app/features/admin/admin.ts b/public/app/features/admin/admin.ts
index a76ed6ea6b1..b93fd07a059 100644
--- a/public/app/features/admin/admin.ts
+++ b/public/app/features/admin/admin.ts
@@ -20,14 +20,6 @@ class AdminSettingsCtrl {
class AdminHomeCtrl {
/** @ngInject **/
constructor() {
-
- var conn = new WebSocket("ws://localhost:3000/ws");
- conn.onclose = function(evt) {
- console.log("Connection closed");
- };
- conn.onmessage = function(evt) {
- console.log("message", evt.data);
- };
}
}
diff --git a/public/app/plugins/datasource/stream/datasource.ts b/public/app/plugins/datasource/stream/datasource.ts
new file mode 100644
index 00000000000..ae2bb87dbef
--- /dev/null
+++ b/public/app/plugins/datasource/stream/datasource.ts
@@ -0,0 +1,21 @@
+///
+
+import {liveSrv} from 'app/core/core';
+
+export class GrafanaStreamDS {
+
+ /** @ngInject */
+ constructor(private $q) {
+
+ }
+
+ query(options) {
+ if (options.targets.length === 0) {
+ return Promise.resolve({data: []});
+ }
+
+ var target = options.targets[0];
+ liveSrv.subscribe(target);
+ }
+}
+
diff --git a/public/app/plugins/datasource/stream/module.ts b/public/app/plugins/datasource/stream/module.ts
new file mode 100644
index 00000000000..b17abd02feb
--- /dev/null
+++ b/public/app/plugins/datasource/stream/module.ts
@@ -0,0 +1,15 @@
+///
+
+import angular from 'angular';
+import {GrafanaStreamDS} from './datasource';
+import {QueryCtrl} from 'app/plugins/sdk';
+
+class GrafanaQueryCtrl extends QueryCtrl {
+ static templateUrl = 'partials/query.editor.html';
+}
+
+export {
+ GrafanaStreamDS as Datasource,
+ GrafanaQueryCtrl as QueryCtrl,
+};
+
diff --git a/public/app/plugins/datasource/stream/partials/query.editor.html b/public/app/plugins/datasource/stream/partials/query.editor.html
new file mode 100644
index 00000000000..6a8554d017d
--- /dev/null
+++ b/public/app/plugins/datasource/stream/partials/query.editor.html
@@ -0,0 +1,8 @@
+
+
+ Stream Expression
+
+
+
+
+
diff --git a/public/app/plugins/datasource/stream/plugin.json b/public/app/plugins/datasource/stream/plugin.json
new file mode 100644
index 00000000000..df5fee586ed
--- /dev/null
+++ b/public/app/plugins/datasource/stream/plugin.json
@@ -0,0 +1,8 @@
+{
+ "type": "datasource",
+ "name": "Grafana Stream DS",
+ "id": "grafana-stream-ds",
+
+ "builtIn": true,
+ "metrics": true
+}