First implementation commit
This commit is contained in:
parent
dcc880e243
commit
0a980ecb3f
38
.drone.yaml
Normal file
38
.drone.yaml
Normal file
@ -0,0 +1,38 @@
|
||||
kind: pipeline
|
||||
name: jellyfin-library-count-prometheus-exporter
|
||||
type: docker
|
||||
|
||||
platform:
|
||||
os: linux
|
||||
arch: arm64
|
||||
|
||||
steps:
|
||||
- name: push-built-image
|
||||
image: plugins/docker
|
||||
settings:
|
||||
context: app/
|
||||
dockerfile: app/Dockerfile
|
||||
registry: gitea.scubbo.org
|
||||
repo: gitea.scubbo.org/scubbo/jellyfin-library-count-prometheus-exporter
|
||||
# https://laszlo.cloud/how-using-cache-from-can-speed-up-your-docker-builds-in-droneci
|
||||
cache_from:
|
||||
- "gitea.scubbo.org/scubbo/jellyfin-library-count-prometheus-exporter:latest"
|
||||
tags:
|
||||
- ${DRONE_COMMIT_SHA:0:10}
|
||||
- latest
|
||||
debug: true
|
||||
launch_debug: true
|
||||
username: scubbo
|
||||
mtu: 1450
|
||||
password:
|
||||
from_secret: gitea_password
|
||||
- name: telegram_notification
|
||||
image: appleboy/drone-telegram
|
||||
settings:
|
||||
token:
|
||||
from_secret: telegram_token
|
||||
to:
|
||||
from_secret: telegram_convo_id
|
||||
|
||||
image_pull_secrets:
|
||||
- dockerconfigjson
|
13
app/Dockerfile
Normal file
13
app/Dockerfile
Normal file
@ -0,0 +1,13 @@
|
||||
FROM debian
|
||||
|
||||
RUN apt update
|
||||
RUN apt upgrade -y
|
||||
RUN apt install -y python3 python3-pip
|
||||
|
||||
ADD requirements.txt /
|
||||
RUN pip3 install -r /requirements.txt
|
||||
|
||||
ADD main.py /bin
|
||||
RUN chmod +x /bin/main.py
|
||||
|
||||
CMD /bin/main.py
|
71
app/main.py
Executable file
71
app/main.py
Executable file
@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
|
||||
import requests
|
||||
from functools import partial
|
||||
|
||||
from prometheus_client import start_http_server, Gauge, REGISTRY, GC_COLLECTOR, PLATFORM_COLLECTOR, PROCESS_COLLECTOR
|
||||
|
||||
REGISTRY.unregister(GC_COLLECTOR)
|
||||
REGISTRY.unregister(PLATFORM_COLLECTOR)
|
||||
REGISTRY.unregister(PROCESS_COLLECTOR)
|
||||
|
||||
|
||||
MEDIA_TYPES = ['Movie', 'Series', 'Episode', 'Artist', 'Program', 'Trailer', 'Song', 'Album', 'MusicVideo','BoxSet', 'Book', 'Item']
|
||||
|
||||
CACHE_LAST_QUERIED = datetime.datetime.fromtimestamp(0)
|
||||
CACHE = {}
|
||||
|
||||
logging.basicConfig(
|
||||
level=getattr(logging, os.environ.get('LOG_LEVEL', 'INFO')),
|
||||
stream=sys.stdout,
|
||||
format='%(asctime)s %(levelname)s %(message)s')
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _refresh_cache():
|
||||
LOGGER.info('Refreshing cache')
|
||||
full_url = f'{os.environ["API_URL"]}/Items/Counts?api_key={os.environ["API_KEY"]}'
|
||||
LOGGER.debug(f'{full_url=}')
|
||||
global CACHE
|
||||
CACHE = requests.get(full_url).json()
|
||||
LOGGER.debug(f'Refreshed cache with {CACHE}')
|
||||
global CACHE_LAST_QUERIED
|
||||
CACHE_LAST_QUERIED = datetime.datetime.now()
|
||||
|
||||
def _fetch_value_from_cache(media_type):
|
||||
# Should refresh?
|
||||
if (not CACHE) or ((datetime.datetime.now()-CACHE_LAST_QUERIED).seconds >= os.environ.get('REFRESH_RATE', 60)):
|
||||
_refresh_cache()
|
||||
return CACHE[media_type+'Count']
|
||||
|
||||
|
||||
def _get_value(media_type):
|
||||
return _fetch_value_from_cache(media_type)
|
||||
return [media_type+'Count']
|
||||
|
||||
|
||||
def _gauge_update(media_type):
|
||||
return partial(_get_value, media_type=media_type)
|
||||
|
||||
|
||||
def main():
|
||||
gauges = {media_type: Gauge(f'jellyfin_{media_type}Count', f'Count of {media_type}') for media_type in MEDIA_TYPES}
|
||||
for media_type, gauge in gauges.items():
|
||||
# Slightly inefficient that each Gauge will query
|
||||
# independently rather than updating a
|
||||
gauge.set_function(_gauge_update(media_type))
|
||||
start_http_server(8555)
|
||||
LOGGER.info('Starting up!')
|
||||
while True:
|
||||
time.sleep(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
1
app/requirements.txt
Normal file
1
app/requirements.txt
Normal file
@ -0,0 +1 @@
|
||||
prometheus-client
|
Loading…
x
Reference in New Issue
Block a user