Add prometheus metrics
This commit is contained in:
@@ -3,8 +3,10 @@ package worker
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"git.vakhrushev.me/av/transcriber/internal/metrics"
|
||||
"git.vakhrushev.me/av/transcriber/internal/service"
|
||||
)
|
||||
|
||||
@@ -39,6 +41,7 @@ func (w *ConversionWorker) Start(ctx context.Context) {
|
||||
return
|
||||
default:
|
||||
err := w.transcribeService.FindAndRunConversionJob()
|
||||
metrics.WorkerJobCounter.WithLabelValues(w.Name(), strconv.FormatBool(err != nil)).Inc()
|
||||
if err != nil {
|
||||
log.Printf("%s error: %v", w.Name(), err)
|
||||
}
|
||||
@@ -80,6 +83,7 @@ func (w *TranscribeWorker) Start(ctx context.Context) {
|
||||
return
|
||||
default:
|
||||
err := w.transcribeService.FindAndRunTranscribeJob()
|
||||
metrics.WorkerJobCounter.WithLabelValues(w.Name(), strconv.FormatBool(err != nil)).Inc()
|
||||
if err != nil {
|
||||
log.Printf("%s error: %v", w.Name(), err)
|
||||
}
|
||||
@@ -121,6 +125,7 @@ func (w *CheckWorker) Start(ctx context.Context) {
|
||||
return
|
||||
default:
|
||||
err := w.transcribeService.FindAndRunTranscribeCheckJob()
|
||||
metrics.WorkerJobCounter.WithLabelValues(w.Name(), strconv.FormatBool(err != nil)).Inc()
|
||||
if err != nil {
|
||||
log.Printf("%s error: %v", w.Name(), err)
|
||||
}
|
||||
|
46
internal/metrics/metrics.go
Normal file
46
internal/metrics/metrics.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package metrics
|
||||
|
||||
import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
)
|
||||
|
||||
var (
|
||||
WorkerJobCounter = promauto.NewCounterVec(
|
||||
prometheus.CounterOpts{
|
||||
Name: "transcriber_worker_job_count",
|
||||
Help: "Count of jobs handled by each worker",
|
||||
},
|
||||
[]string{"name", "error"},
|
||||
)
|
||||
|
||||
// Размер принятых на обработку файлов (в байтах)
|
||||
InputFileSizeHistogram = promauto.NewHistogramVec(
|
||||
prometheus.HistogramOpts{
|
||||
Name: "transcriber_input_file_size_bytes",
|
||||
Help: "Size of input files received for processing",
|
||||
Buckets: []float64{1024, 10240, 102400, 1048576, 10485760, 104857600, 1073741824}, // 1KB, 10KB, 100KB, 1MB, 10MB, 100MB, 1GB
|
||||
},
|
||||
[]string{"file_extension"},
|
||||
)
|
||||
|
||||
// Время конвертации файлов (в секундах)
|
||||
ConversionDurationHistogram = promauto.NewHistogramVec(
|
||||
prometheus.HistogramOpts{
|
||||
Name: "transcriber_conversion_duration_seconds",
|
||||
Help: "Time taken to convert audio files",
|
||||
Buckets: []float64{0.1, 0.5, 1, 5, 10, 30, 60, 120, 300}, // 0.1s, 0.5s, 1s, 5s, 10s, 30s, 1m, 2m, 5m
|
||||
},
|
||||
[]string{"source_format", "target_format", "error"},
|
||||
)
|
||||
|
||||
// Размер файла после конвертации (в байтах)
|
||||
OutputFileSizeHistogram = promauto.NewHistogramVec(
|
||||
prometheus.HistogramOpts{
|
||||
Name: "transcriber_output_file_size_bytes",
|
||||
Help: "Size of files after conversion",
|
||||
Buckets: []float64{1024, 10240, 102400, 1048576, 10485760, 104857600, 1073741824}, // 1KB, 10KB, 100KB, 1MB, 10MB, 100MB, 1GB
|
||||
},
|
||||
[]string{"format"},
|
||||
)
|
||||
)
|
@@ -6,14 +6,21 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.vakhrushev.me/av/transcriber/internal/contract"
|
||||
"git.vakhrushev.me/av/transcriber/internal/entity"
|
||||
"git.vakhrushev.me/av/transcriber/internal/metrics"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
const baseStorageDir = "data/files"
|
||||
const (
|
||||
baseStorageDir = "data/files"
|
||||
|
||||
defaultAudioExt = "audio"
|
||||
)
|
||||
|
||||
type TranscribeService struct {
|
||||
jobRepo contract.TranscriptJobRepository
|
||||
@@ -43,7 +50,7 @@ func (s *TranscribeService) CreateTranscribeJob(file io.Reader, fileName string)
|
||||
// Определяем расширение файла
|
||||
ext := filepath.Ext(fileName)
|
||||
if ext == "" {
|
||||
ext = ".audio" // fallback если расширение не определено
|
||||
ext = fmt.Sprintf(".%s", defaultAudioExt) // fallback если расширение не определено
|
||||
}
|
||||
|
||||
// Создаем путь для сохранения файла
|
||||
@@ -63,6 +70,12 @@ func (s *TranscribeService) CreateTranscribeJob(file io.Reader, fileName string)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := dst.Close(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
metrics.InputFileSizeHistogram.WithLabelValues(ext).Observe(float64(size))
|
||||
|
||||
// Создаем запись в таблице files
|
||||
fileRecord := &entity.File{
|
||||
Id: fileId,
|
||||
@@ -121,7 +134,22 @@ func (s *TranscribeService) FindAndRunConversionJob() error {
|
||||
destFileName := fmt.Sprintf("%s%s", destFileId, ".ogg")
|
||||
destFilePath := filepath.Join(baseStorageDir, destFileName)
|
||||
|
||||
// Получаем расширение исходного файла для метрики
|
||||
srcExt := strings.TrimPrefix(filepath.Ext(srcFile.FileName), ".")
|
||||
if srcExt == "" {
|
||||
srcExt = defaultAudioExt
|
||||
}
|
||||
|
||||
// Измеряем время конвертации
|
||||
startTime := time.Now()
|
||||
err = s.converter.Convert(srcFilePath, destFilePath)
|
||||
conversionDuration := time.Since(startTime)
|
||||
|
||||
// Записываем метрику времени конвертации
|
||||
metrics.ConversionDurationHistogram.
|
||||
WithLabelValues(srcExt, "ogg", strconv.FormatBool(err != nil)).
|
||||
Observe(conversionDuration.Seconds())
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -131,6 +159,9 @@ func (s *TranscribeService) FindAndRunConversionJob() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// Записываем метрику размера выходного файла
|
||||
metrics.OutputFileSizeHistogram.WithLabelValues("ogg").Observe(float64(stat.Size()))
|
||||
|
||||
// Создаем запись в таблице files
|
||||
destFileRecord := &entity.File{
|
||||
Id: destFileId,
|
||||
@@ -218,7 +249,7 @@ func (s *TranscribeService) FindAndRunTranscribeCheckJob() error {
|
||||
if _, ok := err.(*contract.JobNotFoundError); ok {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
return fmt.Errorf("failed find and acquire job: %s, %w", entity.StateTranscribe, err)
|
||||
}
|
||||
|
||||
if job.RecognitionOpID == nil {
|
||||
|
Reference in New Issue
Block a user