From 28a4bbd35d36949352b78c527c03d43d2eba357a Mon Sep 17 00:00:00 2001 From: colinmcneil Date: Wed, 29 Jan 2025 10:35:15 -0500 Subject: [PATCH 1/3] Add simple anon usage tracking to DD extension for registry changes --- src/extension/ui/src/Usage.tsx | 53 +++++++++++++++++++ .../ui/src/components/PromptCard.tsx | 2 + 2 files changed, 55 insertions(+) create mode 100644 src/extension/ui/src/Usage.tsx diff --git a/src/extension/ui/src/Usage.tsx b/src/extension/ui/src/Usage.tsx new file mode 100644 index 0000000..21596e3 --- /dev/null +++ b/src/extension/ui/src/Usage.tsx @@ -0,0 +1,53 @@ +/** + * Anonymous tracking event for registry changes + */ + +type Record = { + event: string; + properties: object; + event_timestamp: number; + source: string; +}; + +const eventsQueue: Record[] = []; + +let processInterval: NodeJS.Timeout; + +export const registryChanged = (name: string, ref: string, action: 'remove' | 'add') => { + const record: Record = { + event: 'registry-changed', + properties: { name, ref, action }, + event_timestamp: Date.now(), + source: 'labs-ai-tools-for-devs-dd' + }; + + eventsQueue.push(record); + + if (processInterval) clearInterval(processInterval); + + processInterval = setInterval(() => { + processEventsQueue(); + }, 1000); +}; + +const processEventsQueue = () => { + if (eventsQueue.length === 0) return clearInterval(processInterval); + + const events = eventsQueue.splice(0, eventsQueue.length); + + sendRecords(events); +}; + +const sendRecords = (records: any[]) => { + const url = 'https://nd14xwptgj.execute-api.us-east-1.amazonaws.com/stage/v1/track'; + const apiKey = '1234567890'; + + fetch(url, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'x-api-key': apiKey + }, + body: JSON.stringify({ records }) + }); +}; diff --git a/src/extension/ui/src/components/PromptCard.tsx b/src/extension/ui/src/components/PromptCard.tsx index 9cf6b6f..42ccfa8 100644 --- a/src/extension/ui/src/components/PromptCard.tsx +++ b/src/extension/ui/src/components/PromptCard.tsx @@ -5,6 +5,7 @@ import Button from '@mui/material/Button'; import { Card, CardActions, CardContent, CardMedia, Typography } from "@mui/material"; import { Ref } from "../Refs"; import { useState } from "react"; +import { registryChanged } from "../Usage"; export interface CatalogItem { description?: string; @@ -42,6 +43,7 @@ export function CatalogItemCard({ openUrl, item, canRegister, registered, regist } {status.state === 'missing docker_mcp' &&