Untitled

mail@pastecode.io avatar
unknown
plain_text
6 months ago
2.9 kB
17
Indexable
Never
from http import HTTPStatus
from dotenv import load_dotenv
from fastapi import APIRouter, HTTPException
import duckdb
import boto3
import psutil
import shutil
import tempfile
import botocore
import os
from src.app_functions.core.config import Settings

load_dotenv()

router = APIRouter(
        prefix='/health',
        tags=['Health']
        )

@router.get("/")
def health():
    # fetch the uptime of the server
    uptime = psutil.boot_time()
    # Get the operating system temporary folder 
    temp_folder = tempfile.gettempdir()
    # Get the free space in the temporary folder in bytes
    temp_folder_free_space = shutil.disk_usage(temp_folder).free
    # If more than 400MB free
    if( temp_folder_free_space >1024 * 1024 * 400 ):
       {"status":"OK","diskSpaceFree": temp_folder_free_space}
    else: 
     raise HTTPException(status_code=503, detail="Not enough free space in temporary folder.")


    try:
        # Connect to aws s3
        session = boto3.Session(profile_name='gtndn-cloudop')
        credentials = session.get_credentials()
        client = boto3.client(
            's3',
            aws_access_key_id=credentials.access_key,
            aws_secret_access_key=credentials.secret_key,
            aws_session_token=credentials.token
        )
        # The head_bucket returns 200 Ok if the bucket exists and 403 forbidden if we have a wrong bucket_name 
        # The head_bucket is needed to test the client, beacuse we won't get an exeption if we have wrong credentials
        client.head_bucket(Bucket=os.getenv('BUCKET_NAME'))
        
        # Connect to duckDB
        # settings=Settings()
        # duckdb.connect(settings.DUCKDB_PATH)
        settings=Settings()
        database=settings.DUCKDB_PATH.as_posix()
        duckdb.connect(database)
        return {"status": "UP", "uptime": uptime, "checks": {"duckDB": "UP", "S3": "UP", "diskSpaceFree": temp_folder_free_space}, "HTTPresponse": HTTPStatus.OK}
    except botocore.exceptions.ProfileNotFound:
        return {"status": "ERROR", "uptime": uptime, "checks": {"duckDB": "UP", "S3": "DOWN", "diskSpaceFree": temp_folder_free_space}, "HTTP response": HTTPStatus.SERVICE_UNAVAILABLE}
    except botocore.exceptions.ClientError:
        return {"status": "UP", "uptime": uptime, "checks": {"duckDB": "UP", "S3": "DOWN", "diskSpaceFree": temp_folder_free_space}, "HTTP response": HTTPStatus.SERVICE_UNAVAILABLE}
    except botocore.exceptions.UnknownServiceError :
        return {"status": "ERROR", "uptime": uptime, "checks": {"duckDB": "UP", "S3": "DOWN", "diskSpaceFree": temp_folder_free_space}, "HTTP response": HTTPStatus.SERVICE_UNAVAILABLE}
    except Exception :
       return {"status": "ERROR", "uptime": uptime, "checks": {"duckDB": "DOWN", "S3": "UP", "diskSpaceFree": temp_folder_free_space}, "HTTP response": HTTPStatus.SERVICE_UNAVAILABLE}