jellyfin-exporter/src/jellyfin_exporter/collector.py

59 lines
1.9 KiB
Python

# pylint: disable=too-few-public-methods
import collections
from prometheus_client import CollectorRegistry, generate_latest
from prometheus_client.core import GaugeMetricFamily
from prometheus_client.registry import Collector
from .jellyfin import JellyfinAPI
CollectorsOptions = collections.namedtuple('CollectorsOptions', [
'sessions',
])
class SessionsCollector(Collector):
"""
Collects Jellyfin /Sessions API endpoint
# HELP jellyfin_sessions Current sessions
# TYPE jellyfin_sessions gauge
jellyfin_session{device="Android TV", "playing"="Attack on Titan", "playmethod"="DirectPlay", "username": "hipstercat"} 1.0
"""
def __init__(self, jf):
self._jf = jf
def collect(self): # pylint: disable=missing-docstring
sessions_metrics = GaugeMetricFamily(
'jellyfin_sessions',
'Current sessions',
labels=["device", "playing", "playmethod", "username"])
for session in self._jf.api("GET", "Sessions", params={"ActiveWithinSeconds": 30}):
if "NowPlayingItem" not in session:
continue
if "PlayState" not in session:
continue
if session["PlayState"]["IsPaused"]:
continue
if "SeriesName" in session["NowPlayingItem"]:
name = session["NowPlayingItem"]["SeriesName"]
else:
name = session["NowPlayingItem"]["Name"]
label_values = [session["Client"], name, session["PlayState"]["PlayMethod"], session["UserName"]]
sessions_metrics.add_metric(label_values, 1)
yield sessions_metrics
def collect_jellyfin(config, host, options: CollectorsOptions):
"""Scrape a host and return prometheus text format for it"""
jf = JellyfinAPI(host, **config)
registry = CollectorRegistry()
if options.sessions:
registry.register(SessionsCollector(jf))
return generate_latest(registry)