Compare commits
2 commits
cd78de96b4
...
a75ce3287d
Author | SHA1 | Date | |
---|---|---|---|
a75ce3287d | |||
2e360f4b20 |
1 changed files with 67 additions and 6 deletions
|
@ -8,6 +8,7 @@ import (
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.lastassault.de/speatzle/morffix/constants"
|
"git.lastassault.de/speatzle/morffix/constants"
|
||||||
"github.com/go-echarts/go-echarts/v2/charts"
|
"github.com/go-echarts/go-echarts/v2/charts"
|
||||||
|
@ -69,7 +70,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
|
`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
|
FROM files
|
||||||
WHERE ffprobe_data IS NOT NULL
|
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 {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Query Codecs: %w", err)
|
return nil, fmt.Errorf("Query Codecs: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -91,7 +92,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
|
`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
|
FROM files
|
||||||
WHERE ffprobe_data IS NOT NULL
|
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 {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Query Resolution: %w", err)
|
return nil, fmt.Errorf("Query Resolution: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -113,7 +114,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
|
`SELECT COALESCE(jsonb_path_query_first(ffprobe_data, '$.format.format_name')::text, 'Unknown') AS name, COUNT(*) AS value
|
||||||
FROM files
|
FROM files
|
||||||
WHERE ffprobe_data IS NOT NULL
|
WHERE ffprobe_data IS NOT NULL
|
||||||
GROUP BY jsonb_path_query_first(ffprobe_data, '$.format.format_name');`)
|
GROUP BY 1;`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Query Container: %w", err)
|
return nil, fmt.Errorf("Query Container: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -134,7 +135,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) {
|
||||||
rows, err = db.Query(ctx,
|
rows, err = db.Query(ctx,
|
||||||
`SELECT health AS id, COUNT(*) AS value
|
`SELECT health AS id, COUNT(*) AS value
|
||||||
FROM files
|
FROM files
|
||||||
GROUP BY health;`)
|
GROUP BY 1;`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Query Health: %w", err)
|
return nil, fmt.Errorf("Query Health: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -155,7 +156,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) {
|
||||||
rows, err = db.Query(ctx,
|
rows, err = db.Query(ctx,
|
||||||
`SELECT transcode AS id, COUNT(*) AS value
|
`SELECT transcode AS id, COUNT(*) AS value
|
||||||
FROM files
|
FROM files
|
||||||
GROUP BY transcode;`)
|
GROUP BY 1;`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Query Transcode: %w", err)
|
return nil, fmt.Errorf("Query Transcode: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -176,7 +177,7 @@ func generateStats(ctx context.Context) ([]ChartData, error) {
|
||||||
rows, err = db.Query(ctx,
|
rows, err = db.Query(ctx,
|
||||||
`SELECT status AS id, COUNT(*) AS value
|
`SELECT status AS id, COUNT(*) AS value
|
||||||
FROM tasks
|
FROM tasks
|
||||||
GROUP BY status;`)
|
GROUP BY 1;`)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Query Task Status: %w", err)
|
return nil, fmt.Errorf("Query Task Status: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -194,6 +195,66 @@ func generateStats(ctx context.Context) ([]ChartData, error) {
|
||||||
}
|
}
|
||||||
data = append(data, generatePie("Task Status", res))
|
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
|
return data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue