Add actual scraping
This commit is contained in:
parent
e59d737512
commit
828c7fb2ee
2 changed files with 93 additions and 0 deletions
34
arkose_prometheus/__init__.py
Normal file
34
arkose_prometheus/__init__.py
Normal file
|
@ -0,0 +1,34 @@
|
|||
import logging
|
||||
import argparse
|
||||
import asyncio
|
||||
from prometheus_client import start_http_server
|
||||
from . import arkose_gauge
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser("arkose_prometheus")
|
||||
parser.add_argument("-p", "--port", type=int, default=9154)
|
||||
parser.add_argument(
|
||||
"-i",
|
||||
"--scrape-interval",
|
||||
type=int,
|
||||
default=180,
|
||||
help="Scrape interval, in seconds.",
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
start_http_server(args.port)
|
||||
logger.info("Listening on port %d...", args.port)
|
||||
|
||||
try:
|
||||
asyncio.run(arkose_gauge.scrape_metric_forever(interval=args.scrape_interval))
|
||||
except KeyboardInterrupt:
|
||||
logger.info("Closing server (keyboard interrupt)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
59
arkose_prometheus/arkose_gauge.py
Normal file
59
arkose_prometheus/arkose_gauge.py
Normal file
|
@ -0,0 +1,59 @@
|
|||
import asyncio
|
||||
import aiohttp
|
||||
import datetime
|
||||
import re
|
||||
import logging
|
||||
from prometheus_client import Gauge
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
ARKOSES = {
|
||||
"genevois": "https://genevois.arkose.com/",
|
||||
"massy": "https://massy.arkose.com/",
|
||||
"montreuil": "https://montreuil.arkose.com/",
|
||||
"nation": "https://nation.arkose.com/",
|
||||
}
|
||||
|
||||
BLOCKPARK_OCCUPATION = Gauge(
|
||||
"blockpark_occupation", "Blockpark occupation", ["blockpark"]
|
||||
)
|
||||
|
||||
GAUGE_RE = re.compile(r'<div class="jauge-bar"><div style="width: ([0-9]*)%"></div>')
|
||||
|
||||
|
||||
class FailedScrape(Exception):
|
||||
pass
|
||||
|
||||
|
||||
async def _scrape_arkose(arkose, session):
|
||||
async with session.get(ARKOSES[arkose]) as resp:
|
||||
if resp.status != 200:
|
||||
raise FailedScrape("Non-200 error")
|
||||
content = await resp.text()
|
||||
|
||||
with open("/tmp/arkose_{}.html".format(arkose), "w") as handle:
|
||||
handle.write(content)
|
||||
|
||||
match = GAUGE_RE.search(content)
|
||||
if not match:
|
||||
raise FailedScrape("Could not extract gauge")
|
||||
return int(match[1])
|
||||
|
||||
|
||||
async def scrape_metric_forever(interval: int):
|
||||
async with aiohttp.ClientSession() as session:
|
||||
while True:
|
||||
start_time = datetime.datetime.now()
|
||||
occupation_data = await asyncio.gather(
|
||||
*[_scrape_arkose(arkose, session) for arkose in ARKOSES],
|
||||
return_exceptions=True
|
||||
)
|
||||
|
||||
for arkose, occup in zip(ARKOSES, occupation_data):
|
||||
if isinstance(occup, Exception):
|
||||
logger.warning("%s failed: %s", arkose, occup)
|
||||
continue
|
||||
BLOCKPARK_OCCUPATION.labels(blockpark=arkose).set(occup)
|
||||
|
||||
delta_time = datetime.datetime.now() - start_time
|
||||
await asyncio.sleep(interval - delta_time.total_seconds())
|
Loading…
Reference in a new issue