Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 

124 rindas
4.4 KiB

  1. package metrics
  2. import (
  3. "testing"
  4. "github.com/prometheus/client_golang/prometheus"
  5. "github.com/prometheus/client_golang/prometheus/testutil"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func newTestRegistry() *prometheus.Registry {
  9. return prometheus.NewRegistry()
  10. }
  11. func TestRequestsTotalCounter(t *testing.T) {
  12. reg := newTestRegistry()
  13. m := NewMetrics(reg)
  14. m.RequestsTotal.WithLabelValues("1", "gpt-4", "200", "true", "chat").Inc()
  15. m.RequestsTotal.WithLabelValues("1", "gpt-4", "200", "true", "chat").Inc()
  16. m.RequestsTotal.WithLabelValues("2", "claude-3", "429", "false", "chat").Inc()
  17. assert.Equal(t, float64(2), testutil.ToFloat64(m.RequestsTotal.WithLabelValues("1", "gpt-4", "200", "true", "chat")))
  18. assert.Equal(t, float64(1), testutil.ToFloat64(m.RequestsTotal.WithLabelValues("2", "claude-3", "429", "false", "chat")))
  19. }
  20. func TestRequestErrorsTotalCounter(t *testing.T) {
  21. reg := newTestRegistry()
  22. m := NewMetrics(reg)
  23. m.RequestErrorsTotal.WithLabelValues("1", "gpt-4", "upstream", "429").Inc()
  24. m.RequestErrorsTotal.WithLabelValues("1", "gpt-4", "upstream", "429").Inc()
  25. m.RequestErrorsTotal.WithLabelValues("2", "claude-3", "timeout", "context_deadline_exceeded").Inc()
  26. assert.Equal(t, float64(2), testutil.ToFloat64(m.RequestErrorsTotal.WithLabelValues("1", "gpt-4", "upstream", "429")))
  27. assert.Equal(t, float64(1), testutil.ToFloat64(m.RequestErrorsTotal.WithLabelValues("2", "claude-3", "timeout", "context_deadline_exceeded")))
  28. }
  29. func TestRequestRetriesTotalCounter(t *testing.T) {
  30. reg := newTestRegistry()
  31. m := NewMetrics(reg)
  32. m.RequestRetriesTotal.WithLabelValues("1", "gpt-4").Inc()
  33. m.RequestRetriesTotal.WithLabelValues("1", "gpt-4").Inc()
  34. assert.Equal(t, float64(2), testutil.ToFloat64(m.RequestRetriesTotal.WithLabelValues("1", "gpt-4")))
  35. }
  36. func TestTokensTotalCounter(t *testing.T) {
  37. reg := newTestRegistry()
  38. m := NewMetrics(reg)
  39. m.TokensTotal.WithLabelValues("1", "gpt-4", "prompt").Add(100)
  40. m.TokensTotal.WithLabelValues("1", "gpt-4", "completion").Add(50)
  41. m.TokensTotal.WithLabelValues("1", "gpt-4", "cache").Add(20)
  42. assert.Equal(t, float64(100), testutil.ToFloat64(m.TokensTotal.WithLabelValues("1", "gpt-4", "prompt")))
  43. assert.Equal(t, float64(50), testutil.ToFloat64(m.TokensTotal.WithLabelValues("1", "gpt-4", "completion")))
  44. assert.Equal(t, float64(20), testutil.ToFloat64(m.TokensTotal.WithLabelValues("1", "gpt-4", "cache")))
  45. }
  46. func TestQuotaConsumedTotalCounter(t *testing.T) {
  47. reg := newTestRegistry()
  48. m := NewMetrics(reg)
  49. m.QuotaConsumedTotal.WithLabelValues("1", "gpt-4", "wallet").Add(5000)
  50. assert.Equal(t, float64(5000), testutil.ToFloat64(m.QuotaConsumedTotal.WithLabelValues("1", "gpt-4", "wallet")))
  51. }
  52. func TestRequestDurationHistogram(t *testing.T) {
  53. reg := newTestRegistry()
  54. m := NewMetrics(reg)
  55. m.RequestDuration.WithLabelValues("1", "gpt-4", "true", "chat").Observe(1.5)
  56. m.RequestDuration.WithLabelValues("1", "gpt-4", "true", "chat").Observe(2.5)
  57. // 验证 histogram metric family 被注册且有数据
  58. assert.Equal(t, 1, testutil.CollectAndCount(m.RequestDuration))
  59. }
  60. func TestUpstreamDurationHistogram(t *testing.T) {
  61. reg := newTestRegistry()
  62. m := NewMetrics(reg)
  63. m.UpstreamDuration.WithLabelValues("1", "gpt-4").Observe(0.5)
  64. assert.Equal(t, 1, testutil.CollectAndCount(m.UpstreamDuration))
  65. }
  66. func TestFirstTokenDurationHistogram(t *testing.T) {
  67. reg := newTestRegistry()
  68. m := NewMetrics(reg)
  69. m.FirstTokenDuration.WithLabelValues("1", "gpt-4").Observe(0.1)
  70. assert.Equal(t, 1, testutil.CollectAndCount(m.FirstTokenDuration))
  71. }
  72. func TestActiveRequestsGauge(t *testing.T) {
  73. reg := newTestRegistry()
  74. m := NewMetrics(reg)
  75. m.ActiveRequests.WithLabelValues("gpt-4").Inc()
  76. m.ActiveRequests.WithLabelValues("gpt-4").Inc()
  77. m.ActiveRequests.WithLabelValues("claude-3").Inc()
  78. assert.Equal(t, float64(2), testutil.ToFloat64(m.ActiveRequests.WithLabelValues("gpt-4")))
  79. assert.Equal(t, float64(1), testutil.ToFloat64(m.ActiveRequests.WithLabelValues("claude-3")))
  80. m.ActiveRequests.WithLabelValues("gpt-4").Dec()
  81. assert.Equal(t, float64(1), testutil.ToFloat64(m.ActiveRequests.WithLabelValues("gpt-4")))
  82. }
  83. func TestMetricsDisabledIsNoOp(t *testing.T) {
  84. // 当 METRICS_ENABLED=false 时,使用独立 registry(Discard)
  85. reg := prometheus.NewPedanticRegistry()
  86. m := NewMetrics(reg)
  87. // 这些调用不应该 panic
  88. m.RequestsTotal.WithLabelValues("1", "gpt-4", "200", "true", "chat").Inc()
  89. m.ActiveRequests.WithLabelValues("gpt-4").Inc()
  90. m.RequestDuration.WithLabelValues("1", "gpt-4", "true", "chat").Observe(1.0)
  91. }