"""Healthy demo service: HTTP on :8000 with /health, and a log that has something to grep. Every request is logged; every ~20 s a warning, every ~60 s a simulated DB error — material for «🔎 Свой grep» and «🤖 Спросить агента» («когда были ошибки подключения?»). """ import itertools import logging import threading import time from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") log = logging.getLogger("hello") class Handler(BaseHTTPRequestHandler): def do_GET(self) -> None: body = b"ok\n" if self.path == "/health" else b"hello from tgit demo\n" self.send_response(200) self.send_header("Content-Type", "text/plain") self.end_headers() self.wfile.write(body) def log_message(self, format: str, *args: object) -> None: log.info("%s %s", self.address_string(), format % args) def chatter() -> None: for tick in itertools.count(1): time.sleep(20) log.warning("slow request: /report took %d ms", 1200 + tick % 7 * 100) if tick % 3 == 0: log.error("connection refused: db:5432 (retry %d)", tick // 3) if __name__ == "__main__": threading.Thread(target=chatter, daemon=True).start() log.info("listening on :8000") ThreadingHTTPServer(("0.0.0.0", 8000), Handler).serve_forever()