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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
package com.softwaremill.sttp.prometheus
import java.lang
import java.util.concurrent.CountDownLatch
import com.softwaremill.sttp.testing.SttpBackendStub
import com.softwaremill.sttp.{HttpURLConnectionBackend, Id, sttp, _}
import io.prometheus.client.CollectorRegistry
import org.scalatest.concurrent.{Eventually, IntegrationPatience}
import org.scalatest.{BeforeAndAfter, FlatSpec, Matchers, OptionValues}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
class PrometheusBackendTest extends FlatSpec with Matchers with BeforeAndAfter with Eventually with OptionValues {
before {
CollectorRegistry.defaultRegistry.clear()
}
it should "use default histogram name" in {
// given
val backendStub = SttpBackendStub(HttpURLConnectionBackend()).whenAnyRequest.thenRespondOk()
val backend = PrometheusBackend[Id, Nothing](backendStub)
val requestsNumber = 10
// when
(0 until requestsNumber).foreach(_ => backend.send(sttp.get(uri"http://127.0.0.1/foo")))
// then
getMetricVale(s"${PrometheusBackend.DefaultHistogramName}_count").value shouldBe requestsNumber
}
it should "use mapped request to histogram name" in {
// given
val customHistogramName = "my_custom_histogram"
val backend =
PrometheusBackend[Id, Nothing](SttpBackendStub(HttpURLConnectionBackend()), _ => Some(customHistogramName))
val requestsNumber = 5
// when
(0 until requestsNumber).foreach(_ => backend.send(sttp.get(uri"http://127.0.0.1/foo")))
// then
getMetricVale(s"${PrometheusBackend.DefaultHistogramName}_count") shouldBe empty
getMetricVale(s"${customHistogramName}_count").value shouldBe requestsNumber
}
it should "disable histograms" in {
// given
val backend =
PrometheusBackend[Id, Nothing](SttpBackendStub(HttpURLConnectionBackend()), _ => None)
val requestsNumber = 6
// when
(0 until requestsNumber).foreach(_ => backend.send(sttp.get(uri"http://127.0.0.1/foo")))
// then
getMetricVale(s"${PrometheusBackend.DefaultHistogramName}_count") shouldBe empty
}
it should "use default gauge name" in {
// given
val requestsNumber = 10
val countDownLatch = new CountDownLatch(1)
val backendStub = SttpBackendStub.asynchronousFuture.whenAnyRequest.thenRespondWrapped {
Future {
countDownLatch.await()
Response(Right(""), 200, "", Nil, Nil)
}
}
val backend = PrometheusBackend[Future, Nothing](backendStub)
// when
(0 until requestsNumber).foreach(_ => backend.send(sttp.get(uri"http://127.0.0.1/foo")))
// then
eventually {
getMetricVale(PrometheusBackend.DefaultRequestsInProgressGaugeName).value shouldBe requestsNumber
}
countDownLatch.countDown()
eventually {
getMetricVale(PrometheusBackend.DefaultRequestsInProgressGaugeName).value shouldBe 0
}
}
it should "use mapped request to gauge name" in {
// given
val customGaugeName = "my_custom_gauge"
val requestsNumber = 10
val countDownLatch = new CountDownLatch(1)
val backendStub = SttpBackendStub.asynchronousFuture.whenAnyRequest.thenRespondWrapped {
Future {
countDownLatch.await()
Response(Right(""), 200, "", Nil, Nil)
}
}
val backend =
PrometheusBackend[Future, Nothing](backendStub, requestToInProgressGaugeNameMapper = _ => Some(customGaugeName))
// when
(0 until requestsNumber).foreach(_ => backend.send(sttp.get(uri"http://127.0.0.1/foo")))
// then
eventually {
getMetricVale(PrometheusBackend.DefaultRequestsInProgressGaugeName) shouldBe empty
getMetricVale(customGaugeName).value shouldBe requestsNumber
}
countDownLatch.countDown()
eventually {
getMetricVale(PrometheusBackend.DefaultRequestsInProgressGaugeName) shouldBe empty
getMetricVale(customGaugeName).value shouldBe 0
}
}
it should "disable gauge" in {
// given
val requestsNumber = 10
val countDownLatch = new CountDownLatch(1)
val backendStub = SttpBackendStub.asynchronousFuture.whenAnyRequest.thenRespondWrapped {
Future {
countDownLatch.await()
Response(Right(""), 200, "", Nil, Nil)
}
}
val backend = PrometheusBackend[Future, Nothing](backendStub, requestToInProgressGaugeNameMapper = _ => None)
// when
(0 until requestsNumber).foreach(_ => backend.send(sttp.get(uri"http://127.0.0.1/foo")))
// then
getMetricVale(PrometheusBackend.DefaultRequestsInProgressGaugeName) shouldBe empty
countDownLatch.countDown()
eventually {
getMetricVale(s"${PrometheusBackend.DefaultHistogramName}_count").value shouldBe requestsNumber
getMetricVale(PrometheusBackend.DefaultRequestsInProgressGaugeName) shouldBe empty
}
}
private[this] def getMetricVale(name: String): Option[lang.Double] =
Option(CollectorRegistry.defaultRegistry.getSampleValue(name))
}
|