diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e4dc30f08c53c..f4144cc6f2ba8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -801,12 +801,15 @@ x-pack/platform/packages/shared/index-lifecycle-management/index_lifecycle_manag x-pack/platform/packages/shared/index-management/index_management_shared_types @elastic/kibana-management x-pack/platform/packages/shared/kbn-ai-assistant @elastic/search-kibana x-pack/platform/packages/shared/kbn-alerting-comparators @elastic/response-ops +x-pack/platform/packages/shared/kbn-apm-types @elastic/obs-ux-infra_services-team x-pack/platform/packages/shared/kbn-cloud-security-posture/common @elastic/kibana-cloud-security-posture x-pack/platform/packages/shared/kbn-data-forge @elastic/obs-ux-management-team x-pack/platform/packages/shared/kbn-elastic-assistant @elastic/security-generative-ai x-pack/platform/packages/shared/kbn-elastic-assistant-common @elastic/security-generative-ai x-pack/platform/packages/shared/kbn-entities-schema @elastic/obs-entities +x-pack/platform/packages/shared/kbn-event-stacktrace @elastic/obs-ux-infra_services-team @elastic/obs-ux-logs-team x-pack/platform/packages/shared/kbn-inference-endpoint-ui-common @elastic/response-ops @elastic/appex-ai-infra @elastic/obs-ai-assistant @elastic/security-generative-ai +x-pack/platform/packages/shared/kbn-key-value-metadata-table @elastic/obs-ux-infra_services-team @elastic/obs-ux-logs-team x-pack/platform/packages/shared/kbn-langchain @elastic/security-generative-ai x-pack/platform/packages/shared/kbn-slo-schema @elastic/obs-ux-management-team x-pack/platform/packages/shared/ml/aiops_common @elastic/ml-ui @@ -907,7 +910,6 @@ x-pack/solutions/observability/packages/alert_details @elastic/obs-ux-management x-pack/solutions/observability/packages/alerting_test_data @elastic/obs-ux-management-team x-pack/solutions/observability/packages/get_padded_alert_time_range_util @elastic/obs-ux-management-team x-pack/solutions/observability/packages/kbn-alerts-grouping @elastic/response-ops -x-pack/solutions/observability/packages/kbn-apm-types @elastic/obs-ux-infra_services-team x-pack/solutions/observability/packages/kbn-custom-integrations @elastic/obs-ux-logs-team x-pack/solutions/observability/packages/kbn-investigation-shared @elastic/obs-ux-management-team x-pack/solutions/observability/packages/kbn-streams-schema @elastic/streams-program-team diff --git a/package.json b/package.json index d11260fccbc5b..1837ffa5535d9 100644 --- a/package.json +++ b/package.json @@ -188,7 +188,7 @@ "@kbn/apm-data-access-plugin": "link:x-pack/solutions/observability/plugins/apm_data_access", "@kbn/apm-data-view": "link:src/platform/packages/shared/kbn-apm-data-view", "@kbn/apm-plugin": "link:x-pack/solutions/observability/plugins/apm", - "@kbn/apm-types": "link:x-pack/solutions/observability/packages/kbn-apm-types", + "@kbn/apm-types": "link:x-pack/platform/packages/shared/kbn-apm-types", "@kbn/apm-utils": "link:src/platform/packages/shared/kbn-apm-utils", "@kbn/app-link-test-plugin": "link:test/plugin_functional/plugins/app_link_test", "@kbn/application-usage-test-plugin": "link:x-pack/test/usage_collection/plugins/application_usage_test", @@ -499,6 +499,7 @@ "@kbn/event-annotation-plugin": "link:src/platform/plugins/private/event_annotation", "@kbn/event-log-fixture-plugin": "link:x-pack/test/plugin_api_integration/plugins/event_log", "@kbn/event-log-plugin": "link:x-pack/platform/plugins/shared/event_log", + "@kbn/event-stacktrace": "link:x-pack/platform/packages/shared/kbn-event-stacktrace", "@kbn/expandable-flyout": "link:x-pack/solutions/security/packages/expandable-flyout", "@kbn/exploratory-view-example-plugin": "link:x-pack/examples/exploratory_view_example", "@kbn/exploratory-view-plugin": "link:x-pack/solutions/observability/plugins/exploratory_view", @@ -596,6 +597,7 @@ "@kbn/kbn-top-nav-plugin": "link:test/plugin_functional/plugins/kbn_top_nav", "@kbn/kbn-tp-custom-visualizations-plugin": "link:test/plugin_functional/plugins/kbn_tp_custom_visualizations", "@kbn/kbn-tp-run-pipeline-plugin": "link:test/interpreter_functional/plugins/kbn_tp_run_pipeline", + "@kbn/key-value-metadata-table": "link:x-pack/platform/packages/shared/kbn-key-value-metadata-table", "@kbn/kibana-cors-test-plugin": "link:x-pack/test/functional_cors/plugins/kibana_cors_test", "@kbn/kibana-overview-plugin": "link:src/platform/plugins/private/kibana_overview", "@kbn/kibana-react-plugin": "link:src/platform/plugins/shared/kibana_react", diff --git a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts index fa1856aa05ca3..5ffd12ff250d5 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts @@ -58,8 +58,8 @@ export type LogDocument = Fields & 'cloud.project.id'?: string; 'cloud.instance.id'?: string; 'error.stack_trace'?: string; - 'error.exception.stacktrace'?: string; - 'error.log.stacktrace'?: string; + 'error.exception'?: unknown; + 'error.log'?: unknown; 'log.custom': Record; 'host.geo.location': number[]; 'host.ip': string; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts index 08d914c1017dd..1e3f742937a48 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts @@ -144,7 +144,7 @@ const scenario: Scenario = async (runOptions) => { .defaults({ ...commonLongEntryFields, 'error.message': message, - 'error.exception.stacktrace': 'Error message in error.exception.stacktrace', + 'error.stack_trace': 'Stacktrace', }) .timestamp(timestamp); }); @@ -174,7 +174,7 @@ const scenario: Scenario = async (runOptions) => { .defaults({ ...commonLongEntryFields, 'event.original': message, - 'error.log.stacktrace': 'Error message in error.log.stacktrace', + 'error.stack_trace': 'Stacktrace', 'event.start': eventDate, 'event.end': moment(eventDate).add(1, 'm').toDate(), }) @@ -203,7 +203,7 @@ const scenario: Scenario = async (runOptions) => { .setHostIp(getIpAddress()) .defaults({ ...commonLongEntryFields, - 'error.stack_trace': 'Error message in error.stack_trace', + 'error.stack_trace': 'Stacktrace', }) .timestamp(timestamp); }); diff --git a/packages/kbn-apm-synthtrace/src/scenarios/spiked_latency.ts b/packages/kbn-apm-synthtrace/src/scenarios/spiked_latency.ts index 990be36cbc589..61fa99c69f736 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/spiked_latency.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/spiked_latency.ts @@ -15,6 +15,7 @@ import { generateLongId, generateShortId, Instance, + LogDocument, } from '@kbn/apm-synthtrace-client'; import { Scenario } from '../cli/scenario'; import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; @@ -26,7 +27,7 @@ const ENVIRONMENT = getSynthtraceEnvironment(__filename); const alwaysSpikeTransactionName = 'GET /always-spike'; const sometimesSpikeTransactionName = 'GET /sometimes-spike'; -const scenario: Scenario = async ({ logger, ...runOptions }) => { +const scenario: Scenario = async ({ logger, ...runOptions }) => { const { isLogsDb } = parseLogsScenarioOpts(runOptions.scenarioOpts); return { diff --git a/src/dev/storybook/aliases.ts b/src/dev/storybook/aliases.ts index e3df535fb9988..1aea675a39058 100644 --- a/src/dev/storybook/aliases.ts +++ b/src/dev/storybook/aliases.ts @@ -77,4 +77,5 @@ export const storybookAliases = { ui_actions_enhanced: 'src/platform/plugins/shared/ui_actions_enhanced/.storybook', unified_search: 'src/platform/plugins/shared/unified_search/.storybook', profiling: 'x-pack/solutions/observability/plugins/profiling/.storybook', + event_stacktrace: 'x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook', }; diff --git a/src/platform/packages/shared/kbn-discover-utils/src/data_types/logs/types.ts b/src/platform/packages/shared/kbn-discover-utils/src/data_types/logs/types.ts index 123ad6c631026..0bee05d8cfd45 100644 --- a/src/platform/packages/shared/kbn-discover-utils/src/data_types/logs/types.ts +++ b/src/platform/packages/shared/kbn-discover-utils/src/data_types/logs/types.ts @@ -37,8 +37,8 @@ export interface LogDocument extends DataTableRecord { 'data_stream.dataset': string; 'error.stack_trace'?: string; - 'error.exception.stacktrace'?: string; - 'error.log.stacktrace'?: string; + 'error.exception.stacktrace.abs_path'?: string; + 'error.log.stacktrace.abs_path'?: string; }; } @@ -83,8 +83,8 @@ export interface ResourceFields { export interface StackTraceFields { 'error.stack_trace'?: string; - 'error.exception.stacktrace'?: string; - 'error.log.stacktrace'?: string; + 'error.exception.stacktrace.abs_path'?: string; + 'error.log.stacktrace.abs_path'?: string; } export interface SmartFieldGridColumnOptions { diff --git a/src/platform/packages/shared/kbn-discover-utils/src/field_constants.ts b/src/platform/packages/shared/kbn-discover-utils/src/field_constants.ts index a2a68d139ad03..975b703572274 100644 --- a/src/platform/packages/shared/kbn-discover-utils/src/field_constants.ts +++ b/src/platform/packages/shared/kbn-discover-utils/src/field_constants.ts @@ -19,6 +19,7 @@ export const TRACE_ID_FIELD = 'trace.id'; export const LOG_FILE_PATH_FIELD = 'log.file.path'; export const DATASTREAM_NAMESPACE_FIELD = 'data_stream.namespace'; export const DATASTREAM_DATASET_FIELD = 'data_stream.dataset'; +export const DATASTREAM_TYPE_FIELD = 'data_stream.type'; // Resource Fields export const AGENT_NAME_FIELD = 'agent.name'; @@ -41,5 +42,5 @@ export const DEGRADED_DOCS_FIELDS = [IGNORED_FIELD, IGNORED_FIELD_VALUES_FIELD] // Error Stacktrace export const ERROR_STACK_TRACE = 'error.stack_trace'; -export const ERROR_EXCEPTION_STACKTRACE = 'error.exception.stacktrace'; -export const ERROR_LOG_STACKTRACE = 'error.log.stacktrace'; +export const ERROR_EXCEPTION_STACKTRACE_ABS_PATH = 'error.exception.stacktrace.abs_path'; +export const ERROR_LOG_STACKTRACE_ABS_PATH = 'error.log.stacktrace.abs_path'; diff --git a/src/platform/packages/shared/kbn-discover-utils/src/utils/get_stack_trace_fields.ts b/src/platform/packages/shared/kbn-discover-utils/src/utils/get_stack_trace_fields.ts index b2d61c007ea3f..e0e1e2ca407ac 100644 --- a/src/platform/packages/shared/kbn-discover-utils/src/utils/get_stack_trace_fields.ts +++ b/src/platform/packages/shared/kbn-discover-utils/src/utils/get_stack_trace_fields.ts @@ -9,19 +9,19 @@ import { getFieldValue, LogDocument, StackTraceFields } from '..'; import { - ERROR_EXCEPTION_STACKTRACE, - ERROR_LOG_STACKTRACE, + ERROR_EXCEPTION_STACKTRACE_ABS_PATH, + ERROR_LOG_STACKTRACE_ABS_PATH, ERROR_STACK_TRACE, } from '../field_constants'; export const getStacktraceFields = (doc: LogDocument): StackTraceFields => { const errorStackTrace = getFieldValue(doc, ERROR_STACK_TRACE); - const errorExceptionStackTrace = getFieldValue(doc, ERROR_EXCEPTION_STACKTRACE); - const errorLogStackTrace = getFieldValue(doc, ERROR_LOG_STACKTRACE); + const errorExceptionStackTrace = getFieldValue(doc, ERROR_EXCEPTION_STACKTRACE_ABS_PATH); + const errorLogStackTrace = getFieldValue(doc, ERROR_LOG_STACKTRACE_ABS_PATH); return { [ERROR_STACK_TRACE]: errorStackTrace, - [ERROR_EXCEPTION_STACKTRACE]: errorExceptionStackTrace, - [ERROR_LOG_STACKTRACE]: errorLogStackTrace, + [ERROR_EXCEPTION_STACKTRACE_ABS_PATH]: errorExceptionStackTrace, + [ERROR_LOG_STACKTRACE_ABS_PATH]: errorLogStackTrace, }; }; diff --git a/src/platform/plugins/shared/unified_doc_viewer/kibana.jsonc b/src/platform/plugins/shared/unified_doc_viewer/kibana.jsonc index a741cd93472b3..0471a2c6a84d3 100644 --- a/src/platform/plugins/shared/unified_doc_viewer/kibana.jsonc +++ b/src/platform/plugins/shared/unified_doc_viewer/kibana.jsonc @@ -23,4 +23,4 @@ "kibanaUtils" ] } -} \ No newline at end of file +} diff --git a/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx index 03499c16fad08..b58c0278ed50b 100644 --- a/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx +++ b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview.tsx @@ -12,11 +12,13 @@ import { DocViewRenderProps } from '@kbn/unified-doc-viewer/types'; import { getLogDocumentOverview } from '@kbn/discover-utils'; import { EuiHorizontalRule, EuiSpacer } from '@elastic/eui'; import { ObservabilityLogsAIAssistantFeatureRenderDeps } from '@kbn/discover-shared-plugin/public'; +import { getStacktraceFields, LogDocument } from '@kbn/discover-utils/src'; import { LogsOverviewHeader } from './logs_overview_header'; import { LogsOverviewHighlights } from './logs_overview_highlights'; import { FieldActionsProvider } from '../../hooks/use_field_actions'; import { getUnifiedDocViewerServices } from '../../plugin'; import { LogsOverviewDegradedFields } from './logs_overview_degraded_fields'; +import { LogsOverviewStacktraceSection } from './logs_overview_stacktrace_section'; export type LogsOverviewProps = DocViewRenderProps & { renderAIAssistant?: (deps: ObservabilityLogsAIAssistantFeatureRenderDeps) => JSX.Element; @@ -34,6 +36,8 @@ export function LogsOverview({ const { fieldFormats } = getUnifiedDocViewerServices(); const parsedDoc = getLogDocumentOverview(hit, { dataView, fieldFormats }); const LogsOverviewAIAssistant = renderAIAssistant; + const stacktraceFields = getStacktraceFields(hit as LogDocument); + const isStacktraceAvailable = Object.values(stacktraceFields).some(Boolean); return ( + {isStacktraceAvailable && } {LogsOverviewAIAssistant && } ); diff --git a/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_stacktrace_section.tsx b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_stacktrace_section.tsx new file mode 100644 index 0000000000000..957e3dcd774f0 --- /dev/null +++ b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_stacktrace_section.tsx @@ -0,0 +1,52 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ +import { EuiAccordion, EuiHorizontalRule, EuiTitle, useGeneratedHtmlId } from '@elastic/eui'; +import { DataTableRecord } from '@kbn/discover-utils'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { StacktraceContent } from './sub_components/stacktrace/stacktrace_content'; + +const stacktraceAccordionTitle = i18n.translate( + 'unifiedDocViewer.docView.logsOverview.accordion.title.stacktrace', + { + defaultMessage: 'Stacktrace', + } +); + +export function LogsOverviewStacktraceSection({ + hit, + dataView, +}: { + hit: DataTableRecord; + dataView: DataView; +}) { + const accordionId = useGeneratedHtmlId({ + prefix: stacktraceAccordionTitle, + }); + + return ( + <> + +

{stacktraceAccordionTitle}

+ + } + paddingSize="m" + initialIsOpen={false} + data-test-subj="unifiedDocViewLogsOverviewStacktraceAccordion" + > + +
+ + + ); +} diff --git a/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.test.tsx b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.test.tsx new file mode 100644 index 0000000000000..543da9eaa4ea4 --- /dev/null +++ b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.test.tsx @@ -0,0 +1,233 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import React from 'react'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; +import '@kbn/code-editor-mock/jest_helper'; +import * as hooks from '../../../../hooks/use_es_doc_search'; +import { EuiLoadingSpinner } from '@elastic/eui'; +import { buildDataTableRecord } from '@kbn/discover-utils'; +import { ApmStacktrace } from './apm_stacktrace'; +import { EuiThemeProvider } from '@elastic/eui'; +import { ExceptionStacktrace, PlaintextStacktrace, Stacktrace } from '@kbn/event-stacktrace'; + +const mockDataView = { + getComputedFields: () => [], +} as never; + +describe('APM Stacktrace component', () => { + test('renders loading state', () => { + jest.spyOn(hooks, 'useEsDocSearch').mockImplementation(() => [0, null, () => {}]); + + const comp = mountWithIntl( + + ); + + const loadingSpinner = comp.find(EuiLoadingSpinner); + expect(loadingSpinner).toHaveLength(1); + }); + + test('renders error state', () => { + jest.spyOn(hooks, 'useEsDocSearch').mockImplementation(() => [3, null, () => {}]); + + const comp = mountWithIntl( + + ); + const errorComponent = comp.find('[data-test-subj="unifiedDocViewerApmStacktraceErrorMsg"]'); + expect(errorComponent).toHaveLength(1); + }); + + test('renders log stacktrace', () => { + const mockHit = getMockHit({ + id: '1', + grouping_key: '1', + log: { + message: 'Log message', + stacktrace: [ + { + exclude_from_grouping: false, + abs_path: 'test.js', + filename: 'test.js', + line: { + number: 1, + context: 'console.log(err)', + }, + function: '', + context: { + pre: ['console.log(err)'], + post: ['console.log(err)'], + }, + vars: {}, + }, + { + exclude_from_grouping: false, + library_frame: true, + abs_path: 'test.js', + filename: 'test.js', + line: { + number: 1, + }, + function: 'test', + vars: {}, + }, + ], + }, + }); + + jest.spyOn(hooks, 'useEsDocSearch').mockImplementation(() => [2, mockHit, () => {}]); + + const comp = mountWithIntl( + + + + ); + + const stacktraceComponent = comp.find(Stacktrace); + expect(stacktraceComponent).toHaveLength(1); + }); + + test('renders exception stacktrace', () => { + const mockHit = getMockHit({ + id: '1', + grouping_key: '1', + exception: [ + { + message: 'Exception stacktrace', + stacktrace: [ + { + exclude_from_grouping: false, + abs_path: 'test.js', + filename: 'test.js', + line: { + number: 1, + context: 'console.log(err)', + }, + function: '', + context: { + pre: ['console.log(err)'], + post: ['console.log(err);'], + }, + vars: {}, + }, + { + exclude_from_grouping: false, + library_frame: true, + abs_path: 'test.js', + filename: 'test.js', + line: { + number: 1, + }, + function: 'test', + vars: {}, + }, + ], + }, + { + handled: true, + module: 'module', + attributes: { + test: 'test', + }, + message: 'message', + type: 'type', + }, + ], + }); + + jest.spyOn(hooks, 'useEsDocSearch').mockImplementation(() => [2, mockHit, () => {}]); + + const comp = mountWithIntl( + + + + ); + + const stacktraceComponent = comp.find(ExceptionStacktrace); + expect(stacktraceComponent).toHaveLength(1); + }); + + test('renders plain text stacktrace', () => { + const mockHit = getMockHit({ + id: '1', + grouping_key: '1', + exception: [ + { + handled: true, + message: 'message', + type: 'type', + }, + ], + stack_trace: 'test', + }); + + jest.spyOn(hooks, 'useEsDocSearch').mockImplementation(() => [2, mockHit, () => {}]); + + const comp = mountWithIntl( + + + + ); + + const stacktraceComponent = comp.find(PlaintextStacktrace); + expect(stacktraceComponent).toHaveLength(1); + }); +}); + +function getMockHit(error: Record) { + return buildDataTableRecord({ + _index: '.ds-logs-apm.error-default-2024.12.31-000001', + _id: 'id123', + _score: 1, + _source: { + data_stream: { + type: 'logs', + dataset: 'apm.error', + namespace: 'default', + }, + '@timestamp': '2024-12-31T00:00:00.000Z', + message: 'Log stacktrace', + error, + }, + }); +} diff --git a/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.tsx b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.tsx new file mode 100644 index 0000000000000..d820012f30792 --- /dev/null +++ b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.tsx @@ -0,0 +1,78 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { EuiLoadingSpinner } from '@elastic/eui'; +import { DataTableRecord } from '@kbn/discover-utils'; +import { i18n } from '@kbn/i18n'; +import React, { useEffect, useState } from 'react'; +import { ExceptionStacktrace, PlaintextStacktrace, Stacktrace } from '@kbn/event-stacktrace'; +import type { APMError } from '@kbn/apm-types'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { ElasticRequestState } from '@kbn/unified-doc-viewer'; +import { useEsDocSearch } from '../../../../hooks'; + +export const APM_ERROR_DATASTREAM_FIELDS = { + dataStreamType: 'logs', + dataStreamDataset: 'apm.error', +}; + +export function ApmStacktrace({ hit, dataView }: { hit: DataTableRecord; dataView: DataView }) { + const [apmErrorDoc, setApmErrorDoc] = useState(); + + const [requestState, esHit] = useEsDocSearch({ + id: hit.raw._id || '', + index: hit.raw._index, + dataView, + }); + + useEffect(() => { + if (requestState === ElasticRequestState.Found && esHit) { + setApmErrorDoc(esHit?.raw._source as unknown as APMError); + } + }, [requestState, esHit]); + + if (requestState === ElasticRequestState.Loading) { + return ; + } + + if (requestState === ElasticRequestState.Error || requestState === ElasticRequestState.NotFound) { + return ( +

+ {i18n.translate('unifiedDocViewer.apmStacktrace.errorMessage', { + defaultMessage: 'Failed to load stacktrace', + })} +

+ ); + } + + const codeLanguage = apmErrorDoc?.service?.language?.name; + const exceptions = apmErrorDoc?.error?.exception || []; + const logStackframes = apmErrorDoc?.error?.log?.stacktrace; + const isPlaintextException = + !!apmErrorDoc?.error?.stack_trace && exceptions.length === 1 && !exceptions[0].stacktrace; + + if (apmErrorDoc?.error?.log?.message) { + return ; + } + + if (apmErrorDoc?.error?.exception?.length) { + return isPlaintextException ? ( + + ) : ( + + ); + } + + return null; +} diff --git a/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/stacktrace_content.tsx b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/stacktrace_content.tsx new file mode 100644 index 0000000000000..ed56adac4df95 --- /dev/null +++ b/src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/stacktrace_content.tsx @@ -0,0 +1,43 @@ +/* + * 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", the "GNU Affero General Public License v3.0 only", and the "Server Side + * Public License v 1"; you may not use this file except in compliance with, at + * your election, the "Elastic License 2.0", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { EuiCodeBlock } from '@elastic/eui'; +import { DataTableRecord, fieldConstants, getFieldValue } from '@kbn/discover-utils'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { APM_ERROR_DATASTREAM_FIELDS, ApmStacktrace } from './apm_stacktrace'; + +export function StacktraceContent({ hit, dataView }: { hit: DataTableRecord; dataView: DataView }) { + const errorStackTrace = getFieldValue(hit, fieldConstants.ERROR_STACK_TRACE) as string; + const dataStreamTypeField = getFieldValue(hit, fieldConstants.DATASTREAM_TYPE_FIELD) as string; + const dataStreamDatasetField = getFieldValue( + hit, + fieldConstants.DATASTREAM_DATASET_FIELD + ) as string; + + if ( + dataStreamTypeField === APM_ERROR_DATASTREAM_FIELDS.dataStreamType && + dataStreamDatasetField === APM_ERROR_DATASTREAM_FIELDS.dataStreamDataset + ) { + return ; + } + + if (errorStackTrace) { + return {errorStackTrace}; + } + + return ( +

+ {i18n.translate('unifiedDocViewer.stacktraceSection.errorMessage', { + defaultMessage: 'Failed to load stacktrace', + })} +

+ ); +} diff --git a/src/platform/plugins/shared/unified_doc_viewer/tsconfig.json b/src/platform/plugins/shared/unified_doc_viewer/tsconfig.json index 5ccf221a1e11d..cd6d92a846707 100644 --- a/src/platform/plugins/shared/unified_doc_viewer/tsconfig.json +++ b/src/platform/plugins/shared/unified_doc_viewer/tsconfig.json @@ -36,7 +36,10 @@ "@kbn/router-utils", "@kbn/unified-field-list", "@kbn/core-lifecycle-browser", - "@kbn/management-settings-ids" + "@kbn/management-settings-ids", + "@kbn/apm-types", + "@kbn/event-stacktrace" + ], "exclude": [ "target/**/*", diff --git a/tsconfig.base.json b/tsconfig.base.json index 06df1ec525415..2300b4e29609b 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -90,8 +90,8 @@ "@kbn/apm-synthtrace/*": ["packages/kbn-apm-synthtrace/*"], "@kbn/apm-synthtrace-client": ["packages/kbn-apm-synthtrace-client"], "@kbn/apm-synthtrace-client/*": ["packages/kbn-apm-synthtrace-client/*"], - "@kbn/apm-types": ["x-pack/solutions/observability/packages/kbn-apm-types"], - "@kbn/apm-types/*": ["x-pack/solutions/observability/packages/kbn-apm-types/*"], + "@kbn/apm-types": ["x-pack/platform/packages/shared/kbn-apm-types"], + "@kbn/apm-types/*": ["x-pack/platform/packages/shared/kbn-apm-types/*"], "@kbn/apm-utils": ["src/platform/packages/shared/kbn-apm-utils"], "@kbn/apm-utils/*": ["src/platform/packages/shared/kbn-apm-utils/*"], "@kbn/app-link-test-plugin": ["test/plugin_functional/plugins/app_link_test"], @@ -890,6 +890,8 @@ "@kbn/event-log-fixture-plugin/*": ["x-pack/test/plugin_api_integration/plugins/event_log/*"], "@kbn/event-log-plugin": ["x-pack/platform/plugins/shared/event_log"], "@kbn/event-log-plugin/*": ["x-pack/platform/plugins/shared/event_log/*"], + "@kbn/event-stacktrace": ["x-pack/platform/packages/shared/kbn-event-stacktrace"], + "@kbn/event-stacktrace/*": ["x-pack/platform/packages/shared/kbn-event-stacktrace/*"], "@kbn/expandable-flyout": ["x-pack/solutions/security/packages/expandable-flyout"], "@kbn/expandable-flyout/*": ["x-pack/solutions/security/packages/expandable-flyout/*"], "@kbn/expect": ["packages/kbn-expect"], @@ -1116,6 +1118,8 @@ "@kbn/kbn-tp-custom-visualizations-plugin/*": ["test/plugin_functional/plugins/kbn_tp_custom_visualizations/*"], "@kbn/kbn-tp-run-pipeline-plugin": ["test/interpreter_functional/plugins/kbn_tp_run_pipeline"], "@kbn/kbn-tp-run-pipeline-plugin/*": ["test/interpreter_functional/plugins/kbn_tp_run_pipeline/*"], + "@kbn/key-value-metadata-table": ["x-pack/platform/packages/shared/kbn-key-value-metadata-table"], + "@kbn/key-value-metadata-table/*": ["x-pack/platform/packages/shared/kbn-key-value-metadata-table/*"], "@kbn/kibana-cors-test-plugin": ["x-pack/test/functional_cors/plugins/kibana_cors_test"], "@kbn/kibana-cors-test-plugin/*": ["x-pack/test/functional_cors/plugins/kibana_cors_test/*"], "@kbn/kibana-manifest-schema": ["packages/kbn-kibana-manifest-schema"], diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 2f5ba408dcdd5..4807bc2f1e242 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -177,7 +177,8 @@ "solutions/observability/plugins/ux" ], "xpack.urlDrilldown": "platform/plugins/private/drilldowns/url_drilldown", - "xpack.watcher": "platform/plugins/private/watcher" + "xpack.watcher": "platform/plugins/private/watcher", + "xpack.eventStacktrace": "platform/packages/shared/kbn-event-stacktrace" }, "exclude": [ "examples" @@ -187,4 +188,4 @@ "@kbn/translations-plugin/translations/ja-JP.json", "@kbn/translations-plugin/translations/fr-FR.json" ] -} \ No newline at end of file +} diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/es_fields.ts b/x-pack/platform/packages/shared/kbn-apm-types/es_fields.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/es_fields.ts rename to x-pack/platform/packages/shared/kbn-apm-types/es_fields.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/es_schemas_raw.ts b/x-pack/platform/packages/shared/kbn-apm-types/es_schemas_raw.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/es_schemas_raw.ts rename to x-pack/platform/packages/shared/kbn-apm-types/es_schemas_raw.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/es_schemas_ui.ts b/x-pack/platform/packages/shared/kbn-apm-types/es_schemas_ui.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/es_schemas_ui.ts rename to x-pack/platform/packages/shared/kbn-apm-types/es_schemas_ui.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/index.ts b/x-pack/platform/packages/shared/kbn-apm-types/index.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/index.ts rename to x-pack/platform/packages/shared/kbn-apm-types/index.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/kibana.jsonc b/x-pack/platform/packages/shared/kbn-apm-types/kibana.jsonc similarity index 67% rename from x-pack/solutions/observability/packages/kbn-apm-types/kibana.jsonc rename to x-pack/platform/packages/shared/kbn-apm-types/kibana.jsonc index d93053a79eed2..98025b6c6f1d4 100644 --- a/x-pack/solutions/observability/packages/kbn-apm-types/kibana.jsonc +++ b/x-pack/platform/packages/shared/kbn-apm-types/kibana.jsonc @@ -4,6 +4,6 @@ "owner": [ "@elastic/obs-ux-infra_services-team" ], - "group": "observability", - "visibility": "private" -} \ No newline at end of file + "group": "platform", + "visibility": "shared" +} diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/package.json b/x-pack/platform/packages/shared/kbn-apm-types/package.json similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/package.json rename to x-pack/platform/packages/shared/kbn-apm-types/package.json diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_fields/apm.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_fields/apm.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_fields/apm.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_fields/apm.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/apm_base_doc.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/apm_base_doc.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/apm_base_doc.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/apm_base_doc.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/error_raw.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/error_raw.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/error_raw.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/error_raw.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/event_raw.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/event_raw.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/event_raw.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/event_raw.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/cloud.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/cloud.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/cloud.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/cloud.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/container.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/container.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/container.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/container.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/event_outcome.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/event_outcome.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/event_outcome.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/event_outcome.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/faas.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/faas.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/faas.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/faas.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/host.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/host.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/host.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/host.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/http.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/http.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/http.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/http.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/index.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/index.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/index.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/index.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/kubernetes.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/kubernetes.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/kubernetes.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/kubernetes.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/observer.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/observer.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/observer.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/observer.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/page.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/page.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/page.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/page.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/process.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/process.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/process.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/process.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/service.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/service.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/service.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/service.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/span_links.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/span_links.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/span_links.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/span_links.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/stackframe.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/stackframe.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/stackframe.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/stackframe.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/timestamp_us.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/timestamp_us.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/timestamp_us.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/timestamp_us.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/url.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/url.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/url.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/url.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/user.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/user.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/user.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/user.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/user_agent.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/user_agent.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/fields/user_agent.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/fields/user_agent.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/index.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/index.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/index.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/index.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/metric_raw.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/metric_raw.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/metric_raw.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/metric_raw.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/span_raw.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/span_raw.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/span_raw.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/span_raw.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/transaction_raw.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/transaction_raw.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/raw/transaction_raw.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/raw/transaction_raw.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/apm_error.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/apm_error.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/apm_error.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/apm_error.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/event.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/event.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/event.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/event.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/fields/agent.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/fields/agent.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/fields/agent.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/fields/agent.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/fields/index.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/fields/index.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/fields/index.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/fields/index.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/index.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/index.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/index.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/index.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/metric.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/metric.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/metric.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/metric.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/span.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/span.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/span.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/span.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/transaction.ts b/x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/transaction.ts similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/src/es_schemas/ui/transaction.ts rename to x-pack/platform/packages/shared/kbn-apm-types/src/es_schemas/ui/transaction.ts diff --git a/x-pack/solutions/observability/packages/kbn-apm-types/tsconfig.json b/x-pack/platform/packages/shared/kbn-apm-types/tsconfig.json similarity index 100% rename from x-pack/solutions/observability/packages/kbn-apm-types/tsconfig.json rename to x-pack/platform/packages/shared/kbn-apm-types/tsconfig.json diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/jest_setup.js b/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/jest_setup.js new file mode 100644 index 0000000000000..32071b8aa3f62 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/jest_setup.js @@ -0,0 +1,11 @@ +/* + * 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. + */ + +import { setGlobalConfig } from '@storybook/testing-react'; +import * as globalStorybookConfig from './preview'; + +setGlobalConfig(globalStorybookConfig); diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/main.js b/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/main.js new file mode 100644 index 0000000000000..86b48c32f103e --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/main.js @@ -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. + */ + +module.exports = require('@kbn/storybook').defaultConfig; diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/preview.js b/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/preview.js new file mode 100644 index 0000000000000..8095627564810 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/preview.js @@ -0,0 +1,9 @@ +/* + * 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. + */ + +import { EuiThemeProviderDecorator } from '@kbn/kibana-react-plugin/common'; +export const decorators = [EuiThemeProviderDecorator]; diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/README.md b/x-pack/platform/packages/shared/kbn-event-stacktrace/README.md new file mode 100644 index 0000000000000..232abe4483283 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/README.md @@ -0,0 +1,19 @@ +# @kbn/event-stacktrace + +This package contains components that render event (error, log, span) stack traces. + +## Unit Tests (Jest) + +``` +node scripts/jest --config x-pack/platform/packages/shared/kbn-event-stacktrace/README.md [--watch] + +``` + +## Storybook + +### Start +``` +yarn storybook event_stacktrace +``` + +All files with a .stories.tsx extension will be loaded. You can access the development environment at http://localhost:9001. \ No newline at end of file diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/index.ts b/x-pack/platform/packages/shared/kbn-event-stacktrace/index.ts new file mode 100644 index 0000000000000..73d47dac072cc --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/index.ts @@ -0,0 +1,15 @@ +/* + * 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 * from './src/components/stacktrace/cause_stacktrace'; +export * from './src/components/stacktrace/frame_heading'; +export * from './src/components/stacktrace'; +export * from './src/components/stacktrace/library_stacktrace'; +export * from './src/components/stacktrace/stackframe'; +export * from './src/components/stacktrace/variables'; +export * from './src/components/stacktrace/plain/plaintext_stacktrace'; +export * from './src/components/stacktrace/exception/exception_stacktrace'; diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/jest.config.js b/x-pack/platform/packages/shared/kbn-event-stacktrace/jest.config.js new file mode 100644 index 0000000000000..9e86a6ce91f52 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/jest.config.js @@ -0,0 +1,15 @@ +/* + * 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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../..', + roots: ['/x-pack/platform/packages/shared/kbn-event-stacktrace'], + setupFiles: [ + '/x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/jest_setup.js', + ], +}; diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/kibana.jsonc b/x-pack/platform/packages/shared/kbn-event-stacktrace/kibana.jsonc new file mode 100644 index 0000000000000..56e24859a67b2 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/kibana.jsonc @@ -0,0 +1,10 @@ +{ + "type": "shared-browser", + "id": "@kbn/event-stacktrace", + "owner": [ + "@elastic/obs-ux-infra_services-team", + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared" +} diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/package.json b/x-pack/platform/packages/shared/kbn-event-stacktrace/package.json new file mode 100644 index 0000000000000..67b5df6a34802 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/event-stacktrace", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} \ No newline at end of file diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/__fixtures__/stacktraces.json b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/__fixtures__/stacktraces.json similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/__fixtures__/stacktraces.json rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/__fixtures__/stacktraces.json diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/cause_stacktrace.test.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/cause_stacktrace.test.tsx similarity index 96% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/cause_stacktrace.test.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/cause_stacktrace.test.tsx index a0aab91d0d9b3..a4605ef54e1d8 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/cause_stacktrace.test.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/cause_stacktrace.test.tsx @@ -7,7 +7,7 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { mountWithTheme } from '../../../utils/test_helpers'; +import { mountWithTheme } from '../../utils/test_helpers'; import { CauseStacktrace } from './cause_stacktrace'; describe('CauseStacktrace', () => { diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/cause_stacktrace.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/cause_stacktrace.tsx similarity index 91% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/cause_stacktrace.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/cause_stacktrace.tsx index fdc0d1002ec66..43768884d75fb 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/cause_stacktrace.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/cause_stacktrace.tsx @@ -9,8 +9,8 @@ import { EuiAccordion, EuiTitle, useEuiFontSize } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import styled from '@emotion/styled'; +import { Stackframe } from '@kbn/apm-types'; import { Stacktrace } from '.'; -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; const Accordion = styled(EuiAccordion)` border-top: ${({ theme }) => theme.euiTheme.border.thin}; @@ -37,7 +37,7 @@ function CausedBy({ message }: { message: string }) { return ( - {i18n.translate('xpack.apm.stacktraceTab.causedByFramesToogleButtonLabel', { + {i18n.translate('xpack.eventStacktrace.stacktraceTab.causedByFramesToogleButtonLabel', { defaultMessage: 'Caused By', })} diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/context.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/context.tsx similarity index 93% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/context.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/context.tsx index f3f3861518aa4..3ef837c2d4c36 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/context.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/context.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { EuiCodeBlock } from '@elastic/eui'; -import type { StackframeWithLineContext } from '../../../../typings/es_schemas/raw/fields/stackframe'; +import type { StackframeWithLineContext } from '@kbn/apm-types'; function getStackframeLines(stackframe: StackframeWithLineContext) { const line = stackframe.line.context; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace.stories.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace.stories.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace.stories.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace.stories.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace.test.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace.test.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace.test.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace.test.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace.tsx similarity index 84% rename from x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace.tsx index 956184aa49a13..0750629502d8f 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace.tsx @@ -6,10 +6,10 @@ */ import React from 'react'; -import type { Exception } from '../../../../../typings/es_schemas/raw/error_raw'; -import { Stacktrace } from '../../../shared/stacktrace'; -import { CauseStacktrace } from '../../../shared/stacktrace/cause_stacktrace'; +import type { Exception } from '@kbn/apm-types/es_schemas_raw'; import { ExceptionStacktraceTitle } from './exception_stacktrace_title'; +import { CauseStacktrace } from '../cause_stacktrace'; +import { Stacktrace } from '..'; interface ExceptionStacktraceProps { codeLanguage?: string; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace_title.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace_title.tsx similarity index 97% rename from x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace_title.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace_title.tsx index 20f3ce932b61e..c62f1e331735e 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/exception_stacktrace_title.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception/exception_stacktrace_title.tsx @@ -40,7 +40,7 @@ export function ExceptionStacktraceTitle({ } return ( - +

{title}

); diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading.test.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading.test.tsx similarity index 98% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading.test.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading.test.tsx index 7e3cf4b7f8902..a9d16c9a07b1a 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading.test.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading.test.tsx @@ -6,8 +6,8 @@ */ import React from 'react'; -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { renderWithTheme } from '../../../utils/test_helpers'; +import { Stackframe } from '@kbn/apm-types'; +import { renderWithTheme } from '../../utils/test_helpers'; import { FrameHeading } from './frame_heading'; function getRenderedStackframeText(stackframe: Stackframe, codeLanguage: string, idx: string) { diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading.tsx similarity index 93% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading.tsx index 20c470b45bc7b..67f902dc11406 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading.tsx @@ -9,8 +9,7 @@ import type { ComponentType } from 'react'; import React from 'react'; import styled from '@emotion/styled'; import { useEuiFontSize } from '@elastic/eui'; -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import type { FrameHeadingRendererProps } from './frame_heading_renderers'; +import { Stackframe } from '@kbn/apm-types'; import { CSharpFrameHeadingRenderer, DefaultFrameHeadingRenderer, @@ -18,6 +17,7 @@ import { JavaScriptFrameHeadingRenderer, RubyFrameHeadingRenderer, PhpFrameHeadingRenderer, + FrameHeadingRendererProps, } from './frame_heading_renderers'; const FileDetails = styled.div` diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/c_sharp_frame_heading_renderer.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/c_sharp_frame_heading_renderer.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/c_sharp_frame_heading_renderer.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/c_sharp_frame_heading_renderer.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/default_frame_heading_renderer.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/default_frame_heading_renderer.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/default_frame_heading_renderer.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/default_frame_heading_renderer.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/index.ts b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/index.ts similarity index 86% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/index.ts rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/index.ts index 15965aa805878..fcd2c1778dc8b 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/index.ts +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/index.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { ComponentType } from 'react'; -import type { Stackframe } from '../../../../../typings/es_schemas/raw/fields/stackframe'; +import { ComponentType } from 'react'; +import type { Stackframe } from '@kbn/apm-types'; export interface FrameHeadingRendererProps { fileDetailComponent: ComponentType>; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/java_frame_heading_renderer.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/java_frame_heading_renderer.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/java_frame_heading_renderer.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/java_frame_heading_renderer.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/java_script_frame_heading_renderer.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/java_script_frame_heading_renderer.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/java_script_frame_heading_renderer.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/java_script_frame_heading_renderer.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/php_frame_heading_renderer.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/php_frame_heading_renderer.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/php_frame_heading_renderer.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/php_frame_heading_renderer.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/ruby_frame_heading_renderer.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/ruby_frame_heading_renderer.tsx similarity index 100% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/frame_heading_renderers/ruby_frame_heading_renderer.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/frame_heading_renderers/ruby_frame_heading_renderer.tsx diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/index.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/index.tsx similarity index 87% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/index.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/index.tsx index ca220626dc8e2..477bb9212b604 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/index.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/index.tsx @@ -8,9 +8,8 @@ import { i18n } from '@kbn/i18n'; import { isEmpty, last } from 'lodash'; import React, { Fragment } from 'react'; -import { EuiCodeBlock } from '@elastic/eui'; -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { EmptyMessage } from '../empty_message'; +import { EuiCodeBlock, EuiEmptyPrompt } from '@elastic/eui'; +import type { Stackframe } from '@kbn/apm-types'; import { LibraryStacktrace } from './library_stacktrace'; import { Stackframe as StackframeComponent } from './stackframe'; @@ -23,11 +22,15 @@ interface Props { export function Stacktrace({ stackframes = [], codeLanguage }: Props) { if (isEmpty(stackframes)) { return ( - + {i18n.translate('xpack.eventStacktrace.stacktraceTab.noStacktraceAvailableLabel', { + defaultMessage: 'No stack trace available.', + })} + + } /> ); } diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/library_stacktrace.test.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/library_stacktrace.test.tsx similarity index 94% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/library_stacktrace.test.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/library_stacktrace.test.tsx index 3ca993df33b20..7ff7b65164037 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/library_stacktrace.test.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/library_stacktrace.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { renderWithTheme } from '../../../utils/test_helpers'; +import { renderWithTheme } from '../../utils/test_helpers'; import { LibraryStacktrace } from './library_stacktrace'; describe('LibraryStacktrace', () => { diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/library_stacktrace.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/library_stacktrace.tsx similarity index 78% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/library_stacktrace.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/library_stacktrace.tsx index dd4df07467e29..a35ef863a7055 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/library_stacktrace.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/library_stacktrace.tsx @@ -9,7 +9,7 @@ import { EuiAccordion } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import styled from '@emotion/styled'; -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; +import { Stackframe } from '@kbn/apm-types'; import { Stackframe as StackframeComponent } from './stackframe'; const LibraryStacktraceAccordion = styled(EuiAccordion)` @@ -29,10 +29,13 @@ export function LibraryStacktrace({ codeLanguage, id, stackframes }: Props) { return ( diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/plaintext_stacktrace.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/plain/plaintext_stacktrace.tsx similarity index 90% rename from x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/plaintext_stacktrace.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/plain/plaintext_stacktrace.tsx index 192960904dab7..5f5552e95e4f4 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/plaintext_stacktrace.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/plain/plaintext_stacktrace.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { EuiCodeBlock } from '@elastic/eui'; -import { ExceptionStacktraceTitle } from './exception_stacktrace_title'; +import { ExceptionStacktraceTitle } from '../exception/exception_stacktrace_title'; interface PlaintextStacktraceProps { codeLanguage?: string; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stackframe.test.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stackframe.test.tsx similarity index 90% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stackframe.test.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stackframe.test.tsx index 22d66717f8c2b..f9a66c5cb675d 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stackframe.test.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stackframe.test.tsx @@ -6,10 +6,9 @@ */ import React from 'react'; -import type { ReactWrapper } from 'enzyme'; -import { shallow } from 'enzyme'; -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { mountWithTheme } from '../../../utils/test_helpers'; +import { ReactWrapper, shallow } from 'enzyme'; +import type { Stackframe } from '@kbn/apm-types'; +import { mountWithTheme } from '../../utils/test_helpers'; import { Stackframe as StackframeComponent } from './stackframe'; import stacktracesMock from './__fixtures__/stacktraces.json'; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stackframe.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stackframe.tsx similarity index 94% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stackframe.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stackframe.tsx index 11406e4499e93..fd7aa37235a31 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stackframe.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stackframe.tsx @@ -8,10 +8,7 @@ import { EuiAccordion, useEuiFontSize } from '@elastic/eui'; import React from 'react'; import styled from '@emotion/styled'; -import type { - Stackframe as StackframeType, - StackframeWithLineContext, -} from '../../../../typings/es_schemas/raw/fields/stackframe'; +import type { Stackframe as StackframeType, StackframeWithLineContext } from '@kbn/apm-types'; import { Context } from './context'; import { FrameHeading } from './frame_heading'; import { Variables } from './variables'; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stacktrace.test.ts b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stacktrace.test.ts similarity index 98% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stacktrace.test.ts rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stacktrace.test.ts index e6001bb76063c..d04c03bb6862c 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/stacktrace.test.ts +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/stacktrace.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; +import { Stackframe } from '@kbn/apm-types'; import { getGroupedStackframes } from '.'; import stacktracesMock from './__fixtures__/stacktraces.json'; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/variables.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/variables.tsx similarity index 73% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/variables.tsx rename to x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/variables.tsx index 2cd3fc1408a85..0e78e6d86f1e8 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/stacktrace/variables.tsx +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/variables.tsx @@ -8,10 +8,9 @@ import { EuiAccordion } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; +import { KeyValueTable, getFlattenedKeyValuePairs } from '@kbn/key-value-metadata-table'; +import { Stackframe } from '@kbn/apm-types'; import styled from '@emotion/styled'; -import type { Stackframe } from '../../../../typings/es_schemas/raw/fields/stackframe'; -import { KeyValueTable } from '../key_value_table'; -import { flattenObject } from '../../../../common/utils/flatten_object'; const VariablesContainer = styled.div` background: ${({ theme }) => theme.euiTheme.colors.emptyShade}; @@ -28,16 +27,19 @@ export function Variables({ vars }: Props) { if (!vars) { return null; } - const flattenedVariables = flattenObject(vars); + const flattenedVariables = getFlattenedKeyValuePairs(vars); return ( diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/src/utils/test_helpers.tsx b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/utils/test_helpers.tsx new file mode 100644 index 0000000000000..d4acbba989430 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/src/utils/test_helpers.tsx @@ -0,0 +1,27 @@ +/* + * 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. + */ + +import React from 'react'; +import { EuiThemeProvider } from '@elastic/eui'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { render } from '@testing-library/react'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { mount, MountRendererProps } from 'enzyme'; + +export function renderWithTheme(component: React.ReactNode, params?: any) { + return render({component}, params); +} + +export function mountWithTheme(tree: React.ReactElement) { + function WrappingThemeProvider(props: any) { + return {props.children}; + } + + return mount(tree, { + wrappingComponent: WrappingThemeProvider, + } as MountRendererProps); +} diff --git a/x-pack/platform/packages/shared/kbn-event-stacktrace/tsconfig.json b/x-pack/platform/packages/shared/kbn-event-stacktrace/tsconfig.json new file mode 100644 index 0000000000000..9bb8349dcadf9 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-event-stacktrace/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react", + "@testing-library/jest-dom" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx", + "src/**/*.json", + "../../../../../typings/emotion.d.ts" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/apm-types", + "@kbn/key-value-metadata-table" + ] +} diff --git a/x-pack/platform/packages/shared/kbn-key-value-metadata-table/README.md b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/README.md new file mode 100644 index 0000000000000..f7378a58cfa32 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/README.md @@ -0,0 +1,3 @@ +# @kbn/key-value-metadata-table + +Key-value metadata table \ No newline at end of file diff --git a/x-pack/platform/packages/shared/kbn-key-value-metadata-table/index.ts b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/index.ts new file mode 100644 index 0000000000000..b20e069426861 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/index.ts @@ -0,0 +1,10 @@ +/* + * 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 { KeyValueTable } from './src'; +export { getFlattenedKeyValuePairs } from './src/utils/get_flattened_key_value_pairs'; +export type { KeyValuePair } from './src/utils/get_flattened_key_value_pairs'; diff --git a/x-pack/platform/packages/shared/kbn-key-value-metadata-table/jest.config.js b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/jest.config.js new file mode 100644 index 0000000000000..3935146183c00 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/jest.config.js @@ -0,0 +1,12 @@ +/* + * 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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../../..', + roots: ['/x-pack/platform/packages/shared/kbn-key-value-metadata-table'], +}; diff --git a/x-pack/platform/packages/shared/kbn-key-value-metadata-table/kibana.jsonc b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/kibana.jsonc new file mode 100644 index 0000000000000..658191ca23cd1 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/kibana.jsonc @@ -0,0 +1,12 @@ +{ + "type": "shared-common", + "id": "@kbn/key-value-metadata-table", + "owner": [ + "@elastic/obs-ux-infra_services-team", + "@elastic/obs-ux-logs-team" + ], + "group": "platform", + "visibility": "shared" +} + + diff --git a/x-pack/platform/packages/shared/kbn-key-value-metadata-table/package.json b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/package.json new file mode 100644 index 0000000000000..2be97a92a7926 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/key-value-metadata-table", + "private": true, + "version": "1.0.0", + "license": "Elastic License 2.0" +} \ No newline at end of file diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/formatted_value.tsx b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/formatted_value.tsx similarity index 83% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/formatted_value.tsx rename to x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/formatted_value.tsx index a3baef9a802ba..734763cb53e6e 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/formatted_value.tsx +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/formatted_value.tsx @@ -8,7 +8,7 @@ import { isBoolean, isNumber, isObject } from 'lodash'; import React from 'react'; import styled from '@emotion/styled'; -import { NOT_AVAILABLE_LABEL } from '../../../../common/i18n'; +import { i18n } from '@kbn/i18n'; const EmptyValue = styled.span` color: ${({ theme }) => theme.euiTheme.colors.mediumShade}; @@ -29,7 +29,13 @@ export function FormattedValue({ value }: { value: any }): JSX.Element { } else if (isBoolean(value) || isNumber(value)) { return {String(value)}; } else if (!value) { - return {NOT_AVAILABLE_LABEL}; + return ( + + {i18n.translate('keyValueMetadataTable.notAvailableLabel', { + defaultMessage: 'N/A', + })} + + ); } return {value}; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/index.tsx b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/index.tsx similarity index 95% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/index.tsx rename to x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/index.tsx index fe127e555ee2f..1cd800962985b 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/index.tsx +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/index.tsx @@ -4,13 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import { castArray } from 'lodash'; import type { TableHTMLAttributes } from 'react'; import React from 'react'; import type { EuiTableProps } from '@elastic/eui'; import { EuiTable, EuiTableBody, EuiTableRow, EuiTableRowCell } from '@elastic/eui'; import { FormattedValue } from './formatted_value'; -import type { KeyValuePair } from '../../../../common/utils/flatten_object'; +import { KeyValuePair } from './utils/get_flattened_key_value_pairs'; export function KeyValueTable({ keyValuePairs, diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/key_value_table.test.tsx b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/key_value_table.test.tsx similarity index 93% rename from x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/key_value_table.test.tsx rename to x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/key_value_table.test.tsx index 4942f61ccb4ba..91a0ea6fdf9ea 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/key_value_table/key_value_table.test.tsx +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/key_value_table.test.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { KeyValueTable } from '.'; -import type { render } from '@testing-library/react'; -import { renderWithTheme } from '../../../utils/test_helpers'; +import { render } from '@testing-library/react'; +import { renderWithTheme } from './utils/test_helpers'; function getKeys(output: ReturnType) { const keys = output.getAllByTestId('dot-key'); diff --git a/x-pack/solutions/observability/plugins/apm/common/utils/flatten_object.test.ts b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.test.ts similarity index 77% rename from x-pack/solutions/observability/plugins/apm/common/utils/flatten_object.test.ts rename to x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.test.ts index 46d115addff49..42fba9c3a3704 100644 --- a/x-pack/solutions/observability/plugins/apm/common/utils/flatten_object.test.ts +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { flattenObject } from './flatten_object'; +import { getFlattenedKeyValuePairs } from './get_flattened_key_value_pairs'; describe('FlattenObject', () => { it('flattens multi level item', () => { @@ -22,7 +22,7 @@ describe('FlattenObject', () => { }, }; - const flatten = flattenObject(data); + const flatten = getFlattenedKeyValuePairs(data); expect(flatten).toEqual([ { key: 'bar.item3.itemA.itemAB', value: 'value AB' }, { key: 'bar.item4', value: 'value 4' }, @@ -35,8 +35,8 @@ describe('FlattenObject', () => { ]); }); it('returns an empty array if no valid object is provided', () => { - expect(flattenObject({})).toEqual([]); - expect(flattenObject(null)).toEqual([]); - expect(flattenObject(undefined)).toEqual([]); + expect(getFlattenedKeyValuePairs({})).toEqual([]); + expect(getFlattenedKeyValuePairs(null)).toEqual([]); + expect(getFlattenedKeyValuePairs(undefined)).toEqual([]); }); }); diff --git a/x-pack/solutions/observability/plugins/apm/common/utils/flatten_object.ts b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.ts similarity index 88% rename from x-pack/solutions/observability/plugins/apm/common/utils/flatten_object.ts rename to x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.ts index d8c132017843b..90d51d100b4da 100644 --- a/x-pack/solutions/observability/plugins/apm/common/utils/flatten_object.ts +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.ts @@ -6,14 +6,15 @@ */ import { compact, isObject } from 'lodash'; -import type { Maybe } from '../../typings/common'; + +type Maybe = T | null | undefined; export interface KeyValuePair { key: string; value: unknown; } -export const flattenObject = ( +export const getFlattenedKeyValuePairs = ( item: Maybe>, parentKey?: string ): KeyValuePair[] => { @@ -28,7 +29,7 @@ export const flattenObject = ( // @ts-expect-error upgrade typescript v5.1.6 if (isObject(item[key])) { // @ts-expect-error upgrade typescript v5.1.6 - return acc.concat(flattenObject(item[key], currentKey)); + return acc.concat(getFlattenedKeyValuePairs(item[key], currentKey)); } else { // @ts-expect-error upgrade typescript v5.1.6 acc.push({ key: currentKey, value: item[key] }); diff --git a/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/test_helpers.tsx b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/test_helpers.tsx new file mode 100644 index 0000000000000..006353fa86ffe --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/test_helpers.tsx @@ -0,0 +1,17 @@ +/* + * 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. + */ + +/* global jest */ + +// eslint-disable-next-line import/no-extraneous-dependencies +import { render } from '@testing-library/react'; +import React from 'react'; +import { EuiThemeProvider } from '@elastic/eui'; + +export function renderWithTheme(component: React.ReactNode, params?: any) { + return render({component}, params); +} diff --git a/x-pack/platform/packages/shared/kbn-key-value-metadata-table/tsconfig.json b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/tsconfig.json new file mode 100644 index 0000000000000..ebec9639bd977 --- /dev/null +++ b/x-pack/platform/packages/shared/kbn-key-value-metadata-table/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react", + "@testing-library/jest-dom" + ] + }, + "include": [ + "**/*.ts", "**/*.tsx", "../../../../../typings/emotion.d.ts" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + ] +} diff --git a/x-pack/platform/plugins/private/translations/translations/fr-FR.json b/x-pack/platform/plugins/private/translations/translations/fr-FR.json index 3893fdc0986fc..d5c49dad31b02 100644 --- a/x-pack/platform/plugins/private/translations/translations/fr-FR.json +++ b/x-pack/platform/plugins/private/translations/translations/fr-FR.json @@ -11785,10 +11785,6 @@ "xpack.apm.spanLinks.table.serviceName.unknown": "Inconnu", "xpack.apm.spanLinks.table.span": "Intervalle", "xpack.apm.spanLinks.table.spanDuration": "Durée d'intervalle", - "xpack.apm.stacktraceTab.causedByFramesToogleButtonLabel": "Provoqué par", - "xpack.apm.stacktraceTab.libraryFramesToogleButtonLabel": "{count, plural, one {# cadre de bibliothèque} other {# cadres de bibliothèque}}", - "xpack.apm.stacktraceTab.localVariablesToogleButtonLabel": "Variables locales", - "xpack.apm.stacktraceTab.noStacktraceAvailableLabel": "Aucune trace de pile disponible.", "xpack.apm.storageExplorer.callout.dimissButton": "Rejeter", "xpack.apm.storageExplorer.crossClusterSearchCalloutText": "Alors que l'obtention du nombre de documents fonctionne avec la recherche inter-clusters, les statistiques d'index telles que la taille sont uniquement affichées pour les données stockées dans ce cluster.", "xpack.apm.storageExplorer.crossClusterSearchCalloutTitle": "Recherche dans tous les clusters ?", diff --git a/x-pack/platform/plugins/private/translations/translations/ja-JP.json b/x-pack/platform/plugins/private/translations/translations/ja-JP.json index bf5f929868d4c..a48cd575a953f 100644 --- a/x-pack/platform/plugins/private/translations/translations/ja-JP.json +++ b/x-pack/platform/plugins/private/translations/translations/ja-JP.json @@ -11655,10 +11655,6 @@ "xpack.apm.spanLinks.table.serviceName.unknown": "不明", "xpack.apm.spanLinks.table.span": "スパン", "xpack.apm.spanLinks.table.spanDuration": "スパン期間", - "xpack.apm.stacktraceTab.causedByFramesToogleButtonLabel": "作成元", - "xpack.apm.stacktraceTab.libraryFramesToogleButtonLabel": "{count, plural, other {# ライブラリフレーム}}", - "xpack.apm.stacktraceTab.localVariablesToogleButtonLabel": "ローカル変数", - "xpack.apm.stacktraceTab.noStacktraceAvailableLabel": "利用可能なスタックトレースがありません。", "xpack.apm.storageExplorer.callout.dimissButton": "閉じる", "xpack.apm.storageExplorer.crossClusterSearchCalloutText": "ドキュメント数の取得はクラスター横断検索で動作しますが、サイズなどのインデックス統計情報は、このクラスターに保存されたデータでのみ表示されます。", "xpack.apm.storageExplorer.crossClusterSearchCalloutTitle": "クラスター全体で検索しますか?", diff --git a/x-pack/platform/plugins/private/translations/translations/zh-CN.json b/x-pack/platform/plugins/private/translations/translations/zh-CN.json index df957cdd32c69..6cc25fa849d97 100644 --- a/x-pack/platform/plugins/private/translations/translations/zh-CN.json +++ b/x-pack/platform/plugins/private/translations/translations/zh-CN.json @@ -11457,10 +11457,6 @@ "xpack.apm.spanLinks.table.serviceName.unknown": "未知", "xpack.apm.spanLinks.table.span": "跨度", "xpack.apm.spanLinks.table.spanDuration": "跨度持续时间", - "xpack.apm.stacktraceTab.causedByFramesToogleButtonLabel": "原因", - "xpack.apm.stacktraceTab.libraryFramesToogleButtonLabel": "{count, plural, other {# 个库帧}}", - "xpack.apm.stacktraceTab.localVariablesToogleButtonLabel": "本地变量", - "xpack.apm.stacktraceTab.noStacktraceAvailableLabel": "没有可用的堆栈跟踪。", "xpack.apm.storageExplorer.callout.dimissButton": "关闭", "xpack.apm.storageExplorer.crossClusterSearchCalloutText": "虽然获取文档计数适用于跨集群搜索,但只会对此集群中存储的数据显示索引统计信息(如大小)。", "xpack.apm.storageExplorer.crossClusterSearchCalloutTitle": "正在跨集群搜索?", diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/error_sample_detail.tsx b/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/error_sample_detail.tsx index 928c0ff2d8e4e..d6f63c4ff77c6 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/error_sample_detail.tsx +++ b/x-pack/solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler/error_sample_detail.tsx @@ -29,6 +29,7 @@ import { first } from 'lodash'; import React, { useEffect, useState } from 'react'; import { useHistory } from 'react-router-dom'; import useAsync from 'react-use/lib/useAsync'; +import { ExceptionStacktrace, PlaintextStacktrace, Stacktrace } from '@kbn/event-stacktrace'; import type { AT_TIMESTAMP } from '../../../../../common/es_fields/apm'; import { ERROR_GROUP_ID } from '../../../../../common/es_fields/apm'; import { TraceSearchType } from '../../../../../common/trace_explorer'; @@ -45,17 +46,14 @@ import { TransactionDetailLink } from '../../../shared/links/apm/transaction_det import { DiscoverErrorLink } from '../../../shared/links/discover_links/discover_error_link'; import { fromQuery, toQuery } from '../../../shared/links/url_helpers'; import { ErrorMetadata } from '../../../shared/metadata_table/error_metadata'; -import { Stacktrace } from '../../../shared/stacktrace'; import { Summary } from '../../../shared/summary'; import { HttpInfoSummaryItem } from '../../../shared/summary/http_info_summary_item'; import { UserAgentSummaryItem } from '../../../shared/summary/user_agent_summary_item'; import { TimestampTooltip } from '../../../shared/timestamp_tooltip'; -import { PlaintextStacktrace } from './plaintext_stacktrace'; import { TransactionTab } from '../../transaction_details/waterfall_with_summary/transaction_tabs'; import type { ErrorTab } from './error_tabs'; import { ErrorTabKey, getTabs } from './error_tabs'; import { ErrorUiActionsContextMenu } from './error_ui_actions_context_menu'; -import { ExceptionStacktrace } from './exception_stacktrace'; import { SampleSummary } from './sample_summary'; import { ErrorSampleContextualInsight } from './error_sample_contextual_insight'; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/span_flyout/index.tsx b/x-pack/solutions/observability/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/span_flyout/index.tsx index 4dbb60e13594a..3ac8939031b73 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/span_flyout/index.tsx +++ b/x-pack/solutions/observability/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/span_flyout/index.tsx @@ -25,14 +25,13 @@ import styled from '@emotion/styled'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; import { isEmpty } from 'lodash'; import React, { Fragment } from 'react'; -import { PlaintextStacktrace } from '../../../../../error_group_details/error_sampler/plaintext_stacktrace'; +import { Stacktrace, PlaintextStacktrace } from '@kbn/event-stacktrace'; import type { Span } from '../../../../../../../../typings/es_schemas/ui/span'; import type { Transaction } from '../../../../../../../../typings/es_schemas/ui/transaction'; import { useFetcher, isPending } from '../../../../../../../hooks/use_fetcher'; import { DiscoverSpanLink } from '../../../../../../shared/links/discover_links/discover_span_link'; import { SpanMetadata } from '../../../../../../shared/metadata_table/span_metadata'; import { getSpanLinksTabContent } from '../../../../../../shared/span_links/span_links_tab_content'; -import { Stacktrace } from '../../../../../../shared/stacktrace'; import { Summary } from '../../../../../../shared/summary'; import { CompositeSpanDurationSummaryItem } from '../../../../../../shared/summary/composite_span_duration_summary_item'; import { DurationSummaryItem } from '../../../../../../shared/summary/duration_summary_item'; diff --git a/x-pack/solutions/observability/plugins/apm/public/components/shared/metadata_table/section.tsx b/x-pack/solutions/observability/plugins/apm/public/components/shared/metadata_table/section.tsx index 54dbb850691e9..0b69445bec3b9 100644 --- a/x-pack/solutions/observability/plugins/apm/public/components/shared/metadata_table/section.tsx +++ b/x-pack/solutions/observability/plugins/apm/public/components/shared/metadata_table/section.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { isEmpty } from 'lodash'; import { i18n } from '@kbn/i18n'; import { EuiText } from '@elastic/eui'; -import { KeyValueTable } from '../key_value_table'; +import { KeyValueTable } from '@kbn/key-value-metadata-table'; interface Props { properties: Array<{ field: string; value: string[] | number[] }>; diff --git a/x-pack/solutions/observability/plugins/apm/server/routes/assistant_functions/get_log_categories/index.ts b/x-pack/solutions/observability/plugins/apm/server/routes/assistant_functions/get_log_categories/index.ts index 88d4f74abaf66..4c4e033be7484 100644 --- a/x-pack/solutions/observability/plugins/apm/server/routes/assistant_functions/get_log_categories/index.ts +++ b/x-pack/solutions/observability/plugins/apm/server/routes/assistant_functions/get_log_categories/index.ts @@ -9,10 +9,10 @@ import datemath from '@elastic/datemath'; import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import type { LogSourcesService } from '@kbn/logs-data-access-plugin/common/types'; import { unflattenKnownApmEventFields } from '@kbn/apm-data-access-plugin/server/utils'; +import { getFlattenedKeyValuePairs } from '@kbn/key-value-metadata-table'; +import type { KeyValuePair } from '@kbn/key-value-metadata-table'; import { maybe } from '../../../../common/utils/maybe'; import { asMutableArray } from '../../../../common/utils/as_mutable_array'; -import type { KeyValuePair } from '../../../../common/utils/flatten_object'; -import { flattenObject } from '../../../../common/utils/flatten_object'; import type { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { PROCESSOR_EVENT, TRACE_ID } from '../../../../common/es_fields/apm'; import { getTypedSearch } from '../../../utils/create_typed_es_client'; @@ -153,6 +153,6 @@ export async function getLogCategories({ return { logCategories: await Promise.all(promises ?? []), - entities: flattenObject(sampleDoc), + entities: getFlattenedKeyValuePairs(sampleDoc), }; } diff --git a/x-pack/solutions/observability/plugins/apm/tsconfig.json b/x-pack/solutions/observability/plugins/apm/tsconfig.json index be688ddd1da27..bfc1fdbdb6218 100644 --- a/x-pack/solutions/observability/plugins/apm/tsconfig.json +++ b/x-pack/solutions/observability/plugins/apm/tsconfig.json @@ -132,7 +132,9 @@ "@kbn/charts-theme", "@kbn/response-ops-rule-params", "@kbn/entityManager-plugin", - "@kbn/core-http-server-utils" + "@kbn/core-http-server-utils", + "@kbn/key-value-metadata-table", + "@kbn/event-stacktrace" ], "exclude": ["target/**/*"] } diff --git a/x-pack/solutions/observability/plugins/inventory/e2e/synthtrace.ts b/x-pack/solutions/observability/plugins/inventory/e2e/synthtrace.ts index 95f2e8fbb65c2..746a8692d5fb2 100644 --- a/x-pack/solutions/observability/plugins/inventory/e2e/synthtrace.ts +++ b/x-pack/solutions/observability/plugins/inventory/e2e/synthtrace.ts @@ -10,6 +10,7 @@ import type { EntityFields, ApmFields, InfraDocument, + LogDocument, } from '@kbn/apm-synthtrace-client'; export const entitiesSynthtrace = { @@ -31,7 +32,7 @@ export const apmSynthtrace = { }; export const logsSynthtrace = { - index: (events: SynthtraceGenerator | Array>) => + index: (events: SynthtraceGenerator | Array>) => cy.task( 'logsSynthtrace:index', Array.from(events).flatMap((event) => event.serialize()) diff --git a/yarn.lock b/yarn.lock index d5896896f294c..82c99d989e6e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4034,7 +4034,7 @@ version "0.0.0" uid "" -"@kbn/apm-types@link:x-pack/solutions/observability/packages/kbn-apm-types": +"@kbn/apm-types@link:x-pack/platform/packages/shared/kbn-apm-types": version "0.0.0" uid "" @@ -5634,6 +5634,10 @@ version "0.0.0" uid "" +"@kbn/event-stacktrace@link:x-pack/platform/packages/shared/kbn-event-stacktrace": + version "0.0.0" + uid "" + "@kbn/expandable-flyout@link:x-pack/solutions/security/packages/expandable-flyout": version "0.0.0" uid "" @@ -6086,6 +6090,10 @@ version "0.0.0" uid "" +"@kbn/key-value-metadata-table@link:x-pack/platform/packages/shared/kbn-key-value-metadata-table": + version "0.0.0" + uid "" + "@kbn/kibana-cors-test-plugin@link:x-pack/test/functional_cors/plugins/kibana_cors_test": version "0.0.0" uid ""