Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions jupyter_server/prometheus/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
18 changes: 17 additions & 1 deletion jupyter_server/serverapp.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand Down
Loading