Skip to content

Commit

Permalink
[Obs AI Assistant] move rule connector to observability_ai_assistant_…
Browse files Browse the repository at this point in the history
…app (#180949)

## Summary

Resolves #180910

This change simply moves the rule_connector introduced in
#179980 to the
`observability_ai_assistant_app` plugin. There are not functional
changes.
Also added some unit tests

### Testing
See testing section in #179980

---------

Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com>
  • Loading branch information
klacabane and kibanamachine authored Apr 22, 2024
1 parent f10463a commit e8fe9db
Show file tree
Hide file tree
Showing 20 changed files with 327 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ export const connectorTypes: string[] = [
'.bedrock',
'.d3security',
'.sentinelone',
'.observability-ai-assistant',
'.cases',
'.observability-ai-assistant',
];
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@
"security",
"taskManager",
"dataViews",
"triggersActionsUi",
"ruleRegistry",
"alerting"
],
"requiredBundles": ["kibanaReact", "kibanaUtils"],
"optionalPlugins": ["cloud", "serverless"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export type {
export { AssistantAvatar } from './components/assistant_avatar';
export { ConnectorSelectorBase } from './components/connector_selector/connector_selector_base';
export { useAbortableAsync, type AbortableAsyncState } from './hooks/use_abortable_async';
export { useGenAIConnectorsWithoutContext } from './hooks/use_genai_connectors';

export { createStorybookChatService, createStorybookService } from './storybook_mock';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import type {
ObservabilityAIAssistantPublicStart,
ObservabilityAIAssistantService,
} from './types';
import { getObsAIAssistantConnectorType } from './rule_connector';

export class ObservabilityAIAssistantPlugin
implements
Expand Down Expand Up @@ -88,10 +87,6 @@ export class ObservabilityAIAssistantPlugin

const isEnabled = service.isEnabled();

pluginsStart.triggersActionsUi.actionTypeRegistry.register(
getObsAIAssistantConnectorType(service)
);

return {
service,
useGenAIConnectors: () => useGenAIConnectorsWithoutContext(service),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import {
CoreSetup,
DEFAULT_APP_CATEGORIES,
KibanaRequest,
Logger,
Plugin,
PluginInitializerContext,
Expand All @@ -24,10 +23,7 @@ import { firstValueFrom } from 'rxjs';
import { OBSERVABILITY_AI_ASSISTANT_FEATURE_ID } from '../common/feature';
import type { ObservabilityAIAssistantConfig } from './config';
import { registerServerRoutes } from './routes/register_routes';
import {
ObservabilityAIAssistantRequestHandlerContext,
ObservabilityAIAssistantRouteHandlerResources,
} from './routes/types';
import { ObservabilityAIAssistantRouteHandlerResources } from './routes/types';
import { ObservabilityAIAssistantService } from './service';
import {
ObservabilityAIAssistantServerSetup,
Expand All @@ -38,10 +34,6 @@ import {
import { addLensDocsToKb } from './service/knowledge_base_service/kb_docs/lens';
import { registerFunctions } from './functions';
import { recallRankingEvent } from './analytics/recall_ranking';
import {
getObsAIAssistantConnectorType,
getObsAIAssistantConnectorAdapter,
} from './rule_connector';

export class ObservabilityAIAssistantPlugin
implements
Expand Down Expand Up @@ -162,55 +154,6 @@ export class ObservabilityAIAssistantPlugin

addLensDocsToKb({ service, logger: this.logger.get('kb').get('lens') });

const initResources = async (
request: KibanaRequest
): Promise<ObservabilityAIAssistantRouteHandlerResources> => {
const [coreStart, pluginsStart] = await core.getStartServices();
const license = await firstValueFrom(pluginsStart.licensing.license$);
const savedObjectsClient = coreStart.savedObjects.getScopedClient(request);

const context: ObservabilityAIAssistantRequestHandlerContext = {
rac: routeHandlerPlugins.ruleRegistry.start().then((startContract) => {
return {
getAlertsClient() {
return startContract.getRacClientWithRequest(request);
},
};
}),
alerting: routeHandlerPlugins.alerting.start().then((startContract) => {
return {
getRulesClient() {
return startContract.getRulesClientWithRequest(request);
},
};
}),
core: Promise.resolve({
coreStart,
elasticsearch: {
client: coreStart.elasticsearch.client.asScoped(request),
},
uiSettings: {
client: coreStart.uiSettings.asScopedToClient(savedObjectsClient),
},
savedObjects: {
client: savedObjectsClient,
},
}),
licensing: Promise.resolve({ license, featureUsage: pluginsStart.licensing.featureUsage }),
};

return {
request,
service,
context,
logger: this.logger.get('connector'),
plugins: routeHandlerPlugins,
};
};

plugins.actions.registerType(getObsAIAssistantConnectorType(initResources));
plugins.alerting.registerConnectorAdapter(getObsAIAssistantConnectorAdapter());

registerServerRoutes({
core,
logger: this.logger,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@
"@kbn/cloud-plugin",
"@kbn/serverless",
"@kbn/triggers-actions-ui-plugin",
"@kbn/stack-connectors-plugin",
],
"exclude": ["target/**/*"]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/

export const OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID = '.observability-ai-assistant';
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@
"share",
"security",
"licensing",
"ml"
"ml",
"alerting",
"features"
],
"requiredBundles": ["kibanaReact"],
"optionalPlugins": ["cloud"],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import type {
import { createAppService, ObservabilityAIAssistantAppService } from './service/create_app_service';
import { SharedProviders } from './utils/shared_providers';
import { LazyNavControl } from './components/nav_control/lazy_nav_control';
import { getObsAIAssistantConnectorType } from './rule_connector';

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface ConfigSchema {}
Expand Down Expand Up @@ -124,12 +125,17 @@ export class ObservabilityAIAssistantAppPlugin
order: 1001,
});

pluginsStart.observabilityAIAssistant.service.register(async ({ registerRenderFunction }) => {
const service = pluginsStart.observabilityAIAssistant.service;

service.register(async ({ registerRenderFunction }) => {
const { registerFunctions } = await import('./functions');

await registerFunctions({ pluginsStart, registerRenderFunction });
});

pluginsStart.triggersActionsUi.actionTypeRegistry.register(
getObsAIAssistantConnectorType(service)
);
return {};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ import type {
ActionTypeModel as ConnectorTypeModel,
GenericValidationResult,
} from '@kbn/triggers-actions-ui-plugin/public/types';
import { ObsAIAssistantActionParams } from './types';
import { ObservabilityAIAssistantService } from '../types';
import { AssistantAvatar } from '../components/assistant_avatar';
import {
AssistantAvatar,
ObservabilityAIAssistantService,
} from '@kbn/observability-ai-assistant-plugin/public';
import { OBSERVABILITY_AI_ASSISTANT_CONNECTOR_ID } from '../../common/rule_connector';
import { ObsAIAssistantActionParams } from './types';
import {
CONNECTOR_DESC,
CONNECTOR_REQUIRED,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ import React, { useEffect } from 'react';
import type { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public';
import { i18n } from '@kbn/i18n';
import { EuiFormRow, EuiFlexItem, EuiSelect, EuiSpacer, EuiTextArea } from '@elastic/eui';
import {
ObservabilityAIAssistantService,
useGenAIConnectorsWithoutContext,
} from '@kbn/observability-ai-assistant-plugin/public';
import { ObsAIAssistantActionParams } from './types';
import { ObservabilityAIAssistantService } from '../types';
import { useGenAIConnectorsWithoutContext } from '../hooks/use_genai_connectors';

const ObsAIAssistantParamsFields: React.FunctionComponent<
ActionParamsProps<ObsAIAssistantActionParams> & { service: ObservabilityAIAssistantService }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,21 @@ import {
Plugin,
type PluginInitializerContext,
type CoreStart,
KibanaRequest,
} from '@kbn/core/server';
import {
ObservabilityAIAssistantRequestHandlerContext,
ObservabilityAIAssistantRouteHandlerResources,
} from '@kbn/observability-ai-assistant-plugin/server/routes/types';
import { ObservabilityAIAssistantPluginStartDependencies } from '@kbn/observability-ai-assistant-plugin/server/types';
import { mapValues } from 'lodash';
import { firstValueFrom } from 'rxjs';
import type { ObservabilityAIAssistantAppConfig } from './config';
import { registerFunctions } from './functions';
import {
getObsAIAssistantConnectorAdapter,
getObsAIAssistantConnectorType,
} from './rule_connector';
import type {
ObservabilityAIAssistantAppPluginSetupDependencies,
ObservabilityAIAssistantAppPluginStartDependencies,
Expand Down Expand Up @@ -42,6 +54,68 @@ export class ObservabilityAIAssistantAppPlugin
>,
plugins: ObservabilityAIAssistantAppPluginSetupDependencies
): ObservabilityAIAssistantAppServerSetup {
const routeHandlerPlugins = mapValues(plugins, (value, key) => {
return {
setup: value,
start: () =>
core.getStartServices().then((services) => {
const [, pluginsStartContracts] = services;
return pluginsStartContracts[
key as keyof ObservabilityAIAssistantPluginStartDependencies
];
}),
};
}) as ObservabilityAIAssistantRouteHandlerResources['plugins'];

const initResources = async (
request: KibanaRequest
): Promise<ObservabilityAIAssistantRouteHandlerResources> => {
const [coreStart, pluginsStart] = await core.getStartServices();
const license = await firstValueFrom(pluginsStart.licensing.license$);
const savedObjectsClient = coreStart.savedObjects.getScopedClient(request);

const context: ObservabilityAIAssistantRequestHandlerContext = {
rac: routeHandlerPlugins.ruleRegistry.start().then((startContract) => {
return {
getAlertsClient() {
return startContract.getRacClientWithRequest(request);
},
};
}),
alerting: routeHandlerPlugins.alerting.start().then((startContract) => {
return {
getRulesClient() {
return startContract.getRulesClientWithRequest(request);
},
};
}),
core: Promise.resolve({
coreStart,
elasticsearch: {
client: coreStart.elasticsearch.client.asScoped(request),
},
uiSettings: {
client: coreStart.uiSettings.asScopedToClient(savedObjectsClient),
},
savedObjects: {
client: savedObjectsClient,
},
}),
licensing: Promise.resolve({ license, featureUsage: pluginsStart.licensing.featureUsage }),
};

return {
request,
context,
service: plugins.observabilityAIAssistant.service,
logger: this.logger.get('connector'),
plugins: routeHandlerPlugins,
};
};

plugins.actions.registerType(getObsAIAssistantConnectorType(initResources));
plugins.alerting.registerConnectorAdapter(getObsAIAssistantConnectorAdapter());

return {};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import joiToJsonSchema from 'joi-to-json';
import type { Type } from '@kbn/config-schema';
import { castArray, isPlainObject, forEach, unset } from 'lodash';
import type { CompatibleJSONSchema } from '../../common/functions/types';
import type { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/common/functions/types';

function dropUnknownProperties(object: CompatibleJSONSchema) {
if (!isPlainObject(object)) {
Expand Down
Loading

0 comments on commit e8fe9db

Please sign in to comment.