Skip to content

Commit 8c2f1a8

Browse files
committed
feat: enhance API key usage grouping with base URL inclusion
- Updated `GetAPIKeyUsage` to group API key usage by "base_url|api_key" composite keys. - Adjusted logic to handle `base_url` extraction from auth attributes. - Revised unit tests to validate "base_url|api_key" grouping behavior.
1 parent e37f3be commit 8c2f1a8

2 files changed

Lines changed: 18 additions & 8 deletions

File tree

internal/api/handlers/management/api_key_usage.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func mergeRecentRequestBuckets(dst, src []coreauth.RecentRequestBucket) []coreau
3535
}
3636

3737
// GetAPIKeyUsage returns recent request buckets for all in-memory api_key auths,
38-
// grouped by provider and keyed by the raw api-key value.
38+
// grouped by provider and keyed by "base_url|api_key".
3939
func (h *Handler) GetAPIKeyUsage(c *gin.Context) {
4040
if h == nil {
4141
c.JSON(http.StatusInternalServerError, gin.H{"error": "handler not initialized"})
@@ -64,6 +64,14 @@ func (h *Handler) GetAPIKeyUsage(c *gin.Context) {
6464
if apiKey == "" {
6565
continue
6666
}
67+
baseURL := ""
68+
if auth.Attributes != nil {
69+
baseURL = strings.TrimSpace(auth.Attributes["base_url"])
70+
if baseURL == "" {
71+
baseURL = strings.TrimSpace(auth.Attributes["base-url"])
72+
}
73+
}
74+
compositeKey := baseURL + "|" + apiKey
6775
provider := strings.ToLower(strings.TrimSpace(auth.Provider))
6876
if provider == "" {
6977
provider = "unknown"
@@ -75,11 +83,11 @@ func (h *Handler) GetAPIKeyUsage(c *gin.Context) {
7583
providerBucket = make(map[string][]coreauth.RecentRequestBucket)
7684
out[provider] = providerBucket
7785
}
78-
if existing, exists := providerBucket[apiKey]; exists {
79-
providerBucket[apiKey] = mergeRecentRequestBuckets(existing, recent)
86+
if existing, exists := providerBucket[compositeKey]; exists {
87+
providerBucket[compositeKey] = mergeRecentRequestBuckets(existing, recent)
8088
continue
8189
}
82-
providerBucket[apiKey] = recent
90+
providerBucket[compositeKey] = recent
8391
}
8492

8593
c.JSON(http.StatusOK, out)

internal/api/handlers/management/api_key_usage_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ func TestGetAPIKeyUsage_GroupsByProviderAndAPIKey(t *testing.T) {
3131
ID: "codex-auth",
3232
Provider: "codex",
3333
Attributes: map[string]string{
34-
"api_key": "codex-key",
34+
"api_key": "codex-key",
35+
"base_url": "https://codex.example.com",
3536
},
3637
}); err != nil {
3738
t.Fatalf("register codex auth: %v", err)
@@ -40,7 +41,8 @@ func TestGetAPIKeyUsage_GroupsByProviderAndAPIKey(t *testing.T) {
4041
ID: "claude-auth",
4142
Provider: "claude",
4243
Attributes: map[string]string{
43-
"api_key": "claude-key",
44+
"api_key": "claude-key",
45+
"base_url": "https://claude.example.com",
4446
},
4547
}); err != nil {
4648
t.Fatalf("register claude auth: %v", err)
@@ -67,7 +69,7 @@ func TestGetAPIKeyUsage_GroupsByProviderAndAPIKey(t *testing.T) {
6769
t.Fatalf("decode payload: %v", err)
6870
}
6971

70-
codexBuckets := payload["codex"]["codex-key"]
72+
codexBuckets := payload["codex"]["https://codex.example.com|codex-key"]
7173
if len(codexBuckets) != 20 {
7274
t.Fatalf("codex buckets len = %d, want 20", len(codexBuckets))
7375
}
@@ -76,7 +78,7 @@ func TestGetAPIKeyUsage_GroupsByProviderAndAPIKey(t *testing.T) {
7678
t.Fatalf("codex totals = %d/%d, want 1/1", codexSuccess, codexFailed)
7779
}
7880

79-
claudeBuckets := payload["claude"]["claude-key"]
81+
claudeBuckets := payload["claude"]["https://claude.example.com|claude-key"]
8082
if len(claudeBuckets) != 20 {
8183
t.Fatalf("claude buckets len = %d, want 20", len(claudeBuckets))
8284
}

0 commit comments

Comments
 (0)