Merge pull request #172 from vklimontovich/main

Telemetry improvements
This commit is contained in:
Bailey Pumfleet 2021-05-07 20:37:24 +01:00 committed by GitHub
commit a001fe123c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 10 deletions

View file

@ -3,7 +3,7 @@ import {useContext, useEffect, useState} from "react";
import { useRouter } from "next/router"; import { useRouter } from "next/router";
import { signOut, useSession } from 'next-auth/client'; import { signOut, useSession } from 'next-auth/client';
import { MenuIcon, XIcon } from '@heroicons/react/outline'; import { MenuIcon, XIcon } from '@heroicons/react/outline';
import {TelemetryContext, useTelemetry} from "../lib/telemetry"; import {collectPageParameters, telemetryEventTypes, useTelemetry} from "../lib/telemetry";
export default function Shell(props) { export default function Shell(props) {
const router = useRouter(); const router = useRouter();
@ -14,7 +14,7 @@ export default function Shell(props) {
useEffect(() => { useEffect(() => {
telemetry.withJitsu((jitsu) => { telemetry.withJitsu((jitsu) => {
return jitsu.track('page_view', {page_url: router.pathname, page_title: "", source_ip: ""}) return jitsu.track(telemetryEventTypes.pageView, collectPageParameters(router.pathname))
}); });
}, [telemetry]) }, [telemetry])

View file

@ -1,6 +1,16 @@
import React, {useContext} from 'react' import React, {useContext} from 'react'
import {jitsuClient, JitsuClient} from "@jitsu/sdk-js"; import {jitsuClient, JitsuClient} from "@jitsu/sdk-js";
/**
* Enumeration of all event types that are being sent
* to telemetry collection.
*/
export const telemetryEventTypes = {
pageView: 'page_view',
dateSelected: 'date_selected',
timeSelected: 'time_selected',
bookingConfirmed: 'booking_confirmed'
}
/** /**
* Telemetry client * Telemetry client
@ -21,6 +31,31 @@ function useTelemetry(): TelemetryClient {
return useContext(TelemetryContext); return useContext(TelemetryContext);
} }
function isLocalhost(host: string) {
return "localhost" === host || "127.0.0.1" === host;
}
/**
* Collects page parameters and makes sure no sensitive data made it to telemetry
* @param route current next.js route
*/
export function collectPageParameters(route?: string): any {
let host = document.location.hostname;
let maskedHost = isLocalhost(host) ? "localhost" : "masked";
//starts with ''
let docPath = route ?? "";
return {
page_url: route,
page_title: "",
source_ip: "",
url: document.location.protocol + "//" + host + (docPath ?? ""),
doc_host: maskedHost,
doc_search: "",
doc_path: docPath,
referer: "",
}
}
function createTelemetryClient(): TelemetryClient { function createTelemetryClient(): TelemetryClient {
if (process.env.NEXT_PUBLIC_TELEMETRY_KEY) { if (process.env.NEXT_PUBLIC_TELEMETRY_KEY) {
return { return {
@ -36,7 +71,7 @@ function createTelemetryClient(): TelemetryClient {
window['jitsu'] = jitsuClient({ window['jitsu'] = jitsuClient({
log_level: 'ERROR', log_level: 'ERROR',
tracking_host: "https://t.calendso.com", tracking_host: "https://t.calendso.com",
key: "js.2pvs2bbpqq1zxna97wcml.oi2jzirnbj1ev4tc57c5r", key: process.env.NEXT_PUBLIC_TELEMETRY_KEY,
cookie_name: "__clnds", cookie_name: "__clnds",
capture_3rd_party_cookies: false, capture_3rd_party_cookies: false,
}); });

View file

@ -17,7 +17,7 @@ dayjs.extend(utc);
dayjs.extend(timezone); dayjs.extend(timezone);
import getSlots from '../../lib/slots'; import getSlots from '../../lib/slots';
import {useTelemetry} from "../../lib/telemetry"; import {collectPageParameters, telemetryEventTypes, useTelemetry} from "../../lib/telemetry";
function classNames(...classes) { function classNames(...classes) {
return classes.filter(Boolean).join(' ') return classes.filter(Boolean).join(' ')
@ -34,7 +34,7 @@ export default function Type(props) {
const telemetry = useTelemetry(); const telemetry = useTelemetry();
const [selectedTimeZone, setSelectedTimeZone] = useState(''); const [selectedTimeZone, setSelectedTimeZone] = useState('');
function toggleTimeOptions() { function toggleTimeOptions() {
setIsTimeOptionsOpen(!isTimeOptionsOpen); setIsTimeOptionsOpen(!isTimeOptionsOpen);
} }
@ -44,6 +44,10 @@ export default function Type(props) {
setSelectedTimeZone(dayjs.tz.guess()) setSelectedTimeZone(dayjs.tz.guess())
}, []) }, [])
useEffect(() => {
telemetry.withJitsu((jitsu) => jitsu.track(telemetryEventTypes.pageView, collectPageParameters()))
})
// Get router variables // Get router variables
const router = useRouter(); const router = useRouter();
@ -91,7 +95,7 @@ export default function Type(props) {
// Combine placeholder days with actual days // Combine placeholder days with actual days
const calendar = [...emptyDays, ...days.map((day) => const calendar = [...emptyDays, ...days.map((day) =>
<button key={day} onClick={(e) => { <button key={day} onClick={(e) => {
telemetry.withJitsu((jitsu) => jitsu.track('date_selected', {page_title: "", source_ip: ""})) telemetry.withJitsu((jitsu) => jitsu.track(telemetryEventTypes.dateSelected, collectPageParameters()))
setSelectedDate(dayjs().tz(selectedTimeZone).month(selectedMonth).date(day)) setSelectedDate(dayjs().tz(selectedTimeZone).month(selectedMonth).date(day))
}} disabled={selectedMonth < parseInt(dayjs().format('MM')) && dayjs().month(selectedMonth).format("D") > day} className={"text-center w-10 h-10 rounded-full mx-auto " + (dayjs().isSameOrBefore(dayjs().date(day).month(selectedMonth)) ? 'bg-blue-50 text-blue-600 font-medium' : 'text-gray-400 font-light') + (dayjs(selectedDate).month(selectedMonth).format("D") == day ? ' bg-blue-600 text-white-important' : '')}> }} disabled={selectedMonth < parseInt(dayjs().format('MM')) && dayjs().month(selectedMonth).format("D") > day} className={"text-center w-10 h-10 rounded-full mx-auto " + (dayjs().isSameOrBefore(dayjs().date(day).month(selectedMonth)) ? 'bg-blue-50 text-blue-600 font-medium' : 'text-gray-400 font-light') + (dayjs(selectedDate).month(selectedMonth).format("D") == day ? ' bg-blue-600 text-white-important' : '')}>
{day} {day}
@ -161,7 +165,6 @@ export default function Type(props) {
</title> </title>
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
</Head> </Head>
<main <main
className={ className={
"mx-auto my-24 transition-max-width ease-in-out duration-500 " + "mx-auto my-24 transition-max-width ease-in-out duration-500 " +

View file

@ -3,7 +3,7 @@ import Link from 'next/link';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import { ClockIcon, CalendarIcon } from '@heroicons/react/solid'; import { ClockIcon, CalendarIcon } from '@heroicons/react/solid';
import prisma from '../../lib/prisma'; import prisma from '../../lib/prisma';
import {useTelemetry} from "../../lib/telemetry"; import {collectPageParameters, telemetryEventTypes, useTelemetry} from "../../lib/telemetry";
import {useEffect} from "react"; import {useEffect} from "react";
const dayjs = require('dayjs'); const dayjs = require('dayjs');
@ -12,12 +12,12 @@ export default function Book(props) {
const { date, user } = router.query; const { date, user } = router.query;
const telemetry = useTelemetry(); const telemetry = useTelemetry();
useEffect(() => { useEffect(() => {
telemetry.withJitsu(jitsu => jitsu.track('time_selected', { page_title: "", source_ip: "" })); telemetry.withJitsu(jitsu => jitsu.track(telemetryEventTypes.timeSelected, collectPageParameters()));
}) })
const bookingHandler = event => { const bookingHandler = event => {
event.preventDefault(); event.preventDefault();
telemetry.withJitsu(jitsu => jitsu.track('booking_confirmed', { page_title: "", source_ip: "" })); telemetry.withJitsu(jitsu => jitsu.track(telemetryEventTypes.bookingConfirmed, collectPageParameters()));
const res = fetch( const res = fetch(
'/api/book/' + user, '/api/book/' + user,
{ {