File size: 1,321 Bytes
f1dd159
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package gateway

import (
	"context"
	"time"

	"github.com/chenyme/grok2api/backend/internal/pkg/perfmetrics"
)

const (
	finalizationHealthBudget    = 750 * time.Millisecond
	finalizationOwnershipBudget = 1500 * time.Millisecond
	finalizationQuotaBudget     = time.Second
	finalizationAuditBudget     = 3 * time.Second
	finalizationMetadataBudget  = 500 * time.Millisecond
)

type finalizationBudget struct {
	deadline  time.Time
	operation string
	provider  string
}

func newFinalizationBudget(operation, provider string) finalizationBudget {
	return finalizationBudget{
		deadline:  time.Now().Add(finalizationTimeout),
		operation: operation,
		provider:  provider,
	}
}

func (b finalizationBudget) run(stage string, limit time.Duration, action func(context.Context) error) error {
	started := time.Now()
	deadline := b.deadline
	if candidate := started.Add(limit); candidate.Before(deadline) {
		deadline = candidate
	}
	ctx, cancel := context.WithDeadline(context.Background(), deadline)
	err := action(ctx)
	cancel()
	outcome := "success"
	if err != nil {
		outcome = "failed"
	}
	perfmetrics.Default.ObserveDuration("finalization_stage_duration_us", perfmetrics.Labels{
		Subsystem: "gateway", Operation: b.operation, Provider: b.provider, Stage: stage, Outcome: outcome,
	}, time.Since(started))
	return err
}