backend_datasource.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package plugins
  2. import (
  3. "context"
  4. "encoding/json"
  5. "os/exec"
  6. "path"
  7. "github.com/grafana/grafana/pkg/models"
  8. "github.com/grafana/grafana/pkg/plugins/backend"
  9. "github.com/grafana/grafana/pkg/tsdb"
  10. "github.com/grafana/grafana/pkg/log"
  11. proto "github.com/grafana/grafana/pkg/tsdb/models"
  12. shared "github.com/grafana/grafana/pkg/tsdb/models/proxy"
  13. plugin "github.com/hashicorp/go-plugin"
  14. )
  15. type BackendDatasource struct {
  16. *PluginBase
  17. Executable string
  18. log log.Logger
  19. client *plugin.Client
  20. }
  21. func (p *BackendDatasource) initBackendPlugin(log log.Logger) error {
  22. p.log = log.New("plugin-id", p.Id)
  23. p.client = plugin.NewClient(&plugin.ClientConfig{
  24. HandshakeConfig: plugin.HandshakeConfig{
  25. ProtocolVersion: 1,
  26. MagicCookieKey: "BASIC_PLUGIN",
  27. MagicCookieValue: "hello",
  28. },
  29. Plugins: map[string]plugin.Plugin{p.Id: &shared.TsdbPluginImpl{}},
  30. Cmd: exec.Command("sh", "-c", path.Join(p.PluginDir, p.Executable)),
  31. AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC},
  32. Logger: backend.LogWrapper{Logger: p.log},
  33. })
  34. rpcClient, err := p.client.Client()
  35. if err != nil {
  36. return err
  37. }
  38. raw, err := rpcClient.Dispense(p.Id)
  39. if err != nil {
  40. return err
  41. }
  42. plugin := raw.(shared.TsdbPlugin)
  43. response, err := plugin.Query(context.Background(), &proto.TsdbQuery{})
  44. if err != nil {
  45. p.log.Error("Response from plugin. ", "response", response)
  46. } else {
  47. p.log.Info("Response from plugin. ", "response", response)
  48. }
  49. tsdb.RegisterTsdbQueryEndpoint(p.Id, func(dsInfo *models.DataSource) (tsdb.TsdbQueryEndpoint, error) {
  50. return &shared.TsdbWrapper{TsdbPlugin: plugin}, nil
  51. })
  52. return nil
  53. }
  54. func (p *BackendDatasource) Kill() {
  55. p.client.Kill()
  56. }
  57. func (p *BackendDatasource) Load(decoder *json.Decoder, pluginDir string) error {
  58. if err := decoder.Decode(&p); err != nil {
  59. return err
  60. }
  61. if err := p.registerPlugin(pluginDir); err != nil {
  62. return err
  63. }
  64. BackendDatasources[p.Id] = p
  65. return nil
  66. }