dashboard.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package dashboards
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/grafana/grafana/pkg/log"
  6. "github.com/pkg/errors"
  7. )
  8. type DashboardProvisioner interface {
  9. Provision() error
  10. PollChanges(ctx context.Context)
  11. }
  12. type DashboardProvisionerImpl struct {
  13. log log.Logger
  14. fileReaders []*fileReader
  15. }
  16. type DashboardProvisionerFactory func(string) (DashboardProvisioner, error)
  17. func NewDashboardProvisionerImpl(configDirectory string) (*DashboardProvisionerImpl, error) {
  18. logger := log.New("provisioning.dashboard")
  19. cfgReader := &configReader{path: configDirectory, log: logger}
  20. configs, err := cfgReader.readConfig()
  21. if err != nil {
  22. return nil, errors.Wrap(err, "Failed to read dashboards config")
  23. }
  24. fileReaders, err := getFileReaders(configs, logger)
  25. if err != nil {
  26. return nil, errors.Wrap(err, "Failed to initialize file readers")
  27. }
  28. d := &DashboardProvisionerImpl{
  29. log: logger,
  30. fileReaders: fileReaders,
  31. }
  32. return d, nil
  33. }
  34. func (provider *DashboardProvisionerImpl) Provision() error {
  35. for _, reader := range provider.fileReaders {
  36. err := reader.startWalkingDisk()
  37. if err != nil {
  38. return errors.Wrapf(err, "Failed to provision config %v", reader.Cfg.Name)
  39. }
  40. }
  41. return nil
  42. }
  43. // PollChanges starts polling for changes in dashboard definition files. It creates goroutine for each provider
  44. // defined in the config.
  45. func (provider *DashboardProvisionerImpl) PollChanges(ctx context.Context) {
  46. for _, reader := range provider.fileReaders {
  47. go reader.pollChanges(ctx)
  48. }
  49. }
  50. func getFileReaders(configs []*DashboardsAsConfig, logger log.Logger) ([]*fileReader, error) {
  51. var readers []*fileReader
  52. for _, config := range configs {
  53. switch config.Type {
  54. case "file":
  55. fileReader, err := NewDashboardFileReader(config, logger.New("type", config.Type, "name", config.Name))
  56. if err != nil {
  57. return nil, errors.Wrapf(err, "Failed to create file reader for config %v", config.Name)
  58. }
  59. readers = append(readers, fileReader)
  60. default:
  61. return nil, fmt.Errorf("type %s is not supported", config.Type)
  62. }
  63. }
  64. return readers, nil
  65. }