1
1
"""Tests for Jupyter Server metrics functionality."""
2
2
3
- import pytest
4
- import requests
5
3
import time
6
4
from unittest .mock import patch
7
5
6
+ import pytest
7
+ import requests
8
+
8
9
from jupyter_server .prometheus .server import PrometheusMetricsServer , start_metrics_server
9
10
from jupyter_server .serverapp import ServerApp
10
11
13
14
def metrics_server_app ():
14
15
"""Create a server app with metrics enabled on a specific port."""
15
16
# Override the environment variable for this test
16
- with patch .dict (' os.environ' , {' JUPYTER_SERVER_METRICS_PORT' : ' 9090' }):
17
+ with patch .dict (" os.environ" , {" JUPYTER_SERVER_METRICS_PORT" : " 9090" }):
17
18
app = ServerApp ()
18
19
# Set the metrics_port directly as a trait
19
20
app .metrics_port = 9090
@@ -29,38 +30,38 @@ def metrics_server(metrics_server_app):
29
30
time .sleep (0.1 )
30
31
yield server
31
32
# Cleanup
32
- if hasattr (server , ' stop' ):
33
+ if hasattr (server , " stop" ):
33
34
server .stop ()
34
35
35
36
36
37
def test_metrics_server_starts (metrics_server ):
37
38
"""Test that the metrics server starts successfully."""
38
39
assert metrics_server is not None
39
- assert hasattr (metrics_server , ' port' )
40
+ assert hasattr (metrics_server , " port" )
40
41
assert metrics_server .port == 9090
41
42
42
43
43
44
def test_metrics_endpoint_accessible (metrics_server ):
44
45
"""Test that the metrics endpoint is accessible."""
45
- response = requests .get (f' http://localhost:{ metrics_server .port } /metrics' )
46
+ response = requests .get (f" http://localhost:{ metrics_server .port } /metrics" )
46
47
assert response .status_code == 200
47
- assert ' jupyter_server' in response .text
48
+ assert " jupyter_server" in response .text
48
49
49
50
50
51
def test_metrics_contains_kernel_metrics (metrics_server ):
51
52
"""Test that kernel metrics are present."""
52
- response = requests .get (f' http://localhost:{ metrics_server .port } /metrics' )
53
+ response = requests .get (f" http://localhost:{ metrics_server .port } /metrics" )
53
54
assert response .status_code == 200
54
55
content = response .text
55
- assert ' jupyter_kernel_currently_running_total' in content
56
+ assert " jupyter_kernel_currently_running_total" in content
56
57
57
58
58
59
def test_metrics_contains_server_info (metrics_server ):
59
60
"""Test that server info metrics are present."""
60
- response = requests .get (f' http://localhost:{ metrics_server .port } /metrics' )
61
+ response = requests .get (f" http://localhost:{ metrics_server .port } /metrics" )
61
62
assert response .status_code == 200
62
63
content = response .text
63
- assert ' jupyter_server_info' in content
64
+ assert " jupyter_server_info" in content
64
65
65
66
66
67
def test_metrics_server_with_authentication ():
@@ -70,20 +71,20 @@ def test_metrics_server_with_authentication():
70
71
app .authenticate_prometheus = True
71
72
app .initialize ([])
72
73
app .identity_provider .token = "test_token"
73
-
74
+
74
75
server = start_metrics_server (app , 9091 )
75
76
time .sleep (0.1 )
76
-
77
+
77
78
try :
78
79
# Without token should fail
79
- response = requests .get (f' http://localhost:{ server .port } /metrics' )
80
+ response = requests .get (f" http://localhost:{ server .port } /metrics" )
80
81
assert response .status_code == 401
81
-
82
+
82
83
# With token should succeed
83
- response = requests .get (f' http://localhost:{ server .port } /metrics?token=test_token' )
84
+ response = requests .get (f" http://localhost:{ server .port } /metrics?token=test_token" )
84
85
assert response .status_code == 200
85
86
finally :
86
- if hasattr (server , ' stop' ):
87
+ if hasattr (server , " stop" ):
87
88
server .stop ()
88
89
89
90
@@ -96,31 +97,31 @@ def test_metrics_server_port_conflict_handling():
96
97
# Start first server
97
98
server1 = start_metrics_server (app , 9092 )
98
99
time .sleep (0.1 )
99
-
100
+
100
101
try :
101
102
# Try to start second server on same port
102
103
server2 = start_metrics_server (app , 9092 )
103
104
time .sleep (0.1 )
104
-
105
+
105
106
# One of them should have failed to start or used a different port
106
- if server2 is not None and hasattr (server2 , ' port' ):
107
+ if server2 is not None and hasattr (server2 , " port" ):
107
108
assert server2 .port != 9092 or server1 .port != 9092
108
109
finally :
109
- if hasattr (server1 , ' stop' ):
110
+ if hasattr (server1 , " stop" ):
110
111
server1 .stop ()
111
- if server2 is not None and hasattr (server2 , ' stop' ):
112
+ if server2 is not None and hasattr (server2 , " stop" ):
112
113
server2 .stop ()
113
114
114
115
115
116
def test_metrics_server_disabled_when_port_zero ():
116
117
"""Test that metrics server is not started when port is 0."""
117
- with patch .dict (' os.environ' , {' JUPYTER_SERVER_METRICS_PORT' : '0' }):
118
+ with patch .dict (" os.environ" , {" JUPYTER_SERVER_METRICS_PORT" : "0" }):
118
119
app = ServerApp ()
119
120
app .metrics_port = 0
120
121
app .initialize ([])
121
-
122
+
122
123
# Should not start metrics server
123
- assert not hasattr (app , ' metrics_server' ) or app .metrics_server is None
124
+ assert not hasattr (app , " metrics_server" ) or app .metrics_server is None
124
125
125
126
126
127
def test_metrics_url_logging_with_separate_server ():
@@ -130,18 +131,18 @@ def test_metrics_url_logging_with_separate_server():
130
131
app .authenticate_prometheus = True
131
132
app .initialize ([])
132
133
app .identity_provider .token = "test_token"
133
-
134
+
134
135
# Start metrics server
135
136
server = start_metrics_server (app , 9093 )
136
137
time .sleep (0.1 )
137
-
138
+
138
139
try :
139
140
# The URL should include the separate port
140
141
expected_url = "http://localhost:9093/metrics?token=test_token"
141
142
# This is a basic test - in practice you'd capture the log output
142
143
assert server .port == 9093
143
144
finally :
144
- if hasattr (server , ' stop' ):
145
+ if hasattr (server , " stop" ):
145
146
server .stop ()
146
147
147
148
@@ -152,7 +153,7 @@ def test_metrics_url_logging_with_main_server():
152
153
app .authenticate_prometheus = True
153
154
app .initialize ([])
154
155
app .identity_provider .token = "test_token"
155
-
156
+
156
157
# Should use main server's /metrics endpoint
157
158
# This would be tested by checking the log output in practice
158
- assert app .metrics_port == 0
159
+ assert app .metrics_port == 0
0 commit comments