mirror of
https://github.com/tubearchivist/tubearchivist-metrics.git
synced 2024-12-22 01:40:14 +00:00
MVP created
This commit is contained in:
parent
8d0f2cc2a9
commit
76a8195b59
32
tubearchivist-metrics/environment.py
Normal file
32
tubearchivist-metrics/environment.py
Normal file
@ -0,0 +1,32 @@
|
||||
"""
|
||||
Functionality for setting up the environment for the metrics package.
|
||||
Reads in environment variables for the application to use.
|
||||
"""
|
||||
import os
|
||||
|
||||
|
||||
class AppConfig:
|
||||
def __init__(self) -> None:
|
||||
self.config = self.get_config()
|
||||
|
||||
@staticmethod
|
||||
def get_config():
|
||||
"""
|
||||
Reads in environment variables for the application to use.
|
||||
"""
|
||||
|
||||
es_pass = os.environ.get("ES_PASSWORD")
|
||||
es_user = os.environ.get("ES_USER", default="elastic")
|
||||
es_url = os.environ.get("ES_URL", default="http://archivist-es:9200")
|
||||
listen_port = os.environ.get("LISTEN_PORT", default="9934")
|
||||
poll_interval = os.environ.get("POLL_INTERVAL", default="60")
|
||||
|
||||
application = {
|
||||
"es_url": es_url,
|
||||
"es_user": es_user,
|
||||
"es_pass": es_pass,
|
||||
"listen_port": listen_port,
|
||||
"poll_interval": poll_interval,
|
||||
}
|
||||
|
||||
return application
|
30
tubearchivist-metrics/esconnect.py
Normal file
30
tubearchivist-metrics/esconnect.py
Normal file
@ -0,0 +1,30 @@
|
||||
from elasticsearch import Elasticsearch
|
||||
from environment import AppConfig
|
||||
|
||||
config = AppConfig().config
|
||||
|
||||
|
||||
class ElasticWrapper:
|
||||
"""
|
||||
makes calls to elastic search
|
||||
returns response count
|
||||
"""
|
||||
|
||||
es_url = config["es_url"]
|
||||
es_user = config["es_user"]
|
||||
es_pass = config["es_pass"]
|
||||
|
||||
es = Elasticsearch(
|
||||
[es_url],
|
||||
basic_auth=(es_user, es_pass),
|
||||
timeout=30,
|
||||
max_retries=10,
|
||||
retry_on_timeout=True,
|
||||
)
|
||||
|
||||
def get_count(index_name):
|
||||
"""
|
||||
Returns the number of documents in the index
|
||||
"""
|
||||
response = ElasticWrapper.es.count(index=index_name)
|
||||
return response["count"]
|
11
tubearchivist-metrics/getmetrics.py
Normal file
11
tubearchivist-metrics/getmetrics.py
Normal file
@ -0,0 +1,11 @@
|
||||
from esconnect import ElasticWrapper
|
||||
|
||||
|
||||
class GetMetrics:
|
||||
@staticmethod
|
||||
def count(index_name):
|
||||
|
||||
"""Get count of documents from ES"""
|
||||
result = ElasticWrapper.get_count(index_name)
|
||||
print("Metric for " + index_name + ": " + str(result))
|
||||
return int(result)
|
63
tubearchivist-metrics/main.py
Normal file
63
tubearchivist-metrics/main.py
Normal file
@ -0,0 +1,63 @@
|
||||
import time
|
||||
from prometheus_client import start_http_server, Gauge, Enum
|
||||
|
||||
from environment import AppConfig
|
||||
from getmetrics import GetMetrics
|
||||
|
||||
config = AppConfig().config
|
||||
|
||||
# Print configuration on console when starting the application
|
||||
|
||||
print("Configuration is currently set to:")
|
||||
print("Elasticsearch URL: " + config["es_url"])
|
||||
print("Listen Port: " + config["listen_port"])
|
||||
print("Poll Interval (seconds): " + config["poll_interval"])
|
||||
|
||||
|
||||
class AppMetrics:
|
||||
# fmt: off
|
||||
def __init__(self, poll_interval=int(config["poll_interval"])):
|
||||
|
||||
self.poll_interval = poll_interval
|
||||
|
||||
# Metrics to expose
|
||||
self.channel_count = Gauge("channel_count", "Number of channels")
|
||||
self.playlist_count = Gauge("playlist_count", "Number of playlists")
|
||||
self.download_count = Gauge("download_count", "Number of downloads")
|
||||
self.download_queue = Gauge("download_queue", "Number of pending downloads")
|
||||
self.subtitle_count = Gauge("subtitle_count", "Number of subtitles downloaded for videos")
|
||||
# fmt: on
|
||||
|
||||
def run_metrics_loop(self):
|
||||
"""
|
||||
Runs a loop that will update the metrics every second.
|
||||
"""
|
||||
while True:
|
||||
self.retrieve_metrics()
|
||||
time.sleep(self.poll_interval)
|
||||
|
||||
def retrieve_metrics(self):
|
||||
"""
|
||||
Retrieves the metrics from the database and updates the metrics.
|
||||
"""
|
||||
self.channel_count.set(GetMetrics.count(index_name="ta_channel"))
|
||||
self.playlist_count.set(GetMetrics.count(index_name="ta_playlist"))
|
||||
self.download_queue.set(GetMetrics.count(index_name="ta_download"))
|
||||
self.download_count.set(GetMetrics.count(index_name="ta_video"))
|
||||
self.subtitle_count.set(GetMetrics.count(index_name="ta_subtitle"))
|
||||
|
||||
|
||||
def main():
|
||||
"""Main Entry Point"""
|
||||
listen_port = int(config["listen_port"])
|
||||
poll_interval = int(config["poll_interval"])
|
||||
|
||||
app_metrics = AppMetrics(
|
||||
poll_interval=poll_interval,
|
||||
)
|
||||
start_http_server(listen_port)
|
||||
app_metrics.run_metrics_loop()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Loading…
Reference in New Issue
Block a user