@@ -554,6 +554,7 @@ func Reset() {
554554// RecordRequestCounter records the number of requests.
555555func RecordRequestCounter (modelName , targetModelName , fairnessID string , priority int ) {
556556 modelName , targetModelName = boundModels (modelName , targetModelName )
557+ fairnessID = boundFairnessID (fairnessID )
557558 prioStr := strconv .Itoa (priority )
558559 requestCounter .WithLabelValues (modelName , targetModelName , prioStr ).Inc ()
559560 llmdRequestCounter .WithLabelValues (modelName , targetModelName , fairnessID , prioStr ).Inc ()
@@ -562,6 +563,7 @@ func RecordRequestCounter(modelName, targetModelName, fairnessID string, priorit
562563// RecordRequestErrCounter records the number of error requests.
563564func RecordRequestErrCounter (modelName , targetModelName , fairnessID , priority string , code string ) {
564565 modelName , targetModelName = boundModels (modelName , targetModelName )
566+ fairnessID = boundFairnessID (fairnessID )
565567 if code != "" {
566568 requestErrCounter .WithLabelValues (modelName , targetModelName , code ).Inc ()
567569 llmdRequestErrCounter .WithLabelValues (modelName , targetModelName , fairnessID , priority , code ).Inc ()
@@ -571,13 +573,15 @@ func RecordRequestErrCounter(modelName, targetModelName, fairnessID, priority st
571573// RecordRequestSizes records the request sizes.
572574func RecordRequestSizes (modelName , targetModelName , fairnessID , priority string , reqSize int ) {
573575 modelName , targetModelName = boundModels (modelName , targetModelName )
576+ fairnessID = boundFairnessID (fairnessID )
574577 requestSizes .WithLabelValues (modelName , targetModelName ).Observe (float64 (reqSize ))
575578 llmdRequestSizes .WithLabelValues (modelName , targetModelName , fairnessID , priority ).Observe (float64 (reqSize ))
576579}
577580
578581// RecordRequestLatencies records duration of request.
579582func RecordRequestLatencies (ctx context.Context , modelName , targetModelName , fairnessID , priority string , received time.Time , complete time.Time ) bool {
580583 modelName , targetModelName = boundModels (modelName , targetModelName )
584+ fairnessID = boundFairnessID (fairnessID )
581585 if ! complete .After (received ) {
582586 log .FromContext (ctx ).V (logutil .DEFAULT ).Error (nil , "Request latency values are invalid" ,
583587 "modelName" , modelName , "targetModelName" , targetModelName , "completeTime" , complete , "receivedTime" , received )
@@ -592,13 +596,15 @@ func RecordRequestLatencies(ctx context.Context, modelName, targetModelName, fai
592596// RecordResponseSizes records the response sizes.
593597func RecordResponseSizes (modelName , targetModelName , fairnessID , priority string , size int ) {
594598 modelName , targetModelName = boundModels (modelName , targetModelName )
599+ fairnessID = boundFairnessID (fairnessID )
595600 responseSizes .WithLabelValues (modelName , targetModelName ).Observe (float64 (size ))
596601 llmdResponseSizes .WithLabelValues (modelName , targetModelName , fairnessID , priority ).Observe (float64 (size ))
597602}
598603
599604// RecordInputTokens records input tokens count.
600605func RecordInputTokens (modelName , targetModelName , fairnessID , priority string , size int ) {
601606 modelName , targetModelName = boundModels (modelName , targetModelName )
607+ fairnessID = boundFairnessID (fairnessID )
602608 if size > 0 {
603609 inputTokens .WithLabelValues (modelName , targetModelName ).Observe (float64 (size ))
604610 llmdInputTokens .WithLabelValues (modelName , targetModelName , fairnessID , priority ).Observe (float64 (size ))
@@ -608,6 +614,7 @@ func RecordInputTokens(modelName, targetModelName, fairnessID, priority string,
608614// RecordOutputTokens records output tokens count.
609615func RecordOutputTokens (modelName , targetModelName , fairnessID , priority string , size int ) {
610616 modelName , targetModelName = boundModels (modelName , targetModelName )
617+ fairnessID = boundFairnessID (fairnessID )
611618 if size > 0 {
612619 outputTokens .WithLabelValues (modelName , targetModelName ).Observe (float64 (size ))
613620 llmdOutputTokens .WithLabelValues (modelName , targetModelName , fairnessID , priority ).Observe (float64 (size ))
@@ -617,13 +624,15 @@ func RecordOutputTokens(modelName, targetModelName, fairnessID, priority string,
617624// RecordPromptCachedTokens records prompt cached tokens count.
618625func RecordPromptCachedTokens (modelName , targetModelName , fairnessID , priority string , size int ) {
619626 modelName , targetModelName = boundModels (modelName , targetModelName )
627+ fairnessID = boundFairnessID (fairnessID )
620628 promptCachedTokens .WithLabelValues (modelName , targetModelName ).Observe (float64 (size ))
621629 llmdPromptCachedTokens .WithLabelValues (modelName , targetModelName , fairnessID , priority ).Observe (float64 (size ))
622630}
623631
624632// RecordNormalizedTimePerOutputToken (NTPOT) records the normalized time per output token.
625633func RecordNormalizedTimePerOutputToken (ctx context.Context , modelName , targetModelName , fairnessID , priority string , received time.Time , complete time.Time , outputTokenCount int ) bool {
626634 modelName , targetModelName = boundModels (modelName , targetModelName )
635+ fairnessID = boundFairnessID (fairnessID )
627636 if outputTokenCount <= 0 {
628637 return false
629638 }
@@ -645,6 +654,7 @@ func RecordNormalizedTimePerOutputToken(ctx context.Context, modelName, targetMo
645654// RecordRequestTTFT records the time to first token.
646655func RecordRequestTTFT (ctx context.Context , modelName , targetModelName , fairnessID , priority string , streaming bool , received time.Time , firstToken time.Time ) bool {
647656 modelName , targetModelName = boundModels (modelName , targetModelName )
657+ fairnessID = boundFairnessID (fairnessID )
648658 if firstToken .IsZero () {
649659 return false
650660 }
@@ -666,6 +676,7 @@ func RecordRequestTTFT(ctx context.Context, modelName, targetModelName, fairness
666676// RecordRequestTPOT records the average time per output token.
667677func RecordRequestTPOT (ctx context.Context , modelName , targetModelName , fairnessID , priority string , received time.Time , firstToken time.Time , complete time.Time , outputTokenCount int ) bool {
668678 modelName , targetModelName = boundModels (modelName , targetModelName )
679+ fairnessID = boundFairnessID (fairnessID )
669680 if firstToken .IsZero () || outputTokenCount <= 1 {
670681 return false
671682 }
@@ -686,6 +697,7 @@ func RecordRequestTPOT(ctx context.Context, modelName, targetModelName, fairness
686697// RecordInterTokenLatency records the time between consecutive response body chunks for streaming requests.
687698func RecordInterTokenLatency (ctx context.Context , modelName , targetModelName , fairnessID , priority string , itlSeconds float64 ) bool {
688699 modelName , targetModelName = boundModels (modelName , targetModelName )
700+ fairnessID = boundFairnessID (fairnessID )
689701 if itlSeconds < 0 {
690702 log .FromContext (ctx ).Error (nil , "Inter-token latency value must be non-negative" ,
691703 "modelName" , modelName , "targetModelName" , targetModelName , "itlSeconds" , itlSeconds )
@@ -698,6 +710,7 @@ func RecordInterTokenLatency(ctx context.Context, modelName, targetModelName, fa
698710// IncRunningRequests increases the current running requests.
699711func IncRunningRequests (modelName , targetModelName , fairnessID , priority string ) {
700712 modelName , targetModelName = boundModels (modelName , targetModelName )
713+ fairnessID = boundFairnessID (fairnessID )
701714 if modelName != "" {
702715 runningRequests .WithLabelValues (modelName ).Inc ()
703716 llmdRunningRequests .WithLabelValues (modelName , targetModelName , fairnessID , priority ).Inc ()
@@ -707,6 +720,7 @@ func IncRunningRequests(modelName, targetModelName, fairnessID, priority string)
707720// DecRunningRequests decreases the current running requests.
708721func DecRunningRequests (modelName , targetModelName , fairnessID , priority string ) {
709722 modelName , targetModelName = boundModels (modelName , targetModelName )
723+ fairnessID = boundFairnessID (fairnessID )
710724 if modelName != "" {
711725 runningRequests .WithLabelValues (modelName ).Dec ()
712726 llmdRunningRequests .WithLabelValues (modelName , targetModelName , fairnessID , priority ).Dec ()
@@ -802,6 +816,8 @@ func RecordFlowControlRequestQueueDuration(
802816 modelName , targetModelName string ,
803817 duration time.Duration ,
804818) {
819+ fairnessID = boundFairnessID (fairnessID )
820+ modelName , targetModelName = boundModels (modelName , targetModelName )
805821 flowControlRequestQueueDuration .WithLabelValues (
806822 fairnessID , priority , outcome ,
807823 inferencePool ,
@@ -826,6 +842,7 @@ func RecordFlowControlRequestEnqueueDuration(
826842 fairnessID string , priority string , outcome string ,
827843 duration time.Duration ,
828844) {
845+ fairnessID = boundFairnessID (fairnessID )
829846 flowControlRequestEnqueueDuration .WithLabelValues (
830847 fairnessID , priority , outcome ,
831848 ).Observe (duration .Seconds ())
@@ -838,27 +855,31 @@ func RecordFlowControlRequestEnqueueDuration(
838855// IncFlowControlQueueSize increments the Flow Control queue size gauge.
839856func IncFlowControlQueueSize (fairnessID , priority , inferencePool , modelName , targetModelName string ) {
840857 modelName , targetModelName = boundModels (modelName , targetModelName )
858+ fairnessID = boundFairnessID (fairnessID )
841859 flowControlQueueSize .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Inc ()
842860 llmdFlowControlQueueSize .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Inc ()
843861}
844862
845863// DecFlowControlQueueSize decrements the Flow Control queue size gauge.
846864func DecFlowControlQueueSize (fairnessID , priority , inferencePool , modelName , targetModelName string ) {
847865 modelName , targetModelName = boundModels (modelName , targetModelName )
866+ fairnessID = boundFairnessID (fairnessID )
848867 flowControlQueueSize .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Dec ()
849868 llmdFlowControlQueueSize .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Dec ()
850869}
851870
852871// AddFlowControlQueueBytes increments the Flow Control queue bytes gauge.
853872func AddFlowControlQueueBytes (fairnessID , priority , inferencePool , modelName , targetModelName string , bytes uint64 ) {
854873 modelName , targetModelName = boundModels (modelName , targetModelName )
874+ fairnessID = boundFairnessID (fairnessID )
855875 flowControlQueueBytes .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Add (float64 (bytes ))
856876 llmdFlowControlQueueBytes .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Add (float64 (bytes ))
857877}
858878
859879// SubFlowControlQueueBytes decrements the Flow Control queue bytes gauge.
860880func SubFlowControlQueueBytes (fairnessID , priority , inferencePool , modelName , targetModelName string , bytes uint64 ) {
861881 modelName , targetModelName = boundModels (modelName , targetModelName )
882+ fairnessID = boundFairnessID (fairnessID )
862883 flowControlQueueBytes .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Sub (float64 (bytes ))
863884 llmdFlowControlQueueBytes .WithLabelValues (fairnessID , priority , inferencePool , modelName , targetModelName ).Sub (float64 (bytes ))
864885}
@@ -874,6 +895,23 @@ func IncFlowControlRequestsTotal(outcome, priority, inferencePool string) {
874895 llmdFlowControlRequestsTotal .WithLabelValues (outcome , priority , inferencePool ).Inc ()
875896}
876897
898+ // DeleteFlowControlFlowSeries removes every flow-control series labeled with the given fairness ID
899+ // and priority, across both the deprecated and the llm_d_epp metric families. The fairness ID is
900+ // derived from client input, so its cardinality is unbounded; the flow registry calls this when it
901+ // garbage-collects an idle flow so that the metric vectors track live flows instead of growing
902+ // monotonically with every fairness ID ever observed.
903+ func DeleteFlowControlFlowSeries (fairnessID , priority string ) {
904+ labels := prometheus.Labels {"fairness_id" : fairnessID , "priority" : priority }
905+ flowControlRequestQueueDuration .DeletePartialMatch (labels )
906+ flowControlRequestEnqueueDuration .DeletePartialMatch (labels )
907+ flowControlQueueSize .DeletePartialMatch (labels )
908+ flowControlQueueBytes .DeletePartialMatch (labels )
909+ llmdFlowControlRequestQueueDuration .DeletePartialMatch (labels )
910+ llmdFlowControlRequestEnqueueDuration .DeletePartialMatch (labels )
911+ llmdFlowControlQueueSize .DeletePartialMatch (labels )
912+ llmdFlowControlQueueBytes .DeletePartialMatch (labels )
913+ }
914+
877915// RecordInferenceModelRewriteDecision records the routing decision for InferenceModelRewrite.
878916// The rewrite name and target come from configuration; only the source model name is
879917// request-derived and needs bounding (a generic rule matches arbitrary model names).
0 commit comments