Add async archiving option; Move REST-API to new package

This commit is contained in:
Lou Knauer
2021-12-16 09:35:03 +01:00
parent 9c5c8a05e2
commit 7fcc39a144
6 changed files with 358 additions and 174 deletions

View File

@@ -137,9 +137,9 @@ func loadAveragesFromArchive(job *model.Job, metrics []string, data [][]schema.F
}
// Writes a running job to the job-archive
func ArchiveJob(job *model.Job, ctx context.Context) error {
func ArchiveJob(job *model.Job, ctx context.Context) (*schema.JobMeta, error) {
if job.State != model.JobStateRunning {
return errors.New("cannot archive job that is not running")
return nil, errors.New("cannot archive job that is not running")
}
allMetrics := make([]string, 0)
@@ -149,7 +149,7 @@ func ArchiveJob(job *model.Job, ctx context.Context) error {
}
jobData, err := LoadData(job, allMetrics, ctx)
if err != nil {
return err
return nil, err
}
tags := []struct {
@@ -195,39 +195,46 @@ func ArchiveJob(job *model.Job, ctx context.Context) error {
}
}
// If the file based archive is disabled,
// only return the JobMeta structure as the
// statistics in there are needed.
if !useArchive {
return metaData, nil
}
dirPath, err := getPath(job, "", false)
if err != nil {
return err
return nil, err
}
if err := os.MkdirAll(dirPath, 0777); err != nil {
return err
return nil, err
}
f, err := os.Create(path.Join(dirPath, "meta.json"))
if err != nil {
return err
return nil, err
}
defer f.Close()
writer := bufio.NewWriter(f)
if err := json.NewEncoder(writer).Encode(metaData); err != nil {
return err
return nil, err
}
if err := writer.Flush(); err != nil {
return err
return nil, err
}
f, err = os.Create(path.Join(dirPath, "data.json"))
if err != nil {
return err
return nil, err
}
writer = bufio.NewWriter(f)
if err := json.NewEncoder(writer).Encode(jobData); err != nil {
return err
return nil, err
}
if err := writer.Flush(); err != nil {
return err
return nil, err
}
return f.Close()
return metaData, f.Close()
}

View File

@@ -28,7 +28,10 @@ var metricDataRepos map[string]MetricDataRepository = map[string]MetricDataRepos
var JobArchivePath string
func Init(jobArchivePath string) error {
var useArchive bool
func Init(jobArchivePath string, disableArchive bool) error {
useArchive = !disableArchive
JobArchivePath = jobArchivePath
for _, cluster := range config.Clusters {
if cluster.MetricDataRepository != nil {
@@ -55,7 +58,7 @@ func Init(jobArchivePath string) error {
// Fetches the metric data for a job.
func LoadData(job *model.Job, metrics []string, ctx context.Context) (schema.JobData, error) {
if job.State == model.JobStateRunning {
if job.State == model.JobStateRunning || !useArchive {
repo, ok := metricDataRepos[job.ClusterID]
if !ok {
return nil, fmt.Errorf("no metric data repository configured for '%s'", job.ClusterID)
@@ -83,7 +86,7 @@ func LoadData(job *model.Job, metrics []string, ctx context.Context) (schema.Job
// Used for the jobsFootprint GraphQL-Query. TODO: Rename/Generalize.
func LoadAverages(job *model.Job, metrics []string, data [][]schema.Float, ctx context.Context) error {
if job.State != model.JobStateRunning {
if job.State != model.JobStateRunning && useArchive {
return loadAveragesFromArchive(job, metrics, data)
}
@@ -120,6 +123,12 @@ func LoadNodeData(clusterId string, metrics, nodes []string, from, to int64, ctx
return nil, fmt.Errorf("no metric data repository configured for '%s'", clusterId)
}
if metrics == nil {
for _, m := range config.GetClusterConfig(clusterId).MetricConfig {
metrics = append(metrics, m.Name)
}
}
data, err := repo.LoadNodeData(clusterId, metrics, nodes, from, to, ctx)
if err != nil {
return nil, err