Path: blob/main/components/gitpod-protocol/src/util/analytics.ts
2500 views
/**1* Copyright (c) 2021 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import Analytics = require("analytics-node");7import { IAnalyticsWriter, IdentifyMessage, TrackMessage, PageMessage } from "../analytics";8import { log } from "./logging";910export function newAnalyticsWriterFromEnv(): IAnalyticsWriter {11switch (process.env.GITPOD_ANALYTICS_WRITER) {12case "segment":13return new SegmentAnalyticsWriter(14process.env.GITPOD_ANALYTICS_SEGMENT_KEY || "",15process.env.GITPOD_ANALYTICS_SEGMENT_ENDPOINT || "",16);17case "log":18return new LogAnalyticsWriter();19default:20return new NoAnalyticsWriter();21}22}2324class SegmentAnalyticsWriter implements IAnalyticsWriter {25protected readonly analytics: Analytics;2627constructor(writeKey: string, endpoint: string) {28this.analytics = new Analytics(writeKey, {29host: endpoint,30});31}3233identify(msg: IdentifyMessage) {34try {35this.analytics.identify(36{37...msg,38integrations: {39All: true,40Mixpanel: !!msg.userId,41},42},43(err: Error) => {44if (err) {45log.warn("analytics.identify failed", err);46}47},48);49} catch (err) {50log.warn("analytics.identify failed", err);51}52}5354track(msg: TrackMessage) {55try {56this.analytics.track(57{58...msg,59integrations: {60All: true,61Mixpanel: !!msg.userId,62},63},64(err: Error) => {65if (err) {66log.warn("analytics.track failed", err);67}68},69);70} catch (err) {71log.warn("analytics.track failed", err);72}73}7475page(msg: PageMessage) {76try {77this.analytics.page(78{79...msg,80integrations: {81All: true,82Mixpanel: !!msg.userId,83},84},85(err: Error) => {86if (err) {87log.warn("analytics.page failed", err);88}89},90);91} catch (err) {92log.warn("analytics.page failed", err);93}94}95}9697class LogAnalyticsWriter implements IAnalyticsWriter {98identify(msg: IdentifyMessage): void {99log.debug("analytics identify", msg);100}101track(msg: TrackMessage): void {102log.debug("analytics track", msg);103}104page(msg: PageMessage): void {105log.debug("analytics page", msg);106}107}108109class NoAnalyticsWriter implements IAnalyticsWriter {110identify(msg: IdentifyMessage): void {}111track(msg: TrackMessage): void {}112page(msg: PageMessage): void {}113}114115116