reflex/pynecone/utils/telemetry.py
2023-05-10 23:26:01 -07:00

99 lines
2.3 KiB
Python

"""Anonymous telemetry for Pynecone."""
import json
import multiprocessing
import platform
from datetime import datetime
import httpx
import psutil
from pynecone import constants
from pynecone.base import Base
def get_os() -> str:
"""Get the operating system.
Returns:
The operating system.
"""
return platform.system()
def get_python_version() -> str:
"""Get the Python version.
Returns:
The Python version.
"""
return platform.python_version()
def get_pynecone_version() -> str:
"""Get the Pynecone version.
Returns:
The Pynecone version.
"""
return constants.VERSION
def get_cpu_count() -> int:
"""Get the number of CPUs.
Returns:
The number of CPUs.
"""
return multiprocessing.cpu_count()
def get_memory() -> int:
"""Get the total memory in MB.
Returns:
The total memory in MB.
"""
return psutil.virtual_memory().total >> 20
class Telemetry(Base):
"""Anonymous telemetry for Pynecone."""
user_os: str = get_os()
cpu_count: int = get_cpu_count()
memory: int = get_memory()
pynecone_version: str = get_pynecone_version()
python_version: str = get_python_version()
def send(event: str, telemetry_enabled: bool) -> None:
"""Send anonymous telemetry for Pynecone.
Args:
event: The event name.
telemetry_enabled: Whether to send the telemetry.
"""
try:
if telemetry_enabled:
telemetry = Telemetry()
with open(constants.PCVERSION_APP_FILE) as f: # type: ignore
pynecone_json = json.load(f)
distinct_id = pynecone_json["project_hash"]
post_hog = {
"api_key": "phc_JoMo0fOyi0GQAooY3UyO9k0hebGkMyFJrrCw1Gt5SGb",
"event": event,
"properties": {
"distinct_id": distinct_id,
"user_os": telemetry.user_os,
"pynecone_version": telemetry.pynecone_version,
"python_version": telemetry.python_version,
"cpu_count": telemetry.cpu_count,
"memory": telemetry.memory,
},
"timestamp": datetime.utcnow().isoformat(),
}
httpx.post("https://app.posthog.com/capture/", json=post_hog)
except Exception:
pass