mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 21:42:37 +08:00
Backend plugins: Refactor to allow shared contract between core and external backend plugins (#25472)
Refactor to allow shared contract between core and external backend plugins allowing core backend data sources in Grafana to be implemented in same way as an external backend plugin. Use v0.67.0 of sdk. Add tests for verifying plugin is restarted when process is killed. Enable strict linting for backendplugin packages
This commit is contained in:

committed by
GitHub

parent
40b3473a10
commit
c0f3b2929c
88
pkg/plugins/backendplugin/grpcplugin/log_wrapper.go
Normal file
88
pkg/plugins/backendplugin/grpcplugin/log_wrapper.go
Normal file
@ -0,0 +1,88 @@
|
||||
package grpcplugin
|
||||
|
||||
import (
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
|
||||
glog "github.com/grafana/grafana/pkg/infra/log"
|
||||
hclog "github.com/hashicorp/go-hclog"
|
||||
)
|
||||
|
||||
type logWrapper struct {
|
||||
Logger glog.Logger
|
||||
}
|
||||
|
||||
func formatArgs(args ...interface{}) []interface{} {
|
||||
if len(args) == 0 || len(args)%2 != 0 {
|
||||
return args
|
||||
}
|
||||
|
||||
res := []interface{}{}
|
||||
|
||||
for n := 0; n < len(args); n += 2 {
|
||||
key := args[n]
|
||||
|
||||
if stringKey, ok := key.(string); ok && stringKey == "timestamp" {
|
||||
continue
|
||||
}
|
||||
|
||||
res = append(res, key)
|
||||
res = append(res, args[n+1])
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func (lw logWrapper) Trace(msg string, args ...interface{}) {
|
||||
lw.Logger.Debug(msg, formatArgs(args...)...)
|
||||
}
|
||||
func (lw logWrapper) Debug(msg string, args ...interface{}) {
|
||||
lw.Logger.Debug(msg, formatArgs(args...)...)
|
||||
}
|
||||
func (lw logWrapper) Info(msg string, args ...interface{}) {
|
||||
lw.Logger.Info(msg, formatArgs(args...)...)
|
||||
}
|
||||
func (lw logWrapper) Warn(msg string, args ...interface{}) {
|
||||
lw.Logger.Warn(msg, formatArgs(args...)...)
|
||||
}
|
||||
func (lw logWrapper) Error(msg string, args ...interface{}) {
|
||||
lw.Logger.Error(msg, formatArgs(args...)...)
|
||||
}
|
||||
|
||||
func (lw logWrapper) IsTrace() bool { return true }
|
||||
func (lw logWrapper) IsDebug() bool { return true }
|
||||
func (lw logWrapper) IsInfo() bool { return true }
|
||||
func (lw logWrapper) IsWarn() bool { return true }
|
||||
func (lw logWrapper) IsError() bool { return true }
|
||||
|
||||
func (lw logWrapper) With(args ...interface{}) hclog.Logger {
|
||||
return logWrapper{Logger: lw.Logger.New(args...)}
|
||||
}
|
||||
func (lw logWrapper) Named(name string) hclog.Logger {
|
||||
if name == "stdio" {
|
||||
// discard logs from stdio hashicorp/go-plugin gRPC service since
|
||||
// it's not enabled/in use per default.
|
||||
// discard debug log of "waiting for stdio data".
|
||||
// discard warn log of "received EOF, stopping recv loop".
|
||||
return hclog.NewNullLogger()
|
||||
}
|
||||
return logWrapper{
|
||||
Logger: lw.Logger.New(),
|
||||
}
|
||||
}
|
||||
|
||||
func (lw logWrapper) ResetNamed(name string) hclog.Logger {
|
||||
return logWrapper{Logger: lw.Logger.New()}
|
||||
}
|
||||
|
||||
func (lw logWrapper) StandardLogger(ops *hclog.StandardLoggerOptions) *log.Logger {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (lw logWrapper) SetLevel(level hclog.Level) {}
|
||||
|
||||
// Return a value that conforms to io.Writer, which can be passed into log.SetOutput()
|
||||
func (lw logWrapper) StandardWriter(opts *hclog.StandardLoggerOptions) io.Writer {
|
||||
return ioutil.Discard
|
||||
}
|
Reference in New Issue
Block a user