nephthys/nephthys/__main__.py
Mish 81dd26da2b
Add support for pushing logs to an OpenTelemetry endpoint (#130)
* Allow specifying log level per-logger

* Add support for sending logs to an OpenTelemetry endpoint

* Consistently use parse_level_name() for LOG_LEVEL_* env vars
2025-12-01 14:05:32 +00:00

97 lines
3 KiB
Python

import asyncio
import contextlib
import logging
from datetime import datetime
import uvicorn
from aiohttp import ClientSession
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from dotenv import load_dotenv
from starlette.applications import Starlette
from nephthys.tasks.close_stale import close_stale_tickets
from nephthys.tasks.daily_stats import send_daily_stats
from nephthys.tasks.update_helpers import update_helpers
from nephthys.utils.delete_thread import process_queue
from nephthys.utils.env import env
from nephthys.utils.logging import parse_level_name
from nephthys.utils.logging import send_heartbeat
from nephthys.utils.logging import setup_otel_logging
load_dotenv()
try:
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
except ImportError:
pass
logging.basicConfig(level=logging.NOTSET)
stderr_logger = logging.StreamHandler()
stderr_logger.setLevel(parse_level_name(env.log_level_stderr))
stderr_logger.setFormatter(logging.Formatter(logging.BASIC_FORMAT))
logging.getLogger().handlers = [stderr_logger]
if env.otel_logs_url:
setup_otel_logging()
@contextlib.asynccontextmanager
async def main(_app: Starlette):
await send_heartbeat(":neodog_nom_verified: Bot is online!")
async with ClientSession() as session:
env.session = session
await env.db.connect()
scheduler = AsyncIOScheduler(timezone="Europe/London")
if env.daily_summary:
scheduler.add_job(send_daily_stats, "cron", hour=0, minute=0)
scheduler.add_job(
close_stale_tickets,
"interval",
hours=1,
max_instances=1,
next_run_time=datetime.now(),
)
scheduler.start()
delete_msg_task = asyncio.create_task(process_queue())
await update_helpers()
handler = None
if env.slack_app_token:
if env.environment == "production":
logging.warning(
"You are currently running Socket mode in production. This is NOT RECOMMENDED - you should set up a proper HTTP server with a request URL."
)
from slack_bolt.adapter.socket_mode.async_handler import (
AsyncSocketModeHandler,
)
from nephthys.utils.slack import app as slack_app
handler = AsyncSocketModeHandler(slack_app, env.slack_app_token)
logging.info("Starting Socket Mode handler")
await handler.connect_async()
logging.info(f"Starting Uvicorn on port {env.port}")
yield
scheduler.shutdown()
delete_msg_task.cancel()
if handler:
logging.info("Stopping Socket Mode handler")
await handler.close_async()
def start():
uvicorn.run(
"nephthys.utils.starlette:app",
host="0.0.0.0",
port=env.port,
log_level="info" if env.environment != "production" else "warning",
reload=env.environment == "development",
)
if __name__ == "__main__":
start()