feat(telemetry): allow users to send session recording (#22170)

This commit is contained in:
Ankush Menat 2023-08-23 20:58:07 +05:30 committed by GitHub
parent e4a6016f83
commit a9d7b99429
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 4 deletions

View file

@ -402,9 +402,17 @@ frappe.setup.slides_settings = [
},
{
fieldname: "enable_telemetry",
label: __("Allow Sending Usage Data for Improving Applications"),
label: __("Allow sending usage data for improving applications"),
fieldtype: "Check",
default: 1,
depends_on: "eval:frappe.telemetry.can_enable()",
},
{
fieldname: "allow_recording_first_session",
label: __("Allow recording my first session to improve user experience"),
fieldtype: "Check",
default: 0,
depends_on: "eval:frappe.telemetry.can_enable()",
},
],

View file

@ -6,7 +6,7 @@ import json
import frappe
from frappe.geo.country_info import get_country_info
from frappe.translate import get_messages_for_boot, send_translations, set_default_language
from frappe.utils import cint, strip
from frappe.utils import cint, now, strip
from frappe.utils.password import update_password
from . import install_fixtures
@ -184,6 +184,8 @@ def update_system_settings(args):
}
)
system_settings.save()
if args.get("allow_recording_first_session"):
frappe.db.set_default("session_recording_start", now())
def update_user_name(args):

View file

@ -82,6 +82,10 @@ $.extend(frappe.datetime, {
return moment(d1).diff(d2, "hours");
},
get_minute_diff: function (d1, d2) {
return moment(d1).diff(d2, "minutes");
},
get_day_diff: function (d1, d2) {
return moment(d1).diff(d2, "days");
},

View file

@ -7,7 +7,6 @@ class TelemetryManager {
this.project_id = frappe.boot.posthog_project_id;
this.telemetry_host = frappe.boot.posthog_host;
this.site_age = frappe.boot.telemetry_site_age;
if (cint(frappe.boot.enable_telemetry) && this.project_id && this.telemetry_host) {
this.enabled = true;
}
@ -15,13 +14,14 @@ class TelemetryManager {
initialize() {
if (!this.enabled) return;
let disable_decide = !this.should_record_session();
try {
posthog.init(this.project_id, {
api_host: this.telemetry_host,
autocapture: false,
capture_pageview: false,
capture_pageleave: false,
advanced_disable_decide: true,
advanced_disable_decide: disable_decide,
});
posthog.identify(frappe.boot.sitename);
this.send_heartbeat();
@ -42,6 +42,10 @@ class TelemetryManager {
posthog.opt_out_capturing();
}
can_enable() {
return Boolean(this.telemetry_host && this.project_id);
}
send_heartbeat() {
const KEY = "ph_last_heartbeat";
const now = frappe.datetime.system_datetime(true);
@ -62,6 +66,16 @@ class TelemetryManager {
posthog.capture("$pageview");
});
}
should_record_session() {
let start = frappe.boot.sysdefaults.session_recording_start;
if (!start) return;
let start_datetime = frappe.datetime.str_to_obj(start);
let now = frappe.datetime.now_datetime();
// if user allowed recording only record for first 2 hours, never again.
return frappe.datetime.get_minute_diff(now, start_datetime) < 120;
}
}
frappe.telemetry = new TelemetryManager();