package dashboardsnapshot import ( "context" "encoding/json" "fmt" "net/http" "time" "gocloud.dev/blob" "k8s.io/kube-openapi/pkg/spec3" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/services/apiserver/builder" "github.com/grafana/grafana/pkg/services/dashboardsnapshots" ) type dashExportStatus struct { Count int Index int Started int64 Updated int64 Finished int64 Error string } type dashExporter struct { status dashExportStatus service dashboardsnapshots.Service sql db.DB } func (d *dashExporter) getAPIRouteHandler() builder.APIRouteHandler { return builder.APIRouteHandler{ Path: "admin/export", Spec: &spec3.PathProps{ Summary: "an example at the root level", Description: "longer description here?", Post: &spec3.Operation{ OperationProps: spec3.OperationProps{ Tags: []string{"export"}, Responses: &spec3.Responses{ ResponsesProps: spec3.ResponsesProps{ StatusCodeResponses: map[int]*spec3.Response{ 200: { ResponseProps: spec3.ResponseProps{ Content: map[string]*spec3.MediaType{ "application/json": {}, }, }, }, }, }, }, }, }, }, Handler: func(w http.ResponseWriter, r *http.Request) { // Only let it start once if d.status.Started == 0 { go d.doExport() } time.Sleep(time.Second) _ = json.NewEncoder(w).Encode(d.status) }, } } // NO way to stop!!!!!! func (d *dashExporter) doExport() { defer func() { d.status.Finished = time.Now().UnixMilli() }() d.status = dashExportStatus{ Started: time.Now().UnixMilli(), } if d.sql == nil { d.status.Error = "missing dependencies" return } ctx := context.Background() keys := []string{} err := d.sql.GetSqlxSession().Select(ctx, &keys, "SELECT key FROM dashboard_snapshot ORDER BY id asc") if err != nil { d.status.Error = err.Error() return } d.status.Count = len(keys) bucket, err := blob.OpenBucket(ctx, "mem://?key=foo.txt&prefix=a/subfolder/") if err != nil { d.status.Error = err.Error() return } defer func() { _ = bucket.Close() }() for idx, key := range keys { d.status.Index = idx snap, err := d.service.GetDashboardSnapshot(ctx, &dashboardsnapshots.GetDashboardSnapshotQuery{ Key: key, }) if err != nil { d.status.Error = err.Error() return } dash, err := snap.Dashboard.ToDB() if err != nil { d.status.Error = err.Error() return } fmt.Printf("TODO, export: %s (len: %d)\n", snap.Key, len(dash)) // w, err := bucket.NewWriter(ctx, "foo.txt", nil) // if err != nil { // d.status.Error = err.Error() // return // } time.Sleep(time.Second * 1) d.status.Updated = time.Now().UnixMilli() } fmt.Printf("done!\n") }