telemetry.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. """Anonymous telemetry for Pynecone."""
  2. import json
  3. import multiprocessing
  4. import platform
  5. from datetime import datetime
  6. import httpx
  7. import psutil
  8. from pynecone import constants
  9. from pynecone.base import Base
  10. def get_os() -> str:
  11. """Get the operating system.
  12. Returns:
  13. The operating system.
  14. """
  15. return platform.system()
  16. def get_python_version() -> str:
  17. """Get the Python version.
  18. Returns:
  19. The Python version.
  20. """
  21. return platform.python_version()
  22. def get_pynecone_version() -> str:
  23. """Get the Pynecone version.
  24. Returns:
  25. The Pynecone version.
  26. """
  27. return constants.VERSION
  28. def get_cpu_count() -> int:
  29. """Get the number of CPUs.
  30. Returns:
  31. The number of CPUs.
  32. """
  33. return multiprocessing.cpu_count()
  34. def get_memory() -> int:
  35. """Get the total memory in MB.
  36. Returns:
  37. The total memory in MB.
  38. """
  39. return psutil.virtual_memory().total >> 20
  40. class Telemetry(Base):
  41. """Anonymous telemetry for Pynecone."""
  42. user_os: str = get_os()
  43. cpu_count: int = get_cpu_count()
  44. memory: int = get_memory()
  45. pynecone_version: str = get_pynecone_version()
  46. python_version: str = get_python_version()
  47. def pynecone_telemetry(event: str, telemetry_enabled: bool) -> None:
  48. """Send anonymous telemetry for Pynecone.
  49. Args:
  50. event: The event name.
  51. telemetry_enabled: Whether to send the telemetry.
  52. """
  53. try:
  54. if telemetry_enabled:
  55. telemetry = Telemetry()
  56. with open(constants.PCVERSION_APP_FILE) as f: # type: ignore
  57. pynecone_json = json.load(f)
  58. distinct_id = pynecone_json["project_hash"]
  59. post_hog = {
  60. "api_key": "phc_JoMo0fOyi0GQAooY3UyO9k0hebGkMyFJrrCw1Gt5SGb",
  61. "event": event,
  62. "properties": {
  63. "distinct_id": distinct_id,
  64. "user_os": telemetry.user_os,
  65. "pynecone_version": telemetry.pynecone_version,
  66. "python_version": telemetry.python_version,
  67. "cpu_count": telemetry.cpu_count,
  68. "memory": telemetry.memory,
  69. },
  70. "timestamp": datetime.utcnow().isoformat(),
  71. }
  72. httpx.post("https://app.posthog.com/capture/", json=post_hog)
  73. except Exception:
  74. pass