metrics.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package metrics
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/imgproxy/imgproxy/v3/metrics/cloudwatch"
  6. "github.com/imgproxy/imgproxy/v3/metrics/datadog"
  7. "github.com/imgproxy/imgproxy/v3/metrics/newrelic"
  8. "github.com/imgproxy/imgproxy/v3/metrics/otel"
  9. "github.com/imgproxy/imgproxy/v3/metrics/prometheus"
  10. )
  11. const (
  12. MetaSourceImageURL = "imgproxy.source_image_url"
  13. MetaSourceImageOrigin = "imgproxy.source_image_origin"
  14. MetaProcessingOptions = "imgproxy.processing_options"
  15. )
  16. type Meta map[string]any
  17. func Init() error {
  18. prometheus.Init()
  19. if err := newrelic.Init(); err != nil {
  20. return nil
  21. }
  22. datadog.Init()
  23. if err := otel.Init(); err != nil {
  24. return err
  25. }
  26. if err := cloudwatch.Init(); err != nil {
  27. return err
  28. }
  29. return nil
  30. }
  31. func Stop() {
  32. newrelic.Stop()
  33. datadog.Stop()
  34. otel.Stop()
  35. cloudwatch.Stop()
  36. }
  37. func Enabled() bool {
  38. return prometheus.Enabled() ||
  39. newrelic.Enabled() ||
  40. datadog.Enabled() ||
  41. otel.Enabled() ||
  42. cloudwatch.Enabled()
  43. }
  44. func StartRequest(ctx context.Context, rw http.ResponseWriter, r *http.Request) (context.Context, context.CancelFunc, http.ResponseWriter) {
  45. promCancel, rw := prometheus.StartRequest(rw)
  46. ctx, nrCancel, rw := newrelic.StartTransaction(ctx, rw, r)
  47. ctx, ddCancel, rw := datadog.StartRootSpan(ctx, rw, r)
  48. ctx, otelCancel, rw := otel.StartRootSpan(ctx, rw, r)
  49. cancel := func() {
  50. promCancel()
  51. nrCancel()
  52. ddCancel()
  53. otelCancel()
  54. }
  55. return ctx, cancel, rw
  56. }
  57. func SetMetadata(ctx context.Context, meta Meta) {
  58. for key, value := range meta {
  59. newrelic.SetMetadata(ctx, key, value)
  60. datadog.SetMetadata(ctx, key, value)
  61. otel.SetMetadata(ctx, key, value)
  62. }
  63. }
  64. func StartQueueSegment(ctx context.Context) context.CancelFunc {
  65. promCancel := prometheus.StartQueueSegment()
  66. nrCancel := newrelic.StartSegment(ctx, "Queue", nil)
  67. ddCancel := datadog.StartSpan(ctx, "queue", nil)
  68. otelCancel := otel.StartSpan(ctx, "queue", nil)
  69. cancel := func() {
  70. promCancel()
  71. nrCancel()
  72. ddCancel()
  73. otelCancel()
  74. }
  75. return cancel
  76. }
  77. func StartDownloadingSegment(ctx context.Context, meta Meta) context.CancelFunc {
  78. promCancel := prometheus.StartDownloadingSegment()
  79. nrCancel := newrelic.StartSegment(ctx, "Downloading image", meta)
  80. ddCancel := datadog.StartSpan(ctx, "downloading_image", meta)
  81. otelCancel := otel.StartSpan(ctx, "downloading_image", meta)
  82. cancel := func() {
  83. promCancel()
  84. nrCancel()
  85. ddCancel()
  86. otelCancel()
  87. }
  88. return cancel
  89. }
  90. func StartProcessingSegment(ctx context.Context, meta Meta) context.CancelFunc {
  91. promCancel := prometheus.StartProcessingSegment()
  92. nrCancel := newrelic.StartSegment(ctx, "Processing image", meta)
  93. ddCancel := datadog.StartSpan(ctx, "processing_image", meta)
  94. otelCancel := otel.StartSpan(ctx, "processing_image", meta)
  95. cancel := func() {
  96. promCancel()
  97. nrCancel()
  98. ddCancel()
  99. otelCancel()
  100. }
  101. return cancel
  102. }
  103. func StartStreamingSegment(ctx context.Context) context.CancelFunc {
  104. promCancel := prometheus.StartStreamingSegment()
  105. nrCancel := newrelic.StartSegment(ctx, "Streaming image", nil)
  106. ddCancel := datadog.StartSpan(ctx, "streaming_image", nil)
  107. otelCancel := otel.StartSpan(ctx, "streaming_image", nil)
  108. cancel := func() {
  109. promCancel()
  110. nrCancel()
  111. ddCancel()
  112. otelCancel()
  113. }
  114. return cancel
  115. }
  116. func SendError(ctx context.Context, errType string, err error) {
  117. prometheus.IncrementErrorsTotal(errType)
  118. newrelic.SendError(ctx, errType, err)
  119. datadog.SendError(ctx, errType, err)
  120. otel.SendError(ctx, errType, err)
  121. }
  122. func ObserveBufferSize(t string, size int) {
  123. prometheus.ObserveBufferSize(t, size)
  124. newrelic.ObserveBufferSize(t, size)
  125. datadog.ObserveBufferSize(t, size)
  126. otel.ObserveBufferSize(t, size)
  127. cloudwatch.ObserveBufferSize(t, size)
  128. }
  129. func SetBufferDefaultSize(t string, size int) {
  130. prometheus.SetBufferDefaultSize(t, size)
  131. newrelic.SetBufferDefaultSize(t, size)
  132. datadog.SetBufferDefaultSize(t, size)
  133. otel.SetBufferDefaultSize(t, size)
  134. cloudwatch.SetBufferDefaultSize(t, size)
  135. }
  136. func SetBufferMaxSize(t string, size int) {
  137. prometheus.SetBufferMaxSize(t, size)
  138. newrelic.SetBufferMaxSize(t, size)
  139. datadog.SetBufferMaxSize(t, size)
  140. otel.SetBufferMaxSize(t, size)
  141. cloudwatch.SetBufferMaxSize(t, size)
  142. }