From 42e182c0bb4f8551f613e38d7ce07abe0cd2bf14 Mon Sep 17 00:00:00 2001 From: Marco Antonio Ghiani Date: Mon, 16 Dec 2024 09:04:58 +0100 Subject: [PATCH] feat(discover): add ai assistant prompts to logs overview detail --- .../accessors/get_doc_viewer.tsx | 18 +++++++++++++++--- .../log_document_profile/accessors/index.ts | 2 +- .../log_document_profile/profile.tsx | 4 ++-- .../log_ai_assistant/log_ai_assistant.tsx | 16 ++++++++++++++-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/get_doc_viewer.tsx b/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/get_doc_viewer.tsx index 1d433b5272d7b..89bb1166d7a2c 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/get_doc_viewer.tsx +++ b/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/get_doc_viewer.tsx @@ -11,11 +11,18 @@ import { i18n } from '@kbn/i18n'; import { UnifiedDocViewerLogsOverview } from '@kbn/unified-doc-viewer-plugin/public'; import React from 'react'; import type { DocumentProfileProvider } from '../../../../profiles'; +import { ProfileProviderServices } from '../../../profile_provider_services'; -export const getDocViewer: DocumentProfileProvider['profile']['getDocViewer'] = - (prev) => (params) => { +export const createGetDocViewer = + (services: ProfileProviderServices): DocumentProfileProvider['profile']['getDocViewer'] => + (prev) => + (params) => { const prevDocViewer = prev(params); + const logsAIAssistantFeature = services.discoverShared.features.registry.getById( + 'observability-logs-ai-assistant' + ); + return { ...prevDocViewer, docViewsRegistry: (registry) => { @@ -25,7 +32,12 @@ export const getDocViewer: DocumentProfileProvider['profile']['getDocViewer'] = defaultMessage: 'Log overview', }), order: 0, - component: (props) => , + component: (props) => ( + + ), }); return prevDocViewer.docViewsRegistry(registry); diff --git a/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/index.ts b/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/index.ts index 6612fbc50e5c6..19941fc188720 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/index.ts +++ b/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/accessors/index.ts @@ -7,4 +7,4 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export { getDocViewer } from './get_doc_viewer'; +export { createGetDocViewer } from './get_doc_viewer'; diff --git a/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/profile.tsx b/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/profile.tsx index e92bbb9a59605..7d7662fbf20b4 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/profile.tsx +++ b/src/plugins/discover/public/context_awareness/profile_providers/observability/log_document_profile/profile.tsx @@ -10,7 +10,7 @@ import { DataTableRecord } from '@kbn/discover-utils'; import { DocumentProfileProvider, DocumentType } from '../../../profiles'; import { ProfileProviderServices } from '../../profile_provider_services'; -import { getDocViewer } from './accessors'; +import { createGetDocViewer } from './accessors'; import { OBSERVABILITY_ROOT_PROFILE_ID } from '../consts'; export const createObservabilityLogDocumentProfileProvider = ( @@ -18,7 +18,7 @@ export const createObservabilityLogDocumentProfileProvider = ( ): DocumentProfileProvider => ({ profileId: 'observability-log-document-profile', profile: { - getDocViewer, + getDocViewer: createGetDocViewer(services), }, resolve: ({ record, rootContext }) => { if (rootContext.profileId !== OBSERVABILITY_ROOT_PROFILE_ID) { diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/log_ai_assistant/log_ai_assistant.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/log_ai_assistant/log_ai_assistant.tsx index 3e1b6fced3337..6e570f5824d17 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/log_ai_assistant/log_ai_assistant.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/log_ai_assistant/log_ai_assistant.tsx @@ -35,6 +35,12 @@ export const LogAIAssistant = ({ return undefined; } + const message = doc.fields.find((field) => field.field === 'message')?.value[0]; + + if (!message) { + return undefined; + } + return getContextualInsightMessages({ message: 'Can you explain what this log message means? Where it could be coming from, whether it is expected and whether it is an issue.', @@ -53,6 +59,10 @@ export const LogAIAssistant = ({ const message = doc.fields.find((field) => field.field === 'message')?.value[0]; + if (!message) { + return undefined; + } + return getContextualInsightMessages({ message: `I'm looking at a log entry. Can you construct a Kibana KQL query that I can enter in the search bar that gives me similar log entries, based on the message field?`, instructions: JSON.stringify({ @@ -61,7 +71,9 @@ export const LogAIAssistant = ({ }); }, [getContextualInsightMessages, doc]); - return ( + const hasAtLeastOnePrompt = Boolean(explainLogMessageMessages || similarLogMessageMessages); + + return hasAtLeastOnePrompt ? ( {ObservabilityAIAssistantContextualInsight && explainLogMessageMessages ? ( @@ -82,7 +94,7 @@ export const LogAIAssistant = ({ ) : null} - ); + ) : null; }; // eslint-disable-next-line import/no-default-export