mirror of
https://github.com/grafana/grafana.git
synced 2024-11-24 09:50:29 -06:00
106 lines
2.0 KiB
Go
106 lines
2.0 KiB
Go
package export
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"math/rand"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
)
|
|
|
|
var _ Job = new(dummyExportJob)
|
|
|
|
type dummyExportJob struct {
|
|
logger log.Logger
|
|
|
|
statusMu sync.Mutex
|
|
status ExportStatus
|
|
cfg ExportConfig
|
|
broadcaster statusBroadcaster
|
|
stopRequested bool
|
|
total int
|
|
}
|
|
|
|
func startDummyExportJob(cfg ExportConfig, broadcaster statusBroadcaster) (Job, error) {
|
|
job := &dummyExportJob{
|
|
logger: log.New("dummy_export_job"),
|
|
cfg: cfg,
|
|
broadcaster: broadcaster,
|
|
status: ExportStatus{
|
|
Running: true,
|
|
Target: "dummy export",
|
|
Started: time.Now().UnixMilli(),
|
|
Count: make(map[string]int, 10),
|
|
Index: 0,
|
|
},
|
|
total: int(math.Round(10 + rand.Float64()*20)),
|
|
}
|
|
|
|
broadcaster(job.status)
|
|
go job.start()
|
|
return job, nil
|
|
}
|
|
|
|
func (e *dummyExportJob) requestStop() {
|
|
e.stopRequested = true
|
|
}
|
|
|
|
func (e *dummyExportJob) start() {
|
|
defer func() {
|
|
e.logger.Info("Finished dummy export job")
|
|
|
|
e.statusMu.Lock()
|
|
defer e.statusMu.Unlock()
|
|
s := e.status
|
|
if err := recover(); err != nil {
|
|
e.logger.Error("export panic", "error", err)
|
|
s.Status = fmt.Sprintf("ERROR: %v", err)
|
|
}
|
|
// Make sure it finishes OK
|
|
if s.Finished < 10 {
|
|
s.Finished = time.Now().UnixMilli()
|
|
}
|
|
s.Running = false
|
|
if s.Status == "" {
|
|
s.Status = "done"
|
|
}
|
|
e.status = s
|
|
e.broadcaster(s)
|
|
}()
|
|
|
|
e.logger.Info("Starting dummy export job")
|
|
|
|
ticker := time.NewTicker(1 * time.Second)
|
|
for t := range ticker.C {
|
|
e.statusMu.Lock()
|
|
e.status.Changed = t.UnixMilli()
|
|
e.status.Index++
|
|
e.status.Last = fmt.Sprintf("ITEM: %d", e.status.Index)
|
|
e.statusMu.Unlock()
|
|
|
|
// Wait till we are done
|
|
shouldStop := e.stopRequested || e.status.Index >= e.total
|
|
e.broadcaster(e.status)
|
|
|
|
if shouldStop {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
func (e *dummyExportJob) getStatus() ExportStatus {
|
|
e.statusMu.Lock()
|
|
defer e.statusMu.Unlock()
|
|
|
|
return e.status
|
|
}
|
|
|
|
func (e *dummyExportJob) getConfig() ExportConfig {
|
|
e.statusMu.Lock()
|
|
defer e.statusMu.Unlock()
|
|
|
|
return e.cfg
|
|
}
|