Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import { LicensingPluginStart } from '@kbn/licensing-plugin/public';
import { IndexManagementPluginStart } from '@kbn/index-management-shared-types';
import { IngestPipelinesPluginStart } from '@kbn/ingest-pipelines-plugin/public';
import { DiscoverSharedPublicStart } from '@kbn/discover-shared-plugin/public';
import { ObservabilityAIAssistantPublicStart } from '@kbn/observability-ai-assistant-plugin/public';
import type { StreamsAppKibanaContext } from '../public/hooks/use_kibana';
import { StreamsTelemetryService } from '../public/telemetry/service';

Expand Down Expand Up @@ -47,6 +48,7 @@ export function getMockStreamsAppContext(): StreamsAppKibanaContext {
indexManagement: {} as unknown as IndexManagementPluginStart,
ingestPipelines: {} as unknown as IngestPipelinesPluginStart,
discoverShared: {} as unknown as DiscoverSharedPublicStart,
observabilityAIAssistant: {} as unknown as ObservabilityAIAssistantPublicStart,
},
},
services: {
Expand Down
17 changes: 7 additions & 10 deletions x-pack/platform/plugins/shared/streams_app/kibana.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,23 @@
"browser": true,
"configPath": ["xpack", "streamsApp"],
"requiredPlugins": [
"streams",
"data",
"datasetQuality",
"dataViews",
"discoverShared",
"unifiedSearch",
"share",
"savedObjectsTagging",
"navigation",
"fieldsMetadata",
"datasetQuality",
"licensing",
"indexManagement",
"ingestPipelines",
"navigation",
"observabilityAIAssistant",
"savedObjectsTagging",
"share",
"streams",
"unifiedSearch",
],
"requiredBundles": [
"kibanaReact"
],
"optionalPlugins": [
"observabilityAIAssistant"
],
"extraPublicDirs": []
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,14 @@ const StreamDetailEnrichmentContent = dynamic(() =>
);

interface StreamDetailEnrichmentProps {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
refreshDefinition: () => void;
}

export function StreamDetailEnrichment({
definition,
refreshDefinition,
}: StreamDetailEnrichmentProps) {
if (!definition) return null;

if (isRootStreamDefinition(definition.stream)) {
return <RootStreamEmptyPrompt />;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@ import {
} from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import { useWatch, useFormContext } from 'react-hook-form';
import { FlattenRecord, IngestStreamGetResponse } from '@kbn/streams-schema';
import { FlattenRecord } from '@kbn/streams-schema';
import type { FindActionResult } from '@kbn/actions-plugin/server';
import { UseGenAIConnectorsResult } from '@kbn/observability-ai-assistant-plugin/public/hooks/use_genai_connectors';
import { useAbortController, useBoolean } from '@kbn/react-hooks';
import useObservable from 'react-use/lib/useObservable';
import { isEmpty } from 'lodash';
import { css } from '@emotion/css';
import { useStreamDetail } from '../../../../../hooks/use_stream_detail';
import { useKibana } from '../../../../../hooks/use_kibana';
Expand Down Expand Up @@ -128,15 +129,16 @@ const RefreshButton = ({
);
};

function useAiEnabled() {
function useAIFeatures() {
const { dependencies, core } = useKibana();
const { observabilityAIAssistant, licensing } = dependencies.start;

const aiAssistantEnabled = observabilityAIAssistant?.service.isEnabled();
const aiAssistantEnabled = observabilityAIAssistant.service.isEnabled();

const genAiConnectors = observabilityAIAssistant?.useGenAIConnectors();
const genAiConnectors = observabilityAIAssistant.useGenAIConnectors();

const aiEnabled = aiAssistantEnabled && (genAiConnectors?.connectors || []).length > 0;
const aiEnabled =
aiAssistantEnabled && genAiConnectors.connectors && !isEmpty(genAiConnectors.connectors);

const currentLicense = useObservable(licensing.license$);

Expand All @@ -146,29 +148,29 @@ function useAiEnabled() {
return {
enabled: aiEnabled,
couldBeEnabled,
genAiConnectors,
};
}

function InnerGrokAiSuggestions({
previewDocuments,
definition,
genAiConnectors,
}: {
previewDocuments: FlattenRecord[];
definition: IngestStreamGetResponse;
genAiConnectors: UseGenAIConnectorsResult;
}) {
const {
dependencies,
services: { telemetryClient },
} = useKibana();
const {
streams: { streamsRepositoryClient },
observabilityAIAssistant,
} = dependencies.start;

const { definition } = useStreamDetail();
const fieldValue = useWatch<ProcessorFormState, 'field'>({ name: 'field' });
const form = useFormContext<GrokFormState>();

const genAiConnectors = observabilityAIAssistant?.useGenAIConnectors();
const currentConnector = genAiConnectors?.selectedConnector;

const [isLoadingSuggestions, setSuggestionsLoading] = useState(false);
Expand Down Expand Up @@ -387,8 +389,7 @@ export function GrokAiSuggestions() {
const {
core: { http },
} = useKibana();
const { enabled: isAiEnabled, couldBeEnabled } = useAiEnabled();
const { definition } = useStreamDetail();
const { enabled: isAiEnabled, couldBeEnabled, genAiConnectors } = useAIFeatures();
const previewDocuments = useSimulatorSelector((snapshot) =>
selectPreviewDocuments(snapshot.context)
);
Expand All @@ -412,18 +413,18 @@ export function GrokAiSuggestions() {
>
{i18n.translate(
'xpack.streams.streamDetailView.managementTab.enrichment.processorFlyout.aiAssistantNotEnabled',
{
defaultMessage: 'Enable AI Assistant features',
}
{ defaultMessage: 'Enable AI Assistant features' }
)}
</EuiLink>
</EuiToolTip>
);
}

if (!isAiEnabled || !definition) {
if (!isAiEnabled) {
return null;
}

return <InnerGrokAiSuggestions definition={definition} previewDocuments={previewDocuments} />;
return (
<InnerGrokAiSuggestions previewDocuments={previewDocuments} genAiConnectors={genAiConnectors} />
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,12 @@ export type DataStreamStats = DataStreamStatServiceResponse['dataStreamsStats'][
bytesPerDay: number;
};

export const useDataStreamStats = ({ definition }: { definition?: IngestStreamGetResponse }) => {
export const useDataStreamStats = ({ definition }: { definition: IngestStreamGetResponse }) => {
const {
services: { dataStreamsClient },
} = useKibana();

const statsFetch = useStreamsAppFetch(async () => {
if (!definition) {
return;
}

const client = await dataStreamsClient;
const {
dataStreamsStats: [dsStats],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export const useIngestionRate = ({
stats,
timeRange,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
stats?: DataStreamStats;
timeRange: TimeRange;
}) => {
Expand All @@ -60,7 +60,7 @@ export const useIngestionRate = ({

const ingestionRateFetch = useStreamsAppFetch(
async ({ signal }) => {
if (!definition || !stats) {
if (!stats) {
return;
}

Expand Down Expand Up @@ -146,7 +146,7 @@ export const useIngestionRatePerTier = ({
stats,
timeRange,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
stats?: DataStreamStats;
timeRange: TimeRange;
}) => {
Expand All @@ -164,7 +164,7 @@ export const useIngestionRatePerTier = ({

const ingestionRateFetch = useStreamsAppFetch(
async ({ signal }) => {
if (!definition || !stats) {
if (!stats) {
return;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,6 @@ export function IlmSummary({

const { value, loading, error } = useStreamsAppFetch(
({ signal }) => {
if (!definition) return;

return streamsRepositoryClient.fetch('GET /internal/streams/{name}/lifecycle/_stats', {
params: { path: { name: definition.stream.name } },
signal,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,13 @@ function useLifecycleState({
definition,
isServerless,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
isServerless: boolean;
}) {
const [updateInProgress, setUpdateInProgress] = useState(false);
const [openEditModal, setOpenEditModal] = useState<LifecycleEditAction>('none');

const lifecycleActions = useMemo(() => {
if (!definition) return [];

const actions: Array<{ name: string; action: LifecycleEditAction }> = [];
const isWired = isWiredStreamGetResponse(definition);
const isUnwired = isUnwiredStreamGetResponse(definition);
Expand Down Expand Up @@ -93,7 +91,7 @@ export function StreamDetailLifecycle({
definition,
refreshDefinition,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
refreshDefinition: () => void;
}) {
const {
Expand Down Expand Up @@ -124,10 +122,6 @@ export function StreamDetailLifecycle({

const { signal } = useAbortController();

if (!definition) {
return null;
}

const ilmLocator = share.url.locators.get<IlmLocatorParams>(ILM_LOCATOR_ID);

const getIlmPolicies = () =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export function IngestionRate({
isLoadingStats,
refreshStats,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
stats?: DataStreamStats;
isLoadingStats: boolean;
refreshStats: () => void;
Expand Down Expand Up @@ -100,7 +100,7 @@ export function IngestionRate({
direction="column"
gutterSize="xs"
>
{!definition ? null : isIlmLifecycle(definition?.effective_lifecycle) ? (
{isIlmLifecycle(definition.effective_lifecycle) ? (
<ChartBarSeries
definition={definition}
stats={stats}
Expand All @@ -126,7 +126,7 @@ function ChartAreaSeries({
timeRange,
isLoadingStats,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
stats?: DataStreamStats;
timeRange: TimeRange;
isLoadingStats: boolean;
Expand All @@ -140,7 +140,7 @@ function ChartAreaSeries({

return ingestionRateError ? (
'Failed to load ingestion rate'
) : !definition || isLoadingStats || isLoadingIngestionRate || !ingestionRate ? (
) : isLoadingStats || isLoadingIngestionRate || !ingestionRate ? (
<EuiLoadingChart />
) : (
<>
Expand Down Expand Up @@ -191,7 +191,7 @@ function ChartBarSeries({
timeRange,
isLoadingStats,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
stats?: DataStreamStats;
timeRange: TimeRange;
isLoadingStats: boolean;
Expand All @@ -206,7 +206,7 @@ function ChartBarSeries({

return ingestionRateError ? (
'Failed to load ingestion rate'
) : !definition || isLoadingStats || isLoadingIngestionRate || !ingestionRate ? (
) : isLoadingStats || isLoadingIngestionRate || !ingestionRate ? (
<EuiLoadingChart />
) : (
<>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,9 @@ export function StreamDetailManagement({
definition,
refreshDefinition,
}: {
definition?: IngestStreamGetResponse;
definition: IngestStreamGetResponse;
refreshDefinition: () => void;
}) {
if (!definition) {
return null;
}

if (isWiredStreamGetResponse(definition)) {
return (
<WiredStreamDetailManagement definition={definition} refreshDefinition={refreshDefinition} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export function WiredStreamDetailManagement({
definition,
refreshDefinition,
}: {
definition?: WiredStreamGetResponse;
definition: WiredStreamGetResponse;
refreshDefinition: () => void;
}) {
const {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export function useRoutingState({
definition,
toasts,
}: {
definition?: WiredStreamGetResponse;
definition: WiredStreamGetResponse;
toasts: IToasts;
}) {
const [lastDisplayedToast, setLastDisplayedToast] = React.useState<Toast | undefined>();
Expand All @@ -40,14 +40,14 @@ export function useRoutingState({
// Child streams: either represents the child streams as they are, or the new order from drag and drop.
const [childStreams, setChildStreams] = React.useState<
WiredStreamGetResponse['stream']['ingest']['wired']['routing']
>(definition?.stream.ingest.wired.routing ?? []);
>(definition.stream.ingest.wired.routing ?? []);

useEffect(() => {
setChildStreams(definition?.stream.ingest.wired.routing ?? []);
setChildStreams(definition.stream.ingest.wired.routing ?? []);
}, [definition]);

// Note: just uses reference equality to check if the order has changed as onChildStreamReorder will create a new array.
const hasChildStreamsOrderChanged = childStreams !== definition?.stream.ingest.wired.routing;
const hasChildStreamsOrderChanged = childStreams !== definition.stream.ingest.wired.routing;

// Child stream currently being dragged
const [draggingChildStream, setDraggingChildStream] = React.useState<string | undefined>();
Expand All @@ -73,8 +73,8 @@ export function useRoutingState({

const cancelChanges = useCallback(() => {
setChildUnderEdit(undefined);
setChildStreams(definition?.stream.ingest.wired.routing ?? []);
}, [definition?.stream.ingest.wired.routing]);
setChildStreams(definition.stream.ingest.wired.routing);
}, [definition.stream.ingest.wired.routing]);

const debouncedChildUnderEdit = useDebounced(childUnderEdit, 300);

Expand Down
Loading