Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: telemetry #1228

Merged
merged 6 commits into from
May 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions desk/src/pages/onboarding/OnboardingIntro.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,15 @@
</template>

<script setup lang="ts">
import { onMounted } from "vue";
import { capture } from "@/telemetry";

const text =
"We're excited to have you join us and explore the world of efficient customer support. \
We are here to revolutionize the way you handle customer inquiries, streamline ticket \
management, and deliver outstanding service.";
const subText =
"Once again, welcome to Frappe Helpdesk! Let's hope for a long and smooth journey!";

onMounted(() => capture("onboarding_started"));
</script>
6 changes: 5 additions & 1 deletion desk/src/pages/onboarding/SetupFavicon.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
</template>

<script setup lang="ts">
import { Ref, ref } from "vue";
import { Ref, onMounted, ref } from "vue";
import { createResource, FileUploader } from "frappe-ui";
import { capture } from "@/telemetry";

const help =
"A favicon enhances your website by providing a small, recognizable icon that \
Expand All @@ -35,6 +36,7 @@ const r = createResource({
debounce: 1000,
onSuccess(data) {
imageUrl.value = data.brand_favicon;
capture("onboarding_favicon_changed");
},
});

Expand All @@ -46,4 +48,6 @@ function update(file) {
value: file.file_url,
});
}

onMounted(() => capture("onboarding_favicon_reached"));
</script>
6 changes: 5 additions & 1 deletion desk/src/pages/onboarding/SetupLogo.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@
</template>

<script setup lang="ts">
import { Ref, ref } from "vue";
import { Ref, onMounted, ref } from "vue";
import { createResource, FileUploader } from "frappe-ui";
import { capture } from "@/telemetry";

const help =
"this will be used in many places, including login and loading screens. \
Expand All @@ -34,6 +35,7 @@ const r = createResource({
debounce: 1000,
onSuccess(data) {
imageUrl.value = data.brand_logo;
capture("onboarding_logo_changed");
},
});

Expand All @@ -45,4 +47,6 @@ function update(file) {
value: file.file_url,
});
}

onMounted(() => capture("onboarding_logo_reached"));
</script>
6 changes: 5 additions & 1 deletion desk/src/pages/onboarding/SetupName.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@
</template>

<script setup lang="ts">
import { ref } from "vue";
import { onMounted, ref } from "vue";
import { createResource } from "frappe-ui";
import { capture } from "@/telemetry";
import IconCheck from "~icons/ph/check-bold";

const text =
Expand All @@ -38,6 +39,7 @@ const r = createResource({
debounce: 1000,
onSuccess() {
isCheckVisible.value = true;
capture("onboarding_name_changed");
},
});

Expand All @@ -50,4 +52,6 @@ function update(value: string) {
value,
});
}

onMounted(() => capture("onboarding_name_reached"));
</script>
8 changes: 7 additions & 1 deletion desk/src/pages/onboarding/SetupSkipEmail.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
</template>

<script setup lang="ts">
import { ref } from "vue";
import { onMounted, ref } from "vue";
import { createResource } from "frappe-ui";
import { capture } from "@/telemetry";

const query =
"Did you know that our Helpdesk is designed to function independently, \
Expand All @@ -25,6 +26,9 @@ const r = createResource({
debounce: 1000,
onSuccess(data) {
isYes.value = data.skip_email_workflow;
const cond = isYes.value ? "yes" : "no";
const event = "onboarding_skip_email_" + cond;
capture(event);
},
});

Expand All @@ -36,4 +40,6 @@ function update(value: boolean) {
value,
});
}

onMounted(() => capture("onboarding_skip_email_reached"));
</script>
5 changes: 5 additions & 0 deletions desk/src/pages/onboarding/SuccessMessage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,13 @@
</template>

<script setup lang="ts">
import { onMounted } from "vue";
import { capture } from "@/telemetry";

const github = "https://github.com/frappe/helpdesk";
const issues = "https://github.com/frappe/helpdesk/issues";
const support = "https://frappedesk.com/helpdesk";
const email = "hello@frappe.io";

onMounted(() => capture("onboarding_finished"));
</script>
8 changes: 7 additions & 1 deletion desk/src/pages/onboarding/email/EmailCredentials.vue
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@
</template>

<script setup lang="ts">
import { ref } from "vue";
import { onMounted, ref } from "vue";
import { storeToRefs } from "pinia";
import { createResource, Button, Input, debounce } from "frappe-ui";
import { capture } from "@/telemetry";
import { createToast } from "@/utils/toasts";
import { useOnboardingEmailStore } from "./data";

Expand Down Expand Up @@ -82,6 +83,7 @@ const emailDefaults = {
const insertRes = createResource({
url: "frappe.client.insert",
onSuccess: () => {
capture("onboarding_email_credentials_success");
next();
},
onError: (error) => {
Expand All @@ -93,6 +95,8 @@ const insertRes = createResource({
icon: "x",
iconClasses: "text-red-500",
});

capture("onboarding_email_credentials_fail");
},
});

Expand Down Expand Up @@ -125,4 +129,6 @@ const submit = debounce(() => {
},
});
}, 500);

onMounted(() => capture("onboarding_email_credentials_reached"));
</script>
5 changes: 4 additions & 1 deletion desk/src/pages/onboarding/email/SelectService.vue
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,11 @@
</template>

