2023-05-15 22:55:49 +08:00
import argparse
import logging
2023-06-05 13:19:27 +05:30
import os
2023-12-28 18:04:02 +05:30
import sqlite3
2023-05-15 22:55:49 +08:00
from typing import Dict , List
import uvicorn
2023-12-28 18:04:02 +05:30
from dotenv import load_dotenv
from fastapi import FastAPI , HTTPException
from posthog import Posthog
2023-05-15 22:55:49 +08:00
# Initialize Global App Variables
app = FastAPI ( )
2023-05-17 18:58:08 +05:30
sqlfile = " data/khoj.sqlite "
2023-05-15 22:55:49 +08:00
logger = logging . getLogger ( )
logger . setLevel ( logging . DEBUG )
2023-06-05 13:19:27 +05:30
load_dotenv ( )
posthog = Posthog ( project_api_key = os . getenv ( " POSTHOG_API_KEY " ) , host = " https://app.posthog.com " )
2023-05-15 22:55:49 +08:00
@app.post ( " /v1/telemetry " )
def v1_telemetry ( telemetry_data : List [ Dict [ str , str ] ] ) :
# Throw exception if no telemetry data received in POST request body
if len ( telemetry_data ) == 0 :
error_message = " Post body is empty. It should contain some telemetry data "
logger . error ( error_message )
raise HTTPException ( status_code = 500 , detail = error_message )
2023-06-05 13:19:27 +05:30
# POST request to khoj posthog server
2023-06-05 07:46:41 +05:30
try :
2023-06-05 13:19:27 +05:30
for row in telemetry_data :
posthog . capture ( row [ " server_id " ] , " api_request " , row )
2023-06-05 07:46:41 +05:30
except Exception as e :
raise HTTPException (
status_code = 500 ,
detail = " Could not POST equest to new khoj telemetry server. Contact developer to get this fixed. " ,
)
2023-05-15 22:55:49 +08:00
# Insert recieved telemetry data into SQLite db
2023-05-17 18:58:08 +05:30
logger . info ( f " Insert row into telemetry table at { sqlfile } : { telemetry_data } " )
2023-05-15 22:55:49 +08:00
with sqlite3 . connect ( sqlfile ) as conn :
cur = conn . cursor ( )
# Create a table if it doesn't exist
cur . execute (
2023-11-26 15:05:19 -08:00
""" CREATE TABLE IF NOT EXISTS usage (id INTEGER PRIMARY KEY, time TIMESTAMP, type TEXT, server_id TEXT, os TEXT, api TEXT, client TEXT, server_version TEXT) """
2023-05-15 22:55:49 +08:00
)
# Log telemetry data
for item in telemetry_data :
cur . execute (
2023-06-08 13:41:16 +05:30
" INSERT INTO usage (time, type, server_id, os, api, client, server_version) VALUES (?, ?, ?, ?, ?, ?, ?) " ,
2023-05-15 22:55:49 +08:00
(
item [ " timestamp " ] ,
item [ " telemetry_type " ] ,
item [ " server_id " ] ,
item [ " os " ] ,
item . get ( " api " ) ,
item . get ( " client " ) ,
2023-06-08 13:41:16 +05:30
item . get ( " server_version " , None ) ,
2023-05-15 22:55:49 +08:00
) ,
)
# Commit the changes
conn . commit ( )
return { " status " : " ok " , " message " : " Logged usage telemetry " }
if __name__ == " __main__ " :
# Setup Argument Parser
parser = argparse . ArgumentParser ( description = " Start Khoj Telemetry Server " )
parser . add_argument ( " --host " , default = " 127.0.0.1 " , type = str , help = " I.P of telemetry server " )
parser . add_argument ( " --port " , " -p " , default = 80 , type = int , help = " Port of telemetry server " )
args = parser . parse_args ( )
# Start Application Server
uvicorn . run ( app , host = args . host , port = args . port , log_level = " debug " )