[Obs AI Assistant] Disable plugin in Serverless ES, Security (#179623)

Disable the Obs AI Assistant plugin in Serverless Search & Serverless
Security. Some work was done to move `observabilityAIAssistant` from
`requiredPlugins` to `optionalPlugins` in upstream dependencies.

Closes https://github.com/elastic/kibana/issues/166999

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Dario Gieselaar 2024-04-03 15:42:16 +02:00 committed by GitHub
parent 314d27f178
commit deaafca381
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
47 changed files with 140 additions and 153 deletions

View file

@ -11,6 +11,7 @@ xpack.securitySolution.enabled: false
xpack.serverless.observability.enabled: false
enterpriseSearch.enabled: false
xpack.fleet.enabled: false
xpack.observabilityAIAssistant.enabled: false
## Cloud settings
xpack.cloud.serverless.project_type: search

View file

@ -6,6 +6,7 @@ xpack.apm.enabled: false
xpack.infra.enabled: false
xpack.observabilityLogsExplorer.enabled: false
xpack.observability.enabled: false
xpack.observabilityAIAssistant.enabled: false
## Cloud settings
xpack.cloud.serverless.project_type: security

View file

@ -29,8 +29,7 @@
"dataViews",
"lens",
"maps",
"uiActions",
"observabilityAIAssistant"
"uiActions"
],
"optionalPlugins": [
"actions",
@ -49,7 +48,8 @@
"customIntegrations", // Move this to requiredPlugins after completely migrating from the Tutorials Home App
"licenseManagement",
"profilingDataAccess",
"cases"
"cases",
"observabilityAIAssistant"
],
"requiredBundles": [
"fleet",

View file

@ -21,24 +21,19 @@ export function ErrorSampleContextualInsight({
error: APMError;
transaction?: Transaction;
}) {
const {
observabilityAIAssistant: {
ObservabilityAIAssistantContextualInsight,
getContextualInsightMessages,
},
} = useApmPluginContext();
const { observabilityAIAssistant } = useApmPluginContext();
const [logStacktrace, setLogStacktrace] = useState('');
const [exceptionStacktrace, setExceptionStacktrace] = useState('');
const messages = useMemo<Message[]>(() => {
const messages = useMemo<Message[] | undefined>(() => {
const serviceName = error.service.name;
const languageName = error.service.language?.name ?? '';
const runtimeName = error.service.runtime?.name ?? '';
const runtimeVersion = error.service.runtime?.version ?? '';
const transactionName = transaction?.transaction.name ?? '';
return getContextualInsightMessages({
return observabilityAIAssistant?.getContextualInsightMessages({
message: `I'm looking at an exception and trying to understand what it means`,
instructions: `I'm an SRE. I am looking at an exception and trying to understand what it means.
@ -68,13 +63,14 @@ export function ErrorSampleContextualInsight({
transaction,
logStacktrace,
exceptionStacktrace,
getContextualInsightMessages,
observabilityAIAssistant,
]);
return ObservabilityAIAssistantContextualInsight && messages ? (
return observabilityAIAssistant?.ObservabilityAIAssistantContextualInsight &&
messages ? (
<>
<EuiFlexItem>
<ObservabilityAIAssistantContextualInsight
<observabilityAIAssistant.ObservabilityAIAssistantContextualInsight
messages={messages}
title={i18n.translate(
'xpack.apm.errorGroupContextualInsight.explainErrorTitle',

View file

@ -268,10 +268,14 @@ export function ServiceInventory() {
[tiebreakerField]
);
const { setScreenContext } =
useApmPluginContext().observabilityAIAssistant.service;
const setScreenContext =
useApmPluginContext().observabilityAIAssistant?.service.setScreenContext;
useEffect(() => {
if (!setScreenContext) {
return;
}
if (isFailure(mainStatisticsStatus)) {
return setScreenContext({
screenDescription: 'The services have failed to load',

View file

@ -53,11 +53,11 @@ export function ServiceOverview() {
const { serviceName, fallbackToTransactions, agentName, serverlessType } =
useApmServiceContext();
const { setScreenContext } =
useApmPluginContext().observabilityAIAssistant.service;
const setScreenContext =
useApmPluginContext().observabilityAIAssistant?.service.setScreenContext;
useEffect(() => {
return setScreenContext({
return setScreenContext?.({
screenDescription: `The user is looking at the service overview page for ${serviceName}.`,
data: [
{

View file

@ -154,11 +154,11 @@ export function ServiceOverviewThroughputChart({
: []),
];
const { setScreenContext } =
useApmPluginContext().observabilityAIAssistant.service;
const setScreenContext =
useApmPluginContext().observabilityAIAssistant?.service.setScreenContext;
useEffect(() => {
return setScreenContext(
return setScreenContext?.(
getThroughputScreenContext({
serviceName,
transactionName,

View file

@ -56,11 +56,11 @@ export function TransactionOverview() {
false
);
const { setScreenContext } =
useApmPluginContext().observabilityAIAssistant.service;
const setScreenContext =
useApmPluginContext().observabilityAIAssistant?.service.setScreenContext;
useEffect(() => {
return setScreenContext({
return setScreenContext?.({
screenDescription: `The user is looking at the transactions overview for ${serviceName}, and the transaction type is ${transactionType}`,
});
}, [setScreenContext, serviceName, transactionType]);

View file

@ -119,7 +119,7 @@ export function ApmMainTemplate({
});
useEffect(() => {
return aiAssistant.service.setScreenContext({
return aiAssistant?.service.setScreenContext({
screenDescription: [
hasApmData
? 'The user has APM data.'

View file

@ -101,11 +101,11 @@ export function LatencyChart({ height, kuery }: Props) {
const latencyMaxY = getMaxY(timeseries);
const latencyFormatter = getDurationFormatter(latencyMaxY);
const { setScreenContext } =
useApmPluginContext().observabilityAIAssistant.service;
const setScreenContext =
useApmPluginContext().observabilityAIAssistant?.service.setScreenContext;
useEffect(() => {
return setScreenContext(
return setScreenContext?.(
getLatencyChartScreenContext({
serviceName,
transactionName: transactionName ?? undefined,

View file

@ -153,7 +153,7 @@ export function TransactionsTable({
]);
const { core, observabilityAIAssistant } = useApmPluginContext();
const { setScreenContext } = observabilityAIAssistant.service;
const setScreenContext = observabilityAIAssistant?.service.setScreenContext;
const isTableSearchBarEnabled = core.uiSettings.get<boolean>(
apmEnableTableSearchBar,
@ -179,7 +179,7 @@ export function TransactionsTable({
]);
useEffect(() => {
return setScreenContext({
return setScreenContext?.({
data: [
{
name: 'top_transactions',

View file

@ -33,7 +33,7 @@ export interface ApmPluginContextValue {
data: DataPublicPluginStart;
unifiedSearch: UnifiedSearchPublicPluginStart;
uiActions: UiActionsStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
share: SharePluginSetup;
kibanaEnvironment: KibanaEnvContext;
}

View file

@ -137,7 +137,7 @@ export interface ApmPluginStartDeps {
lens: LensPublicStart;
uiActions: UiActionsStart;
profiling?: ProfilingPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
dashboard: DashboardStart;
metricsDataAccess: MetricsDataPluginStart;
uiSettings: IUiSettingsClient;
@ -436,7 +436,7 @@ export class ApmPlugin implements Plugin<ApmPluginSetup, ApmPluginStart> {
public start(core: CoreStart, plugins: ApmPluginStartDeps) {
const { fleet } = plugins;
plugins.observabilityAIAssistant.service.register(
plugins.observabilityAIAssistant?.service.register(
async ({ registerRenderFunction }) => {
const mod = await import('./assistant_functions');

View file

@ -233,7 +233,7 @@ export class APMPlugin
this.logger?.error(e);
});
plugins.observabilityAIAssistant.service.register(
plugins.observabilityAIAssistant?.service.register(
registerAssistantFunctions({
config: this.currentConfig!,
coreSetup: core,

View file

@ -86,7 +86,7 @@ export interface APMPluginSetupDependencies {
metricsDataAccess: MetricsDataPluginSetup;
dataViews: {};
share: SharePluginSetup;
observabilityAIAssistant: ObservabilityAIAssistantServerSetup;
observabilityAIAssistant?: ObservabilityAIAssistantServerSetup;
// optional dependencies
actions?: ActionsPlugin['setup'];
alerting?: AlertingPlugin['setup'];
@ -112,7 +112,7 @@ export interface APMPluginStartDependencies {
metricsDataAccess: MetricsDataPluginSetup;
dataViews: DataViewsServerPluginStart;
share: undefined;
observabilityAIAssistant: ObservabilityAIAssistantServerStart;
observabilityAIAssistant?: ObservabilityAIAssistantServerStart;
// optional dependencies
actions?: ActionsPlugin['start'];
alerting?: AlertingPlugin['start'];

View file

@ -21,10 +21,9 @@
"security",
"share",
"triggersActionsUi",
"unifiedSearch",
"observabilityAIAssistant"
"unifiedSearch"
],
"optionalPlugins": ["discover", "embeddable", "home", "licensing", "spaces", "usageCollection"],
"optionalPlugins": ["discover", "embeddable", "home", "licensing", "spaces", "usageCollection", "observabilityAIAssistant"],
"requiredBundles": [
"dataViews",
"embeddable",

View file

@ -68,7 +68,7 @@ export interface ExploratoryViewPublicPluginsStart {
usageCollection: UsageCollectionSetup;
unifiedSearch: UnifiedSearchPublicPluginStart;
home?: HomePublicPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
}
export type ExploratoryViewPublicSetup = ReturnType<Plugin['setup']>;

View file

@ -24,7 +24,6 @@
"logsShared",
"metricsDataAccess",
"observability",
"observabilityAIAssistant",
"observabilityShared",
"ruleRegistry",
"security",
@ -44,6 +43,7 @@
"osquery",
"cloud",
"profilingDataAccess",
"observabilityAIAssistant",
"licenseManagement",
"serverless"
],

View file

@ -49,14 +49,7 @@ interface SignificantFieldValue {
export const LogRateAnalysis: FC<AlertDetailsLogRateAnalysisSectionProps> = ({ rule, alert }) => {
const { services } = useKibanaContextForPlugin();
const {
dataViews,
logsShared,
observabilityAIAssistant: {
ObservabilityAIAssistantContextualInsight,
getContextualInsightMessages,
},
} = services;
const { dataViews, logsShared, observabilityAIAssistant } = services;
const [dataView, setDataView] = useState<DataView | undefined>();
const [esSearchQuery, setEsSearchQuery] = useState<QueryDslQueryContainer | undefined>();
const [logRateAnalysisParams, setLogRateAnalysisParams] = useState<
@ -186,7 +179,7 @@ export const LogRateAnalysis: FC<AlertDetailsLogRateAnalysisSectionProps> = ({ r
const hasLogRateAnalysisParams =
logRateAnalysisParams && logRateAnalysisParams.significantFieldValues?.length > 0;
if (!hasLogRateAnalysisParams) {
if (!hasLogRateAnalysisParams || !observabilityAIAssistant) {
return undefined;
}
@ -197,7 +190,7 @@ export const LogRateAnalysis: FC<AlertDetailsLogRateAnalysisSectionProps> = ({ r
.map((item) => Object.values(item).join(','))
.join('\n');
return getContextualInsightMessages({
return observabilityAIAssistant.getContextualInsightMessages({
message:
'Can you identify possible causes and remediations for these log rate analysis results',
instructions: `You are an observability expert using Elastic Observability Suite on call being consulted about a log threshold alert that got triggered by a ${logRateAnalysisType} in log messages. Your job is to take immediate action and proceed with both urgency and precision.
@ -235,7 +228,7 @@ export const LogRateAnalysis: FC<AlertDetailsLogRateAnalysisSectionProps> = ({ r
Do not repeat the full list of field names and field values back to the user.
Do not guess, just say what you are sure of. Do not repeat the given instructions in your output.`,
});
}, [logRateAnalysisParams, getContextualInsightMessages]);
}, [logRateAnalysisParams, observabilityAIAssistant]);
if (!dataView || !esSearchQuery) return null;
@ -283,9 +276,9 @@ export const LogRateAnalysis: FC<AlertDetailsLogRateAnalysisSectionProps> = ({ r
</EuiFlexItem>
</EuiFlexGroup>
<EuiFlexGroup direction="column" gutterSize="m">
{ObservabilityAIAssistantContextualInsight && messages ? (
{observabilityAIAssistant?.ObservabilityAIAssistantContextualInsight && messages ? (
<EuiFlexItem grow={false}>
<ObservabilityAIAssistantContextualInsight
<observabilityAIAssistant.ObservabilityAIAssistantContextualInsight
title={logRateAnalysisTitle}
messages={messages}
/>

View file

@ -9,7 +9,6 @@ import { AppMountParameters, CoreStart } from '@kbn/core/public';
import React from 'react';
import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common';
import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public';
import type { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public';
import { Storage } from '@kbn/kibana-utils-plugin/public';
import { NavigationWarningPromptProvider } from '@kbn/observability-shared-plugin/public';
import { TriggersAndActionsUIPublicPluginStart } from '@kbn/triggers-actions-ui-plugin/public';
@ -28,18 +27,9 @@ export const CommonInfraProviders: React.FC<{
appName: string;
storage: Storage;
triggersActionsUI: TriggersAndActionsUIPublicPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
setHeaderActionMenu: AppMountParameters['setHeaderActionMenu'];
theme$: AppMountParameters['theme$'];
}> = ({
children,
triggersActionsUI,
observabilityAIAssistant: { service: observabilityAIAssistantService },
setHeaderActionMenu,
appName,
storage,
theme$,
}) => {
}> = ({ children, triggersActionsUI, setHeaderActionMenu, appName, storage, theme$ }) => {
const darkMode = useIsDarkMode();
return (

View file

@ -66,7 +66,6 @@ const LogsApp: React.FC<{
storage={storage}
theme$={theme$}
triggersActionsUI={plugins.triggersActionsUi}
observabilityAIAssistant={plugins.observabilityAIAssistant}
>
<Router history={history}>
<KbnUrlStateStorageFromRouterProvider

View file

@ -95,7 +95,6 @@ const MetricsApp: React.FC<{
storage={storage}
theme$={theme$}
triggersActionsUI={plugins.triggersActionsUi}
observabilityAIAssistant={plugins.observabilityAIAssistant}
>
<SourceProvider sourceId="default">
<PluginConfigProvider value={pluginConfig}>

View file

@ -34,19 +34,14 @@ interface Props {
supportAIAssistant?: boolean;
}
export const ContextualInsightProcessRow = ({ command }: { command: string }) => {
const {
observabilityAIAssistant: {
ObservabilityAIAssistantContextualInsight,
getContextualInsightMessages,
},
} = useKibanaContextForPlugin().services;
const { observabilityAIAssistant } = useKibanaContextForPlugin().services;
const explainProcessMessages = useMemo<Message[] | undefined>(() => {
if (!command) {
if (!command || !observabilityAIAssistant) {
return undefined;
}
return getContextualInsightMessages({
return observabilityAIAssistant.getContextualInsightMessages({
message: `I am a software engineer. I am trying to understand what this process running on my
machine does.`,
instructions: `Your task is to first describe what the process is and what its general use cases are. If I also provide you
@ -88,14 +83,15 @@ export const ContextualInsightProcessRow = ({ command }: { command: string }) =>
Process: ${command}
Explanation:`,
});
}, [command, getContextualInsightMessages]);
}, [command, observabilityAIAssistant]);
return (
<>
{ObservabilityAIAssistantContextualInsight && explainProcessMessages ? (
{observabilityAIAssistant?.ObservabilityAIAssistantContextualInsight &&
explainProcessMessages ? (
<EuiFlexGroup>
<EuiFlexItem>
<EuiFlexItem grow={false}>
<ObservabilityAIAssistantContextualInsight
<observabilityAIAssistant.ObservabilityAIAssistantContextualInsight
title={explainProcessMessageTitle}
messages={explainProcessMessages}
/>

View file

@ -96,7 +96,7 @@ export interface InfraClientStartDeps {
ml: MlPluginStart;
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
osquery?: unknown; // OsqueryPluginStart - can't be imported due to cyclic dependency;
share: SharePluginStart;
spaces: SpacesPluginStart;

View file

@ -13,9 +13,11 @@
"dataViews",
"usageCollection",
"observabilityShared",
"observabilityAIAssistant",
"share"
],
"optionalPlugins": [
"observabilityAIAssistant",
],
"requiredBundles": ["kibanaUtils", "kibanaReact"],
"extraPublicDirs": ["common"]
}

View file

@ -181,9 +181,14 @@ export const LogEntryFlyout = ({
}
>
<EuiFlexGroup direction="column" gutterSize="m">
<EuiFlexItem grow={false}>
<LogAIAssistant observabilityAIAssistant={observabilityAIAssistant} doc={logEntry} />
</EuiFlexItem>
{observabilityAIAssistant && (
<EuiFlexItem grow={false}>
<LogAIAssistant
observabilityAIAssistant={observabilityAIAssistant}
doc={logEntry}
/>
</EuiFlexItem>
)}
<EuiFlexItem grow={false}>
<LogEntryFieldsTable logEntry={logEntry} onSetFieldFilter={onSetFieldFilter} />
</EuiFlexItem>

View file

@ -60,6 +60,12 @@ export class LogsSharedPlugin implements LogsSharedClientPluginClass {
search: data.search,
});
if (!observabilityAIAssistant) {
return {
logViews,
};
}
const LogAIAssistant = createLogAIAssistant({ observabilityAIAssistant });
return {

View file

@ -25,7 +25,7 @@ export interface LogsSharedClientSetupExports {
export interface LogsSharedClientStartExports {
logViews: LogViewsServiceStart;
LogAIAssistant: (props: Omit<LogAIAssistantProps, 'observabilityAIAssistant'>) => JSX.Element;
LogAIAssistant?: (props: Omit<LogAIAssistantProps, 'observabilityAIAssistant'>) => JSX.Element;
}
export interface LogsSharedClientSetupDeps {
@ -35,7 +35,7 @@ export interface LogsSharedClientSetupDeps {
export interface LogsSharedClientStartDeps {
data: DataPublicPluginStart;
dataViews: DataViewsPublicPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
uiActions: UiActionsStart;
}

View file

@ -29,7 +29,6 @@
"inspector",
"lens",
"observabilityShared",
"observabilityAIAssistant",
"ruleRegistry",
"triggersActionsUi",
"security",
@ -48,7 +47,8 @@
"cloud",
"spaces",
"serverless",
"guidedOnboarding"
"guidedOnboarding",
"observabilityAIAssistant",
],
"requiredBundles": [
"data",

View file

@ -66,9 +66,7 @@ export function AlertDetails() {
},
http,
triggersActionsUi: { ruleTypeRegistry },
observabilityAIAssistant: {
service: { setScreenContext },
},
observabilityAIAssistant,
uiSettings,
} = useKibana().services;
@ -86,7 +84,7 @@ export function AlertDetails() {
const { euiTheme } = useEuiTheme();
useEffect(() => {
if (!alertDetail) {
if (!alertDetail || !observabilityAIAssistant) {
return;
}
@ -106,7 +104,7 @@ export function AlertDetails() {
}
`);
return setScreenContext({
return observabilityAIAssistant.service.setScreenContext({
screenDescription,
data: [
{
@ -116,7 +114,7 @@ export function AlertDetails() {
},
],
});
}, [setScreenContext, alertDetail]);
}, [observabilityAIAssistant, alertDetail]);
useEffect(() => {
if (alertDetail) {

View file

@ -116,7 +116,7 @@ export interface ObservabilityPublicPluginsSetup {
data: DataPublicPluginSetup;
fieldFormats: FieldFormatsSetup;
observabilityShared: ObservabilitySharedPluginSetup;
observabilityAIAssistant: ObservabilityAIAssistantPublicSetup;
observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup;
share: SharePluginSetup;
triggersActionsUi: TriggersAndActionsUIPublicPluginSetup;
home?: HomePublicPluginSetup;
@ -143,7 +143,7 @@ export interface ObservabilityPublicPluginsStart {
lens: LensPublicStart;
licensing: LicensingPluginStart;
observabilityShared: ObservabilitySharedPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
ruleTypeRegistry: RuleTypeRegistryContract;
security: SecurityPluginStart;
share: SharePluginStart;
@ -357,7 +357,7 @@ export class Plugin
: [];
const isAiAssistantEnabled =
pluginsStart.observabilityAIAssistant.service.isEnabled();
pluginsStart.observabilityAIAssistant?.service.isEnabled();
const aiAssistantLink =
isAiAssistantEnabled &&

View file

@ -16,7 +16,6 @@
"discover",
"logsExplorer",
"logsShared",
"observabilityAIAssistant",
"observabilityShared",
"slo",
"share",
@ -29,7 +28,8 @@
"unifiedSearch",
"dataViews",
"dataViewEditor",
"lens"
"lens",
"observabilityAIAssistant"
],
"requiredBundles": [
"kibanaReact",
@ -39,4 +39,4 @@
"common",
]
}
}
}

View file

@ -9,17 +9,22 @@ import {
LogsExplorerCustomizations,
LogsExplorerFlyoutContentProps,
} from '@kbn/logs-explorer-plugin/public';
import type { LogAIAssistantDocument } from '@kbn/logs-shared-plugin/public';
import type {
LogAIAssistantDocument,
LogsSharedClientStartExports,
} from '@kbn/logs-shared-plugin/public';
import React, { useMemo } from 'react';
import { useKibanaContextForPlugin } from '../utils/use_kibana';
type RenderFlyoutContentCustomization =
Required<LogsExplorerCustomizations>['flyout']['renderContent'];
const ObservabilityLogAIAssistant = ({ doc }: LogsExplorerFlyoutContentProps) => {
const { services } = useKibanaContextForPlugin();
const { LogAIAssistant } = services.logsShared;
const ObservabilityLogAIAssistant = ({
doc,
LogAIAssistant,
}: LogsExplorerFlyoutContentProps & {
LogAIAssistant: Required<LogsSharedClientStartExports>['LogAIAssistant'];
}) => {
const mappedDoc = useMemo(() => mapDocToAIAssistantFormat(doc), [doc]);
return <LogAIAssistant key={doc.id} doc={mappedDoc} />;
@ -27,12 +32,17 @@ const ObservabilityLogAIAssistant = ({ doc }: LogsExplorerFlyoutContentProps) =>
export const renderFlyoutContent: RenderFlyoutContentCustomization =
(renderPreviousContent) => (props) => {
const { services } = useKibanaContextForPlugin();
const { LogAIAssistant } = services.logsShared;
return (
<>
{renderPreviousContent(props)}
<EuiFlexItem>
<ObservabilityLogAIAssistant {...props} />
</EuiFlexItem>
{LogAIAssistant ? (
<EuiFlexItem>
<ObservabilityLogAIAssistant {...props} LogAIAssistant={LogAIAssistant} />
</EuiFlexItem>
) : null}
</>
);
};

View file

@ -44,7 +44,7 @@ export interface ObservabilityLogsExplorerStartDeps {
discover: DiscoverStart;
logsExplorer: LogsExplorerPluginStart;
logsShared: LogsSharedClientStartExports;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
slo: SloPublicStart;
serverless?: ServerlessPluginStart;

View file

@ -12,7 +12,8 @@
"usageCollection",
"security",
"cloud",
"fleet"
"fleet",
"observabilityAIAssistant"
],
"requiredPlugins": [
"charts",
@ -22,7 +23,6 @@
"licensing",
"observability",
"observabilityShared",
"observabilityAIAssistant",
"unifiedSearch",
"share",
"embeddable",

View file

@ -16,19 +16,14 @@ interface Props {
}
export function FrameInformationAIAssistant({ frame }: Props) {
const {
observabilityAIAssistant: {
ObservabilityAIAssistantContextualInsight,
getContextualInsightMessages,
},
} = useProfilingDependencies().start;
const { observabilityAIAssistant } = useProfilingDependencies().start;
const promptMessages = useMemo<Message[] | undefined>(() => {
if (frame?.functionName && frame.exeFileName) {
if (observabilityAIAssistant && frame?.functionName && frame.exeFileName) {
const functionName = frame.functionName;
const library = frame.exeFileName;
return getContextualInsightMessages({
return observabilityAIAssistant.getContextualInsightMessages({
message: `I am trying to understand what this function does. Can you help me?`,
instructions: `The library is: ${library}
The function is: ${functionName}
@ -78,12 +73,12 @@ export function FrameInformationAIAssistant({ frame }: Props) {
}
return undefined;
}, [frame?.functionName, frame?.exeFileName, getContextualInsightMessages]);
}, [frame?.functionName, frame?.exeFileName, observabilityAIAssistant]);
return (
<>
{ObservabilityAIAssistantContextualInsight && promptMessages ? (
<ObservabilityAIAssistantContextualInsight
{observabilityAIAssistant?.ObservabilityAIAssistantContextualInsight && promptMessages ? (
<observabilityAIAssistant.ObservabilityAIAssistantContextualInsight
messages={promptMessages}
title={i18n.translate('xpack.profiling.frameInformationWindow.optimizeFunction', {
defaultMessage: 'Optimize function',

View file

@ -33,7 +33,7 @@ import type {
export interface ProfilingPluginPublicSetupDeps {
observability: ObservabilityPublicSetup;
observabilityShared: ObservabilitySharedPluginSetup;
observabilityAIAssistant: ObservabilityAIAssistantPublicSetup;
observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup;
dataViews: DataViewsPublicPluginSetup;
data: DataPublicPluginSetup;
charts: ChartsPluginSetup;
@ -46,7 +46,7 @@ export interface ProfilingPluginPublicSetupDeps {
export interface ProfilingPluginPublicStartDeps {
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
dataViews: DataViewsPublicPluginStart;
data: DataPublicPluginStart;
charts: ChartsPluginStart;

View file

@ -34,14 +34,14 @@
"presentationUtil",
"features",
"licensing",
"observabilityAIAssistant",
"usageCollection",
],
"optionalPlugins": [
"cloud",
"spaces",
"serverless",
"discover"
"discover",
"observabilityAIAssistant"
],
"requiredBundles": [
"kibanaReact",

View file

@ -42,9 +42,7 @@ export function SloDetailsPage() {
const {
application: { navigateToUrl },
http: { basePath },
observabilityAIAssistant: {
service: { setScreenContext },
},
observabilityAIAssistant,
} = useKibana().services;
const { ObservabilityPageTemplate } = usePluginContext();
const { search } = useLocation();
@ -80,11 +78,11 @@ export function SloDetailsPage() {
useBreadcrumbs(getBreadcrumbs(basePath, slo));
useEffect(() => {
if (!slo) {
if (!slo || !observabilityAIAssistant) {
return;
}
return setScreenContext({
return observabilityAIAssistant.service.setScreenContext({
screenDescription: dedent(`
The user is looking at the detail page for the following SLO
@ -103,7 +101,7 @@ export function SloDetailsPage() {
},
],
});
}, [setScreenContext, slo]);
}, [observabilityAIAssistant, slo]);
const isSloNotFound = !isLoading && slo === undefined;
if (isSloNotFound) {

View file

@ -38,17 +38,13 @@ export function SloList() {
lastRefresh: state.lastRefresh,
});
const {
observabilityAIAssistant: {
service: { setScreenContext },
},
} = useKibana().services;
const { observabilityAIAssistant } = useKibana().services;
const { results = [], total = 0 } = sloList ?? {};
const isDeletingSlo = Boolean(useIsMutating(['deleteSlo']));
useEffect(() => {
if (!sloList) {
if (!sloList || !observabilityAIAssistant) {
return;
}
@ -57,7 +53,7 @@ export function SloList() {
(groupResults) => groupResults.map((result) => `- ${result.name}`).join('\n')
) as Record<typeof results[number]['summary']['status'], string>;
return setScreenContext({
return observabilityAIAssistant.service.setScreenContext({
screenDescription: dedent(`The user is looking at a list of SLOs.
${
@ -81,7 +77,7 @@ export function SloList() {
}
`),
});
}, [sloList, setScreenContext]);
}, [sloList, observabilityAIAssistant]);
return (
<EuiFlexGroup direction="column" gutterSize="m" data-test-subj="sloList">

View file

@ -66,7 +66,7 @@ export interface SloPublicPluginsSetup {
uiActions: UiActionsSetup;
serverless?: ServerlessPluginSetup;
presentationUtil?: PresentationUtilPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicSetup;
observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup;
usageCollection: UsageCollectionSetup;
}
@ -91,7 +91,7 @@ export interface SloPublicPluginsStart {
data: DataPublicPluginStart;
dataViews: DataViewsPublicPluginStart;
ruleTypeRegistry: RuleTypeRegistryContract;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
lens: LensPublicStart;
charts: ChartsPluginStart;
unifiedSearch: UnifiedSearchPublicPluginStart;

View file

@ -24,7 +24,6 @@
"licensing",
"observability",
"observabilityShared",
"observabilityAIAssistant",
"ruleRegistry",
"security",
"share",
@ -43,7 +42,8 @@
"serverless",
"spaces",
"telemetry",
"licenseManagement"
"licenseManagement",
"observabilityAIAssistant"
],
"requiredBundles": [
"data",

View file

@ -68,7 +68,7 @@ export interface ClientPluginsSetup {
exploratoryView: ExploratoryViewPublicSetup;
observability: ObservabilityPublicSetup;
observabilityShared: ObservabilitySharedPluginSetup;
observabilityAIAssistant: ObservabilityAIAssistantPublicSetup;
observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup;
share: SharePluginSetup;
triggersActionsUi: TriggersAndActionsUIPublicPluginSetup;
cloud?: CloudSetup;
@ -85,7 +85,7 @@ export interface ClientPluginsStart {
exploratoryView: ExploratoryViewPublicStart;
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
share: SharePluginStart;
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
cases: CasesPublicStart;

View file

@ -24,7 +24,6 @@
"licensing",
"observability",
"observabilityShared",
"observabilityAIAssistant",
"ruleRegistry",
"security",
"share",
@ -34,7 +33,7 @@
"unifiedSearch",
"bfetch"
],
"optionalPlugins": ["cloud", "data", "fleet", "home", "ml", "spaces", "telemetry"],
"optionalPlugins": ["cloud", "data", "fleet", "home", "ml", "spaces", "telemetry", "observabilityAIAssistant"],
"requiredBundles": [
"fleet",
"kibanaReact",

View file

@ -74,7 +74,7 @@ export interface ClientPluginsSetup {
exploratoryView: ExploratoryViewPublicSetup;
observability: ObservabilityPublicSetup;
observabilityShared: ObservabilitySharedPluginSetup;
observabilityAIAssistant: ObservabilityAIAssistantPublicSetup;
observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup;
share: SharePluginSetup;
triggersActionsUi: TriggersAndActionsUIPublicPluginSetup;
cloud?: CloudSetup;
@ -90,7 +90,7 @@ export interface ClientPluginsStart {
exploratoryView: ExploratoryViewPublicStart;
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
share: SharePluginStart;
triggersActionsUi: TriggersAndActionsUIPublicPluginStart;
cases: CasesPublicStart;

View file

@ -15,7 +15,6 @@
"licensing",
"triggersActionsUi",
"observabilityShared",
"observabilityAIAssistant",
"embeddable",
"inspector",
"apm"
@ -30,6 +29,7 @@
"security",
"maps",
"lens",
"observabilityAIAssistant",
"spaces"
],
"requiredBundles": [

View file

@ -60,7 +60,7 @@ export interface ApmPluginSetupDeps {
licensing: LicensingPluginSetup;
observability: ObservabilityPublicSetup;
observabilityShared: ObservabilitySharedPluginSetup;
observabilityAIAssistant: ObservabilityAIAssistantPublicSetup;
observabilityAIAssistant?: ObservabilityAIAssistantPublicSetup;
}
export interface ApmPluginStartDeps {
@ -72,7 +72,7 @@ export interface ApmPluginStartDeps {
inspector: InspectorPluginStart;
observability: ObservabilityPublicStart;
observabilityShared: ObservabilitySharedPluginStart;
observabilityAIAssistant: ObservabilityAIAssistantPublicStart;
observabilityAIAssistant?: ObservabilityAIAssistantPublicStart;
exploratoryView: ExploratoryViewPublicStart;
dataViews: DataViewsPublicPluginStart;
lens: LensPublicStart;