From 0644f0aa1ae55660a80c5b8ef777d6dd4edd5f7e Mon Sep 17 00:00:00 2001 From: Giorgos Bamparopoulos Date: Wed, 22 Jan 2025 18:06:14 +0200 Subject: [PATCH] [One Discover] Display stacktrace in the logs overview tab (#204521) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 📓 Summary Adds a new section to the overview tab in the log details flyout in Discover to display stacktrace information for logs and exceptions. In a follow-up, the stacktrace could be moved to a new tab in the log details flyout and actions can be added to the stacktrace (and quality) icons in the document table to open the relevant sections in the flyout. Closes https://github.com/elastic/kibana/issues/190460 ### APM - Log stacktrace (library frames) image ### APM - Exception (with cause) image ### APM - Exception (simple stacktrace) image ### Apache Tomcat Integration (Catalina) - Stacktrace image ## 📝 Notes for reviewers - The `@kbn/apm-types` package was marked as platform / shared as it's being used by the [unified_doc_viewer](https://github.com/elastic/kibana/blob/main/src/plugins/unified_doc_viewer/kibana.jsonc) - The code used to render stacktraces in APM was moved into a new `@kbn/event-stacktrace` package as it is reused in the `unified_doc_viewer` - The code used to render metadata table in APM was moved into a new `@kbn/key-value-metadata-table` package ## 🧪 Testing instructions The deployed environments have sample logs that can be used (time range: Jan 1, 2025 - now). For a local setup, please follow the instructions below: 1. Ingest sample logs with stacktraces ([gist](https://gist.github.com/gbamparop/0da21ca7f65b24c4a9c071ce9e9b97b0)). Please note that these are test data and some fields that are not used by stacktraces might not be consistent 2. View relevant logs in Discover (Query: `service.name: "synth-node-0" OR apache_tomcat :*`, Time range: Jan 1, 2025 - now) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 4 +- package.json | 4 +- .../src/lib/logs/index.ts | 4 +- .../src/scenarios/simple_logs.ts | 6 +- .../src/scenarios/spiked_latency.ts | 3 +- src/dev/storybook/aliases.ts | 1 + .../src/data_types/logs/types.ts | 8 +- .../kbn-discover-utils/src/field_constants.ts | 5 +- .../src/utils/get_stack_trace_fields.ts | 12 +- .../shared/unified_doc_viewer/kibana.jsonc | 2 +- .../logs_overview.tsx | 5 + .../logs_overview_stacktrace_section.tsx | 52 ++++ .../stacktrace/apm_stacktrace.test.tsx | 233 ++++++++++++++++++ .../stacktrace/apm_stacktrace.tsx | 78 ++++++ .../stacktrace/stacktrace_content.tsx | 43 ++++ .../shared/unified_doc_viewer/tsconfig.json | 5 +- tsconfig.base.json | 8 +- x-pack/.i18nrc.json | 5 +- .../shared}/kbn-apm-types/es_fields.ts | 0 .../shared}/kbn-apm-types/es_schemas_raw.ts | 0 .../shared}/kbn-apm-types/es_schemas_ui.ts | 0 .../packages/shared}/kbn-apm-types/index.ts | 0 .../shared}/kbn-apm-types/kibana.jsonc | 6 +- .../shared}/kbn-apm-types/package.json | 0 .../kbn-apm-types/src/es_fields/apm.ts | 0 .../src/es_schemas/raw/apm_base_doc.ts | 0 .../src/es_schemas/raw/error_raw.ts | 0 .../src/es_schemas/raw/event_raw.ts | 0 .../src/es_schemas/raw/fields/cloud.ts | 0 .../src/es_schemas/raw/fields/container.ts | 0 .../es_schemas/raw/fields/event_outcome.ts | 0 .../src/es_schemas/raw/fields/faas.ts | 0 .../src/es_schemas/raw/fields/host.ts | 0 .../src/es_schemas/raw/fields/http.ts | 0 .../src/es_schemas/raw/fields/index.ts | 0 .../src/es_schemas/raw/fields/kubernetes.ts | 0 .../src/es_schemas/raw/fields/observer.ts | 0 .../src/es_schemas/raw/fields/page.ts | 0 .../src/es_schemas/raw/fields/process.ts | 0 .../src/es_schemas/raw/fields/service.ts | 0 .../src/es_schemas/raw/fields/span_links.ts | 0 .../src/es_schemas/raw/fields/stackframe.ts | 0 .../src/es_schemas/raw/fields/timestamp_us.ts | 0 .../src/es_schemas/raw/fields/url.ts | 0 .../src/es_schemas/raw/fields/user.ts | 0 .../src/es_schemas/raw/fields/user_agent.ts | 0 .../kbn-apm-types/src/es_schemas/raw/index.ts | 0 .../src/es_schemas/raw/metric_raw.ts | 0 .../src/es_schemas/raw/span_raw.ts | 0 .../src/es_schemas/raw/transaction_raw.ts | 0 .../src/es_schemas/ui/apm_error.ts | 0 .../kbn-apm-types/src/es_schemas/ui/event.ts | 0 .../src/es_schemas/ui/fields/agent.ts | 0 .../src/es_schemas/ui/fields/index.ts | 0 .../kbn-apm-types/src/es_schemas/ui/index.ts | 0 .../kbn-apm-types/src/es_schemas/ui/metric.ts | 0 .../kbn-apm-types/src/es_schemas/ui/span.ts | 0 .../src/es_schemas/ui/transaction.ts | 0 .../shared}/kbn-apm-types/tsconfig.json | 0 .../.storybook/jest_setup.js | 11 + .../kbn-event-stacktrace/.storybook/main.js | 8 + .../.storybook/preview.js | 9 + .../shared/kbn-event-stacktrace/README.md | 19 ++ .../shared/kbn-event-stacktrace/index.ts | 15 ++ .../kbn-event-stacktrace/jest.config.js | 15 ++ .../shared/kbn-event-stacktrace/kibana.jsonc | 10 + .../shared/kbn-event-stacktrace/package.json | 6 + .../stacktrace/__fixtures__/stacktraces.json | 0 .../stacktrace/cause_stacktrace.test.tsx | 2 +- .../stacktrace/cause_stacktrace.tsx | 4 +- .../src/components}/stacktrace/context.tsx | 2 +- .../exception_stacktrace.stories.tsx | 0 .../exception}/exception_stacktrace.test.tsx | 0 .../exception}/exception_stacktrace.tsx | 6 +- .../exception}/exception_stacktrace_title.tsx | 2 +- .../stacktrace/frame_heading.test.tsx | 4 +- .../components}/stacktrace/frame_heading.tsx | 4 +- .../c_sharp_frame_heading_renderer.tsx | 0 .../default_frame_heading_renderer.tsx | 0 .../frame_heading_renderers/index.ts | 4 +- .../java_frame_heading_renderer.tsx | 0 .../java_script_frame_heading_renderer.tsx | 0 .../php_frame_heading_renderer.tsx | 0 .../ruby_frame_heading_renderer.tsx | 0 .../src/components}/stacktrace/index.tsx | 19 +- .../stacktrace/library_stacktrace.test.tsx | 2 +- .../stacktrace/library_stacktrace.tsx | 13 +- .../plain}/plaintext_stacktrace.tsx | 2 +- .../stacktrace/stackframe.test.tsx | 7 +- .../src/components}/stacktrace/stackframe.tsx | 5 +- .../components}/stacktrace/stacktrace.test.ts | 2 +- .../src/components}/stacktrace/variables.tsx | 16 +- .../src/utils/test_helpers.tsx | 27 ++ .../shared/kbn-event-stacktrace/tsconfig.json | 26 ++ .../kbn-key-value-metadata-table/README.md | 3 + .../kbn-key-value-metadata-table/index.ts | 10 + .../jest.config.js | 12 + .../kbn-key-value-metadata-table/kibana.jsonc | 12 + .../kbn-key-value-metadata-table/package.json | 6 + .../src}/formatted_value.tsx | 10 +- .../src}/index.tsx | 3 +- .../src}/key_value_table.test.tsx | 4 +- .../get_flattened_key_value_pairs.test.ts} | 10 +- .../utils/get_flattened_key_value_pairs.ts} | 7 +- .../src/utils/test_helpers.tsx | 17 ++ .../tsconfig.json | 21 ++ .../translations/translations/fr-FR.json | 4 - .../translations/translations/ja-JP.json | 4 - .../translations/translations/zh-CN.json | 4 - .../error_sampler/error_sample_detail.tsx | 4 +- .../waterfall/span_flyout/index.tsx | 3 +- .../shared/metadata_table/section.tsx | 2 +- .../get_log_categories/index.ts | 6 +- .../observability/plugins/apm/tsconfig.json | 4 +- .../plugins/inventory/e2e/synthtrace.ts | 3 +- yarn.lock | 10 +- 116 files changed, 772 insertions(+), 111 deletions(-) create mode 100644 src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/logs_overview_stacktrace_section.tsx create mode 100644 src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.test.tsx create mode 100644 src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/apm_stacktrace.tsx create mode 100644 src/platform/plugins/shared/unified_doc_viewer/public/components/doc_viewer_logs_overview/sub_components/stacktrace/stacktrace_content.tsx rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/es_fields.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/es_schemas_raw.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/es_schemas_ui.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/index.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/kibana.jsonc (67%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/package.json (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_fields/apm.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/apm_base_doc.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/error_raw.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/event_raw.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/cloud.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/container.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/event_outcome.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/faas.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/host.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/http.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/index.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/kubernetes.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/observer.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/page.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/process.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/service.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/span_links.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/stackframe.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/timestamp_us.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/url.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/user.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/fields/user_agent.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/index.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/metric_raw.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/span_raw.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/raw/transaction_raw.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/apm_error.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/event.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/fields/agent.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/fields/index.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/index.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/metric.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/span.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/src/es_schemas/ui/transaction.ts (100%) rename x-pack/{solutions/observability/packages => platform/packages/shared}/kbn-apm-types/tsconfig.json (100%) create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/jest_setup.js create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/main.js create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/.storybook/preview.js create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/README.md create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/index.ts create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/jest.config.js create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/kibana.jsonc create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/package.json rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/__fixtures__/stacktraces.json (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/cause_stacktrace.test.tsx (96%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/cause_stacktrace.tsx (91%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/context.tsx (93%) rename x-pack/{solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler => platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception}/exception_stacktrace.stories.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler => platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception}/exception_stacktrace.test.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler => platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception}/exception_stacktrace.tsx (84%) rename x-pack/{solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler => platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/exception}/exception_stacktrace_title.tsx (97%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading.test.tsx (98%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading.tsx (93%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading_renderers/c_sharp_frame_heading_renderer.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading_renderers/default_frame_heading_renderer.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading_renderers/index.ts (86%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading_renderers/java_frame_heading_renderer.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading_renderers/java_script_frame_heading_renderer.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading_renderers/php_frame_heading_renderer.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/frame_heading_renderers/ruby_frame_heading_renderer.tsx (100%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/index.tsx (87%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/library_stacktrace.test.tsx (94%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/library_stacktrace.tsx (78%) rename x-pack/{solutions/observability/plugins/apm/public/components/app/error_group_details/error_sampler => platform/packages/shared/kbn-event-stacktrace/src/components/stacktrace/plain}/plaintext_stacktrace.tsx (90%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/stackframe.test.tsx (90%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/stackframe.tsx (94%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/stacktrace.test.ts (98%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared => platform/packages/shared/kbn-event-stacktrace/src/components}/stacktrace/variables.tsx (73%) create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/src/utils/test_helpers.tsx create mode 100644 x-pack/platform/packages/shared/kbn-event-stacktrace/tsconfig.json create mode 100644 x-pack/platform/packages/shared/kbn-key-value-metadata-table/README.md create mode 100644 x-pack/platform/packages/shared/kbn-key-value-metadata-table/index.ts create mode 100644 x-pack/platform/packages/shared/kbn-key-value-metadata-table/jest.config.js create mode 100644 x-pack/platform/packages/shared/kbn-key-value-metadata-table/kibana.jsonc create mode 100644 x-pack/platform/packages/shared/kbn-key-value-metadata-table/package.json rename x-pack/{solutions/observability/plugins/apm/public/components/shared/key_value_table => platform/packages/shared/kbn-key-value-metadata-table/src}/formatted_value.tsx (83%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared/key_value_table => platform/packages/shared/kbn-key-value-metadata-table/src}/index.tsx (95%) rename x-pack/{solutions/observability/plugins/apm/public/components/shared/key_value_table => platform/packages/shared/kbn-key-value-metadata-table/src}/key_value_table.test.tsx (93%) rename x-pack/{solutions/observability/plugins/apm/common/utils/flatten_object.test.ts => platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.test.ts} (77%) rename x-pack/{solutions/observability/plugins/apm/common/utils/flatten_object.ts => platform/packages/shared/kbn-key-value-metadata-table/src/utils/get_flattened_key_value_pairs.ts} (88%) create mode 100644 x-pack/platform/packages/shared/kbn-key-value-metadata-table/src/utils/test_helpers.tsx create mode 100644 x-pack/platform/packages/shared/kbn-key-value-metadata-table/tsconfig.json 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 ""