From c0e47f20bcd88d57c3f77a688a92c4cf19771469 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 1 Jul 2025 12:05:06 -0600 Subject: [PATCH] telemetry! --- .../assistant_body/starter_prompts.test.tsx | 20 ++++++++++++++++++- .../assistant_body/starter_prompts.tsx | 17 +++++++++++++--- .../assistant_overlay/index.test.tsx | 1 + .../impl/assistant_context/types.tsx | 1 + .../telemetry/events/ai_assistant/types.ts | 6 ++++++ .../use_assistant_telemetry/index.test.tsx | 1 + .../hooks/use_assistant_telemetry/index.tsx | 3 +++ 7 files changed, 45 insertions(+), 4 deletions(-) diff --git a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.test.tsx b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.test.tsx index 57064176c0417..60a9266a2dc2e 100644 --- a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.test.tsx +++ b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.test.tsx @@ -81,7 +81,7 @@ const mockResponse = [ const testProps = { setUserPrompt: jest.fn(), }; - +const mockReportAssistantStarterPrompt = jest.fn(); jest.mock('../../..', () => { return { useFindPrompts: jest.fn(), @@ -89,12 +89,18 @@ jest.mock('../../..', () => { assistantAvailability: { isAssistantEnabled: true, }, + assistantTelemetry: { + reportAssistantStarterPrompt: mockReportAssistantStarterPrompt, + }, http: { fetch: {} }, }), }; }); describe('StarterPrompts', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); it('should return an empty array if no prompts are provided', () => { expect(getAllPromptIds(promptGroups)).toEqual([ 'starterPromptTitle1', @@ -158,4 +164,16 @@ describe('StarterPrompts', () => { fireEvent.click(getByTestId('starterPromptPrompt2 from API yall')); expect(testProps.setUserPrompt).toHaveBeenCalledWith('starterPromptPrompt2 from API yall'); }); + it('calls reportAssistantStarterPrompt with prompt title when a prompt is selected', () => { + (useFindPrompts as jest.Mock).mockReturnValue({ data: { prompts: mockResponse } }); + const { getByTestId } = render( + + + + ); + fireEvent.click(getByTestId('starterPromptPrompt2 from API yall')); + expect(mockReportAssistantStarterPrompt).toHaveBeenCalledWith({ + promptTitle: 'starterPromptTitle2 from API yall', + }); + }); }); diff --git a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.tsx b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.tsx index 3b914b8555ae4..d4dafe174afb8 100644 --- a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.tsx +++ b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_body/starter_prompts.tsx @@ -68,6 +68,7 @@ export const promptGroups = [ export const StarterPrompts: React.FC = ({ connectorId, setUserPrompt }) => { const { assistantAvailability: { isAssistantEnabled }, + assistantTelemetry, http, toasts, } = useAssistantContext(); @@ -93,11 +94,21 @@ export const StarterPrompts: React.FC = ({ connectorId, setUserPrompt }) return formatPromptGroups(actualPrompts); }, [actualPrompts]); + const trackPrompt = useCallback( + (promptTitle: string) => { + assistantTelemetry?.reportAssistantStarterPrompt({ + promptTitle, + }); + }, + [assistantTelemetry] + ); + const onSelectPrompt = useCallback( - (prompt: string) => { + (prompt: string, title: string) => { setUserPrompt(prompt); + trackPrompt(title); }, - [setUserPrompt] + [setUserPrompt, trackPrompt] ); return ( @@ -109,7 +120,7 @@ export const StarterPrompts: React.FC = ({ connectorId, setUserPrompt }) hasShadow={false} hasBorder data-test-subj={prompt} - onClick={() => onSelectPrompt(prompt)} + onClick={() => onSelectPrompt(prompt, title)} className={starterPromptInnerClassName} > diff --git a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx index 4cd7b0fce58cc..47f7723f39c14 100644 --- a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx +++ b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant/assistant_overlay/index.test.tsx @@ -15,6 +15,7 @@ const assistantTelemetry = { reportAssistantInvoked, reportAssistantMessageSent: () => {}, reportAssistantQuickPrompt: () => {}, + reportAssistantStarterPrompt: () => {}, reportAssistantSettingToggled: () => {}, }; describe('AssistantOverlay', () => { diff --git a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant_context/types.tsx b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant_context/types.tsx index ff4e306844ee3..548e7a82806c3 100644 --- a/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant_context/types.tsx +++ b/x-pack/platform/packages/shared/kbn-elastic-assistant/impl/assistant_context/types.tsx @@ -53,6 +53,7 @@ export interface AssistantTelemetry { isEnabledKnowledgeBase: boolean; }) => void; reportAssistantQuickPrompt: (params: { promptTitle: string }) => void; + reportAssistantStarterPrompt: (params: { promptTitle: string }) => void; reportAssistantSettingToggled: (params: { assistantStreamingEnabled?: boolean; alertsCountUpdated?: boolean; diff --git a/x-pack/solutions/security/plugins/elastic_assistant/public/src/common/lib/telemetry/events/ai_assistant/types.ts b/x-pack/solutions/security/plugins/elastic_assistant/public/src/common/lib/telemetry/events/ai_assistant/types.ts index b2527b7ef43ee..8e56efc3c4ab8 100644 --- a/x-pack/solutions/security/plugins/elastic_assistant/public/src/common/lib/telemetry/events/ai_assistant/types.ts +++ b/x-pack/solutions/security/plugins/elastic_assistant/public/src/common/lib/telemetry/events/ai_assistant/types.ts @@ -11,6 +11,7 @@ export enum AssistantEventTypes { AssistantInvoked = 'Assistant Invoked', AssistantMessageSent = 'Assistant Message Sent', AssistantQuickPrompt = 'Assistant Quick Prompt', + AssistantStarterPrompt = 'Assistant Starter Prompt', AssistantSettingToggled = 'Assistant Setting Toggled', } @@ -30,6 +31,10 @@ export interface ReportAssistantQuickPromptParams { promptTitle: string; } +export interface ReportAssistantStarterPromptParams { + promptTitle: string; +} + export interface ReportAssistantSettingToggledParams { alertsCountUpdated?: boolean; assistantStreamingEnabled?: boolean; @@ -39,6 +44,7 @@ export interface AssistantTelemetryEventsMap { [AssistantEventTypes.AssistantInvoked]: ReportAssistantInvokedParams; [AssistantEventTypes.AssistantMessageSent]: ReportAssistantMessageSentParams; [AssistantEventTypes.AssistantQuickPrompt]: ReportAssistantQuickPromptParams; + [AssistantEventTypes.AssistantStarterPrompt]: ReportAssistantStarterPromptParams; [AssistantEventTypes.AssistantSettingToggled]: ReportAssistantSettingToggledParams; } diff --git a/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.test.tsx b/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.test.tsx index 7d544ca55936b..0e073d431ef01 100644 --- a/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.test.tsx +++ b/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.test.tsx @@ -43,6 +43,7 @@ const trackingFns = [ { name: 'reportAssistantInvoked', eventType: AssistantEventTypes.AssistantInvoked }, { name: 'reportAssistantMessageSent', eventType: AssistantEventTypes.AssistantMessageSent }, { name: 'reportAssistantQuickPrompt', eventType: AssistantEventTypes.AssistantQuickPrompt }, + { name: 'reportAssistantStarterPrompt', eventType: AssistantEventTypes.AssistantStarterPrompt }, ]; describe('useAssistantTelemetry', () => { diff --git a/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.tsx b/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.tsx index 90ccc1d46071b..1ce2e1fa43050 100644 --- a/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.tsx +++ b/x-pack/solutions/security/plugins/elastic_assistant/public/src/hooks/use_assistant_telemetry/index.tsx @@ -13,6 +13,7 @@ import { ReportAssistantInvokedParams, ReportAssistantMessageSentParams, ReportAssistantQuickPromptParams, + ReportAssistantStarterPromptParams, ReportAssistantSettingToggledParams, } from '../../common/lib/telemetry/events/ai_assistant/types'; @@ -45,6 +46,8 @@ export const useAssistantTelemetry = (): AssistantTelemetry => { reportTelemetry({ eventType: AssistantEventTypes.AssistantMessageSent, params }), reportAssistantQuickPrompt: (params: ReportAssistantQuickPromptParams) => reportTelemetry({ eventType: AssistantEventTypes.AssistantQuickPrompt, params }), + reportAssistantStarterPrompt: (params: ReportAssistantStarterPromptParams) => + reportTelemetry({ eventType: AssistantEventTypes.AssistantStarterPrompt, params }), reportAssistantSettingToggled: (params: ReportAssistantSettingToggledParams) => telemetry.reportEvent(AssistantEventTypes.AssistantSettingToggled, params), }),