From 2e360f4b201b6e92cc39dfed713c6ad91ca28e66 Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Sun, 14 Jul 2024 00:37:16 +0200 Subject: [PATCH 1/2] Improve Stats group by --- server/stats.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/stats.go b/server/stats.go index 933ae77..5cfb9f4 100644 --- a/server/stats.go +++ b/server/stats.go @@ -69,7 +69,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) { `SELECT COALESCE(jsonb_path_query_first(ffprobe_data, '$.streams[*] ? (@.codec_type == "video") ? (@.disposition.attached_pic == 0).codec_name')::text, 'Unknown') AS name, COUNT(*) AS value FROM files WHERE ffprobe_data IS NOT NULL - GROUP BY jsonb_path_query_first(ffprobe_data, '$.streams[*] ? (@.codec_type == "video") ? (@.disposition.attached_pic == 0).codec_name');`) + GROUP BY 1;`) if err != nil { return nil, fmt.Errorf("Query Codecs: %w", err) } @@ -91,7 +91,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) { `SELECT COALESCE(jsonb_path_query_first(ffprobe_data, '$.streams[*] ? (@.codec_type == "video") ? (@.disposition.attached_pic == 0).width')::text, 'Unknown') AS name, COUNT(*) AS value FROM files WHERE ffprobe_data IS NOT NULL - GROUP BY jsonb_path_query_first(ffprobe_data, '$.streams[*] ? (@.codec_type == "video") ? (@.disposition.attached_pic == 0).width');`) + GROUP BY 1;`) if err != nil { return nil, fmt.Errorf("Query Resolution: %w", err) } @@ -113,7 +113,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) { `SELECT COALESCE(jsonb_path_query_first(ffprobe_data, '$.format.format_name')::text, 'Unknown') AS name, COUNT(*) AS value FROM files WHERE ffprobe_data IS NOT NULL - GROUP BY jsonb_path_query_first(ffprobe_data, '$.format.format_name');`) + GROUP BY 1;`) if err != nil { return nil, fmt.Errorf("Query Container: %w", err) } @@ -134,7 +134,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) { rows, err = db.Query(ctx, `SELECT health AS id, COUNT(*) AS value FROM files - GROUP BY health;`) + GROUP BY 1;`) if err != nil { return nil, fmt.Errorf("Query Health: %w", err) } @@ -155,7 +155,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) { rows, err = db.Query(ctx, `SELECT transcode AS id, COUNT(*) AS value FROM files - GROUP BY transcode;`) + GROUP BY 1;`) if err != nil { return nil, fmt.Errorf("Query Transcode: %w", err) } @@ -176,7 +176,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) { rows, err = db.Query(ctx, `SELECT status AS id, COUNT(*) AS value FROM tasks - GROUP BY status;`) + GROUP BY 1;`) if err != nil { return nil, fmt.Errorf("Query Task Status: %w", err) } From a75ce3287da734e6c6965359a36a4b57d63cf30a Mon Sep 17 00:00:00 2001 From: Samuel Lorch Date: Sun, 14 Jul 2024 02:18:10 +0200 Subject: [PATCH 2/2] Add Task Status Per Day Bar Chart --- server/stats.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/server/stats.go b/server/stats.go index 5cfb9f4..d55f3af 100644 --- a/server/stats.go +++ b/server/stats.go @@ -8,6 +8,7 @@ import ( "log/slog" "net/http" "strings" + "time" "git.lastassault.de/speatzle/morffix/constants" "github.com/go-echarts/go-echarts/v2/charts" @@ -194,6 +195,66 @@ func generateStats(ctx context.Context) ([]ChartData, error) { } data = append(data, generatePie("Task Status", res)) + type BarTaskRowValue struct { + Date time.Time + Status constants.TaskStatus + Count int + } + + rows, err = db.Query(ctx, + `SELECT date_trunc('day', updated_at) date, status, COUNT(*) AS count + FROM tasks + WHERE status = $1 OR status = $2 + GROUP BY 1,2;`, constants.TASK_STATUS_SUCCESS, constants.TASK_STATUS_FAILED) + if err != nil { + return nil, fmt.Errorf("Query Task Status Day: %w", err) + } + + taskStatusDayCounts, err := pgx.CollectRows(rows, pgx.RowToStructByName[BarTaskRowValue]) + if err != nil { + return nil, fmt.Errorf("Collect Task Status Day Data: %w", err) + } + + days := []string{} + successBarData := []opts.BarData{} + failedBarData := []opts.BarData{} + for _, v := range taskStatusDayCounts { + days = append(days, v.Date.Format(time.DateOnly)) + if v.Status == constants.TASK_STATUS_SUCCESS { + successBarData = append(successBarData, opts.BarData{ + Value: v.Count, + }) + } else if v.Status == constants.TASK_STATUS_FAILED { + failedBarData = append(failedBarData, opts.BarData{ + Value: v.Count, + }) + } + + } + bar := charts.NewBar() + bar.SetGlobalOptions( + charts.WithInitializationOpts(opts.Initialization{ + Theme: "dark", + BackgroundColor: "#111", + }), + charts.WithTitleOpts(opts.Title{ + Title: "Task Success/Failed Per Day", + }), + ) + bar.SetXAxis(days). + AddSeries("Success", successBarData). + AddSeries("Failed", failedBarData). + SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{ + Stack: "stackA", + })) + + snippet := bar.RenderSnippet() + + data = append(data, ChartData{ + Element: template.HTML(snippet.Element), + Script: template.HTML(snippet.Script), + }) + return data, nil }