Skip to content

Commit

Permalink
Merge pull request #20825 from ankush/posthog_poc
Browse files Browse the repository at this point in the history
feat: telemetry using posthog
  • Loading branch information
ankush committed Apr 26, 2023
2 parents 109a549 + db4cd1a commit 7042dca
Show file tree
Hide file tree
Showing 9 changed files with 143 additions and 2 deletions.
18 changes: 16 additions & 2 deletions frappe/core/doctype/system_settings/system_settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,9 @@
"max_auto_email_report_per_user",
"system_updates_section",
"disable_system_update_notification",
"disable_change_log_notification"
"disable_change_log_notification",
"telemetry_section",
"enable_telemetry"
],
"fields": [
{
Expand Down Expand Up @@ -535,12 +537,24 @@
"fieldname": "disable_document_sharing",
"fieldtype": "Check",
"label": "Disable Document Sharing"
},
{
"collapsible": 1,
"fieldname": "telemetry_section",
"fieldtype": "Section Break",
"label": "Telemetry"
},
{
"default": "1",
"fieldname": "enable_telemetry",
"fieldtype": "Check",
"label": "Allow Sending Usage Data for Improving applications"
}
],
"icon": "fa fa-cog",
"issingle": 1,
"links": [],
"modified": "2023-03-14 11:30:56.465653",
"modified": "2023-04-23 11:14:59.302851",
"modified_by": "Administrator",
"module": "Core",
"name": "System Settings",
Expand Down
23 changes: 23 additions & 0 deletions frappe/desk/page/setup_wizard/setup_wizard.js
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ frappe.setup.SetupWizard = class SetupWizard extends frappe.ui.Slides {
}

action_on_complete() {
frappe.telemetry.capture("initated_client_side", "setup");
if (!this.current_slide.set_values()) return;
this.update_values();
this.show_working_state();
Expand Down Expand Up @@ -325,6 +326,7 @@ frappe.setup.SetupWizardSlide = class SetupWizardSlide extends frappe.ui.Slide {
make() {
super.make();
this.set_init_values();
this.setup_telemetry_events();
this.reset_action_button_state();
}

Expand All @@ -340,6 +342,18 @@ frappe.setup.SetupWizardSlide = class SetupWizardSlide extends frappe.ui.Slide {
});
}
}

setup_telemetry_events() {
let me = this;
this.fields.filter(frappe.model.is_value_type).forEach((field) => {
me.get_input(field.fieldname).on("change", function () {
frappe.telemetry.capture(`${field.fieldname}_set`, "setup");
if (field.fieldname == "enable_telemetry" && !me.get_value("enable_telemetry")) {
frappe.telemetry.disable();
}
});
});
}
};

// Frappe slides settings
Expand Down Expand Up @@ -384,6 +398,15 @@ frappe.setup.slides_settings = [
fieldtype: "Select",
reqd: 1,
},
{
fieldtype: "Section Break",
},
{
fieldname: "enable_telemetry",
label: __("Allow Sending Usage Data for Improving applications"),
fieldtype: "Check",
default: 1,
},
],

onload: function (slide) {
Expand Down
5 changes: 5 additions & 0 deletions frappe/desk/page/setup_wizard/setup_wizard.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ def setup_complete(args):

@frappe.task()
def process_setup_stages(stages, user_input, is_background_task=False):
from frappe.utils.telemetry import capture

capture("initated_server_side", "setup")
try:
frappe.flags.in_setup_wizard = True
current_task = None
Expand All @@ -88,6 +91,7 @@ def process_setup_stages(stages, user_input, is_background_task=False):
)
else:
run_setup_success(user_input)
capture("completed_server_side", "setup")
if not is_background_task:
return {"status": "ok"}
frappe.publish_realtime("setup_task", {"status": "ok"}, user=frappe.session.user)
Expand Down Expand Up @@ -171,6 +175,7 @@ def update_system_settings(args):
"number_format": number_format,
"enable_scheduler": 1 if not frappe.flags.in_test else 0,
"backup_limit": 3, # Default for downloadable backups
"enable_telemetry": cint(args.get("enable_telemetry")),
}
)
system_settings.save()
Expand Down
5 changes: 5 additions & 0 deletions frappe/hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"form.bundle.js",
"controls.bundle.js",
"report.bundle.js",
"telemetry.bundle.js",
]
app_include_css = [
"desk.bundle.css",
Expand Down Expand Up @@ -419,3 +420,7 @@
"frappe.monitor.stop",
"frappe.utils.file_lock.release_document_locks",
]

extend_bootinfo = [
"frappe.utils.telemetry.add_bootinfo",
]
1 change: 1 addition & 0 deletions frappe/public/js/lib/posthog.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions frappe/public/js/telemetry.bundle.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import "./telemetry/index.js";
44 changes: 44 additions & 0 deletions frappe/public/js/telemetry/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import "../lib/posthog.js";

class TelemetryManager {
constructor() {
this.enabled = false;

this.project_id = frappe.boot.posthog_project_id;
this.telemetry_host = frappe.boot.posthog_host;

if (cint(frappe.boot.enable_telemetry) && this.project_id && this.telemetry_host) {
this.enabled = true;
}
}

initialize() {
if (!this.enabled) return;
try {
posthog.init(this.project_id, {
api_host: this.telemetry_host,
autocapture: false,
capture_pageview: false,
capture_pageleave: false,
advanced_disable_decide: true,
});
posthog.identify(frappe.boot.sitename);
} catch (e) {
console.trace("Failed to initialize telemetry", e);
this.enabled = false;
}
}

capture(event, app) {
if (!this.enabled) return;
posthog.capture(`${app}_${event}`);
}

disable() {
this.enabled = false;
posthog.opt_out_capturing();
}
}

frappe.telemetry = new TelemetryManager();
frappe.telemetry.initialize();
47 changes: 47 additions & 0 deletions frappe/utils/telemetry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
""" Basic telemetry for improving apps.
WARNING: Everything in this file should be treated "internal" and is subjected to change or get
removed without any warning.
"""
from contextlib import suppress

from posthog import Posthog

import frappe

POSTHOG_PROJECT_FIELD = "posthog_project_id"
POSTHOG_HOST_FIELD = "posthog_host"


def add_bootinfo(bootinfo):
if not frappe.get_system_settings("enable_telemetry"):
return

bootinfo.posthog_host = frappe.conf.get(POSTHOG_HOST_FIELD)
bootinfo.posthog_project_id = frappe.conf.get(POSTHOG_PROJECT_FIELD)
bootinfo.enable_telemetry = True


def init_telemetry():
"""Init posthog for server side telemetry."""
if hasattr(frappe.local, "posthog"):
return

if not frappe.get_system_settings("enable_telemetry"):
return

posthog_host = frappe.conf.get(POSTHOG_HOST_FIELD)
posthog_project_id = frappe.conf.get(POSTHOG_PROJECT_FIELD)

if not posthog_host or not posthog_project_id:
return

with suppress(Exception):
frappe.local.posthog = Posthog(posthog_project_id, host=posthog_host)


def capture(event, app):
init_telemetry()
ph: Posthog = getattr(frappe.local, "posthog", None)
with suppress(Exception):
ph and ph.capture(frappe.local.site, f"{app}_{event}")
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ dependencies = [
"google-api-python-client~=2.2.0",
"google-auth-oauthlib~=0.4.4",
"google-auth~=1.29.0",
"posthog~=3.0.1",
]

[build-system]
Expand Down

0 comments on commit 7042dca

Please sign in to comment.