diff --git a/jupyter_server/prometheus/metrics.py b/jupyter_server/prometheus/metrics.py index ff71523299..c0aeb37568 100644 --- a/jupyter_server/prometheus/metrics.py +++ b/jupyter_server/prometheus/metrics.py @@ -58,6 +58,17 @@ "Jupyter Server Extensiom Version Information", ["name", "version", "enabled"], ) +LAST_ACTIVITY = Gauge( + "jupyter_server_last_activity_timestamp_seconds", + "Timestamp of last seen activity on this Jupyter Server", +) +SERVER_STARTED = Gauge( + "jupyter_server_started_timestamp_seconds", "Timestamp of when this Jupyter Server was started" +) +ACTIVE_DURATION = Gauge( + "jupyter_server_active_duration_seconds", + "Number of seconds this Jupyter Server has been active", +) __all__ = [ "HTTP_REQUEST_DURATION_SECONDS", diff --git a/jupyter_server/serverapp.py b/jupyter_server/serverapp.py index ca8bc98743..2766509abc 100644 --- a/jupyter_server/serverapp.py +++ b/jupyter_server/serverapp.py @@ -110,7 +110,13 @@ GatewaySessionManager, ) from jupyter_server.log import log_request -from jupyter_server.prometheus.metrics import SERVER_EXTENSION_INFO, SERVER_INFO +from jupyter_server.prometheus.metrics import ( + ACTIVE_DURATION, + LAST_ACTIVITY, + SERVER_EXTENSION_INFO, + SERVER_INFO, + SERVER_STARTED, +) from jupyter_server.services.config import ConfigManager from jupyter_server.services.contents.filemanager import ( AsyncFileContentsManager, @@ -2708,6 +2714,16 @@ def init_metrics(self) -> None: name=ext.name, version=ext.version, enabled=str(ext.enabled).lower() ) + started = self.web_app.settings["started"] + SERVER_STARTED.set(started.timestamp()) + + LAST_ACTIVITY.set_function(lambda: self.web_app.last_activity().timestamp()) + ACTIVE_DURATION.set_function( + lambda: ( + self.web_app.last_activity() - self.web_app.settings["started"] + ).total_seconds() + ) + @catch_config_error def initialize( self,