<script setup lang="ts">
import { computed } from "vue";
import { computed, onMounted } from "vue";
import { storeToRefs } from "pinia";
import { Button, Tooltip } from "frappe-ui";
import { isEmpty } from "lodash";
import { capture } from "@/telemetry";
import { useOnboardingEmailStore } from "./data";
import IconAlert from "~icons/espresso/alert-circle";
import LogoGmail from "@/assets/images/gmail.png";
Expand Down Expand Up @@ -86,4 +87,6 @@ const services = [
const info = computed(
() => services.find((s) => s.name === service.value)?.info
);

onMounted(() => capture("onboarding_email_select_service_reached"));
</script>
4 changes: 4 additions & 0 deletions desk/src/pages/onboarding/email/SetupEmail.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
</template>

<script setup lang="ts">
import { onMounted } from "vue";
import { storeToRefs } from "pinia";
import { capture } from "@/telemetry";
import { useOnboardingEmailStore } from "./data";
import EmailIntro from "./EmailIntro.vue";
import SelectService from "./SelectService.vue";
Expand All @@ -15,4 +17,6 @@ import SuccessMessage from "./SuccessMessage.vue";
const onboardingEmailStore = useOnboardingEmailStore();
const { step } = storeToRefs(onboardingEmailStore);
const steps = [EmailIntro, SelectService, EmailCredentials, SuccessMessage];

onMounted(() => capture("onboarding_email_reached"));
</script>
5 changes: 5 additions & 0 deletions desk/src/pages/onboarding/email/SuccessMessage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,13 @@
</template>

<script setup lang="ts">
import { onMounted } from "vue";
import { capture } from "@/telemetry";

const emoji = "✔️";
const message =
"Fantastic! Your email is now active. You are ready unleash true \
potential of Frappe Helpdesk!";

onMounted(() => capture("onboarding_email_finished"));
</script>
3 changes: 3 additions & 0 deletions desk/src/router.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { createRouter, createWebHistory } from "vue-router";
import { call } from "frappe-ui";
import { useAuthStore } from "@/stores/auth";
import { init as initTelemetry } from "./telemetry";

export const WEBSITE_ROOT = "Website Root";

Expand Down Expand Up @@ -393,6 +394,8 @@ router.beforeEach(async (to) => {
});

router.beforeEach(async (to) => {
await initTelemetry();

const isAuthRoute = AUTH_ROUTES.includes(to.name);
const authStore = useAuthStore();

Expand Down
57 changes: 57 additions & 0 deletions desk/src/telemetry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { useStorage } from "@vueuse/core";
import { call } from "frappe-ui";
import "../../../frappe/frappe/public/js/lib/posthog.js";

// eslint-disable-next-line @typescript-eslint/no-explicit-any
declare const posthog: any;

const APP = "helpdesk";
const SITENAME = window.location.hostname;

const telemetry = useStorage("telemetry", {
enabled: false,
project_id: "",
host: "",
});

export async function init() {
await set_enabled();
if (!telemetry.value.enabled) return;
try {
await set_credentials();
posthog.init(telemetry.value.project_id, {
api_host: telemetry.value.host,
autocapture: false,
capture_pageview: false,
capture_pageleave: false,
advanced_disable_decide: true,
});
posthog.identify(SITENAME);
} catch (e) {
console.trace("Failed to initialize telemetry", e);
telemetry.value.enabled = false;
}
}

async function set_enabled() {
if (telemetry.value.enabled) return;

await call("helpdesk.api.telemetry.is_enabled").then((res) => {
telemetry.value.enabled = res;
});
}

async function set_credentials() {
if (!telemetry.value.enabled) return;
if (telemetry.value.project_id && telemetry.value.host) return;

await call("helpdesk.api.telemetry.get_credentials").then((res) => {
telemetry.value.project_id = res.project_id;
telemetry.value.host = res.telemetry_host;
});
}

export function capture(event: string) {
if (!telemetry.value.enabled) return;
posthog.capture(`${APP}_${event}`);
}
18 changes: 18 additions & 0 deletions helpdesk/api/telemetry.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import frappe


@frappe.whitelist()
def is_enabled():
return bool(
frappe.get_system_settings("enable_telemetry")
and frappe.conf.get("posthog_host")
and frappe.conf.get("posthog_project_id")
)


@frappe.whitelist()
def get_credentials():
return {
"project_id": frappe.conf.get("posthog_project_id"),
"telemetry_host": frappe.conf.get("posthog_host"),
}
6 changes: 3 additions & 3 deletions helpdesk/helpdesk/doctype/hd_ticket/hd_ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
from frappe.model.mapper import get_mapped_doc
from frappe.query_builder import Case, DocType, Order
from frappe.query_builder.functions import Count
from frappe.realtime import get_website_room
from frappe.utils import date_diff, get_datetime, now_datetime, time_diff_in_seconds
from frappe.utils.user import is_website_user

Expand All @@ -27,8 +26,7 @@
default_outgoing_email_account,
default_ticket_outgoing_email_account,
)

from helpdesk.utils import publish_event
from helpdesk.utils import publish_event, capture_event


class HDTicket(Document):
Expand Down Expand Up @@ -439,6 +437,8 @@ def reply_via_agent(
self.status = "Replied"
self.save()

capture_event("agent_replied")

if skip_email_workflow:
return

Expand Down
5 changes: 5 additions & 0 deletions helpdesk/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@
import frappe
from bs4 import BeautifulSoup
from frappe.realtime import get_website_room
from frappe.utils.telemetry import capture as _capture


def publish_event(event: str, data: dict):
room = get_website_room()
frappe.publish_realtime(event, message=data, room=room, after_commit=True)


def capture_event(event: str):
return _capture(event, "helpdesk")


def extract_mentions(html):
if not html:
return []
Expand Down