dashboard.go 2.3 KB

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