mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2026-10-27 08:00:14 +00:00
66 lines
2.1 KiB
Go
66 lines
2.1 KiB
Go
package vllm
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strconv"
|
|
|
|
"github.com/1Panel-dev/1Panel/agent/app/model"
|
|
"github.com/1Panel-dev/1Panel/agent/utils/re"
|
|
)
|
|
|
|
type requestMetrics struct {
|
|
Seconds float64 `json:"seconds"`
|
|
PrefixHits *float64 `json:"prefixHits,omitempty"`
|
|
PrefixQueries *float64 `json:"prefixQueries,omitempty"`
|
|
FinishReasons map[string]float64 `json:"finishReasons,omitempty"`
|
|
}
|
|
|
|
func calculateRequestMetrics(current, previous Metrics, elapsed float64, result *model.MonitorVLLM) error {
|
|
sample := requestMetrics{Seconds: elapsed, FinishReasons: map[string]float64{}}
|
|
hits := counterDelta(current["prefix_cache_hits_total"], previous["prefix_cache_hits_total"])
|
|
queries := counterDelta(current["prefix_cache_queries_total"], previous["prefix_cache_queries_total"])
|
|
if hits != nil && queries != nil && *hits <= *queries {
|
|
sample.PrefixHits, sample.PrefixQueries = hits, queries
|
|
if *queries > 0 {
|
|
rate := *hits / *queries * 100
|
|
result.PrefixCacheHitRate = &rate
|
|
}
|
|
}
|
|
before := groupFinishReasons(previous["request_success_total"])
|
|
for reason, values := range groupFinishReasons(current["request_success_total"]) {
|
|
if delta := counterDelta(values, before[reason]); delta != nil {
|
|
sample.FinishReasons[reason] = *delta
|
|
if result.FinishReasons == nil {
|
|
result.FinishReasons = map[string]float64{}
|
|
}
|
|
result.FinishReasons[reason] = *delta / elapsed
|
|
}
|
|
}
|
|
encoded, err := json.Marshal(sample)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
result.RequestDeltas = string(encoded)
|
|
return nil
|
|
}
|
|
|
|
func groupFinishReasons(samples map[string]float64) map[string]map[string]float64 {
|
|
groups := map[string]map[string]float64{}
|
|
for labels, value := range samples {
|
|
for _, label := range re.GetRegex(re.VLLMMetricLabelPattern).FindAllStringSubmatch(labels, -1) {
|
|
if label[1] != "finished_reason" {
|
|
continue
|
|
}
|
|
reason, err := strconv.Unquote(label[2])
|
|
if err != nil || reason == "" {
|
|
continue
|
|
}
|
|
if groups[reason] == nil {
|
|
groups[reason] = map[string]float64{}
|
|
}
|
|
groups[reason][labels] = value
|
|
}
|
|
}
|
|
return groups
|
|
}
|