Chore: Remove dead code (#28664)
Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com>
This commit is contained in:
@@ -9,21 +9,6 @@ import (
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
)
|
||||
|
||||
type AlertRule struct {
|
||||
Id int64 `json:"id"`
|
||||
DashboardId int64 `json:"dashboardId"`
|
||||
PanelId int64 `json:"panelId"`
|
||||
Name string `json:"name"`
|
||||
Message string `json:"message"`
|
||||
State models.AlertStateType `json:"state"`
|
||||
NewStateDate time.Time `json:"newStateDate"`
|
||||
EvalDate time.Time `json:"evalDate"`
|
||||
EvalData *simplejson.Json `json:"evalData"`
|
||||
ExecutionError string `json:"executionError"`
|
||||
Url string `json:"url"`
|
||||
CanEdit bool `json:"canEdit"`
|
||||
}
|
||||
|
||||
func formatShort(interval time.Duration) string {
|
||||
var result string
|
||||
|
||||
|
||||
@@ -65,20 +65,6 @@ func (sm *staticMap) Set(dir *http.Dir) {
|
||||
sm.data[string(*dir)] = dir
|
||||
}
|
||||
|
||||
func (sm *staticMap) Get(name string) *http.Dir {
|
||||
sm.lock.RLock()
|
||||
defer sm.lock.RUnlock()
|
||||
|
||||
return sm.data[name]
|
||||
}
|
||||
|
||||
func (sm *staticMap) Delete(name string) {
|
||||
sm.lock.Lock()
|
||||
defer sm.lock.Unlock()
|
||||
|
||||
delete(sm.data, name)
|
||||
}
|
||||
|
||||
var statics = staticMap{sync.RWMutex{}, map[string]*http.Dir{}}
|
||||
|
||||
// staticFileSystem implements http.FileSystem interface.
|
||||
@@ -197,22 +183,3 @@ func Static(directory string, staticOpt ...StaticOptions) macaron.Handler {
|
||||
staticHandler(ctx, log, opt)
|
||||
}
|
||||
}
|
||||
|
||||
// Statics registers multiple static middleware handlers all at once.
|
||||
func Statics(opt StaticOptions, dirs ...string) macaron.Handler {
|
||||
if len(dirs) == 0 {
|
||||
panic("no static directory is given")
|
||||
}
|
||||
opts := make([]StaticOptions, len(dirs))
|
||||
for i := range dirs {
|
||||
opts[i] = prepareStaticOption(dirs[i], opt)
|
||||
}
|
||||
|
||||
return func(ctx *macaron.Context, log *log.Logger) {
|
||||
for i := range opts {
|
||||
if staticHandler(ctx, log, opts[i]) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,6 @@ import (
|
||||
// HandlerFunc defines a handler function interface.
|
||||
type HandlerFunc interface{}
|
||||
|
||||
// CtxHandlerFunc defines a context handler function.
|
||||
type CtxHandlerFunc func()
|
||||
|
||||
// Msg defines a message interface.
|
||||
type Msg interface{}
|
||||
|
||||
@@ -204,14 +201,6 @@ func Publish(msg Msg) error {
|
||||
return globalBus.Publish(msg)
|
||||
}
|
||||
|
||||
// InTransaction starts a transaction and store it in the context.
|
||||
// The caller can then pass a function with multiple DispatchCtx calls that
|
||||
// all will be executed in the same transaction. InTransaction will rollback if the
|
||||
// callback returns an error.
|
||||
func InTransaction(ctx context.Context, fn func(ctx context.Context) error) error {
|
||||
return globalBus.InTransaction(ctx, fn)
|
||||
}
|
||||
|
||||
func ClearBusHandlers() {
|
||||
globalBus = New()
|
||||
}
|
||||
|
||||
@@ -36,13 +36,6 @@ func New(logger string, ctx ...interface{}) Logger {
|
||||
return Root.New(params...)
|
||||
}
|
||||
|
||||
// NewWithLevel returns a new logger with a certain level.
|
||||
func NewWithLevel(name string, level log15.Lvl) Logger {
|
||||
logger := Root.New("logger", name)
|
||||
logger.SetHandler(log15.LvlFilterHandler(level, log15.StreamHandler(os.Stdout, getLogFormat("console"))))
|
||||
return logger
|
||||
}
|
||||
|
||||
func Tracef(format string, v ...interface{}) {
|
||||
var message string
|
||||
if len(v) > 0 {
|
||||
@@ -91,10 +84,6 @@ func Errorf(skip int, format string, v ...interface{}) {
|
||||
Root.Error(fmt.Sprintf(format, v...))
|
||||
}
|
||||
|
||||
func Criticalf(skip int, format string, v ...interface{}) {
|
||||
Root.Crit(fmt.Sprintf(format, v...))
|
||||
}
|
||||
|
||||
func Fatalf(skip int, format string, v ...interface{}) {
|
||||
Root.Crit(fmt.Sprintf(format, v...))
|
||||
Close()
|
||||
@@ -114,25 +103,6 @@ func Reload() {
|
||||
}
|
||||
}
|
||||
|
||||
func GetLogLevelFor(name string) Lvl {
|
||||
if level, ok := filters[name]; ok {
|
||||
switch level {
|
||||
case log15.LvlWarn:
|
||||
return LvlWarn
|
||||
case log15.LvlInfo:
|
||||
return LvlInfo
|
||||
case log15.LvlError:
|
||||
return LvlError
|
||||
case log15.LvlCrit:
|
||||
return LvlCrit
|
||||
default:
|
||||
return LvlDebug
|
||||
}
|
||||
}
|
||||
|
||||
return LvlInfo
|
||||
}
|
||||
|
||||
var logLevels = map[string]log15.Lvl{
|
||||
"trace": log15.LvlDebug,
|
||||
"debug": log15.LvlDebug,
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
package log
|
||||
|
||||
import (
|
||||
"io"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type logWriterImpl struct {
|
||||
log Logger
|
||||
level Lvl
|
||||
prefix string
|
||||
}
|
||||
|
||||
func NewLogWriter(log Logger, level Lvl, prefix string) io.Writer {
|
||||
return &logWriterImpl{
|
||||
log: log,
|
||||
level: level,
|
||||
prefix: prefix,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *logWriterImpl) Write(p []byte) (n int, err error) {
|
||||
message := l.prefix + strings.TrimSpace(string(p))
|
||||
|
||||
switch l.level {
|
||||
case LvlCrit:
|
||||
l.log.Crit(message)
|
||||
case LvlError:
|
||||
l.log.Error(message)
|
||||
case LvlWarn:
|
||||
l.log.Warn(message)
|
||||
case LvlInfo:
|
||||
l.log.Info(message)
|
||||
default:
|
||||
l.log.Debug(message)
|
||||
}
|
||||
|
||||
return len(p), nil
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
package log
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/inconshreveable/log15"
|
||||
)
|
||||
|
||||
type FakeLogger struct {
|
||||
m map[string]string
|
||||
}
|
||||
|
||||
func (f *FakeLogger) New(ctx ...interface{}) log15.Logger {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *FakeLogger) Debug(msg string, ctx ...interface{}) {
|
||||
f.m["debug"] = msg
|
||||
}
|
||||
|
||||
func (f *FakeLogger) Info(msg string, ctx ...interface{}) {
|
||||
f.m["info"] = msg
|
||||
}
|
||||
|
||||
func (f *FakeLogger) Warn(msg string, ctx ...interface{}) {
|
||||
f.m["warn"] = msg
|
||||
}
|
||||
|
||||
func (f *FakeLogger) Error(msg string, ctx ...interface{}) {
|
||||
f.m["err"] = msg
|
||||
}
|
||||
|
||||
func (f *FakeLogger) Crit(msg string, ctx ...interface{}) {
|
||||
f.m["crit"] = msg
|
||||
}
|
||||
|
||||
func (f *FakeLogger) GetHandler() log15.Handler {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *FakeLogger) SetHandler(l log15.Handler) {}
|
||||
|
||||
func TestLogWriter_level(t *testing.T) {
|
||||
tests := []struct {
|
||||
description string
|
||||
logger string
|
||||
prefix string
|
||||
level Lvl
|
||||
input []byte
|
||||
expectedConsumed int
|
||||
expectedOutput string
|
||||
}{
|
||||
{
|
||||
description: "level crit",
|
||||
logger: "crit",
|
||||
input: []byte("crit"),
|
||||
level: LvlCrit,
|
||||
expectedConsumed: 4,
|
||||
expectedOutput: "crit",
|
||||
},
|
||||
{
|
||||
description: "level error",
|
||||
logger: "err",
|
||||
input: []byte("error"),
|
||||
level: LvlError,
|
||||
expectedConsumed: 5,
|
||||
expectedOutput: "error",
|
||||
},
|
||||
{
|
||||
description: "level warn",
|
||||
logger: "warn",
|
||||
input: []byte("warn"),
|
||||
level: LvlWarn,
|
||||
expectedConsumed: 4,
|
||||
expectedOutput: "warn",
|
||||
},
|
||||
{
|
||||
description: "level info",
|
||||
logger: "info",
|
||||
input: []byte("info"),
|
||||
level: LvlInfo,
|
||||
expectedConsumed: 4,
|
||||
expectedOutput: "info",
|
||||
},
|
||||
{
|
||||
description: "level debug",
|
||||
logger: "debug",
|
||||
input: []byte("debug"),
|
||||
level: LvlDebug,
|
||||
expectedConsumed: 5,
|
||||
expectedOutput: "debug",
|
||||
},
|
||||
{
|
||||
description: "prefix",
|
||||
logger: "debug",
|
||||
input: []byte("debug"),
|
||||
prefix: "prefix",
|
||||
level: LvlDebug,
|
||||
expectedConsumed: 5,
|
||||
expectedOutput: "prefixdebug",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range tests {
|
||||
tc := tc // to avoid timing issues
|
||||
|
||||
t.Run(tc.description, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
fake := &FakeLogger{m: map[string]string{}}
|
||||
|
||||
w := NewLogWriter(fake, tc.level, tc.prefix)
|
||||
n, err := w.Write(tc.input)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, tc.expectedConsumed, n)
|
||||
assert.Equal(t, tc.expectedOutput, fake.m[tc.logger])
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,11 @@ import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/inconshreveable/log15"
|
||||
"github.com/mattn/go-isatty"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"testing"
|
||||
@@ -15,11 +17,24 @@ import (
|
||||
"golang.org/x/oauth2"
|
||||
)
|
||||
|
||||
func getLogFormat() log15.Format {
|
||||
if isatty.IsTerminal(os.Stdout.Fd()) {
|
||||
return log15.TerminalFormat()
|
||||
}
|
||||
return log15.LogfmtFormat()
|
||||
}
|
||||
|
||||
func newLogger(name string, level log15.Lvl) log.Logger {
|
||||
logger := log.Root.New("logger", name)
|
||||
logger.SetHandler(log15.LvlFilterHandler(level, log15.StreamHandler(os.Stdout, getLogFormat())))
|
||||
return logger
|
||||
}
|
||||
|
||||
func TestSearchJSONForEmail(t *testing.T) {
|
||||
t.Run("Given a generic OAuth provider", func(t *testing.T) {
|
||||
provider := SocialGenericOAuth{
|
||||
SocialBase: &SocialBase{
|
||||
log: log.NewWithLevel("generic_oauth_test", log15.LvlDebug),
|
||||
log: newLogger("generic_oauth_test", log15.LvlDebug),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -107,7 +122,7 @@ func TestSearchJSONForRole(t *testing.T) {
|
||||
t.Run("Given a generic OAuth provider", func(t *testing.T) {
|
||||
provider := SocialGenericOAuth{
|
||||
SocialBase: &SocialBase{
|
||||
log: log.NewWithLevel("generic_oauth_test", log15.LvlDebug),
|
||||
log: newLogger("generic_oauth_test", log15.LvlDebug),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -170,7 +185,7 @@ func TestUserInfoSearchesForEmailAndRole(t *testing.T) {
|
||||
t.Run("Given a generic OAuth provider", func(t *testing.T) {
|
||||
provider := SocialGenericOAuth{
|
||||
SocialBase: &SocialBase{
|
||||
log: log.NewWithLevel("generic_oauth_test", log15.LvlDebug),
|
||||
log: newLogger("generic_oauth_test", log15.LvlDebug),
|
||||
},
|
||||
emailAttributePath: "email",
|
||||
}
|
||||
@@ -337,7 +352,7 @@ func TestUserInfoSearchesForLogin(t *testing.T) {
|
||||
t.Run("Given a generic OAuth provider", func(t *testing.T) {
|
||||
provider := SocialGenericOAuth{
|
||||
SocialBase: &SocialBase{
|
||||
log: log.NewWithLevel("generic_oauth_test", log15.LvlDebug),
|
||||
log: newLogger("generic_oauth_test", log15.LvlDebug),
|
||||
},
|
||||
loginAttributePath: "login",
|
||||
}
|
||||
@@ -432,7 +447,7 @@ func TestUserInfoSearchesForName(t *testing.T) {
|
||||
t.Run("Given a generic OAuth provider", func(t *testing.T) {
|
||||
provider := SocialGenericOAuth{
|
||||
SocialBase: &SocialBase{
|
||||
log: log.NewWithLevel("generic_oauth_test", log15.LvlDebug),
|
||||
log: newLogger("generic_oauth_test", log15.LvlDebug),
|
||||
},
|
||||
nameAttributePath: "name",
|
||||
}
|
||||
@@ -529,7 +544,7 @@ func TestUserInfoSearchesForName(t *testing.T) {
|
||||
func TestPayloadCompression(t *testing.T) {
|
||||
provider := SocialGenericOAuth{
|
||||
SocialBase: &SocialBase{
|
||||
log: log.NewWithLevel("generic_oauth_test", log15.LvlDebug),
|
||||
log: newLogger("generic_oauth_test", log15.LvlDebug),
|
||||
},
|
||||
emailAttributePath: "email",
|
||||
}
|
||||
|
||||
@@ -272,11 +272,6 @@ func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard {
|
||||
return dash
|
||||
}
|
||||
|
||||
// GetString a
|
||||
func (d *Dashboard) GetString(prop string, defaultValue string) string {
|
||||
return d.Data.Get(prop).MustString(defaultValue)
|
||||
}
|
||||
|
||||
// UpdateSlug updates the slug
|
||||
func (d *Dashboard) UpdateSlug() {
|
||||
title := d.Data.Get("title").MustString()
|
||||
|
||||
@@ -1,81 +0,0 @@
|
||||
package coreplugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/plugins/backendplugin"
|
||||
"github.com/grafana/grafana/pkg/tsdb"
|
||||
)
|
||||
|
||||
type corePlugin struct {
|
||||
pluginID string
|
||||
logger log.Logger
|
||||
backend.CheckHealthHandler
|
||||
backend.CallResourceHandler
|
||||
backend.QueryDataHandler
|
||||
}
|
||||
|
||||
// New returns a new backendplugin.PluginFactoryFunc for creating a core (built-in) backendplugin.Plugin.
|
||||
func New(opts backend.ServeOpts) backendplugin.PluginFactoryFunc {
|
||||
return backendplugin.PluginFactoryFunc(func(pluginID string, logger log.Logger, env []string) (backendplugin.Plugin, error) {
|
||||
return &corePlugin{
|
||||
pluginID: pluginID,
|
||||
logger: logger,
|
||||
CheckHealthHandler: opts.CheckHealthHandler,
|
||||
CallResourceHandler: opts.CallResourceHandler,
|
||||
QueryDataHandler: opts.QueryDataHandler,
|
||||
}, nil
|
||||
})
|
||||
}
|
||||
|
||||
func (cp *corePlugin) PluginID() string {
|
||||
return cp.pluginID
|
||||
}
|
||||
|
||||
func (cp *corePlugin) Logger() log.Logger {
|
||||
return cp.logger
|
||||
}
|
||||
|
||||
func (cp *corePlugin) Start(ctx context.Context) error {
|
||||
if cp.QueryDataHandler != nil {
|
||||
tsdb.RegisterTsdbQueryEndpoint(cp.pluginID, func(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) {
|
||||
return newQueryEndpointAdapter(cp.pluginID, cp.logger, backendplugin.InstrumentQueryDataHandler(cp.QueryDataHandler)), nil
|
||||
})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cp *corePlugin) Stop(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (cp *corePlugin) IsManaged() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (cp *corePlugin) Exited() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (cp *corePlugin) CollectMetrics(ctx context.Context) (*backend.CollectMetricsResult, error) {
|
||||
return nil, backendplugin.ErrMethodNotImplemented
|
||||
}
|
||||
|
||||
func (cp *corePlugin) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
||||
if cp.CheckHealthHandler != nil {
|
||||
return cp.CheckHealthHandler.CheckHealth(ctx, req)
|
||||
}
|
||||
|
||||
return nil, backendplugin.ErrMethodNotImplemented
|
||||
}
|
||||
|
||||
func (cp *corePlugin) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
|
||||
if cp.CallResourceHandler != nil {
|
||||
return cp.CallResourceHandler.CallResource(ctx, req, sender)
|
||||
}
|
||||
|
||||
return backendplugin.ErrMethodNotImplemented
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
package coreplugin_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/plugins/backendplugin"
|
||||
"github.com/grafana/grafana/pkg/plugins/backendplugin/coreplugin"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCorePlugin(t *testing.T) {
|
||||
t.Run("New core plugin with empty opts should return expected values", func(t *testing.T) {
|
||||
factory := coreplugin.New(backend.ServeOpts{})
|
||||
p, err := factory("plugin", log.New("test"), nil)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, p)
|
||||
require.NoError(t, p.Start(context.Background()))
|
||||
require.NoError(t, p.Stop(context.Background()))
|
||||
require.False(t, p.IsManaged())
|
||||
require.False(t, p.Exited())
|
||||
|
||||
_, err = p.CollectMetrics(context.Background())
|
||||
require.Equal(t, backendplugin.ErrMethodNotImplemented, err)
|
||||
|
||||
_, err = p.CheckHealth(context.Background(), nil)
|
||||
require.Equal(t, backendplugin.ErrMethodNotImplemented, err)
|
||||
|
||||
err = p.CallResource(context.Background(), nil, nil)
|
||||
require.Equal(t, backendplugin.ErrMethodNotImplemented, err)
|
||||
})
|
||||
|
||||
t.Run("New core plugin with handlers set in opts should return expected values", func(t *testing.T) {
|
||||
checkHealthCalled := false
|
||||
callResourceCalled := false
|
||||
factory := coreplugin.New(backend.ServeOpts{
|
||||
CheckHealthHandler: backend.CheckHealthHandlerFunc(func(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) {
|
||||
checkHealthCalled = true
|
||||
return nil, nil
|
||||
}),
|
||||
CallResourceHandler: backend.CallResourceHandlerFunc(func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error {
|
||||
callResourceCalled = true
|
||||
return nil
|
||||
}),
|
||||
})
|
||||
p, err := factory("plugin", log.New("test"), nil)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, p)
|
||||
require.NoError(t, p.Start(context.Background()))
|
||||
require.NoError(t, p.Stop(context.Background()))
|
||||
require.False(t, p.IsManaged())
|
||||
require.False(t, p.Exited())
|
||||
|
||||
_, err = p.CollectMetrics(context.Background())
|
||||
require.Equal(t, backendplugin.ErrMethodNotImplemented, err)
|
||||
|
||||
_, err = p.CheckHealth(context.Background(), &backend.CheckHealthRequest{})
|
||||
require.NoError(t, err)
|
||||
require.True(t, checkHealthCalled)
|
||||
|
||||
err = p.CallResource(context.Background(), &backend.CallResourceRequest{}, nil)
|
||||
require.NoError(t, err)
|
||||
require.True(t, callResourceCalled)
|
||||
})
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
package coreplugin
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||
"github.com/grafana/grafana/pkg/infra/log"
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
"github.com/grafana/grafana/pkg/plugins/datasource/wrapper"
|
||||
"github.com/grafana/grafana/pkg/tsdb"
|
||||
)
|
||||
|
||||
func newQueryEndpointAdapter(pluginID string, logger log.Logger, handler backend.QueryDataHandler) tsdb.TsdbQueryEndpoint {
|
||||
return &queryEndpointAdapter{
|
||||
pluginID: pluginID,
|
||||
logger: logger,
|
||||
handler: handler,
|
||||
}
|
||||
}
|
||||
|
||||
type queryEndpointAdapter struct {
|
||||
pluginID string
|
||||
logger log.Logger
|
||||
handler backend.QueryDataHandler
|
||||
}
|
||||
|
||||
func modelToInstanceSettings(ds *models.DataSource) (*backend.DataSourceInstanceSettings, error) {
|
||||
jsonDataBytes, err := ds.JsonData.MarshalJSON()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &backend.DataSourceInstanceSettings{
|
||||
ID: ds.Id,
|
||||
Name: ds.Name,
|
||||
URL: ds.Url,
|
||||
Database: ds.Database,
|
||||
User: ds.User,
|
||||
BasicAuthEnabled: ds.BasicAuth,
|
||||
BasicAuthUser: ds.BasicAuthUser,
|
||||
JSONData: jsonDataBytes,
|
||||
DecryptedSecureJSONData: ds.DecryptedValues(),
|
||||
Updated: ds.Updated,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (a *queryEndpointAdapter) Query(ctx context.Context, ds *models.DataSource, query *tsdb.TsdbQuery) (*tsdb.Response, error) {
|
||||
instanceSettings, err := modelToInstanceSettings(ds)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req := &backend.QueryDataRequest{
|
||||
PluginContext: backend.PluginContext{
|
||||
OrgID: ds.OrgId,
|
||||
PluginID: a.pluginID,
|
||||
User: wrapper.BackendUserFromSignedInUser(query.User),
|
||||
DataSourceInstanceSettings: instanceSettings,
|
||||
},
|
||||
Queries: []backend.DataQuery{},
|
||||
Headers: query.Headers,
|
||||
}
|
||||
|
||||
for _, q := range query.Queries {
|
||||
modelJSON, err := q.Model.MarshalJSON()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Queries = append(req.Queries, backend.DataQuery{
|
||||
RefID: q.RefId,
|
||||
Interval: time.Duration(q.IntervalMs) * time.Millisecond,
|
||||
MaxDataPoints: q.MaxDataPoints,
|
||||
TimeRange: backend.TimeRange{
|
||||
From: query.TimeRange.GetFromAsTimeUTC(),
|
||||
To: query.TimeRange.GetToAsTimeUTC(),
|
||||
},
|
||||
QueryType: q.QueryType,
|
||||
JSON: modelJSON,
|
||||
})
|
||||
}
|
||||
|
||||
resp, err := a.handler.QueryData(ctx, req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tR := &tsdb.Response{
|
||||
Results: make(map[string]*tsdb.QueryResult, len(resp.Responses)),
|
||||
}
|
||||
|
||||
for refID, r := range resp.Responses {
|
||||
qr := &tsdb.QueryResult{
|
||||
RefId: refID,
|
||||
}
|
||||
|
||||
for _, f := range r.Frames {
|
||||
if f.RefID == "" {
|
||||
f.RefID = refID
|
||||
}
|
||||
}
|
||||
|
||||
qr.Dataframes = tsdb.NewDecodedDataFrames(r.Frames)
|
||||
|
||||
if r.Error != nil {
|
||||
qr.Error = r.Error
|
||||
}
|
||||
|
||||
tR.Results[refID] = qr
|
||||
}
|
||||
|
||||
return tR, nil
|
||||
}
|
||||
@@ -66,11 +66,6 @@ type PluginDescriptor struct {
|
||||
startFns PluginStartFuncs
|
||||
}
|
||||
|
||||
// PluginID returns the plugin ID.
|
||||
func (pd PluginDescriptor) PluginID() string {
|
||||
return pd.pluginID
|
||||
}
|
||||
|
||||
// getV2PluginSet returns list of plugins supported on v2.
|
||||
func getV2PluginSet() goplugin.PluginSet {
|
||||
return goplugin.PluginSet{
|
||||
|
||||
@@ -20,6 +20,16 @@ import (
|
||||
"github.com/xorcare/pointer"
|
||||
)
|
||||
|
||||
func newTimeSeriesPointsFromArgs(values ...float64) tsdb.TimeSeriesPoints {
|
||||
points := make(tsdb.TimeSeriesPoints, 0)
|
||||
|
||||
for i := 0; i < len(values); i += 2 {
|
||||
points = append(points, tsdb.NewTimePoint(null.FloatFrom(values[i]), values[i+1]))
|
||||
}
|
||||
|
||||
return points
|
||||
}
|
||||
|
||||
func TestQueryCondition(t *testing.T) {
|
||||
Convey("when evaluating query condition", t, func() {
|
||||
queryConditionScenario("Given avg() and > 100", func(ctx *queryConditionTestContext) {
|
||||
@@ -47,7 +57,7 @@ func TestQueryCondition(t *testing.T) {
|
||||
})
|
||||
|
||||
Convey("should fire when avg is above 100", func() {
|
||||
points := tsdb.NewTimeSeriesPointsFromArgs(120, 0)
|
||||
points := newTimeSeriesPointsFromArgs(120, 0)
|
||||
ctx.series = tsdb.TimeSeriesSlice{tsdb.NewTimeSeries("test1", points)}
|
||||
cr, err := ctx.exec()
|
||||
|
||||
@@ -67,7 +77,7 @@ func TestQueryCondition(t *testing.T) {
|
||||
})
|
||||
|
||||
Convey("Should not fire when avg is below 100", func() {
|
||||
points := tsdb.NewTimeSeriesPointsFromArgs(90, 0)
|
||||
points := newTimeSeriesPointsFromArgs(90, 0)
|
||||
ctx.series = tsdb.TimeSeriesSlice{tsdb.NewTimeSeries("test1", points)}
|
||||
cr, err := ctx.exec()
|
||||
|
||||
@@ -88,8 +98,8 @@ func TestQueryCondition(t *testing.T) {
|
||||
|
||||
Convey("Should fire if only first series matches", func() {
|
||||
ctx.series = tsdb.TimeSeriesSlice{
|
||||
tsdb.NewTimeSeries("test1", tsdb.NewTimeSeriesPointsFromArgs(120, 0)),
|
||||
tsdb.NewTimeSeries("test2", tsdb.NewTimeSeriesPointsFromArgs(0, 0)),
|
||||
tsdb.NewTimeSeries("test1", newTimeSeriesPointsFromArgs(120, 0)),
|
||||
tsdb.NewTimeSeries("test2", newTimeSeriesPointsFromArgs(0, 0)),
|
||||
}
|
||||
cr, err := ctx.exec()
|
||||
|
||||
@@ -121,7 +131,7 @@ func TestQueryCondition(t *testing.T) {
|
||||
Convey("Should set Firing if eval match", func() {
|
||||
ctx.evaluator = `{"type": "no_value", "params": []}`
|
||||
ctx.series = tsdb.TimeSeriesSlice{
|
||||
tsdb.NewTimeSeries("test1", tsdb.NewTimeSeriesPointsFromArgs()),
|
||||
tsdb.NewTimeSeries("test1", newTimeSeriesPointsFromArgs()),
|
||||
}
|
||||
cr, err := ctx.exec()
|
||||
|
||||
@@ -131,8 +141,8 @@ func TestQueryCondition(t *testing.T) {
|
||||
|
||||
Convey("Should set NoDataFound both series are empty", func() {
|
||||
ctx.series = tsdb.TimeSeriesSlice{
|
||||
tsdb.NewTimeSeries("test1", tsdb.NewTimeSeriesPointsFromArgs()),
|
||||
tsdb.NewTimeSeries("test2", tsdb.NewTimeSeriesPointsFromArgs()),
|
||||
tsdb.NewTimeSeries("test1", newTimeSeriesPointsFromArgs()),
|
||||
tsdb.NewTimeSeries("test2", newTimeSeriesPointsFromArgs()),
|
||||
}
|
||||
cr, err := ctx.exec()
|
||||
|
||||
@@ -153,8 +163,8 @@ func TestQueryCondition(t *testing.T) {
|
||||
|
||||
Convey("Should not set NoDataFound if one series is empty", func() {
|
||||
ctx.series = tsdb.TimeSeriesSlice{
|
||||
tsdb.NewTimeSeries("test1", tsdb.NewTimeSeriesPointsFromArgs()),
|
||||
tsdb.NewTimeSeries("test2", tsdb.NewTimeSeriesPointsFromArgs(120, 0)),
|
||||
tsdb.NewTimeSeries("test1", newTimeSeriesPointsFromArgs()),
|
||||
tsdb.NewTimeSeries("test2", newTimeSeriesPointsFromArgs(120, 0)),
|
||||
}
|
||||
cr, err := ctx.exec()
|
||||
|
||||
|
||||
@@ -35,15 +35,6 @@ type ItemQuery struct {
|
||||
Limit int64 `json:"limit"`
|
||||
}
|
||||
|
||||
type PostParams struct {
|
||||
DashboardId int64 `json:"dashboardId"`
|
||||
PanelId int64 `json:"panelId"`
|
||||
Epoch int64 `json:"epoch"`
|
||||
Title string `json:"title"`
|
||||
Text string `json:"text"`
|
||||
Icon string `json:"icon"`
|
||||
}
|
||||
|
||||
type DeleteParams struct {
|
||||
OrgId int64
|
||||
Id int64
|
||||
|
||||
@@ -16,7 +16,6 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/go-macaron/session"
|
||||
"github.com/prometheus/common/model"
|
||||
ini "gopkg.in/ini.v1"
|
||||
|
||||
@@ -170,7 +169,6 @@ var (
|
||||
BasicAuthEnabled bool
|
||||
|
||||
// Session settings.
|
||||
SessionOptions session.Options
|
||||
SessionConnMaxLifetime int64
|
||||
|
||||
// Global setting objects.
|
||||
|
||||
@@ -72,16 +72,6 @@ func NewTimePoint(value null.Float, timestamp float64) TimePoint {
|
||||
return TimePoint{value, null.FloatFrom(timestamp)}
|
||||
}
|
||||
|
||||
func NewTimeSeriesPointsFromArgs(values ...float64) TimeSeriesPoints {
|
||||
points := make(TimeSeriesPoints, 0)
|
||||
|
||||
for i := 0; i < len(values); i += 2 {
|
||||
points = append(points, NewTimePoint(null.FloatFrom(values[i]), values[i+1]))
|
||||
}
|
||||
|
||||
return points
|
||||
}
|
||||
|
||||
func NewTimeSeries(name string, points TimeSeriesPoints) *TimeSeries {
|
||||
return &TimeSeries{
|
||||
Name: name,
|
||||
|
||||
@@ -2,7 +2,6 @@ package tsdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
)
|
||||
@@ -19,18 +18,6 @@ func init() {
|
||||
registry = make(map[string]GetTsdbQueryEndpointFn)
|
||||
}
|
||||
|
||||
func getTsdbQueryEndpointFor(dsInfo *models.DataSource) (TsdbQueryEndpoint, error) {
|
||||
if fn, exists := registry[dsInfo.Type]; exists {
|
||||
executor, err := fn(dsInfo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return executor, nil
|
||||
}
|
||||
return nil, fmt.Errorf("Could not find executor for data source type: %s", dsInfo.Type)
|
||||
}
|
||||
|
||||
func RegisterTsdbQueryEndpoint(pluginId string, fn GetTsdbQueryEndpointFn) {
|
||||
registry[pluginId] = fn
|
||||
}
|
||||
|
||||
+9
-1
@@ -2,6 +2,7 @@ package tsdb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/grafana/grafana/pkg/models"
|
||||
)
|
||||
@@ -9,7 +10,14 @@ import (
|
||||
type HandleRequestFunc func(ctx context.Context, dsInfo *models.DataSource, req *TsdbQuery) (*Response, error)
|
||||
|
||||
func HandleRequest(ctx context.Context, dsInfo *models.DataSource, req *TsdbQuery) (*Response, error) {
|
||||
endpoint, err := getTsdbQueryEndpointFor(dsInfo)
|
||||
var endpoint TsdbQueryEndpoint
|
||||
fn, exists := registry[dsInfo.Type]
|
||||
if !exists {
|
||||
return nil, fmt.Errorf("Could not find executor for data source type: %s", dsInfo.Type)
|
||||
}
|
||||
|
||||
var err error
|
||||
endpoint, err = fn(dsInfo)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -1,13 +1,5 @@
|
||||
package util
|
||||
|
||||
// MaxInt returns the larger of x or y.
|
||||
func MaxInt(x, y int) int {
|
||||
if x < y {
|
||||
return y
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
// MinInt returns the smaller of x or y.
|
||||
func MinInt(x, y int) int {
|
||||
if x > y {
|
||||
|
||||
Reference in New Issue
Block a user