From 1fd274d895ab5d4a00f41a6e3103781fc76058de Mon Sep 17 00:00:00 2001 From: Leopold Schabel Date: Fri, 12 Aug 2022 19:32:37 +0200 Subject: [PATCH] python_client: add simple Python ClickHouse client --- python_client/radiance.py | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 python_client/radiance.py diff --git a/python_client/radiance.py b/python_client/radiance.py new file mode 100755 index 0000000..59f9961 --- /dev/null +++ b/python_client/radiance.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 + +import os + +import requests + +RADIANCE_HOST = os.getenv("RADIANCE_HOST") +RADIANCE_USER = os.getenv("RADIANCE_USER") +RADIANCE_PASSWORD = os.getenv("RADIANCE_PASSWORD") + +LEADER_STATS = """ +SELECT + leader, + median(diff), + count() +FROM +( + WITH + leader, + minIf(timestamp, type = 'firstShredReceived') AS tsReceived, + minIf(timestamp, type = 'completed') AS tsCompleted + SELECT + source, + slot, + leader, + toUnixTimestamp64Milli(tsCompleted) - toUnixTimestamp64Milli(tsReceived) AS diff + FROM slot_status + WHERE toDate(timestamp) = today() - 5 + GROUP BY + slot, + leader, + source +) +GROUP BY leader +ORDER BY median(diff) +FORMAT JSON +""" + + +class RadianceClient(): + def __init__(self, host, user, password): + self.host = host + self.user = user + self.password = password + self.session = requests.session() + self.session.user_agent = "radiance-client/v0.1" + self.session.auth = (self.user, self.password) + + def query(self, query): + r = self.session.post(self.host, data=query) + if r.status_code != 200: + raise Exception("Failed to get leader stats: {}".format(r.text)) + return r.json()['data'] + + def get_leader_stats(self): + return self.query(LEADER_STATS) + + +if __name__ == '__main__': + import pprint + + c = RadianceClient(RADIANCE_HOST, RADIANCE_USER, RADIANCE_PASSWORD) + r = c.get_leader_stats() + pprint.pprint(r)