@@ -36,18 +36,30 @@ func TestCollectMetrics(t *testing.T) {
3636 }
3737
3838 mockClock := mock .NewMockClock (ctrl )
39+ mockClock .EXPECT ().
40+ Now ().
41+ Return (time .Now ()).
42+ Times (1 )
43+
3944 mockClock .EXPECT ().
4045 Parse (gomock .Any (), gomock .Any ()).
4146 DoAndReturn (func (s1 , s2 string ) (time.Time , error ) {
4247 return time .Parse (s1 , s2 )
4348 }).
4449 Times (1 )
4550
51+ // The first call to Since is for the uptime of the container
4652 mockClock .EXPECT ().
4753 Since (gomock .Any ()).
4854 Return (1 * time .Second ).
4955 Times (1 )
5056
57+ // The second call to Since is for the scrape duration
58+ mockClock .EXPECT ().
59+ Since (gomock .Any ()).
60+ Return (2 * time .Second ).
61+ Times (1 )
62+
5163 dc := collector .NewWithClient (cli , mockClock , ignoreLabel )
5264
5365 const expected = `
@@ -108,6 +120,161 @@ func TestCollectMetrics(t *testing.T) {
108120 # HELP docker_container_uptime Uptime of the container in seconds
109121 # TYPE docker_container_uptime gauge
110122 docker_container_uptime{name="testName"} 1.0
123+ # HELP docker_exporter_scrape_duration Duration of the scrape in seconds
124+ # TYPE docker_exporter_scrape_duration gauge
125+ docker_exporter_scrape_duration 2
126+ `
127+
128+ if err := testutil .CollectAndCompare (dc , strings .NewReader (expected )); err != nil {
129+ t .Errorf ("unexpected collecting result:\n %s" , err )
130+ }
131+ }
132+
133+ func TestCollectMetricsShouldCollectErrorWhenContainerListFails (t * testing.T ) {
134+ ctrl := gomock .NewController (t )
135+ defer ctrl .Finish ()
136+
137+ srv := httptest .NewServer (http .HandlerFunc (mockErrorDockerApi ))
138+ defer srv .Close ()
139+
140+ cli , err := client .NewClientWithOpts (
141+ client .WithHost (srv .URL ),
142+ client .WithHTTPClient (& http.Client {}),
143+ )
144+
145+ if err != nil {
146+ panic (err )
147+ }
148+
149+ mockClock := mock .NewMockClock (ctrl )
150+ mockClock .EXPECT ().
151+ Now ().
152+ Return (time .Now ()).
153+ Times (1 )
154+
155+ mockClock .EXPECT ().
156+ Since (gomock .Any ()).
157+ Return (2 * time .Second ).
158+ Times (1 )
159+
160+ dc := collector .NewWithClient (cli , mockClock , ignoreLabel )
161+
162+ const expected = `
163+ # HELP docker_exporter_scrape_errors Number of scrape errors
164+ # TYPE docker_exporter_scrape_errors counter
165+ docker_exporter_scrape_errors 1
166+ # HELP docker_exporter_scrape_duration Duration of the scrape in seconds
167+ # TYPE docker_exporter_scrape_duration gauge
168+ docker_exporter_scrape_duration 2
169+ `
170+
171+ if err := testutil .CollectAndCompare (dc , strings .NewReader (expected )); err != nil {
172+ t .Errorf ("unexpected collecting result:\n %s" , err )
173+ }
174+ }
175+
176+ func TestCollectMetricsShouldCollectErrorWhenContainerInspectFails (t * testing.T ) {
177+ ctrl := gomock .NewController (t )
178+ defer ctrl .Finish ()
179+
180+ srv := httptest .NewServer (http .HandlerFunc (mockContainerInspectErrorDockerApi ))
181+ defer srv .Close ()
182+
183+ cli , err := client .NewClientWithOpts (
184+ client .WithHost (srv .URL ),
185+ client .WithHTTPClient (& http.Client {}),
186+ )
187+
188+ if err != nil {
189+ panic (err )
190+ }
191+
192+ mockClock := mock .NewMockClock (ctrl )
193+ mockClock .EXPECT ().
194+ Now ().
195+ Return (time .Now ()).
196+ Times (1 )
197+
198+ mockClock .EXPECT ().
199+ Since (gomock .Any ()).
200+ Return (2 * time .Second ).
201+ Times (1 )
202+
203+ dc := collector .NewWithClient (cli , mockClock , ignoreLabel )
204+
205+ const expected = `
206+ # HELP docker_exporter_scrape_errors Number of scrape errors
207+ # TYPE docker_exporter_scrape_errors counter
208+ docker_exporter_scrape_errors 1
209+ # HELP docker_exporter_scrape_duration Duration of the scrape in seconds
210+ # TYPE docker_exporter_scrape_duration gauge
211+ docker_exporter_scrape_duration 2
212+ `
213+
214+ if err := testutil .CollectAndCompare (dc , strings .NewReader (expected )); err != nil {
215+ t .Errorf ("unexpected collecting result:\n %s" , err )
216+ }
217+ }
218+
219+ func TestCollectMetricsShouldCollectErrorWhenContainerStatsFails (t * testing.T ) {
220+ ctrl := gomock .NewController (t )
221+ defer ctrl .Finish ()
222+
223+ srv := httptest .NewServer (http .HandlerFunc (mockContainerStatsErrorDockerApi ))
224+ defer srv .Close ()
225+
226+ cli , err := client .NewClientWithOpts (
227+ client .WithHost (srv .URL ),
228+ client .WithHTTPClient (& http.Client {}),
229+ )
230+
231+ if err != nil {
232+ panic (err )
233+ }
234+
235+ mockClock := mock .NewMockClock (ctrl )
236+ mockClock .EXPECT ().
237+ Now ().
238+ Return (time .Now ()).
239+ Times (1 )
240+
241+ mockClock .EXPECT ().
242+ Parse (gomock .Any (), gomock .Any ()).
243+ DoAndReturn (func (s1 , s2 string ) (time.Time , error ) {
244+ return time .Parse (s1 , s2 )
245+ }).
246+ Times (1 )
247+
248+ // The first call to Since is for the uptime of the container
249+ mockClock .EXPECT ().
250+ Since (gomock .Any ()).
251+ Return (1 * time .Second ).
252+ Times (1 )
253+
254+ // The second call to Since is for the scrape duration
255+ mockClock .EXPECT ().
256+ Since (gomock .Any ()).
257+ Return (2 * time .Second ).
258+ Times (1 )
259+
260+ dc := collector .NewWithClient (cli , mockClock , ignoreLabel )
261+
262+ const expected = `
263+ # HELP docker_container_info Infos about the container
264+ # TYPE docker_container_info gauge
265+ docker_container_info{image="sha256:d3751d33f9cd5049c4af2b462735457e4d3baf130bcbb87f389e349fbaeb20b9",image_name="myImage",name="testName"} 1
266+ # HELP docker_container_state State of the container
267+ # TYPE docker_container_state gauge
268+ docker_container_state{name="testName",state="running"} 1
269+ # HELP docker_container_uptime Uptime of the container in seconds
270+ # TYPE docker_container_uptime gauge
271+ docker_container_uptime{name="testName"} 1
272+ # HELP docker_exporter_scrape_duration Duration of the scrape in seconds
273+ # TYPE docker_exporter_scrape_duration gauge
274+ docker_exporter_scrape_duration 2
275+ # HELP docker_exporter_scrape_errors Number of scrape errors
276+ # TYPE docker_exporter_scrape_errors counter
277+ docker_exporter_scrape_errors 1
111278 `
112279
113280 if err := testutil .CollectAndCompare (dc , strings .NewReader (expected )); err != nil {
@@ -226,3 +393,35 @@ func mockDockerApi(w http.ResponseWriter, r *http.Request) {
226393
227394 mockJsonResponse (w , r , buildContainerListResponse ())
228395}
396+
397+ func mockErrorDockerApi (w http.ResponseWriter , r * http.Request ) {
398+ w .WriteHeader (http .StatusInternalServerError )
399+ }
400+
401+ func mockContainerInspectErrorDockerApi (w http.ResponseWriter , r * http.Request ) {
402+ if strings .Contains (r .URL .Path , "stats" ) {
403+ mockJsonResponse (w , r , buildStatsResponse ())
404+ return
405+ }
406+
407+ if strings .Contains (r .URL .Path , "testID" ) {
408+ w .WriteHeader (http .StatusInternalServerError )
409+ return
410+ }
411+
412+ mockJsonResponse (w , r , buildContainerListResponse ())
413+ }
414+
415+ func mockContainerStatsErrorDockerApi (w http.ResponseWriter , r * http.Request ) {
416+ if strings .Contains (r .URL .Path , "stats" ) {
417+ w .WriteHeader (http .StatusInternalServerError )
418+ return
419+ }
420+
421+ if strings .Contains (r .URL .Path , "testID" ) {
422+ mockJsonResponse (w , r , buildInspectResponse ())
423+ return
424+ }
425+
426+ mockJsonResponse (w , r , buildContainerListResponse ())
427+ }
0 commit comments