├── .cypress ├── .eslintrc.js ├── CYPRESS_TESTS.md ├── integration │ ├── VisualizationCharts │ │ ├── 10_horizontalBar_chart.spec.js │ │ ├── 11_timeSeries_chart.spec.js │ │ ├── 12_pie_chart.spec.js │ │ ├── 13_heatMap_chart.spec.js │ │ └── 9_verticalBar_chart.spec.js │ ├── app_analytics_test │ │ └── app_analytics.spec.js │ ├── event_analytics_test │ │ └── event_analytics.spec.js │ ├── flint_datasources │ │ ├── acceleration_table.spec.js │ │ └── associated_object_table.spec.js │ ├── integrations_test │ │ └── integrations.spec.js │ ├── metrics_analytics_test │ │ └── metrics_analytics.spec.js │ ├── notebooks_test │ │ └── notebooks.spec.js │ ├── panels_test │ │ └── panels.spec.ts │ └── trace_analytics_test │ │ ├── trace_analytics_dashboard.spec.js │ │ ├── trace_analytics_services.spec.js │ │ └── trace_analytics_traces.spec.js ├── plugins │ └── index.js ├── support │ ├── commands.js │ ├── constants.js │ └── index.js ├── tsconfig.json └── utils │ ├── app_constants.js │ ├── constants.js │ ├── event_analytics │ ├── constants.js │ └── helpers.js │ ├── flint-datasources │ ├── accelerations-cache.json │ ├── catalog-cache.json │ └── panel_constants.js │ ├── jaeger-service-2023-01-24-mappings.json │ ├── jaeger-service-2023-01-24.json │ ├── jaeger-span-2023-01-24-mappings.json │ ├── jaeger-span-2023-01-24.json │ ├── metrics_constants.js │ ├── otel-v1-apm-service-map-mappings.json │ ├── otel-v1-apm-service-map.json │ ├── otel-v1-apm-span-000001-mappings.json │ ├── otel-v1-apm-span-000001.json │ ├── otel-v1-apm-span-000002.json │ └── panel_constants.js ├── .env ├── .eslintignore ├── .eslintrc.js ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ ├── feature_request.md │ └── integration_request.md ├── PULL_REQUEST_TEMPLATE.md ├── draft-release-notes-config.yml └── workflows │ ├── add-untriaged.yml │ ├── backport.yml │ ├── dashboards-observability-test-and-build-workflow.yml │ ├── delete_backport_branch.yml │ ├── draft-release-notes-workflow.yml │ ├── enforce-labels.yml │ ├── ftr-e2e-dashboards-observability-test.yml │ ├── integration-tests-workflow.yml │ ├── link-checker.yml │ ├── lint.yml │ ├── stalled.yml │ └── verify-binary-install.yml ├── .gitignore ├── .husky ├── .gitignore ├── hooks │ └── check-test-only.sh └── pre-commit ├── .lycheeignore ├── .whitesource ├── ADMINS.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DEVELOPER_GUIDE.md ├── Dockerfile ├── LICENSE ├── MAINTAINERS.md ├── NOTICE ├── README.md ├── RELEASING.md ├── SECURITY.md ├── Using-Docker.md ├── babel.config.js ├── codecov.yml ├── common ├── constants │ ├── application_analytics.ts │ ├── autocomplete.ts │ ├── colors.ts │ ├── custom_panels.ts │ ├── data_connections.ts │ ├── data_sources.ts │ ├── data_table.ts │ ├── explorer.ts │ ├── getting_started_routes.ts │ ├── integrations.ts │ ├── metrics.ts │ ├── notebooks.ts │ ├── overview.ts │ ├── query_assist.ts │ ├── shared.ts │ └── trace_analytics.ts ├── query_manager │ ├── antlr │ │ ├── adaptors │ │ │ └── case_insensitive_char_stream.ts │ │ ├── grammar │ │ │ ├── OpenSearchPPLLexer.g4 │ │ │ └── OpenSearchPPLParser.g4 │ │ ├── output │ │ │ ├── OpenSearchPPLLexer.interp │ │ │ ├── OpenSearchPPLLexer.tokens │ │ │ ├── OpenSearchPPLLexer.ts │ │ │ ├── OpenSearchPPLParser.interp │ │ │ ├── OpenSearchPPLParser.tokens │ │ │ ├── OpenSearchPPLParser.ts │ │ │ ├── OpenSearchPPLParserListener.ts │ │ │ └── OpenSearchPPLParserVisitor.ts │ │ └── ppl_syntax_parser.ts │ ├── ast │ │ ├── builder │ │ │ ├── query_builder.ts │ │ │ ├── stats_ast_builder.ts │ │ │ └── stats_builder.ts │ │ ├── expression │ │ │ ├── AggregateFunction.ts │ │ │ ├── AggregateTerm.ts │ │ │ ├── field.ts │ │ │ ├── group_by.ts │ │ │ ├── index.ts │ │ │ ├── span.ts │ │ │ └── spanExpression.ts │ │ ├── index.ts │ │ ├── node.ts │ │ ├── tree │ │ │ └── aggragations.ts │ │ └── types │ │ │ ├── index.ts │ │ │ └── stats.ts │ ├── index.ts │ ├── ppl_query_manager.ts │ ├── query_builder │ │ ├── index.ts │ │ └── ppl_query_builder.ts │ ├── query_parser │ │ ├── index.ts │ │ └── ppl_query_parser.ts │ └── utils │ │ └── index.ts ├── types │ ├── application_analytics.ts │ ├── custom_panels.ts │ ├── data_connections.ts │ ├── explorer.ts │ ├── metrics.ts │ ├── notebooks.ts │ ├── observability_saved_object_attributes.ts │ ├── overview.ts │ └── trace_analytics.ts └── utils │ ├── __tests__ │ └── visualization_helpers.test.tsx │ ├── core_services.ts │ ├── index.ts │ ├── query_session_utils.ts │ ├── set_nav_bread_crumbs.ts │ ├── shared.ts │ └── visualization_helpers.ts ├── cypress.config.js ├── docker-compose.yml ├── docs └── integrations │ ├── README.md │ ├── config.md │ ├── doc_assets │ ├── dashboard_export.png │ ├── dashboard_import.png │ ├── index_pattern_creation.png │ ├── index_pattern_time_field.png │ ├── visualization_configuration.png │ ├── visualization_index_pattern_selection.png │ └── visualization_type_selection.png │ └── setup.md ├── opensearch-dashboards-plugin-helpers.dev.json ├── opensearch_dashboards.json ├── package.json ├── public ├── components │ ├── app.tsx │ ├── application_analytics │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ ├── create.test.tsx.snap │ │ │ │ ├── flyout.test.tsx.snap │ │ │ │ ├── log_config.test.tsx.snap │ │ │ │ ├── service_config.test.tsx.snap │ │ │ │ ├── trace_config.test.tsx.snap │ │ │ │ └── utils.test.tsx.snap │ │ │ ├── create.test.tsx │ │ │ ├── flyout.test.tsx │ │ │ ├── log_config.test.tsx │ │ │ ├── service_config.test.tsx │ │ │ ├── trace_config.test.tsx │ │ │ └── utils.test.tsx │ │ ├── app_analytics.scss │ │ ├── components │ │ │ ├── app_table.tsx │ │ │ ├── application.tsx │ │ │ ├── config_components │ │ │ │ ├── log_config.tsx │ │ │ │ ├── service_config.tsx │ │ │ │ └── trace_config.tsx │ │ │ ├── configuration.tsx │ │ │ ├── create.tsx │ │ │ └── flyout_components │ │ │ │ ├── availability_info_flyout.tsx │ │ │ │ ├── service_detail_flyout.tsx │ │ │ │ ├── trace_detail_flyout.tsx │ │ │ │ └── trace_detail_render.tsx │ │ ├── helpers │ │ │ ├── modal_containers.tsx │ │ │ └── utils.tsx │ │ └── home.tsx │ ├── common │ │ ├── debounced_component │ │ │ ├── debounced_component.tsx │ │ │ └── index.ts │ │ ├── field_button │ │ │ ├── field_button.scss │ │ │ ├── field_button.tsx │ │ │ └── index.ts │ │ ├── field_icon │ │ │ ├── field_icon.tsx │ │ │ └── index.ts │ │ ├── field_name │ │ │ ├── field_name.tsx │ │ │ └── field_type_name.ts │ │ ├── flyout_containers │ │ │ ├── flyout_containers.tsx │ │ │ └── index.ts │ │ ├── helpers │ │ │ ├── add_sample_modal.tsx │ │ │ ├── delete_modal.tsx │ │ │ ├── format_number_with_commas.ts │ │ │ ├── index.ts │ │ │ ├── ppl_docs │ │ │ │ ├── commands │ │ │ │ │ ├── dedup.ts │ │ │ │ │ ├── eval.ts │ │ │ │ │ ├── fields.ts │ │ │ │ │ ├── head.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── parse.ts │ │ │ │ │ ├── rare.ts │ │ │ │ │ ├── rename.ts │ │ │ │ │ ├── search.ts │ │ │ │ │ ├── sort.ts │ │ │ │ │ ├── stats.ts │ │ │ │ │ ├── syntax.ts │ │ │ │ │ ├── top.ts │ │ │ │ │ └── where.ts │ │ │ │ ├── functions │ │ │ │ │ ├── condition.ts │ │ │ │ │ ├── datetime.ts │ │ │ │ │ ├── full_text_search.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── math.ts │ │ │ │ │ └── string.ts │ │ │ │ ├── groups.tsx │ │ │ │ ├── language_structure │ │ │ │ │ ├── datatypes.ts │ │ │ │ │ ├── identifiers.ts │ │ │ │ │ └── index.ts │ │ │ │ └── overview.tsx │ │ │ └── ppl_reference_flyout.tsx │ │ ├── live_tail │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── live_tail_button.test.tsx.snap │ │ │ │ └── live_tail_button.test.tsx │ │ │ └── live_tail_button.tsx │ │ ├── metrics_listener.tsx │ │ ├── query_utils │ │ │ ├── __tests__ │ │ │ │ └── query_utils.test.tsx │ │ │ └── index.ts │ │ ├── search │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── search.test.tsx.snap │ │ │ │ └── search.test.tsx │ │ │ ├── autocomplete.test.tsx │ │ │ ├── autocomplete.tsx │ │ │ ├── autocomplete_logic.ts │ │ │ ├── date_picker.tsx │ │ │ ├── direct_search.tsx │ │ │ ├── queries │ │ │ │ └── data_queries.ts │ │ │ ├── query_area.scss │ │ │ ├── query_area.tsx │ │ │ ├── query_assist_summarization.tsx │ │ │ ├── request_handler.tsx │ │ │ ├── search.scss │ │ │ ├── search.test.tsx │ │ │ ├── search.tsx │ │ │ └── searchindex.tsx │ │ ├── toast │ │ │ └── index.tsx │ │ └── types.ts │ ├── custom_panels │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ ├── custom_panel_table.test.tsx.snap │ │ │ │ ├── custom_panel_view.test.tsx.snap │ │ │ │ └── custom_panel_view_so.test.tsx.snap │ │ │ ├── custom_panel_table.test.tsx │ │ │ ├── custom_panel_view.test.tsx │ │ │ └── custom_panel_view_so.test.tsx │ │ ├── custom_panel_table.tsx │ │ ├── custom_panel_view.tsx │ │ ├── custom_panel_view_so.tsx │ │ ├── helpers │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── custom_input_model.test.tsx.snap │ │ │ │ │ ├── modal_container.test.tsx.snap │ │ │ │ │ └── utils.test.tsx.snap │ │ │ │ ├── add_visualization_helper.test.ts │ │ │ │ ├── custom_input_model.test.tsx │ │ │ │ ├── modal_container.test.tsx │ │ │ │ └── utils.test.tsx │ │ │ ├── add_visualization_helper.ts │ │ │ ├── add_visualization_popover.tsx │ │ │ ├── custom_input_modal.tsx │ │ │ ├── modal_containers.tsx │ │ │ ├── panel_state_reducer.ts │ │ │ └── utils.tsx │ │ ├── home.tsx │ │ ├── panel_modules │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── empty_panel.test.tsx.snap │ │ │ │ └── empty_panel.test.tsx │ │ │ ├── empty_panel.tsx │ │ │ ├── panel_grid │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── panel_grid.test.tsx.snap │ │ │ │ │ └── panel_grid.test.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── panel_grid.scss │ │ │ │ ├── panel_grid.tsx │ │ │ │ └── panel_grid_so.tsx │ │ │ ├── visualization_container │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── visualization_container.test.tsx.snap │ │ │ │ │ └── visualization_container.test.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── visualization_container.scss │ │ │ │ └── visualization_container.tsx │ │ │ └── visualization_flyout │ │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── visualization_flyout.test.tsx.snap │ │ │ │ │ └── visualization_flyout_so.test.tsx.snap │ │ │ │ ├── visualization_flyout.test.tsx │ │ │ │ └── visualization_flyout_so.test.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── visualization_flyout.scss │ │ │ │ ├── visualization_flyout.tsx │ │ │ │ └── visualization_flyout_so.tsx │ │ └── redux │ │ │ └── panel_slice.ts │ ├── datasources │ │ ├── components │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── associated_objects_tab.test.tsx.snap │ │ │ │ │ ├── connection_details.test.tsx.snap │ │ │ │ │ ├── data_connection.test.tsx.snap │ │ │ │ │ ├── inactive_data_connection.test.tsx.snap │ │ │ │ │ ├── installed_integrations_table.test.tsx.snap │ │ │ │ │ ├── manage_data_connections_description.test.tsx.snap │ │ │ │ │ ├── manage_data_connections_table.test.tsx.snap │ │ │ │ │ └── no_access.test.tsx.snap │ │ │ │ ├── acceleration_action_overlay.test.tsx │ │ │ │ ├── acceleration_details_flyout.test.tsx │ │ │ │ ├── acceleration_operation.test.tsx │ │ │ │ ├── acceleration_table.test.tsx │ │ │ │ ├── associated_objects_flyout.test.tsx │ │ │ │ ├── associated_objects_tab.test.tsx │ │ │ │ ├── connection_details.test.tsx │ │ │ │ ├── data_connection.test.tsx │ │ │ │ ├── inactive_data_connection.test.tsx │ │ │ │ ├── installed_integrations_table.test.tsx │ │ │ │ ├── manage_data_connections_description.test.tsx │ │ │ │ ├── manage_data_connections_table.test.tsx │ │ │ │ ├── no_access.test.tsx │ │ │ │ └── testing_constants.ts │ │ │ ├── data_connections_header.tsx │ │ │ ├── manage │ │ │ │ ├── accelerations │ │ │ │ │ ├── acceleration_action_overlay.tsx │ │ │ │ │ ├── acceleration_details_flyout.tsx │ │ │ │ │ ├── acceleration_operation.tsx │ │ │ │ │ ├── acceleration_table.tsx │ │ │ │ │ ├── create_accelerations_flyout │ │ │ │ │ │ ├── create │ │ │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ │ │ ├── create_acceleration.test.tsx.snap │ │ │ │ │ │ │ │ │ ├── create_acceleration_button.test.tsx.snap │ │ │ │ │ │ │ │ │ └── create_acceleration_header.test.tsx.snap │ │ │ │ │ │ │ │ ├── create_acceleration.test.tsx │ │ │ │ │ │ │ │ ├── create_acceleration_button.test.tsx │ │ │ │ │ │ │ │ ├── create_acceleration_header.test.tsx │ │ │ │ │ │ │ │ └── utils.test.tsx │ │ │ │ │ │ │ ├── create_acceleration.tsx │ │ │ │ │ │ │ ├── create_acceleration_button.tsx │ │ │ │ │ │ │ ├── create_acceleration_header.tsx │ │ │ │ │ │ │ └── utils.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ ├── selectors │ │ │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ │ │ ├── define_index_options.test.tsx.snap │ │ │ │ │ │ │ │ │ ├── index_advanced_settings.test.tsx.snap │ │ │ │ │ │ │ │ │ ├── index_setting_options.test.tsx.snap │ │ │ │ │ │ │ │ │ ├── index_type_selector.test.tsx.snap │ │ │ │ │ │ │ │ │ ├── preview_sql_defintion.test.tsx.snap │ │ │ │ │ │ │ │ │ └── source_selector.test.tsx.snap │ │ │ │ │ │ │ │ ├── define_index_options.test.tsx │ │ │ │ │ │ │ │ ├── index_advanced_settings.test.tsx │ │ │ │ │ │ │ │ ├── index_setting_options.test.tsx │ │ │ │ │ │ │ │ ├── index_type_selector.test.tsx │ │ │ │ │ │ │ │ ├── preview_sql_defintion.test.tsx │ │ │ │ │ │ │ │ └── source_selector.test.tsx │ │ │ │ │ │ │ ├── define_index_options.tsx │ │ │ │ │ │ │ ├── index_advanced_settings.tsx │ │ │ │ │ │ │ ├── index_setting_options.tsx │ │ │ │ │ │ │ ├── index_type_selector.tsx │ │ │ │ │ │ │ ├── preview_sql_defintion.tsx │ │ │ │ │ │ │ ├── selector_helpers │ │ │ │ │ │ │ │ ├── load_databases.tsx │ │ │ │ │ │ │ │ └── load_objects.tsx │ │ │ │ │ │ │ └── source_selector.tsx │ │ │ │ │ │ └── visual_editors │ │ │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ │ └── query_visual_editor.test.tsx.snap │ │ │ │ │ │ │ ├── query_builder.test.tsx │ │ │ │ │ │ │ └── query_visual_editor.test.tsx │ │ │ │ │ │ │ ├── covering_index │ │ │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ │ │ └── covering_index_builder.test.tsx.snap │ │ │ │ │ │ │ │ └── covering_index_builder.test.tsx │ │ │ │ │ │ │ └── covering_index_builder.tsx │ │ │ │ │ │ │ ├── materialized_view │ │ │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ │ │ ├── add_column_popover.test.tsx.snap │ │ │ │ │ │ │ │ │ ├── column_expression.test.tsx.snap │ │ │ │ │ │ │ │ │ ├── group_by_tumble_expression.test.tsx.snap │ │ │ │ │ │ │ │ │ └── materialized_view_builder.test.tsx.snap │ │ │ │ │ │ │ │ ├── add_column_popover.test.tsx │ │ │ │ │ │ │ │ ├── column_expression.test.tsx │ │ │ │ │ │ │ │ ├── group_by_tumble_expression.test.tsx │ │ │ │ │ │ │ │ └── materialized_view_builder.test.tsx │ │ │ │ │ │ │ ├── add_column_popover.tsx │ │ │ │ │ │ │ ├── column_expression.tsx │ │ │ │ │ │ │ ├── group_by_tumble_expression.tsx │ │ │ │ │ │ │ └── materialized_view_builder.tsx │ │ │ │ │ │ │ ├── query_builder.tsx │ │ │ │ │ │ │ ├── query_visual_editor.tsx │ │ │ │ │ │ │ └── skipping_index │ │ │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ │ ├── add_fields_modal.test.tsx.snap │ │ │ │ │ │ │ │ ├── delete_fields_modal.test.tsx.snap │ │ │ │ │ │ │ │ ├── generate_fields.test.tsx.snap │ │ │ │ │ │ │ │ └── skipping_index_builder.test.tsx.snap │ │ │ │ │ │ │ ├── add_fields_modal.test.tsx │ │ │ │ │ │ │ ├── delete_fields_modal.test.tsx │ │ │ │ │ │ │ ├── generate_fields.test.tsx │ │ │ │ │ │ │ └── skipping_index_builder.test.tsx │ │ │ │ │ │ │ ├── add_fields_modal.tsx │ │ │ │ │ │ │ ├── delete_fields_modal.tsx │ │ │ │ │ │ │ ├── generate_fields.tsx │ │ │ │ │ │ │ └── skipping_index_builder.tsx │ │ │ │ │ ├── flyout_modules │ │ │ │ │ │ ├── acceleration_details_tab.tsx │ │ │ │ │ │ └── accelerations_schema_tab.tsx │ │ │ │ │ └── utils │ │ │ │ │ │ └── acceleration_utils.tsx │ │ │ │ ├── access_control_tab.tsx │ │ │ │ ├── associated_objects │ │ │ │ │ ├── accelerations_recommendation_callout.tsx │ │ │ │ │ ├── associated_objects_details_flyout.tsx │ │ │ │ │ ├── associated_objects_tab.tsx │ │ │ │ │ ├── modules │ │ │ │ │ │ └── associated_objects_table.tsx │ │ │ │ │ └── utils │ │ │ │ │ │ ├── associated_objects_refresh_button.tsx │ │ │ │ │ │ ├── associated_objects_tab_empty.tsx │ │ │ │ │ │ ├── associated_objects_tab_failure.tsx │ │ │ │ │ │ ├── associated_objects_tab_loading.tsx │ │ │ │ │ │ └── associated_objects_tab_utils.tsx │ │ │ │ ├── connection_details.tsx │ │ │ │ ├── connection_management_callout.tsx │ │ │ │ ├── data_connection.tsx │ │ │ │ ├── inactive_data_connection.tsx │ │ │ │ ├── integrations │ │ │ │ │ └── installed_integrations_table.tsx │ │ │ │ ├── manage_data_connections_description.tsx │ │ │ │ └── manage_data_connections_table.tsx │ │ │ ├── new │ │ │ │ ├── auth_details.tsx │ │ │ │ ├── configure_datasource.tsx │ │ │ │ ├── configure_prometheus_datasource.tsx │ │ │ │ ├── configure_s3_datasource.tsx │ │ │ │ ├── name_row.tsx │ │ │ │ ├── new_datasource.tsx │ │ │ │ ├── new_datasource_card_view.tsx │ │ │ │ ├── new_datasource_description.tsx │ │ │ │ ├── query_permissions.tsx │ │ │ │ ├── review_prometheus_datasource_configuration.tsx │ │ │ │ └── review_s3_datasource_configuration.tsx │ │ │ ├── no_access.tsx │ │ │ └── save_or_cancel.tsx │ │ ├── home.tsx │ │ └── icons │ │ │ ├── prometheus-logo.svg │ │ │ ├── query-assistant-logo.svg │ │ │ └── s3-logo.svg │ ├── event_analytics │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ └── no_results.test.tsx.snap │ │ │ └── no_results.test.tsx │ │ ├── explorer │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── data_grid.test.tsx.snap │ │ │ │ └── data_grid.test.tsx │ │ │ ├── datasources │ │ │ │ └── datasources_selection.tsx │ │ │ ├── direct_query_running.tsx │ │ │ ├── events_views │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ ├── doc_viewer.test.tsx.snap │ │ │ │ │ │ └── flyout_button.test.tsx.snap │ │ │ │ │ ├── doc_viewer.test.tsx │ │ │ │ │ └── flyout_button.test.tsx │ │ │ │ ├── data_grid.scss │ │ │ │ ├── data_grid.tsx │ │ │ │ ├── detail_table │ │ │ │ │ ├── doc_detail_table.tsx │ │ │ │ │ ├── doc_detail_title.tsx │ │ │ │ │ ├── table_row.tsx │ │ │ │ │ ├── table_row_btn_collapse.tsx │ │ │ │ │ ├── table_row_icon_no_mapping.tsx │ │ │ │ │ └── table_row_icon_underscore.tsx │ │ │ │ ├── docView.scss │ │ │ │ ├── docViewRow.tsx │ │ │ │ ├── docViewer.tsx │ │ │ │ ├── doc_flyout.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── json_code_block │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── json_code_block.test.tsx.snap │ │ │ │ │ │ └── json_code_block.test.tsx │ │ │ │ │ └── json_code_block.tsx │ │ │ │ ├── surrounding_flyout.tsx │ │ │ │ └── trace_block │ │ │ │ │ └── trace_block.tsx │ │ │ ├── explorer.scss │ │ │ ├── explorer.tsx │ │ │ ├── log_explorer.scss │ │ │ ├── log_explorer.tsx │ │ │ ├── log_patterns │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ ├── patterns_header.test.tsx.snap │ │ │ │ │ │ └── patterns_table.test.tsx.snap │ │ │ │ │ ├── patterns_header.test.tsx │ │ │ │ │ └── patterns_table.test.tsx │ │ │ │ ├── log_patterns.tsx │ │ │ │ ├── patterns_header.tsx │ │ │ │ └── patterns_table.tsx │ │ │ ├── no_results.tsx │ │ │ ├── query_assist │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── callouts.test.tsx.snap │ │ │ │ │ ├── callouts.test.tsx │ │ │ │ │ ├── hooks.test.ts │ │ │ │ │ └── input.test.tsx │ │ │ │ ├── callouts.tsx │ │ │ │ ├── hooks.ts │ │ │ │ └── input.tsx │ │ │ ├── save_panel │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── save_panel.test.tsx.snap │ │ │ │ │ └── save_panel.test.tsx │ │ │ │ ├── index.ts │ │ │ │ └── save_panel.tsx │ │ │ ├── sidebar │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ ├── field.test.tsx.snap │ │ │ │ │ │ └── sidebar.test.tsx.snap │ │ │ │ │ ├── field.test.tsx │ │ │ │ │ └── sidebar.test.tsx │ │ │ │ ├── field.tsx │ │ │ │ ├── field_insights.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── observability_sidebar.tsx │ │ │ │ ├── sidebar.scss │ │ │ │ └── sidebar.tsx │ │ │ ├── timechart │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── timechart.test.tsx.snap │ │ │ │ │ ├── timechart.test.tsx │ │ │ │ │ └── utils.test.ts │ │ │ │ ├── hits_counter │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── hits_counter.test.tsx.snap │ │ │ │ │ │ └── hits_counter.test.tsx │ │ │ │ │ ├── hits_counter.tsx │ │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── timechart.tsx │ │ │ │ ├── timechart_header │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ └── timechart_header.test.tsx.snap │ │ │ │ │ │ └── timechart_header.test.tsx │ │ │ │ │ ├── index.ts │ │ │ │ │ └── timechart_header.tsx │ │ │ │ └── utils.ts │ │ │ └── visualizations │ │ │ │ ├── config_panel │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── config_panel.test.tsx.snap │ │ │ │ │ └── config_panel.test.tsx │ │ │ │ ├── config_panel.scss │ │ │ │ ├── config_panel.tsx │ │ │ │ ├── config_panel_footer.tsx │ │ │ │ ├── config_panes │ │ │ │ │ ├── config_controls │ │ │ │ │ │ ├── config_availability.tsx │ │ │ │ │ │ ├── config_bar_chart_styles.tsx │ │ │ │ │ │ ├── config_button_group.tsx │ │ │ │ │ │ ├── config_chart_options.tsx │ │ │ │ │ │ ├── config_color_palette_picker.tsx │ │ │ │ │ │ ├── config_color_theme.tsx │ │ │ │ │ │ ├── config_data_links.tsx │ │ │ │ │ │ ├── config_gauge_options.tsx │ │ │ │ │ │ ├── config_heatmap_color_palette_picker.tsx │ │ │ │ │ │ ├── config_legend.tsx │ │ │ │ │ │ ├── config_line_chart_styles.tsx │ │ │ │ │ │ ├── config_logs_view.tsx │ │ │ │ │ │ ├── config_number_input.tsx │ │ │ │ │ │ ├── config_panel_item.tsx │ │ │ │ │ │ ├── config_panel_option_gauge.tsx │ │ │ │ │ │ ├── config_panel_options.tsx │ │ │ │ │ │ ├── config_single_color_picker.tsx │ │ │ │ │ │ ├── config_style_slider.tsx │ │ │ │ │ │ ├── config_switch.tsx │ │ │ │ │ │ ├── config_switch_button.tsx │ │ │ │ │ │ ├── config_text.tsx │ │ │ │ │ │ ├── config_text_input.tsx │ │ │ │ │ │ ├── config_thresholds.tsx │ │ │ │ │ │ ├── config_tooltip.tsx │ │ │ │ │ │ ├── config_treemap_parents.tsx │ │ │ │ │ │ ├── config_value_options.tsx │ │ │ │ │ │ ├── config_visualization_selector.tsx │ │ │ │ │ │ ├── config_yaxis_side.tsx │ │ │ │ │ │ ├── data_config_item_click_panel.tsx │ │ │ │ │ │ ├── data_config_panel_fields.tsx │ │ │ │ │ │ ├── data_configurations_panel.scss │ │ │ │ │ │ ├── data_configurations_panel.tsx │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── logs_view_config_panel_item.tsx │ │ │ │ │ │ └── treemap_config_panel_item.tsx │ │ │ │ │ ├── default_vis_editor.tsx │ │ │ │ │ └── json_editor.tsx │ │ │ │ └── index.ts │ │ │ │ ├── count_distribution │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── count_distribution.test.tsx.snap │ │ │ │ │ └── count_distribution.test.tsx │ │ │ │ ├── count_distribution.tsx │ │ │ │ └── index.ts │ │ │ │ ├── direct_query_vis.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── shared_components │ │ │ │ ├── empty_placeholder.scss │ │ │ │ ├── empty_placeholder.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── plotly_viz_editor │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── plotly_actions.tsx │ │ │ │ │ ├── plotly_editor.scss │ │ │ │ │ ├── plotly_vis.scss │ │ │ │ │ └── plotly_viz_editor.tsx │ │ │ │ └── vis_canvass_placeholder.tsx │ │ │ │ ├── visualization_specs │ │ │ │ ├── default.data.spec.hjson │ │ │ │ ├── default.layout.spec.hjson │ │ │ │ └── default_spec.ts │ │ │ │ ├── visualizations.scss │ │ │ │ └── workspace_panel │ │ │ │ ├── index.ts │ │ │ │ ├── workspace_panel.scss │ │ │ │ └── workspace_panel.tsx │ │ ├── home │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ └── saved_query_table.test.tsx.snap │ │ │ │ └── saved_query_table.test.tsx │ │ │ ├── home.scss │ │ │ ├── home.tsx │ │ │ └── saved_objects_table.tsx │ │ ├── hooks │ │ │ ├── index.ts │ │ │ ├── use_fetch_direct_events.ts │ │ │ ├── use_fetch_events.ts │ │ │ ├── use_fetch_patterns.ts │ │ │ ├── use_fetch_visualizations.ts │ │ │ ├── use_render_visualizations.ts │ │ │ └── use_tab_context.ts │ │ ├── index.scss │ │ ├── index.tsx │ │ ├── redux │ │ │ ├── reducers │ │ │ │ ├── fetch_reducers.ts │ │ │ │ ├── index.ts │ │ │ │ └── query_reducers.ts │ │ │ └── slices │ │ │ │ ├── count_distribution_slice.ts │ │ │ │ ├── field_slice.ts │ │ │ │ ├── patterns_slice.ts │ │ │ │ ├── query_assistant_summarization_slice.ts │ │ │ │ ├── query_result_slice.ts │ │ │ │ ├── query_slice.ts │ │ │ │ ├── query_tab_slice.ts │ │ │ │ ├── search_meta_data_slice.ts │ │ │ │ ├── visualization_slice.ts │ │ │ │ └── viualization_config_slice.ts │ │ └── utils │ │ │ ├── __tests__ │ │ │ └── utils.test.tsx │ │ │ ├── index.tsx │ │ │ └── utils.tsx │ ├── getting_started │ │ ├── components │ │ │ ├── getting_started.tsx │ │ │ ├── getting_started_collectData.tsx │ │ │ ├── getting_started_header.tsx │ │ │ └── utils.tsx │ │ ├── getting_started_artifacts │ │ │ ├── golang_client │ │ │ │ ├── README.md │ │ │ │ ├── assets │ │ │ │ │ └── tutorial-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── getting-started │ │ │ │ │ ├── .env │ │ │ │ │ ├── docker-compose.yml │ │ │ │ │ ├── fluent-bit │ │ │ │ │ │ ├── fluent-bit.conf │ │ │ │ │ │ └── parsers.conf │ │ │ │ │ ├── golang-app │ │ │ │ │ │ ├── Dockerfile │ │ │ │ │ │ ├── go.mod │ │ │ │ │ │ └── main.go │ │ │ │ │ ├── logs │ │ │ │ │ │ └── app.log │ │ │ │ │ └── opensearch_dashboards.yml │ │ │ │ ├── golang_client-1.0.0.json │ │ │ │ ├── info │ │ │ │ │ └── Getting-Started.md │ │ │ │ ├── schemas │ │ │ │ │ └── applicative-logs-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ ├── logo.png │ │ │ │ │ └── logo.svg │ │ │ ├── java_client │ │ │ │ ├── README.md │ │ │ │ ├── assets │ │ │ │ │ └── tutorial-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── getting-started │ │ │ │ │ ├── .env │ │ │ │ │ ├── docker-compose.yml │ │ │ │ │ ├── fluent-bit │ │ │ │ │ │ ├── fluent-bit.conf │ │ │ │ │ │ └── parsers.conf │ │ │ │ │ ├── java-app │ │ │ │ │ │ ├── Dockerfile │ │ │ │ │ │ ├── pom.xml │ │ │ │ │ │ └── src │ │ │ │ │ │ │ └── main │ │ │ │ │ │ │ └── java │ │ │ │ │ │ │ └── App.java │ │ │ │ │ ├── logs │ │ │ │ │ │ └── app.log │ │ │ │ │ └── opensearch_dashboards.yml │ │ │ │ ├── info │ │ │ │ │ └── Getting-Started.md │ │ │ │ ├── java_client-1.0.0.json │ │ │ │ ├── schemas │ │ │ │ │ └── applicative-logs-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ └── logo.svg │ │ │ ├── nginx │ │ │ │ ├── README.md │ │ │ │ ├── assets │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ ├── example_queries-1.0.0.ndjson │ │ │ │ │ ├── getting-started-tutorial-1.0.0.ndjson │ │ │ │ │ ├── nginx-1.0.0.ndjson │ │ │ │ │ └── nginx-index-patterns-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ ├── raw.log │ │ │ │ │ └── sample.json │ │ │ │ ├── getting-started │ │ │ │ │ ├── .env │ │ │ │ │ ├── fluent-bit │ │ │ │ │ │ ├── fluent-bit.conf │ │ │ │ │ │ ├── otel-converter.lua │ │ │ │ │ │ └── parsers.conf │ │ │ │ │ ├── nginx-node.yml │ │ │ │ │ ├── opensearch_dashboards.yml │ │ │ │ │ └── os-cluster.yml │ │ │ │ ├── info │ │ │ │ │ ├── Getting-Started.md │ │ │ │ │ └── README.md │ │ │ │ ├── nginx-1.0.0.json │ │ │ │ ├── schemas │ │ │ │ │ ├── communication-1.0.0.mapping.json │ │ │ │ │ ├── http-1.0.0.mapping.json │ │ │ │ │ └── logs-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard1.png │ │ │ │ │ ├── dashboard2.png │ │ │ │ │ └── logo.svg │ │ │ ├── otel-services │ │ │ │ ├── README.md │ │ │ │ ├── assets │ │ │ │ │ ├── Advanced Settings.ndjson │ │ │ │ │ ├── demo-langing-page-1.0.0.ndjson │ │ │ │ │ ├── getting-started-demo-1.0.0.ndjson │ │ │ │ │ ├── otel-architecture-1.0.0.ndjson │ │ │ │ │ ├── otel-index-patterns-1.0.0.ndjson │ │ │ │ │ ├── otel-service-flow-use-case-integration-1.0.0.ndjson │ │ │ │ │ └── sense.json │ │ │ │ ├── data │ │ │ │ │ ├── logs-samples.json │ │ │ │ │ ├── metrics-samples.json │ │ │ │ │ ├── services-samples.json │ │ │ │ │ └── traces-samples.json │ │ │ │ ├── info │ │ │ │ │ ├── GettingStarted.md │ │ │ │ │ ├── OTEL Demo Architecture.md │ │ │ │ │ ├── Observability Introduction.md │ │ │ │ │ ├── README.md │ │ │ │ │ ├── Tutorial.md │ │ │ │ │ ├── img │ │ │ │ │ │ ├── DemoFlow.png │ │ │ │ │ │ ├── DemoServices.png │ │ │ │ │ │ ├── amp-services-network-metrics-details.png │ │ │ │ │ │ ├── amp-services-system-metrics-details.png │ │ │ │ │ │ ├── configure-prometheus-datasource.png │ │ │ │ │ │ ├── dashboard-login.png │ │ │ │ │ │ ├── dashboard-mng.png │ │ │ │ │ │ ├── demo-app.png │ │ │ │ │ │ ├── dev-tool-schema-notebook.png │ │ │ │ │ │ ├── import-dev-console-sense-notebook.png │ │ │ │ │ │ ├── import-savedObj.png │ │ │ │ │ │ ├── integration-otel-services-dashboards.png │ │ │ │ │ │ ├── integration-otel-services-info.png │ │ │ │ │ │ ├── integration-otel-services-selection.png │ │ │ │ │ │ ├── integration-otel-services-setup.png │ │ │ │ │ │ ├── load-generator.png │ │ │ │ │ │ ├── logs-discovery-otel.png │ │ │ │ │ │ ├── logs-otel-pipe.png │ │ │ │ │ │ ├── metrics-analytics-opensearch-otel-metrics-select-metrics.png │ │ │ │ │ │ ├── metrics-analytics-opensearch-otel-metrics.png │ │ │ │ │ │ ├── metrics-analytics-prometheus-select-metrics.png │ │ │ │ │ │ ├── metrics-analytics-prometheus.png │ │ │ │ │ │ ├── metrics-otel-pipe.png │ │ │ │ │ │ ├── otel-ingestion-rate-dashboard.png │ │ │ │ │ │ ├── service-analytics-dialog-list.png │ │ │ │ │ │ ├── service-analytics-dialog-services_map.png │ │ │ │ │ │ ├── service-analytics-dialog-trace_group.png │ │ │ │ │ │ ├── services-general-dashboard.png │ │ │ │ │ │ ├── specific-service-dashboard.png │ │ │ │ │ │ ├── store-url-in-session.png │ │ │ │ │ │ ├── traces-analytics-dialog-spans.png │ │ │ │ │ │ ├── traces-analytics-dialog.png │ │ │ │ │ │ └── traces-otel-pipe.png │ │ │ │ │ ├── integrations.png │ │ │ │ │ ├── notebook.json │ │ │ │ │ └── services.png │ │ │ │ ├── otel-services-1.0.0-logs.json │ │ │ │ ├── otel-services-1.0.0-metrics.json │ │ │ │ ├── otel-services-1.0.0-traces.json │ │ │ │ ├── schemas │ │ │ │ │ ├── logs-1.0.0.mapping.json │ │ │ │ │ ├── metrics-1.0.0.mapping.json │ │ │ │ │ ├── services-1.0.0.mapping.json │ │ │ │ │ └── traces-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── apm-network-metrics-step.png │ │ │ │ │ ├── apm-system-metrics-step.png │ │ │ │ │ ├── logo.svg │ │ │ │ │ ├── observability-services-step.png │ │ │ │ │ ├── rate-ingestion-step.png │ │ │ │ │ └── single-service-step.png │ │ │ └── python_client │ │ │ │ ├── README.md │ │ │ │ ├── assets │ │ │ │ └── tutorial-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ └── sample.json │ │ │ │ ├── getting-started │ │ │ │ ├── .env │ │ │ │ ├── docker-compose.yml │ │ │ │ ├── fluent-bit │ │ │ │ │ ├── fluent-bit.conf │ │ │ │ │ └── parsers.conf │ │ │ │ ├── opensearch_dashboards.yml │ │ │ │ └── python-app │ │ │ │ │ ├── Dockerfile │ │ │ │ │ └── app.py │ │ │ │ ├── info │ │ │ │ └── Getting-Started.md │ │ │ │ ├── python_client-1.0.0.json │ │ │ │ ├── schemas │ │ │ │ └── applicative-logs-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ ├── dashboard.png │ │ │ │ └── logo.png │ │ └── home.tsx │ ├── hooks │ │ ├── index.ts │ │ └── use_polling.ts │ ├── index.tsx │ ├── integrations │ │ ├── components │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── added_integration.test.tsx.snap │ │ │ │ │ ├── added_integration_flyout.test.tsx.snap │ │ │ │ │ ├── added_integration_table.test.tsx.snap │ │ │ │ │ ├── available_integration_card_view.test.tsx.snap │ │ │ │ │ ├── available_integration_table_view.test.tsx.snap │ │ │ │ │ ├── integration_details.test.tsx.snap │ │ │ │ │ ├── integration_fields.test.tsx.snap │ │ │ │ │ ├── integration_header.test.tsx.snap │ │ │ │ │ ├── setup_integration.test.tsx.snap │ │ │ │ │ ├── setup_integration_inputs.test.tsx.snap │ │ │ │ │ └── upload_flyout.test.tsx.snap │ │ │ │ ├── added_integration.test.tsx │ │ │ │ ├── added_integration_flyout.test.tsx │ │ │ │ ├── added_integration_table.test.tsx │ │ │ │ ├── available_integration_card_view.test.tsx │ │ │ │ ├── available_integration_table_view.test.tsx │ │ │ │ ├── create_integration_helpers.test.ts │ │ │ │ ├── integration_details.test.tsx │ │ │ │ ├── integration_fields.test.tsx │ │ │ │ ├── integration_header.test.tsx │ │ │ │ ├── setup_integration.test.tsx │ │ │ │ ├── setup_integration_inputs.test.tsx │ │ │ │ ├── testing_constants.ts │ │ │ │ └── upload_flyout.test.tsx │ │ │ ├── add_integration_flyout.tsx │ │ │ ├── added_integration.tsx │ │ │ ├── added_integration_overview_page.tsx │ │ │ ├── added_integration_table.tsx │ │ │ ├── available_integration_card_view.tsx │ │ │ ├── available_integration_overview_page.tsx │ │ │ ├── available_integration_table.tsx │ │ │ ├── create_integration_helpers.ts │ │ │ ├── integration.tsx │ │ │ ├── integration_assets_panel.tsx │ │ │ ├── integration_category_badge_group.tsx │ │ │ ├── integration_details_panel.tsx │ │ │ ├── integration_fields_panel.tsx │ │ │ ├── integration_header.tsx │ │ │ ├── integration_overview_panel.tsx │ │ │ ├── integration_screenshots_panel.tsx │ │ │ ├── integration_types.ts │ │ │ ├── setup_integration.tsx │ │ │ ├── setup_integration_inputs.tsx │ │ │ └── upload_flyout.tsx │ │ └── home.tsx │ ├── metrics │ │ ├── helpers │ │ │ ├── __tests__ │ │ │ │ └── utils.test.tsx │ │ │ └── utils.tsx │ │ ├── index.scss │ │ ├── index.tsx │ │ ├── redux │ │ │ └── slices │ │ │ │ ├── __tests__ │ │ │ │ └── metric_slice.test.tsx │ │ │ │ └── metrics_slice.ts │ │ ├── sidebar │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── searchbar.test.tsx.snap │ │ │ │ │ └── sidebar.test.tsx.snap │ │ │ │ ├── searchbar.test.tsx │ │ │ │ └── sidebar.test.tsx │ │ │ ├── data_source_picker.tsx │ │ │ ├── index_picker.tsx │ │ │ ├── metric_name.tsx │ │ │ ├── metrics_accordion.tsx │ │ │ ├── metrics_edit_inline.tsx │ │ │ ├── search_bar.tsx │ │ │ ├── sidebar.scss │ │ │ └── sidebar.tsx │ │ ├── top_menu │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── metrics_export.test.tsx.snap │ │ │ │ │ ├── metrics_export_panel.test.tsx.snap │ │ │ │ │ └── top_menu.test.tsx.snap │ │ │ │ ├── metrics_export.test.tsx │ │ │ │ ├── metrics_export_panel.test.tsx │ │ │ │ └── top_menu.test.tsx │ │ │ ├── metrics_export.tsx │ │ │ ├── metrics_export_panel.tsx │ │ │ ├── top_menu.scss │ │ │ └── top_menu.tsx │ │ └── view │ │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ ├── empty_view.test.tsx.snap │ │ │ │ └── metrics_grid.test.tsx.snap │ │ │ ├── empty_view.test.tsx │ │ │ └── metrics_grid.test.tsx │ │ │ ├── empty_view.scss │ │ │ ├── empty_view.tsx │ │ │ ├── metrics_grid.scss │ │ │ └── metrics_grid.tsx │ ├── notebooks │ │ ├── components │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── note_table.test.tsx.snap │ │ │ │ │ └── notebook.test.tsx.snap │ │ │ │ ├── note_table.test.tsx │ │ │ │ └── notebook.test.tsx │ │ │ ├── helpers │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ └── modal_containers.test.tsx.snap │ │ │ │ │ ├── default_parser.test.tsx │ │ │ │ │ ├── legacy_route_helpers.test.ts │ │ │ │ │ ├── modal_containers.test.tsx │ │ │ │ │ └── reporting_context_menu_helper.test.tsx │ │ │ │ ├── custom_modals │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ ├── custom_input_modal.test.tsx.snap │ │ │ │ │ │ │ └── reporting_loading_modal.test.tsx.snap │ │ │ │ │ │ ├── custom_input_modal.test.tsx │ │ │ │ │ │ └── reporting_loading_modal.test.tsx │ │ │ │ │ ├── custom_input_modal.tsx │ │ │ │ │ └── reporting_loading_modal.tsx │ │ │ │ ├── default_parser.tsx │ │ │ │ ├── download_json.tsx │ │ │ │ ├── legacy_route_helpers.ts │ │ │ │ ├── modal_containers.tsx │ │ │ │ ├── notebooks_parser.tsx │ │ │ │ └── reporting_context_menu_helper.tsx │ │ │ ├── main.tsx │ │ │ ├── note_table.tsx │ │ │ ├── notebook.tsx │ │ │ └── paragraph_components │ │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── para_input.test.tsx.snap │ │ │ │ │ ├── para_output.test.tsx.snap │ │ │ │ │ ├── para_query_grid.test.tsx.snap │ │ │ │ │ └── paragraphs.test.tsx.snap │ │ │ │ ├── para_input.test.tsx │ │ │ │ ├── para_output.test.tsx │ │ │ │ ├── para_query_grid.test.tsx │ │ │ │ └── paragraphs.test.tsx │ │ │ │ ├── para_input.tsx │ │ │ │ ├── para_output.tsx │ │ │ │ ├── para_query_grid.tsx │ │ │ │ └── paragraphs.tsx │ │ ├── docs │ │ │ ├── dev │ │ │ │ ├── API_Documentation.md │ │ │ │ ├── Build_Documentation.md │ │ │ │ ├── OpenSearch-Dashboards-Notebooks-Design-Proposal.md │ │ │ │ ├── Usage_Documentation.md │ │ │ │ └── images │ │ │ │ │ ├── Default_Notebooks_Schemav2.png │ │ │ │ │ ├── Embeddable_API.png │ │ │ │ │ ├── Markdown_ss.png │ │ │ │ │ ├── Multi-timeline_ss.png │ │ │ │ │ ├── Notebooks_v1.png │ │ │ │ │ ├── Notebooks_v2.png │ │ │ │ │ ├── Notebooks_v3.png │ │ │ │ │ ├── UI.png │ │ │ │ │ ├── Zeppelin_ss.png │ │ │ │ │ ├── dashboards-notebooks.gif │ │ │ │ │ ├── dashboards_notebooks_ss.png │ │ │ │ │ ├── default_backend_model.png │ │ │ │ │ ├── default_operation_notebook.png │ │ │ │ │ ├── default_view_notebook.png │ │ │ │ │ ├── matplot_ss.png │ │ │ │ │ ├── notebook-buttons.png │ │ │ │ │ ├── opensearch-zeppelin-settings.png │ │ │ │ │ ├── opensearch-zeppelin.png │ │ │ │ │ ├── opensearch_ss.png │ │ │ │ │ ├── opensearch_ss_zepcontext.png │ │ │ │ │ ├── paragraph-buttons.png │ │ │ │ │ ├── python_ss.png │ │ │ │ │ ├── vizembed_ss.png │ │ │ │ │ └── zeppelin_notebooks_sequence.png │ │ │ └── example_notebooks │ │ │ │ └── default │ │ │ │ └── Introduction Notebook.json │ │ └── index.scss │ ├── overview │ │ ├── components │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── add_dashboard_callout.test.tsx.snap │ │ │ │ │ ├── add_datasource_callout.test.tsx.snap │ │ │ │ │ ├── dashboard_controls.test.tsx.snap │ │ │ │ │ └── select_dashboard_flyout.test.tsx.snap │ │ │ │ ├── add_dashboard_callout.test.tsx │ │ │ │ ├── add_datasource_callout.test.tsx │ │ │ │ ├── dashboard_controls.test.tsx │ │ │ │ └── select_dashboard_flyout.test.tsx │ │ │ ├── add_dashboard_callout.tsx │ │ │ ├── add_datasource_callout.tsx │ │ │ ├── assets │ │ │ │ ├── SampleDataDark.png │ │ │ │ ├── SampleDataLight.png │ │ │ │ └── SelectDashboard.svg │ │ │ ├── card_configs.tsx │ │ │ ├── dashboard_controls.tsx │ │ │ ├── obs_dashboard_state_manager.tsx │ │ │ ├── select_dashboard_flyout.tsx │ │ │ └── utils.tsx │ │ ├── home.tsx │ │ └── index.scss │ ├── trace_analytics │ │ ├── components │ │ │ ├── common │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ ├── helper_functions.test.tsx.snap │ │ │ │ │ │ └── search_bar.test.tsx.snap │ │ │ │ │ ├── helper_functions.test.tsx │ │ │ │ │ ├── legacy_route_helpers.test.tsx │ │ │ │ │ ├── redirection_helpers.test.tsx │ │ │ │ │ └── search_bar.test.tsx │ │ │ │ ├── color_palette.ts │ │ │ │ ├── constants.tsx │ │ │ │ ├── filters │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ ├── filter_edit_popover.test.tsx.snap │ │ │ │ │ │ │ ├── filter_helpers.test.tsx.snap │ │ │ │ │ │ │ └── filters.test.tsx.snap │ │ │ │ │ │ ├── filter_edit_popover.test.tsx │ │ │ │ │ │ ├── filter_helpers.test.tsx │ │ │ │ │ │ └── filters.test.tsx │ │ │ │ │ ├── filter_edit_popover.tsx │ │ │ │ │ ├── filter_helpers.tsx │ │ │ │ │ └── filters.tsx │ │ │ │ ├── helper_functions.tsx │ │ │ │ ├── legacy_route_helpers.ts │ │ │ │ ├── plots │ │ │ │ │ ├── __tests__ │ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ │ ├── box_plt.test.tsx.snap │ │ │ │ │ │ │ ├── error_rate_plt_.test.tsx.snap │ │ │ │ │ │ │ ├── latency_trend_plt.test.tsx.snap │ │ │ │ │ │ │ ├── service_map.test.tsx.snap │ │ │ │ │ │ │ ├── service_map_scale.test.tsx.snap │ │ │ │ │ │ │ └── throughput_plt.test.tsx.snap │ │ │ │ │ │ ├── box_plt.test.tsx │ │ │ │ │ │ ├── error_rate_plt_.test.tsx │ │ │ │ │ │ ├── latency_trend_plt.test.tsx │ │ │ │ │ │ ├── service_map.test.tsx │ │ │ │ │ │ ├── service_map_scale.test.tsx │ │ │ │ │ │ └── throughput_plt.test.tsx │ │ │ │ │ ├── box_plt.tsx │ │ │ │ │ ├── error_rate_plt.tsx │ │ │ │ │ ├── latency_trend_plt.tsx │ │ │ │ │ ├── service_dependencies_table.tsx │ │ │ │ │ ├── service_map.tsx │ │ │ │ │ ├── service_map_node_details.tsx │ │ │ │ │ ├── service_map_scale.tsx │ │ │ │ │ └── throughput_plt.tsx │ │ │ │ ├── redirection_helpers.tsx │ │ │ │ ├── search_bar.tsx │ │ │ │ └── shared_components │ │ │ │ │ ├── component_helper_functions.tsx │ │ │ │ │ ├── custom_datagrid.tsx │ │ │ │ │ └── sharedComponents.scss │ │ │ ├── dashboard │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ ├── dashboard.test.tsx.snap │ │ │ │ │ │ ├── dashboard_table.test.tsx.snap │ │ │ │ │ │ ├── latency_trend_cell.test.tsx.snap │ │ │ │ │ │ ├── mode_picker.test.tsx.snap │ │ │ │ │ │ ├── top_error_rates_table.test.tsx.snap │ │ │ │ │ │ └── top_latency_table.test.tsx.snap │ │ │ │ │ ├── dashboard.test.tsx │ │ │ │ │ ├── dashboard_table.test.tsx │ │ │ │ │ ├── latency_trend_cell.test.tsx │ │ │ │ │ ├── mode_picker.test.tsx │ │ │ │ │ ├── top_error_rates_table.test.tsx │ │ │ │ │ └── top_latency_table.test.tsx │ │ │ │ ├── dashboard.tsx │ │ │ │ ├── dashboard_content.tsx │ │ │ │ ├── dashboard_table.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── latency_trend_cell.tsx │ │ │ │ ├── mode_picker.tsx │ │ │ │ ├── top_error_rates_table.tsx │ │ │ │ ├── top_groups_page.tsx │ │ │ │ └── top_latency_table.tsx │ │ │ ├── services │ │ │ │ ├── __tests__ │ │ │ │ │ ├── __snapshots__ │ │ │ │ │ │ ├── service_view.test.tsx.snap │ │ │ │ │ │ ├── services.test.tsx.snap │ │ │ │ │ │ └── services_table.test.tsx.snap │ │ │ │ │ ├── service_view.test.tsx │ │ │ │ │ ├── services.test.tsx │ │ │ │ │ └── services_table.test.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── service_flyout.tsx │ │ │ │ ├── service_metrics.tsx │ │ │ │ ├── service_trends_plots.tsx │ │ │ │ ├── service_view.tsx │ │ │ │ ├── services.tsx │ │ │ │ ├── services_content.tsx │ │ │ │ └── services_table.tsx │ │ │ └── traces │ │ │ │ ├── __tests__ │ │ │ │ ├── __snapshots__ │ │ │ │ │ ├── flyout_list_item.test.tsx.snap │ │ │ │ │ ├── service_breakdown_panel.test.tsx.snap │ │ │ │ │ ├── span_detail_flyout.test.tsx.snap │ │ │ │ │ ├── span_detail_panel.test.tsx.snap │ │ │ │ │ ├── span_detail_table.test.tsx.snap │ │ │ │ │ ├── trace_view.test.tsx.snap │ │ │ │ │ ├── traces.test.tsx.snap │ │ │ │ │ └── traces_table.test.tsx.snap │ │ │ │ ├── flyout_list_item.test.tsx │ │ │ │ ├── service_breakdown_panel.test.tsx │ │ │ │ ├── span_detail_flyout.test.tsx │ │ │ │ ├── span_detail_panel.test.tsx │ │ │ │ ├── span_detail_table.test.tsx │ │ │ │ ├── trace_view.test.tsx │ │ │ │ ├── trace_view_helpers.test.tsx │ │ │ │ ├── traces.test.tsx │ │ │ │ └── traces_table.test.tsx │ │ │ │ ├── flyout_list_item.tsx │ │ │ │ ├── index.ts │ │ │ │ ├── service_breakdown_panel.tsx │ │ │ │ ├── services_list.tsx │ │ │ │ ├── span_detail_flyout.tsx │ │ │ │ ├── span_detail_panel.tsx │ │ │ │ ├── span_detail_table.tsx │ │ │ │ ├── trace_table_helpers.tsx │ │ │ │ ├── trace_view.tsx │ │ │ │ ├── trace_view_helpers.tsx │ │ │ │ ├── traces.tsx │ │ │ │ ├── traces_content.tsx │ │ │ │ ├── traces_custom_indices_table.tsx │ │ │ │ └── traces_table.tsx │ │ ├── home.tsx │ │ ├── images │ │ │ └── unmatched_node.png │ │ ├── index.scss │ │ ├── requests │ │ │ ├── __tests__ │ │ │ │ └── helper_funtions.test.tsx │ │ │ ├── dashboard_request_handler.ts │ │ │ ├── helper_functions.tsx │ │ │ ├── queries │ │ │ │ ├── dashboard_queries.ts │ │ │ │ ├── services_queries.ts │ │ │ │ └── traces_queries.ts │ │ │ ├── request_handler.ts │ │ │ ├── services_request_handler.ts │ │ │ └── traces_request_handler.ts │ │ └── trace_side_nav.tsx │ └── visualizations │ │ ├── charts │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ ├── bar.test.tsx.snap │ │ │ │ ├── gauge.test.tsx.snap │ │ │ │ ├── heatmap.test.tsx.snap │ │ │ │ ├── histogram.test.tsx.snap │ │ │ │ ├── horizontal_bar.test.tsx.snap │ │ │ │ ├── line.test.tsx.snap │ │ │ │ ├── metrics.test.tsx.snap │ │ │ │ ├── pie.test.tsx.snap │ │ │ │ ├── text.test.tsx.snap │ │ │ │ └── treemap.test.tsx.snap │ │ │ ├── bar.test.tsx │ │ │ ├── gauge.test.tsx │ │ │ ├── heatmap.test.tsx │ │ │ ├── histogram.test.tsx │ │ │ ├── horizontal_bar.test.tsx │ │ │ ├── line.test.tsx │ │ │ ├── metrics.test.tsx │ │ │ ├── pie.test.tsx │ │ │ ├── text.test.tsx │ │ │ └── treemap.test.tsx │ │ ├── bar │ │ │ ├── bar.tsx │ │ │ └── bar_type.ts │ │ ├── bubble │ │ │ ├── bubble.tsx │ │ │ └── bubble_type.ts │ │ ├── data_table │ │ │ ├── data_table.scss │ │ │ ├── data_table.tsx │ │ │ ├── data_table_footer.tsx │ │ │ ├── data_table_header.tsx │ │ │ └── data_table_type.ts │ │ ├── financial │ │ │ └── gauge │ │ │ │ ├── gauge.tsx │ │ │ │ └── gauge_type.ts │ │ ├── helpers │ │ │ ├── index.ts │ │ │ └── viz_types.ts │ │ ├── histogram │ │ │ ├── histogram.tsx │ │ │ └── histogram_type.ts │ │ ├── lines │ │ │ ├── line.tsx │ │ │ └── line_type.ts │ │ ├── maps │ │ │ ├── heatmap.tsx │ │ │ ├── heatmap_type.ts │ │ │ ├── treemap_type.ts │ │ │ └── treemaps.tsx │ │ ├── metrics │ │ │ ├── metrics.tsx │ │ │ └── metrics_type.ts │ │ ├── pie │ │ │ ├── pie.tsx │ │ │ └── pie_type.ts │ │ ├── shared │ │ │ ├── common.ts │ │ │ └── shared_configs.ts │ │ ├── text │ │ │ ├── text.tsx │ │ │ └── text_type.ts │ │ └── vis_types.ts │ │ ├── plotly │ │ ├── __tests__ │ │ │ ├── __snapshots__ │ │ │ │ └── plotly.test.tsx.snap │ │ │ └── plotly.test.tsx │ │ └── plot.tsx │ │ ├── plotly_default_config.ts │ │ ├── saved_object_visualization.tsx │ │ ├── visualization.tsx │ │ └── visualization_chart.tsx ├── dependencies │ ├── components │ │ ├── __snapshots__ │ │ │ └── data_grid_container.test.tsx.snap │ │ ├── data_grid_container.test.tsx │ │ └── data_grid_container.tsx │ └── register_assistant.tsx ├── embeddable │ ├── filters │ │ └── filter_parser.ts │ ├── observability_embeddable.tsx │ ├── observability_embeddable_component.tsx │ └── observability_embeddable_factory.tsx ├── framework │ ├── catalog_cache │ │ ├── cache_intercept.test.ts │ │ ├── cache_intercept.ts │ │ ├── cache_loader.test.tsx │ │ ├── cache_loader.tsx │ │ ├── cache_manager.test.tsx │ │ └── cache_manager.ts │ ├── core_refs.ts │ ├── datasource_pluggables │ │ ├── datasource_pluggable.ts │ │ └── types.ts │ ├── datasources │ │ ├── direct_query_hook.tsx │ │ ├── obs_opensearch_datasource.ts │ │ └── s3_datasource.ts │ └── redux │ │ ├── reducers │ │ └── index.ts │ │ └── store │ │ ├── index.ts │ │ └── shared_state.ts ├── index.scss ├── index.ts ├── plugin.tsx ├── plugin_helpers │ ├── plugin_headerControl.tsx │ ├── plugin_nav.tsx │ └── plugin_overview.tsx ├── services │ ├── data_fetchers │ │ ├── fetch_interface.ts │ │ ├── fetcher_base.ts │ │ ├── ppl │ │ │ └── ppl_data_fetcher.ts │ │ └── sql │ │ │ └── sql_data_fetcher.ts │ ├── requests │ │ ├── dsl.ts │ │ ├── ppl.ts │ │ └── sql.ts │ ├── saved_objects │ │ ├── event_analytics │ │ │ └── saved_objects.ts │ │ ├── saved_object_client │ │ │ ├── client_base.ts │ │ │ ├── client_factory.ts │ │ │ ├── client_interface.ts │ │ │ ├── osd_saved_objects │ │ │ │ ├── osd_saved_object_client.ts │ │ │ │ ├── saved_searches.ts │ │ │ │ ├── saved_visualization.ts │ │ │ │ └── types.ts │ │ │ ├── ppl │ │ │ │ ├── index.ts │ │ │ │ ├── panels.ts │ │ │ │ ├── ppl_client.ts │ │ │ │ ├── saved_query.ts │ │ │ │ └── saved_visualization.ts │ │ │ ├── saved_objects_actions.ts │ │ │ └── types.ts │ │ ├── saved_object_loaders │ │ │ ├── explorer_saved_object_loader.ts │ │ │ ├── loader_base.ts │ │ │ ├── loader_interface.ts │ │ │ └── ppl │ │ │ │ ├── index.ts │ │ │ │ └── ppl_loader.ts │ │ └── saved_object_savers │ │ │ ├── index.ts │ │ │ ├── ppl │ │ │ ├── save_as_current_vis.ts │ │ │ ├── save_as_new_query.ts │ │ │ ├── save_as_new_vis.ts │ │ │ ├── save_current_query.ts │ │ │ └── saved_query_saver.ts │ │ │ ├── saver_base.ts │ │ │ └── saver_interface.ts │ └── timestamp │ │ └── timestamp.ts ├── types.ts └── variables.scss ├── release-notes ├── dashboards-observability.release-notes-1.3.10.md ├── dashboards-observability.release-notes-2.10.0.0.md ├── dashboards-observability.release-notes-2.11.0.0.md ├── dashboards-observability.release-notes-2.12.0.0.md ├── dashboards-observability.release-notes-2.13.0.0.md ├── dashboards-observability.release-notes-2.14.0.0.md ├── dashboards-observability.release-notes-2.15.0.0.md ├── dashboards-observability.release-notes-2.16.0.0.md ├── dashboards-observability.release-notes-2.7.0.0.md ├── dashboards-observability.release-notes-2.8.0.0.md ├── dashboards-observability.release-notes-2.9.0.0.md ├── opensearch-observability.release-notes-2.17.0.0.md ├── opensearch-observability.release-notes-2.18.0.0.md ├── opensearch-observability.release-notes-2.19.0.0.md ├── opensearch-observability.release-notes-2.4.1.0.md ├── opensearch-observability.release-notes-2.6.0.0.md ├── opensearch-observability.release-notes-3.0.0.0-alpha1.md ├── opensearch-observability.release-notes-3.0.0.0-beta1.md └── opensearch-observability.release-notes-3.0.0.0.md ├── server ├── adaptors │ ├── application_analytics │ │ └── app_analytics_adaptor.ts │ ├── custom_panels │ │ └── custom_panel_adaptor.ts │ ├── integrations │ │ ├── __data__ │ │ │ └── repository │ │ │ │ ├── amazon_cloudfront │ │ │ │ ├── amazon_cloudfront-1.1.0.json │ │ │ │ ├── assets │ │ │ │ │ ├── aws_cloudfront-1.0.0.ndjson │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ └── example_queries-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── aws_cloudfront-1.0.0.mapping.json │ │ │ │ │ ├── aws_s3-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ └── logs-aws_cloudfront-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ └── logo.png │ │ │ │ ├── amazon_elb │ │ │ │ ├── amazon_elb-1.0.0.json │ │ │ │ ├── assets │ │ │ │ │ ├── aws_elb-1.0.0.ndjson │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ └── example_queries-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ ├── INGESTION.md │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── aws_elb-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ ├── communication-1.0.0.mapping.json │ │ │ │ │ ├── http-1.0.0.mapping.json │ │ │ │ │ ├── logs_elb-1.0.0.mapping.json │ │ │ │ │ └── url-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard1.png │ │ │ │ │ └── logo.svg │ │ │ │ ├── amazon_networkfirewall │ │ │ │ ├── .DS_Store │ │ │ │ ├── amazon_networkfirewall-1.0.0.json │ │ │ │ ├── assets │ │ │ │ │ ├── amazon_networkfirewall-1.0.0.ndjson │ │ │ │ │ ├── amazon_networkfirewall_aggregated-1.0.0.ndjson │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_mv_aggregated-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ └── example_queries-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── amazon_networkfirewall-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ └── logs_amazon_networkfirewall-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ ├── dashboard1.png │ │ │ │ │ ├── dashboard2.png │ │ │ │ │ ├── dashboard3.png │ │ │ │ │ └── logo.svg │ │ │ │ ├── amazon_rds │ │ │ │ ├── amazon_rds-1.0.0.json │ │ │ │ ├── assets │ │ │ │ │ ├── README.md │ │ │ │ │ └── aws_rds-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── aws_rds-1.0.0.mapping.json │ │ │ │ │ ├── aws_s3-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ └── logs_rds-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── aws-rds-icon.png │ │ │ │ │ └── dashboard.png │ │ │ │ ├── amazon_s3 │ │ │ │ ├── amazon_s3-1.1.0.json │ │ │ │ ├── assets │ │ │ │ │ ├── aws_s3-1.0.0.ndjson │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ └── example_queries-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── aws_s3-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ └── logs_s3-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ └── logo.png │ │ │ │ ├── amazon_vpc_flow │ │ │ │ ├── amazon_vpc_flow-1.1.0.json │ │ │ │ ├── assets │ │ │ │ │ ├── README.md │ │ │ │ │ ├── aws_vpc_flow-1.0.0.ndjson │ │ │ │ │ ├── aws_vpc_flow_flint-live-1.0.0.ndjson │ │ │ │ │ ├── aws_vpc_live_stream_mv_schema-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table_vpc_schema-1.0.0.sql │ │ │ │ │ └── example_queries-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ ├── Flint-Integration.md │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── aws_s3-1.0.0.mapping.json │ │ │ │ │ ├── aws_vpc_flow-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ ├── communication-1.0.0.mapping.json │ │ │ │ │ └── logs_vpc-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard1.png │ │ │ │ │ └── logo.svg │ │ │ │ ├── apache │ │ │ │ ├── apache-1.0.0.json │ │ │ │ ├── assets │ │ │ │ │ ├── apache-1.0.0.ndjson │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ └── example_queries-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ ├── INGESTION.md │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── communication-1.0.0.mapping.json │ │ │ │ │ ├── http-1.0.0.mapping.json │ │ │ │ │ └── logs_apache-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard1.png │ │ │ │ │ └── logo.png │ │ │ │ ├── aws_cloudtrail │ │ │ │ ├── assets │ │ │ │ │ ├── aws_cloudtrail-1.0.0.ndjson │ │ │ │ │ ├── aws_cloudtrail-flint-1.0.0.ndjson │ │ │ │ │ ├── create_mv_cloud-trail-1.0.0.sql │ │ │ │ │ ├── create_mv_cloud-trail-records-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table_cloud-trail-1.0.0.sql │ │ │ │ │ ├── create_table_cloud-trail-records-1.0.0.sql │ │ │ │ │ ├── example_queries-1.0.0.ndjson │ │ │ │ │ └── example_queries-records-1.0.0.ndjson │ │ │ │ ├── aws_cloudtrail-1.1.0.json │ │ │ │ ├── data │ │ │ │ │ ├── raw-sample.json │ │ │ │ │ └── samples.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── aws_cloudtrail-1.0.0.mapping.json │ │ │ │ │ ├── aws_s3-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ └── logs-aws_cloudtrail-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ └── logo.png │ │ │ │ ├── aws_waf │ │ │ │ ├── assets │ │ │ │ │ ├── aws_waf-1.0.0.ndjson │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ └── example_queries-1.0.0.ndjson │ │ │ │ ├── aws_waf-1.1.0.json │ │ │ │ ├── data │ │ │ │ │ └── samples.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── schemas │ │ │ │ │ ├── aws_s3-1.0.0.mapping.json │ │ │ │ │ ├── aws_waf-1.0.0.mapping.json │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ └── logs_waf-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ └── logo.png │ │ │ │ ├── haproxy │ │ │ │ ├── assets │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ └── haproxy-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── haproxy-1.1.0.json │ │ │ │ ├── info │ │ │ │ │ ├── README.md │ │ │ │ │ └── test │ │ │ │ │ │ ├── docker-compose.yaml │ │ │ │ │ │ ├── flask-app │ │ │ │ │ │ ├── Dockerfile │ │ │ │ │ │ ├── app.py │ │ │ │ │ │ └── requirements.txt │ │ │ │ │ │ ├── fluent-bit │ │ │ │ │ │ ├── fluent-bit.conf │ │ │ │ │ │ ├── otel-converter.lua │ │ │ │ │ │ └── parsers.conf │ │ │ │ │ │ ├── haproxy.cfg │ │ │ │ │ │ └── run.sh │ │ │ │ ├── schemas │ │ │ │ │ ├── communication-1.0.0.mapping.json │ │ │ │ │ ├── http-1.0.0.mapping.json │ │ │ │ │ └── logs-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard1.png │ │ │ │ │ ├── dashboard2.png │ │ │ │ │ └── logo.svg │ │ │ │ ├── k8s │ │ │ │ ├── assets │ │ │ │ │ ├── README.md │ │ │ │ │ └── k8s-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ ├── sample-container-cpu-usage.json │ │ │ │ │ ├── sample-container-memory-usage.json │ │ │ │ │ ├── sample-deployment-name.json │ │ │ │ │ ├── sample-node-cpu-usage.json │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── ingestion │ │ │ │ │ ├── README.md │ │ │ │ │ └── fluent-bit.yaml │ │ │ │ ├── k8s-1.0.0.json │ │ │ │ ├── schemas │ │ │ │ │ ├── cloud-1.0.0.mapping.json │ │ │ │ │ ├── container-1.0.0.mapping.json │ │ │ │ │ ├── k8s-1.0.0.mapping.json │ │ │ │ │ └── logs-k8s-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard.png │ │ │ │ │ └── logo.png │ │ │ │ ├── nginx │ │ │ │ ├── assets │ │ │ │ │ ├── create_mv-1.0.0.sql │ │ │ │ │ ├── create_skipping_index-1.0.0.sql │ │ │ │ │ ├── create_table-1.0.0.sql │ │ │ │ │ ├── example_queries-1.0.0.ndjson │ │ │ │ │ └── nginx-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ │ └── sample.json │ │ │ │ ├── info │ │ │ │ │ └── README.md │ │ │ │ ├── nginx-1.0.0.json │ │ │ │ ├── schemas │ │ │ │ │ ├── communication-1.0.0.mapping.json │ │ │ │ │ ├── http-1.0.0.mapping.json │ │ │ │ │ └── logs-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ │ ├── dashboard1.png │ │ │ │ │ ├── dashboard2.png │ │ │ │ │ └── logo.svg │ │ │ │ └── otel-services │ │ │ │ ├── assets │ │ │ │ ├── otel-index-patterns-1.0.0.ndjson │ │ │ │ ├── otel_amp_network_metrics_dashboard-1.0.0.ndjson │ │ │ │ ├── otel_apm_network_services-1.0.0.ndjson │ │ │ │ ├── otel_ingestion_rate_dashboard-1.0.0.ndjson │ │ │ │ ├── otel_services_dashboard-1.0.0.ndjson │ │ │ │ └── otel_single_service_dashboard-1.0.0.ndjson │ │ │ │ ├── data │ │ │ │ ├── logs-samples.json │ │ │ │ ├── metrics-samples.json │ │ │ │ ├── services-samples.json │ │ │ │ └── traces-samples.json │ │ │ │ ├── info │ │ │ │ ├── DemoLandingPage.md │ │ │ │ ├── OTEL Demo Architecture.md │ │ │ │ ├── Observability Introduction.md │ │ │ │ ├── README.md │ │ │ │ ├── img │ │ │ │ │ ├── DemoFlow.png │ │ │ │ │ ├── DemoServices.png │ │ │ │ │ ├── logs-otel-pipe.png │ │ │ │ │ ├── metrics-otel-pipe.png │ │ │ │ │ └── traces-otel-pipe.png │ │ │ │ ├── integrations.png │ │ │ │ ├── notebook.json │ │ │ │ └── services.png │ │ │ │ ├── otel-services-1.0.0.json │ │ │ │ ├── schemas │ │ │ │ ├── logs-1.0.0.mapping.json │ │ │ │ ├── metrics-1.0.0.mapping.json │ │ │ │ ├── services-1.0.0.mapping.json │ │ │ │ └── traces-1.0.0.mapping.json │ │ │ │ └── static │ │ │ │ ├── dashboard1.png │ │ │ │ ├── dashboard2.png │ │ │ │ ├── dashboard3.png │ │ │ │ ├── dashboard4.png │ │ │ │ ├── dashboard5.png │ │ │ │ └── logo.png │ │ ├── __test__ │ │ │ ├── builder.test.ts │ │ │ ├── custom_expects.ts │ │ │ ├── json_repository.test.ts │ │ │ ├── local_fs_repository.test.ts │ │ │ ├── manager.test.ts │ │ │ ├── migrations.test.ts │ │ │ └── validators.test.ts │ │ ├── integrations_builder.ts │ │ ├── integrations_manager.ts │ │ ├── migrations.ts │ │ ├── repository │ │ │ ├── __test__ │ │ │ │ ├── index_data_adaptor.test.ts │ │ │ │ ├── integration_reader.test.ts │ │ │ │ ├── json_data_adaptor.test.ts │ │ │ │ ├── repository.test.ts │ │ │ │ └── utils.test.ts │ │ │ ├── catalog_data_adaptor.ts │ │ │ ├── fs_data_adaptor.ts │ │ │ ├── index_data_adaptor.ts │ │ │ ├── integration_reader.ts │ │ │ ├── json_data_adaptor.ts │ │ │ ├── repository.ts │ │ │ └── utils.ts │ │ ├── types.ts │ │ └── validators.ts │ ├── metrics │ │ └── metrics_analytics_adaptor.ts │ ├── notebooks │ │ ├── saved_objects_notebooks_router.tsx │ │ └── saved_objects_paragraphs_router.tsx │ ├── opensearch_observability_plugin.ts │ ├── ppl_datasource.ts │ └── ppl_plugin.ts ├── common │ ├── helpers │ │ ├── events_explorer │ │ │ └── sample_savedObjects.ts │ │ ├── notebooks │ │ │ ├── default_notebook_schema.ts │ │ │ ├── query_helpers.ts │ │ │ ├── sample_notebooks.ts │ │ │ └── wreck_requests.ts │ │ └── query_assist │ │ │ ├── __tests__ │ │ │ └── generate_field_context.test.ts │ │ │ └── generate_field_context.ts │ ├── metrics │ │ ├── constants.ts │ │ ├── metrics_helper.ts │ │ └── types.ts │ └── types │ │ └── index.ts ├── index.ts ├── parsers │ └── ppl_parser.ts ├── plugin.ts ├── plugin_helper │ └── register_settings.ts ├── routes │ ├── application_analytics │ │ └── app_analytics_router.ts │ ├── custom_panels │ │ ├── panels_router.ts │ │ └── visualizations_router.ts │ ├── data_connections │ │ └── data_connections_router.ts │ ├── datasources │ │ └── datasources_router.ts │ ├── dsl.ts │ ├── event_analytics │ │ └── event_analytics_router.ts │ ├── getting_started │ │ ├── assets │ │ │ ├── golang-tutorial-1.0.0.ndjson │ │ │ ├── java-tutorial-1.0.0.ndjson │ │ │ ├── nginx-1.0.0.ndjson │ │ │ ├── otel-index-patterns-1.0.0-Logs.ndjson │ │ │ ├── otel-index-patterns-1.0.0-Metrics.ndjson │ │ │ ├── otel-index-patterns-1.0.0-Traces.ndjson │ │ │ ├── otel-index-patterns-1.0.0.ndjson │ │ │ └── python-tutorial-1.0.0.ndjson │ │ ├── getting_started_router.ts │ │ └── helper.ts │ ├── index.ts │ ├── integrations │ │ ├── __tests__ │ │ │ └── integrations_router.test.ts │ │ └── integrations_router.ts │ ├── metrics │ │ └── metrics_rounter.ts │ ├── notebooks │ │ ├── noteRouter.ts │ │ ├── paraRouter.ts │ │ ├── sqlRouter.ts │ │ └── vizRouter.ts │ ├── ppl.ts │ ├── query_assist │ │ ├── routes.ts │ │ └── utils │ │ │ ├── __tests__ │ │ │ └── agents.test.ts │ │ │ ├── agents.ts │ │ │ └── constants.ts │ ├── sql.ts │ └── trace_analytics_dsl_router.ts ├── saved_objects │ └── observability_saved_object.ts ├── services │ ├── facets │ │ ├── dsl_facet.ts │ │ ├── ppl_facet.ts │ │ └── saved_objects.ts │ ├── queryService.ts │ └── utils │ │ └── constants.ts └── types.ts ├── test ├── __mocks__ │ ├── coreMocks.ts │ ├── fileMock.js │ ├── httpClientMock.ts │ └── styleMock.js ├── accelerations.ts ├── constants.ts ├── datasources.ts ├── event_analytics_constants.ts ├── jest.config.js ├── metrics_constants.ts ├── notebooks_constants.ts ├── panels_constants.tsx ├── setup.jest.ts └── setupTests.ts ├── tsconfig.json └── yarn.lock /.cypress/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['plugin:cypress/recommended'], 4 | env: { 5 | 'cypress/globals': true, 6 | }, 7 | plugins: ['cypress'], 8 | rules: { 9 | // Add cypress specific rules here 10 | 'cypress/no-assigning-return-values': 'error', 11 | 'cypress/no-unnecessary-waiting': 'error', 12 | 'cypress/assertion-before-screenshot': 'warn', 13 | 'cypress/no-force': 'warn', 14 | 'cypress/no-async-tests': 'error', 15 | }, 16 | }; 17 | -------------------------------------------------------------------------------- /.cypress/support/constants.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const ADMIN_AUTH = { 7 | username: 'admin', 8 | password: 'admin', 9 | }; 10 | -------------------------------------------------------------------------------- /.cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "baseUrl": "../node_modules", 5 | "types": ["cypress"] 6 | }, 7 | "include": ["**/*.*"] 8 | } 9 | -------------------------------------------------------------------------------- /.cypress/utils/flint-datasources/catalog-cache.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "1.0", 3 | "dataSources": [ 4 | { 5 | "name": "mys3", 6 | "lastUpdated": "Thu, 21 Mar 2024 22:01:13 GMT", 7 | "status": "Updated", 8 | "databases": [ 9 | { 10 | "name": "default", 11 | "tables": [ 12 | { 13 | "name": "http_logs" 14 | }, 15 | { 16 | "name": "http_logs_1" 17 | }, 18 | { 19 | "name": "table_no_timestamp" 20 | }, 21 | { 22 | "name": "table_struct" 23 | } 24 | ], 25 | "lastUpdated": "Thu, 21 Mar 2024 22:01:18 GMT", 26 | "status": "Updated" 27 | } 28 | ] 29 | } 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /.cypress/utils/jaeger-service-2023-01-24-mappings.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": { 3 | "operationName": { 4 | "type": "keyword", 5 | "ignore_above": 256 6 | }, 7 | "serviceName": { 8 | "type": "keyword", 9 | "ignore_above": 256 10 | } 11 | }, 12 | "dynamic_templates": [ 13 | { 14 | "span_tags_map": { 15 | "path_match": "tag.*", 16 | "mapping": { 17 | "ignore_above": 256, 18 | "type": "keyword" 19 | } 20 | } 21 | }, 22 | { 23 | "process_tags_map": { 24 | "path_match": "process.tag.*", 25 | "mapping": { 26 | "ignore_above": 256, 27 | "type": "keyword" 28 | } 29 | } 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /.cypress/utils/otel-v1-apm-service-map-mappings.json: -------------------------------------------------------------------------------- 1 | { 2 | "properties": { 3 | "destination": { 4 | "properties": { 5 | "domain": { "type": "keyword", "ignore_above": 1024 }, 6 | "resource": { "type": "keyword", "ignore_above": 1024 } 7 | } 8 | }, 9 | "hashId": { "type": "keyword", "ignore_above": 1024 }, 10 | "kind": { "type": "keyword", "ignore_above": 1024 }, 11 | "serviceName": { "type": "keyword", "ignore_above": 1024 }, 12 | "target": { 13 | "properties": { 14 | "domain": { "type": "keyword", "ignore_above": 1024 }, 15 | "resource": { "type": "keyword", "ignore_above": 1024 } 16 | } 17 | }, 18 | "traceGroupName": { "type": "keyword", "ignore_above": 1024 } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # version for opensearch & opensearch-dashboards docker image 2 | VERSION=3.0.0 3 | 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /data 3 | /build 4 | /target 5 | /.eslintrc.js 6 | /cypress.config.js 7 | !.cypress/ -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # This should match the owning team set up in https://github.com/orgs/opensearch-project/teams 2 | 3 | - @ps48 @kavithacm @derek-ho @joshuali925 @dai-chen @YANG-DB @rupal-bq @mengweieric @vamsi-amazon @swiddis @penghuo @seankao-az @anirudha @paulstn @sumukhswamy @sejli @TackAdam @RyanL1997 4 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🐛 Bug report 3 | about: Create a report to help us improve 4 | title: '[BUG]' 5 | labels: 'bug, untriaged' 6 | assignees: '' 7 | --- 8 | 9 | **What is the bug?** 10 | A clear and concise description of the bug. 11 | 12 | **How can one reproduce the bug?** 13 | Steps to reproduce the behavior: 14 | 1. Go to '...' 15 | 2. Click on '....' 16 | 3. Scroll down to '....' 17 | 4. See error 18 | 19 | **What is the expected behavior?** 20 | A clear and concise description of what you expected to happen. 21 | 22 | **What is your host/environment?** 23 | - OS: [e.g. iOS] 24 | - Version [e.g. 22] 25 | - Plugins 26 | 27 | **Do you have any screenshots?** 28 | If applicable, add screenshots to help explain your problem. 29 | 30 | **Do you have any additional context?** 31 | Add any other context about the problem. 32 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | contact_links: 2 | - name: OpenSearch Community Support 3 | url: https://discuss.opendistrocommunity.dev/ 4 | about: Please ask and answer questions here. 5 | - name: AWS/Amazon Security 6 | url: https://aws.amazon.com/security/vulnerability-reporting/ 7 | about: Please report security vulnerabilities here. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 🎆 Feature request 3 | about: Request a feature in this project 4 | title: '[FEATURE]' 5 | labels: 'enhancement, untriaged' 6 | assignees: '' 7 | --- 8 | **Is your feature request related to a problem?** 9 | A clear and concise description of what the problem is, e.g. _I'm always frustrated when [...]_ 10 | 11 | **What solution would you like?** 12 | A clear and concise description of what you want to happen. 13 | 14 | **What alternatives have you considered?** 15 | A clear and concise description of any alternative solutions or features you've considered. 16 | 17 | **Do you have any additional context?** 18 | Add any other context or screenshots about the feature request here. -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Description 2 | [Describe what this change achieves] 3 | 4 | ### Issues Resolved 5 | [List any issues this PR will resolve] 6 | 7 | ### Check List 8 | - [ ] New functionality includes testing. 9 | - [ ] All tests pass, including unit test, integration test and doctest 10 | - [ ] New functionality has been documented. 11 | - [ ] New functionality has javadoc added 12 | - [ ] New functionality has user manual doc added 13 | - [ ] Commits are signed per the DCO using --signoff 14 | 15 | By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license. 16 | For more information on following Developer Certificate of Origin and signing off your commits, please check [here](https://github.com/opensearch-project/OpenSearch/blob/main/CONTRIBUTING.md#developer-certificate-of-origin). 17 | -------------------------------------------------------------------------------- /.github/workflows/add-untriaged.yml: -------------------------------------------------------------------------------- 1 | name: Apply 'untriaged' label during issue lifecycle 2 | 3 | on: 4 | issues: 5 | types: [opened, reopened, transferred] 6 | 7 | jobs: 8 | apply-label: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/github-script@v6 12 | with: 13 | script: | 14 | github.rest.issues.addLabels({ 15 | issue_number: context.issue.number, 16 | owner: context.repo.owner, 17 | repo: context.repo.repo, 18 | labels: ['untriaged'] 19 | }) 20 | -------------------------------------------------------------------------------- /.github/workflows/backport.yml: -------------------------------------------------------------------------------- 1 | name: Backport 2 | on: 3 | pull_request_target: 4 | types: 5 | - closed 6 | - labeled 7 | 8 | jobs: 9 | backport: 10 | if: github.event.pull_request.merged == true 11 | runs-on: ubuntu-latest 12 | permissions: 13 | contents: write 14 | pull-requests: write 15 | name: Backport 16 | steps: 17 | - name: GitHub App token 18 | id: github_app_token 19 | uses: tibdex/github-app-token@v1.5.0 20 | with: 21 | app_id: ${{ secrets.APP_ID }} 22 | private_key: ${{ secrets.APP_PRIVATE_KEY }} 23 | installation_id: 22958780 24 | 25 | - name: Backport 26 | uses: VachaShah/backport@v2.2.0 27 | with: 28 | github_token: ${{ steps.github_app_token.outputs.token }} 29 | head_template: backport/backport-<%= number %>-to-<%= base %> 30 | failure_labels: backport-failed 31 | -------------------------------------------------------------------------------- /.github/workflows/delete_backport_branch.yml: -------------------------------------------------------------------------------- 1 | name: Delete merged branch of the backport PRs 2 | on: 3 | pull_request: 4 | types: 5 | - closed 6 | 7 | jobs: 8 | delete-branch: 9 | runs-on: ubuntu-latest 10 | if: startsWith(github.event.pull_request.head.ref,'backport/') 11 | steps: 12 | - name: Delete merged branch 13 | uses: SvanBoxel/delete-merged-branch@main 14 | env: 15 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 16 | -------------------------------------------------------------------------------- /.github/workflows/draft-release-notes-workflow.yml: -------------------------------------------------------------------------------- 1 | name: Release Drafter 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | update_release_draft: 10 | name: Update draft release notes 11 | runs-on: ubuntu-latest 12 | steps: 13 | # Drafts your next Release notes as Pull Requests are merged into "main" 14 | - name: Update draft release notes 15 | uses: release-drafter/release-drafter@v5 16 | with: 17 | config-name: draft-release-notes-config.yml 18 | tag: (None) 19 | version: x.x.0.0 20 | env: 21 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 22 | -------------------------------------------------------------------------------- /.github/workflows/enforce-labels.yml: -------------------------------------------------------------------------------- 1 | name: Enforce PR labels 2 | 3 | on: 4 | pull_request: 5 | types: [labeled, unlabeled, opened, edited, synchronize] 6 | jobs: 7 | enforce-label: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: yogevbd/enforce-label-action@2.1.0 11 | with: 12 | REQUIRED_LABELS_ANY: "breaking,feature,enhancement,bug,infrastructure,dependencies,documentation,maintenance,skip-changelog" 13 | REQUIRED_LABELS_ANY_DESCRIPTION: "A release label is required: ['breaking', 'bug', 'dependencies', 'documentation', 'enhancement', 'feature', 'infrastructure', 'maintenance', 'skip-changelog']" 14 | -------------------------------------------------------------------------------- /.github/workflows/link-checker.yml: -------------------------------------------------------------------------------- 1 | name: Link Checker 2 | on: 3 | push: 4 | branches: [main] 5 | pull_request: 6 | branches: [main] 7 | 8 | jobs: 9 | linkchecker: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v4 14 | - name: lychee Link Checker 15 | id: lychee 16 | uses: lycheeverse/lychee-action@master 17 | with: 18 | args: --accept=200,403,429 "./**/*.html" "./**/*.md" "./**/*.txt" --exclude "http://localhost" --exclude "https://localhost" 19 | env: 20 | GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} 21 | - name: Fail if there were link errors 22 | run: exit ${{ steps.lychee.outputs.exit_code }} 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | target/ 3 | build/ 4 | coverage/ 5 | .cypress/screenshots 6 | .cypress/videos 7 | .cypress/downloads 8 | common/query_manager/antlr/output 9 | .eslintcache 10 | -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/hooks/check-test-only.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Get all staged files 4 | staged_files=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|jsx|ts|tsx)$') 5 | 6 | if [[ -z "$staged_files" ]]; then 7 | exit 0 8 | fi 9 | 10 | # Check for .only in Jest or Cypress test files 11 | only_pattern="(describe|it|test|context|cy)\.only\(" 12 | found_only=false 13 | 14 | for file in $staged_files; do 15 | # Check if file has .only 16 | if grep -E "$only_pattern" "$file" > /dev/null; then 17 | echo "Error: Found .only in $file" 18 | echo "Please remove all instances of .only before committing" 19 | found_only=true 20 | fi 21 | done 22 | 23 | if [[ "$found_only" = true ]]; then 24 | exit 1 25 | fi 26 | 27 | exit 0 -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn lint-staged 5 | -------------------------------------------------------------------------------- /.lycheeignore: -------------------------------------------------------------------------------- 1 | opensearch-dashboards 2 | kubernetes.default.svc.cluster.local 3 | observability.playground.opensearch.org 4 | -------------------------------------------------------------------------------- /.whitesource: -------------------------------------------------------------------------------- 1 | { 2 | "scanSettings": { 3 | "configMode": "AUTO", 4 | "configExternalURL": "", 5 | "projectToken": "", 6 | "baseBranches": [] 7 | }, 8 | "checkRunSettings": { 9 | "vulnerableCheckRunConclusionLevel": "failure", 10 | "displayMode": "diff" 11 | }, 12 | "issueSettings": { 13 | "minSeverityLevel": "LOW" 14 | } 15 | } -------------------------------------------------------------------------------- /ADMINS.md: -------------------------------------------------------------------------------- 1 | ## Admins 2 | 3 | [This document](https://github.com/opensearch-project/.github/blob/main/ADMINS.md) explains what admins do in this repo. and how they should be doing it. -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing to this Project 2 | 3 | OpenSearch is a community project that is built and maintained by people just like **you**. 4 | [This document](https://github.com/opensearch-project/.github/blob/main/CONTRIBUTING.md) explains how you can contribute to this and related projects. -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Declare a build argument for the version 2 | ARG VERSION 3 | 4 | # Use OpenSearch image as base 5 | FROM opensearchproject/opensearch-dashboards:${VERSION} 6 | 7 | # Copy plugin zip into image 8 | COPY ./build /tmp 9 | 10 | USER root 11 | RUN mv /tmp/observabilityDashboards*.zip /tmp/observabilityDashboards.zip 12 | USER opensearch-dashboards 13 | 14 | RUN /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin remove observabilityDashboards && \ 15 | /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin install file:///tmp/observabilityDashboards.zip 16 | 17 | USER root 18 | RUN rm -r /tmp/observabilityDashboards.zip 19 | 20 | # Switch back to opensearch user 21 | USER opensearch-dashboards 22 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | OpenSearch (https://opensearch.org/) 2 | Copyright OpenSearch Contributors -------------------------------------------------------------------------------- /RELEASING.md: -------------------------------------------------------------------------------- 1 | This project follows the [OpenSearch release process](https://github.com/opensearch-project/.github/blob/main/RELEASING.md). -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | ## Reporting a Vulnerability 2 | 3 | If you discover a potential security issue in this project we ask that you notify OpenSearch Security directly via email to security@opensearch.org. Please do **not** create a public GitHub issue. 4 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | ignore: 2 | - "common/query_manager/antlr/output" 3 | fixes: 4 | - "OpenSearch-Dashboards/plugins/dashboards-observability/::" 5 | -------------------------------------------------------------------------------- /common/constants/application_analytics.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const TAB_OVERVIEW_ID = 'app-analytics-overview'; 7 | export const TAB_SERVICE_ID = 'app-analytics-service'; 8 | export const TAB_TRACE_ID = 'app-analytics-trace'; 9 | export const TAB_LOG_ID = 'app-analytics-log'; 10 | export const TAB_PANEL_ID = 'app-analytics-panel'; 11 | export const TAB_CONFIG_ID = 'app-analytics-config'; 12 | export const TAB_OVERVIEW_TITLE = 'Overview'; 13 | export const TAB_SERVICE_TITLE = 'Services'; 14 | export const TAB_TRACE_TITLE = 'Traces & Spans'; 15 | export const TAB_LOG_TITLE = 'Log Events'; 16 | export const TAB_PANEL_TITLE = 'Panel'; 17 | export const TAB_CONFIG_TITLE = 'Configuration'; 18 | 19 | export const APP_ANALYTICS_API_PREFIX = '/api/observability/application'; 20 | -------------------------------------------------------------------------------- /common/constants/data_table.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const GRID_HEADER_COLUMN_MAX_WIDTH = '150px'; 7 | export const GRID_PAGE_RANGE_DISPLAY = 5; 8 | export const COLUMN_DEFAULT_MIN_WIDTH = 100; 9 | export const GRID_PAGE_SIZES = [10, 50, 100]; 10 | export const ROW_DENSITIES = [ 11 | { icon: 'tableDensityExpanded', height: 55, selected: false }, 12 | { icon: 'tableDensityNormal', height: 45, selected: false }, 13 | { icon: 'tableDensityCompact', height: 35, selected: true }, 14 | ]; 15 | 16 | export const HEADER_HEIGHT = 35; 17 | -------------------------------------------------------------------------------- /common/constants/integrations.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const OPENSEARCH_DOCUMENTATION_URL = 'https://opensearch.org/docs/latest/integrations/index'; 7 | export const ASSET_FILTER_OPTIONS = [ 8 | 'index-pattern', 9 | 'search', 10 | 'visualization', 11 | 'dashboard', 12 | 'observability-search', 13 | ]; 14 | export const VALID_INDEX_NAME = /^[a-z\d\.][a-z\d\._\-\*]*$/; 15 | export const OPENSEARCH_CATALOG_URL = 16 | 'https://github.com/opensearch-project/opensearch-catalog/releases'; 17 | 18 | // Upstream doesn't export this, so we need to redeclare it for our use. 19 | export type Color = 'success' | 'primary' | 'warning' | 'danger' | undefined; 20 | 21 | export const integrationsBreadcrumb = 'Integrations'; 22 | -------------------------------------------------------------------------------- /common/constants/notebooks.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const NOTEBOOKS_API_PREFIX = '/api/observability/notebooks'; 7 | export const NOTEBOOKS_FETCH_SIZE = 1000; 8 | export const CREATE_NOTE_MESSAGE = 'Enter a name to describe the purpose of this notebook.'; 9 | export const NOTEBOOKS_DOCUMENTATION_URL = 10 | 'https://opensearch.org/docs/latest/observability-plugin/notebooks/'; 11 | 12 | export const zeppelinURL = 'http://localhost:8080'; 13 | 14 | export const wreckOptions = { 15 | baseUrl: zeppelinURL, 16 | headers: { 'Content-Type': 'application/json' }, 17 | }; 18 | 19 | const BASE_NOTEBOOKS_URI = '/_plugins/_notebooks'; 20 | export const OPENSEARCH_NOTEBOOKS_API = { 21 | GET_NOTEBOOKS: `${BASE_NOTEBOOKS_URI}/notebooks`, 22 | NOTEBOOK: `${BASE_NOTEBOOKS_URI}/notebook`, 23 | }; 24 | -------------------------------------------------------------------------------- /common/constants/overview.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const observabilityDashboardsKey = 'observability:defaultDashboard'; 7 | export const observabilityShowCardsKey = 'observability:overviewCardsDisplay'; 8 | -------------------------------------------------------------------------------- /common/constants/query_assist.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | const QUERY_ASSIST_API_PREFIX = '/api/observability/query_assist'; 7 | export const QUERY_ASSIST_API = { 8 | CONFIGURED: `${QUERY_ASSIST_API_PREFIX}/configured`, 9 | GENERATE_PPL: `${QUERY_ASSIST_API_PREFIX}/generate_ppl`, 10 | SUMMARIZE: `${QUERY_ASSIST_API_PREFIX}/summarize`, 11 | }; 12 | 13 | export const ML_COMMONS_API_PREFIX = '/_plugins/_ml'; 14 | 15 | export const ERROR_DETAILS = { GUARDRAILS_TRIGGERED: 'guardrails triggered' }; 16 | -------------------------------------------------------------------------------- /common/query_manager/ast/builder/query_builder.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export interface QueryBuilder { 7 | build: () => T; 8 | } 9 | -------------------------------------------------------------------------------- /common/query_manager/ast/expression/AggregateTerm.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | import { CUSTOM_LABEL } from '../../../../common/constants/explorer'; 6 | import { PPLNode } from '../node'; 7 | export class AggregateTerm extends PPLNode { 8 | constructor( 9 | name: string, 10 | children: PPLNode[], 11 | private statsFunction: PPLNode, 12 | private customLabel: string 13 | ) { 14 | super(name, children); 15 | } 16 | 17 | getTokens() { 18 | return { 19 | function: this.statsFunction.getTokens(), 20 | [CUSTOM_LABEL]: this[CUSTOM_LABEL], 21 | }; 22 | } 23 | 24 | toString(): string { 25 | if (this[CUSTOM_LABEL]) { 26 | return `${this.statsFunction.toString()}${ 27 | this[CUSTOM_LABEL] ? ` as ${this[CUSTOM_LABEL]}` : '' 28 | }`; 29 | } 30 | return `${this.statsFunction.toString()}`; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /common/query_manager/ast/expression/field.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { PPLNode } from '../node'; 7 | 8 | export class Field extends PPLNode { 9 | constructor(name: string, children: Array, private fieldExpression: string) { 10 | super(name, children); 11 | } 12 | 13 | getTokens() { 14 | return { name: this.fieldExpression ?? '' }; 15 | } 16 | 17 | toString(): string { 18 | return this.fieldExpression ?? ''; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /common/query_manager/ast/expression/index.ts: -------------------------------------------------------------------------------- 1 | export { AggregateFunction } from './AggregateFunction'; 2 | export { AggregateTerm } from './AggregateTerm'; 3 | export { GroupBy } from './group_by'; 4 | export { Span } from './span'; 5 | export { SpanExpression } from './spanExpression'; 6 | export { Field } from './field'; 7 | -------------------------------------------------------------------------------- /common/query_manager/ast/expression/span.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { PPLNode } from '../node'; 7 | 8 | export class Span extends PPLNode { 9 | constructor( 10 | name: string, 11 | children: PPLNode[], 12 | private spanExpression: PPLNode, 13 | private customLabel: string 14 | ) { 15 | super(name, children); 16 | } 17 | 18 | getTokens() { 19 | return { 20 | span_expression: this.spanExpression.getTokens(), 21 | customLabel: this.customLabel, 22 | }; 23 | } 24 | 25 | toString(): string { 26 | return `${this.spanExpression.toString()}${this.customLabel ? ` as ${this.customLabel}` : ''}`; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /common/query_manager/ast/expression/spanExpression.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { PPLNode } from '../node'; 7 | 8 | export class SpanExpression extends PPLNode { 9 | constructor( 10 | name: string, 11 | children: Array, 12 | private fieldExpression: string, 13 | private literalValue: string, 14 | private timeUnit: string 15 | ) { 16 | super(name, children); 17 | } 18 | 19 | getTokens() { 20 | return { 21 | field: this.fieldExpression, 22 | literal_value: this.literalValue, 23 | time_unit: this.timeUnit, 24 | }; 25 | } 26 | 27 | toString(): string { 28 | return `span(${this.fieldExpression}, ${this.literalValue}${this.timeUnit})`; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /common/query_manager/ast/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { PPLNode } from './node'; 7 | -------------------------------------------------------------------------------- /common/query_manager/ast/node.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | interface PPLNodeProps { 7 | getName: () => string; 8 | getChildren: () => Array; 9 | toString: () => string; 10 | getTokens: () => any; 11 | } 12 | 13 | export class PPLNode implements PPLNodeProps { 14 | constructor(private name: string, private children: Array) {} 15 | 16 | getChildren(): Array { 17 | return this.children; 18 | } 19 | 20 | getName(): string { 21 | return this.name; 22 | } 23 | 24 | toString(): string { 25 | return ''; 26 | } 27 | 28 | getTokens(): any { 29 | return null; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /common/query_manager/ast/types/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { 7 | ExpressionChunk, 8 | SpanChunk, 9 | StatsAggregationChunk, 10 | StatsAggregationFunctionChunk, 11 | GroupByChunk, 12 | GroupField, 13 | StatsChunk, 14 | SpanExpressionChunk, 15 | AggregationConfigurations, 16 | PreviouslyParsedStaleStats 17 | } from './stats'; 18 | -------------------------------------------------------------------------------- /common/query_manager/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { QueryManager } from './ppl_query_manager'; 7 | -------------------------------------------------------------------------------- /common/query_manager/ppl_query_manager.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { PPLQueryBuilder } from './query_builder/ppl_query_builder'; 7 | import { PPLQueryParser } from './query_parser/ppl_query_parser'; 8 | 9 | export class QueryManager { 10 | queryBuilder(): PPLQueryBuilder { 11 | return new PPLQueryBuilder(); 12 | } 13 | 14 | queryParser(): PPLQueryParser { 15 | return new PPLQueryParser(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /common/query_manager/query_builder/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { PPLQueryBuilder } from './ppl_query_builder'; 7 | -------------------------------------------------------------------------------- /common/query_manager/query_parser/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { PPLQueryParser } from './ppl_query_parser'; 7 | -------------------------------------------------------------------------------- /common/types/application_analytics.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export interface OptionType { 7 | label: string; 8 | } 9 | 10 | export interface ApplicationType { 11 | id: string; 12 | dateCreated: string; 13 | dateModified: string; 14 | name: string; 15 | description: string; 16 | baseQuery: string; 17 | servicesEntities: string[]; 18 | traceGroups: string[]; 19 | panelId: string; 20 | availability: { name: string; color: string; availabilityVisId: string }; 21 | } 22 | 23 | export interface ApplicationRequestType { 24 | name: string; 25 | description: string; 26 | baseQuery: string; 27 | servicesEntities: string[]; 28 | traceGroups: string[]; 29 | panelId: string; 30 | availabilityVisId: string; 31 | } 32 | 33 | export interface AvailabilityType { 34 | name: string; 35 | color: string; 36 | availabilityVisId: string; 37 | } 38 | -------------------------------------------------------------------------------- /common/types/metrics.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { VisualizationType } from './custom_panels'; 7 | type MetricTypes = 'savedCustomMetric' | 'prometheusMetric' | 'openTelemetryMetric'; 8 | 9 | export interface MetricType extends VisualizationType { 10 | id: string; 11 | savedVisualizationId: string; 12 | x: number; 13 | y: number; 14 | w: number; 15 | h: number; 16 | query: { 17 | type: MetricTypes; 18 | aggregation: string; 19 | attributesGroupBy: string[]; 20 | catalog: string; 21 | availableAttributes?: string[]; 22 | }; 23 | } 24 | 25 | export interface OptionType { 26 | label: string; 27 | 'data-test-subj': string; 28 | } 29 | -------------------------------------------------------------------------------- /common/types/overview.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export interface DashboardState { 7 | startDate: string; 8 | endDate: string; 9 | dashboardTitle: string; 10 | dashboardId: string; 11 | } 12 | 13 | export interface DashboardSavedObjectsType { 14 | [key: string]: { 15 | value: string; 16 | label: string; 17 | startDate: string; 18 | endDate: string; 19 | }; 20 | } 21 | -------------------------------------------------------------------------------- /common/utils/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { 7 | getIndexPatternFromRawQuery, 8 | preprocessQuery, 9 | buildQuery, 10 | buildRawQuery, 11 | composeFinalQuery, 12 | removeBacktick, 13 | getSavingCommonParams, 14 | } from '../../public/components/common/query_utils'; 15 | 16 | export * from './core_services'; 17 | -------------------------------------------------------------------------------- /common/utils/query_session_utils.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { ASYNC_QUERY_SESSION_ID } from '../constants/shared'; 7 | 8 | export const setAsyncSessionId = (dataSource: string, value: string | null) => { 9 | if (value !== null) { 10 | sessionStorage.setItem(`${ASYNC_QUERY_SESSION_ID}_${dataSource}`, value); 11 | } 12 | }; 13 | 14 | export const getAsyncSessionId = (dataSource: string) => { 15 | return sessionStorage.getItem(`${ASYNC_QUERY_SESSION_ID}_${dataSource}`); 16 | }; 17 | -------------------------------------------------------------------------------- /common/utils/set_nav_bread_crumbs.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiBreadcrumb } from '@elastic/eui'; 7 | import { coreRefs } from '../../public/framework/core_refs'; 8 | 9 | export const setNavBreadCrumbs = ( 10 | parentBreadCrumb: EuiBreadcrumb[], 11 | pageBreadCrumb: EuiBreadcrumb[], 12 | counter?: number 13 | ) => { 14 | const isNavGroupEnabled = coreRefs?.chrome?.navGroup.getNavGroupEnabled(); 15 | 16 | const updatedPageBreadCrumb = pageBreadCrumb.map((crumb) => ({ 17 | ...crumb, 18 | text: isNavGroupEnabled && counter !== undefined ? `${crumb.text} (${counter})` : crumb.text, 19 | })); 20 | 21 | if (isNavGroupEnabled) { 22 | coreRefs?.chrome?.setBreadcrumbs([...updatedPageBreadCrumb]); 23 | } else { 24 | coreRefs?.chrome?.setBreadcrumbs([...parentBreadCrumb, ...updatedPageBreadCrumb]); 25 | } 26 | }; 27 | -------------------------------------------------------------------------------- /common/utils/visualization_helpers.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { isEmpty, isString } from 'lodash'; 7 | 8 | /* The file contains helper functions for visualizaitons operations 9 | * getUserConfigFrom - returns input objects' user_configs or userConfigs, JSON parsed if necessary 10 | */ 11 | 12 | export const getUserConfigFrom = (container: unknown): object => { 13 | const config = container?.user_configs || container?.userConfigs || {}; 14 | 15 | if (isEmpty(config)) return {}; 16 | 17 | if (isString(config)) return JSON.parse(config); 18 | else return {}; 19 | }; 20 | -------------------------------------------------------------------------------- /docs/integrations/README.md: -------------------------------------------------------------------------------- 1 | # OpenSearch Integrations 2 | 3 | This is the developer documentation for OpenSearch Integrations. 4 | 5 | Some major documents to look at: 6 | - [Setup](setup.md) explains the major steps of the integration setup process behind the scenes, 7 | which gives context for how integration content is assembled. To get more into developing 8 | integrations directly, there's the related [Config](config.md) document. 9 | -------------------------------------------------------------------------------- /docs/integrations/doc_assets/dashboard_export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/docs/integrations/doc_assets/dashboard_export.png -------------------------------------------------------------------------------- /docs/integrations/doc_assets/dashboard_import.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/docs/integrations/doc_assets/dashboard_import.png -------------------------------------------------------------------------------- /docs/integrations/doc_assets/index_pattern_creation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/docs/integrations/doc_assets/index_pattern_creation.png -------------------------------------------------------------------------------- /docs/integrations/doc_assets/index_pattern_time_field.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/docs/integrations/doc_assets/index_pattern_time_field.png -------------------------------------------------------------------------------- /docs/integrations/doc_assets/visualization_configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/docs/integrations/doc_assets/visualization_configuration.png -------------------------------------------------------------------------------- /docs/integrations/doc_assets/visualization_index_pattern_selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/docs/integrations/doc_assets/visualization_index_pattern_selection.png -------------------------------------------------------------------------------- /docs/integrations/doc_assets/visualization_type_selection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/docs/integrations/doc_assets/visualization_type_selection.png -------------------------------------------------------------------------------- /opensearch-dashboards-plugin-helpers.dev.json: -------------------------------------------------------------------------------- 1 | { 2 | "serverSourcePatterns": [ 3 | "package.json", 4 | "yarn.lock", 5 | "tsconfig.json", 6 | "{common,public,server,test}/**/*", 7 | "!__tests__" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /opensearch_dashboards.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "observabilityDashboards", 3 | "version": "3.1.0.0", 4 | "opensearchDashboardsVersion": "3.1.0", 5 | "server": true, 6 | "ui": true, 7 | "requiredPlugins": [ 8 | "charts", 9 | "dashboard", 10 | "data", 11 | "embeddable", 12 | "inspector", 13 | "navigation", 14 | "opensearchDashboardsReact", 15 | "opensearchDashboardsUtils", 16 | "savedObjects", 17 | "uiActions", 18 | "urlForwarding", 19 | "visualizations", 20 | "contentManagement" 21 | ], 22 | "optionalPlugins": [ 23 | "managementOverview", 24 | "assistantDashboards", 25 | "securityDashboards", 26 | "dataSource", 27 | "dataSourceManagement" 28 | ], 29 | "configPath": [ 30 | "observability" 31 | ], 32 | "supportedOSDataSourceVersions": ">=2.9.0", 33 | "requiredOSDataSourcePlugins": [ 34 | "opensearch-sql", 35 | "opensearch-observability" 36 | ] 37 | } -------------------------------------------------------------------------------- /public/components/application_analytics/__tests__/flyout.test.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { configure, mount } from 'enzyme'; 8 | import Adapter from 'enzyme-adapter-react-16'; 9 | import httpClientMock from '../../../../test/__mocks__/httpClientMock'; 10 | import { TraceDetailRender } from '../components/flyout_components/trace_detail_render'; 11 | 12 | describe('Trace Detail Render Flyout component', () => { 13 | configure({ adapter: new Adapter() }); 14 | 15 | it('render trace detail', () => { 16 | const wrapper = mount( 17 | {}} 21 | mode="jaeger" 22 | /> 23 | ); 24 | 25 | expect(wrapper).toMatchSnapshot(); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /public/components/application_analytics/app_analytics.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .query-area { 7 | width: 900px; 8 | } 9 | 10 | #logSource { 11 | overflow: visible; 12 | position: relative; 13 | z-index: 10; 14 | .ppl-link { 15 | top: 103px; 16 | right: 140px; 17 | } 18 | } 19 | 20 | #baseQueryCallout { 21 | max-width: 900px; 22 | } 23 | 24 | #compositionColumn { 25 | width: 300px; 26 | text-overflow: ellipsis; 27 | white-space: nowrap; 28 | overflow: hidden; 29 | } 30 | -------------------------------------------------------------------------------- /public/components/common/debounced_component/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export * from './debounced_component'; 7 | -------------------------------------------------------------------------------- /public/components/common/field_button/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export * from './field_button'; 7 | -------------------------------------------------------------------------------- /public/components/common/field_icon/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export * from './field_icon'; 7 | -------------------------------------------------------------------------------- /public/components/common/flyout_containers/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { FlyoutContainers } from './flyout_containers'; 7 | -------------------------------------------------------------------------------- /public/components/common/helpers/format_number_with_commas.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | const COMMA_SEPARATOR_RE = /(\d)(?=(\d{3})+(?!\d))/g; 7 | 8 | /** 9 | * Converts a number to a string and adds commas 10 | * as thousands separators 11 | */ 12 | export const formatNumWithCommas = (input: number) => 13 | String(input).replace(COMMA_SEPARATOR_RE, '$1,'); 14 | -------------------------------------------------------------------------------- /public/components/common/helpers/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { formatNumWithCommas } from './format_number_with_commas'; 7 | export { PPLReferenceFlyout } from './ppl_reference_flyout'; 8 | -------------------------------------------------------------------------------- /public/components/common/helpers/ppl_docs/commands/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { dedupCmd } from './dedup'; 7 | export { evalCmd } from './eval'; 8 | export { fieldsCmd } from './fields'; 9 | export { headCmd } from './head'; 10 | export { parseCmd } from './parse'; 11 | export { rareCmd } from './rare'; 12 | export { renameCmd } from './rename'; 13 | export { searchCmd } from './search'; 14 | export { sortCmd } from './sort'; 15 | export { statsCmd } from './stats'; 16 | export { syntaxCmd } from './syntax'; 17 | export { topCmd } from './top'; 18 | export { whereCmd } from './where'; 19 | -------------------------------------------------------------------------------- /public/components/common/helpers/ppl_docs/commands/syntax.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const syntaxCmd = `## Syntax 7 | --- 8 | ### Command order 9 | 10 | The PPL query starts with a \`search\` command to reference a table to search. 11 | Commands can be in any order. For example, in the following query, the \`search\` command references the \`accounts\` index as the source and then uses fields and a \`where\` command to perform further processing. 12 | 13 | \`\`\` 14 | search source=accounts 15 | | where age > 18 16 | | fields firstname, lastname 17 | \`\`\` 18 | 19 | ### Required and optional arguments 20 | 21 | Required arguments are enclosed in angle brackets \< \>, and optional arguments are enclosed in square brackets \[ \].`; 22 | -------------------------------------------------------------------------------- /public/components/common/helpers/ppl_docs/functions/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { datetimeFunction } from './datetime'; 7 | export { conditionFunction } from './condition'; 8 | export { mathFunction } from './math'; 9 | export { stringFunction } from './string'; 10 | export { fullTextSearchFunction } from './full_text_search'; 11 | -------------------------------------------------------------------------------- /public/components/common/helpers/ppl_docs/language_structure/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export {pplDatatypes} from './datatypes'; 7 | export {pplIdentifiers} from './identifiers'; -------------------------------------------------------------------------------- /public/components/common/search/queries/data_queries.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const getDataValueQuery = (index: string, field: string) => { 7 | const query = { 8 | index: index, 9 | 'size': 0, 10 | 'aggs': { 11 | 'top_tags': { 12 | 'terms': { 13 | 'field': field, 14 | } 15 | } 16 | } 17 | } 18 | return query; 19 | } 20 | -------------------------------------------------------------------------------- /public/components/common/search/query_area.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .ppl-query-accordion { 7 | padding: $euiSizeS; 8 | } 9 | -------------------------------------------------------------------------------- /public/components/common/search/request_handler.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { CoreStart } from '../../../../../../src/core/public'; 7 | 8 | const DSL_ROUTE = '/api/dsl/search'; 9 | 10 | export function handleDslRequest(http: CoreStart['http'], query) { 11 | return http 12 | .post(DSL_ROUTE, { 13 | body: JSON.stringify(query), 14 | }) 15 | .catch((error) => console.error(error)); 16 | } 17 | -------------------------------------------------------------------------------- /public/components/common/types.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export interface FieldCapAttributes { 7 | type: string; 8 | searchable: boolean; 9 | aggregatable: boolean; 10 | } 11 | 12 | export interface FieldCapResponse { 13 | indices: string[]; 14 | fields: Record>; 15 | } 16 | -------------------------------------------------------------------------------- /public/components/custom_panels/helpers/panel_state_reducer.ts: -------------------------------------------------------------------------------- 1 | import { CUSTOM_PANELS_SAVED_OBJECT_TYPE } from "common/constants/custom_panels" 2 | import { coreRefs } from "public/framework/core_refs" 3 | 4 | 5 | const FETCH = 'fetch' 6 | 7 | /* 8 | ** ACTIONS 9 | */ 10 | const fetchPanel = (id) => ({ type: FETCH, id }) 11 | 12 | export const Actions = { fetchPanel } 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/components/custom_panels/panel_modules/panel_grid/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { PanelGrid } from "./panel_grid"; 7 | -------------------------------------------------------------------------------- /public/components/custom_panels/panel_modules/panel_grid/panel_grid.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .react-grid-layout { 7 | & .react-grid-placeholder { 8 | background: $euiColorWarning; 9 | } 10 | } 11 | 12 | .full-width { 13 | min-width: 100%; 14 | max-width: 100%; 15 | } 16 | -------------------------------------------------------------------------------- /public/components/custom_panels/panel_modules/visualization_container/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { VisualizationContainer } from "./visualization_container"; 7 | -------------------------------------------------------------------------------- /public/components/custom_panels/panel_modules/visualization_flyout/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { VisaulizationFlyout } from "./visualization_flyout"; 7 | -------------------------------------------------------------------------------- /public/components/custom_panels/panel_modules/visualization_flyout/visualization_flyout.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .visualization-div-preview { 7 | min-height: 50vh; 8 | } 9 | 10 | .visualization-loading-chart-preview { 11 | margin: 0; 12 | position: absolute; 13 | top: 50%; 14 | left: 50%; 15 | -ms-transform: translate(-50%, -50%); 16 | -moz-transform: translate(-50%, -50%); 17 | -webkit-transform: translate(-50%, -50%); 18 | -o-transform: translate(-50%, -50%); 19 | transform: translate(-50%, -50%); 20 | } 21 | 22 | .visualization-error-div-preview { 23 | overflow: scroll; 24 | } 25 | 26 | .date-picker-preview { 27 | height: 3vh; 28 | max-width: 500px; 29 | } 30 | 31 | .viz-error-btn { 32 | height: 26px; 33 | line-height: 26px; 34 | font-size: 0.8rem; 35 | } 36 | -------------------------------------------------------------------------------- /public/components/datasources/components/__tests__/manage_data_connections_description.test.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { configure, mount } from 'enzyme'; 7 | import Adapter from 'enzyme-adapter-react-16'; 8 | import { waitFor } from '@testing-library/react'; 9 | import React from 'react'; 10 | import { DataConnectionsDescription } from '../manage/manage_data_connections_description'; 11 | 12 | describe('Manage Data Connections Description test', () => { 13 | configure({ adapter: new Adapter() }); 14 | 15 | it('Renders manage data connections description', async () => { 16 | const wrapper = mount( {}} />); 17 | 18 | await waitFor(() => { 19 | expect(wrapper).toMatchSnapshot(); 20 | }); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /public/components/datasources/components/__tests__/no_access.test.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { configure, mount } from 'enzyme'; 7 | import Adapter from 'enzyme-adapter-react-16'; 8 | import React from 'react'; 9 | import { NoAccess } from '../no_access'; 10 | 11 | describe('No access test', () => { 12 | configure({ adapter: new Adapter() }); 13 | 14 | it('Renders no access view of data source', async () => { 15 | const wrapper = mount(); 16 | 17 | expect(wrapper).toMatchSnapshot(); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/accelerations/create_accelerations_flyout/create/__tests__/__snapshots__/create_acceleration_button.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Create acceleration button component renders create acceleration button component with mv state 1`] = ` 4 | 25 | `; 26 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/accelerations/create_accelerations_flyout/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { CreateAcceleration } from './create/create_acceleration'; 7 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/accelerations/create_accelerations_flyout/visual_editors/skipping_index/__tests__/__snapshots__/generate_fields.test.tsx.snap: -------------------------------------------------------------------------------- 1 | // Jest Snapshot v1, https://goo.gl/fbAQLP 2 | 3 | exports[`Generate fields in skipping index Generate fields in skipping index with default options 1`] = ` 4 | Array [ 5 | , 26 | "", 27 | ] 28 | `; 29 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/associated_objects/accelerations_recommendation_callout.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiCallOut } from '@elastic/eui'; 7 | import React from 'react'; 8 | 9 | export const AccelerationsRecommendationCallout = () => { 10 | return ( 11 | 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/associated_objects/utils/associated_objects_refresh_button.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiSmallButton } from '@elastic/eui'; 7 | import React from 'react'; 8 | import { ASSC_OBJ_REFRESH_BTN } from './associated_objects_tab_utils'; 9 | 10 | interface AssociatedObjectsRefreshButtonProps { 11 | isLoading: boolean; 12 | onClick: () => void; 13 | } 14 | 15 | export const AssociatedObjectsRefreshButton: React.FC = ( 16 | props 17 | ) => { 18 | const { isLoading, onClick } = props; 19 | 20 | return ( 21 | 22 | {ASSC_OBJ_REFRESH_BTN} 23 | 24 | ); 25 | }; 26 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/associated_objects/utils/associated_objects_tab_failure.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiEmptyPrompt } from '@elastic/eui'; 7 | import React from 'react'; 8 | 9 | interface AssociatedObjectsTabFailureProps { 10 | type: string; 11 | } 12 | 13 | export const AssociatedObjectsTabFailure = (props: AssociatedObjectsTabFailureProps) => { 14 | const { type } = props; 15 | return ( 16 | Error} body={

Error loading {type}

} /> 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/associated_objects/utils/associated_objects_tab_loading.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiEmptyPrompt, EuiLoadingSpinner } from '@elastic/eui'; 7 | import React from 'react'; 8 | 9 | interface AssociatedObjectsTabLoadingProps { 10 | objectType: string; 11 | warningMessage: boolean; 12 | } 13 | 14 | export const AssociatedObjectsTabLoading: React.FC = (props) => { 15 | const { objectType, warningMessage } = props; 16 | 17 | const BodyText = ( 18 | <> 19 |

Loading {objectType}

20 | {warningMessage ?

This may take a moment.

: <>} 21 | 22 | ); 23 | 24 | return } body={BodyText} />; 25 | }; 26 | -------------------------------------------------------------------------------- /public/components/datasources/components/manage/connection_management_callout.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiCallOut } from '@elastic/eui'; 7 | import React from 'react'; 8 | 9 | export const ConnectionManagementCallout = () => { 10 | return ( 11 | 12 | Access to data may be managed in other systems outside of OpenSearch. Check with your 13 | administrator for additional configurations. 14 | 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /public/components/datasources/components/new/new_datasource.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiPage, EuiPageBody } from '@elastic/eui'; 7 | import React, { useEffect } from 'react'; 8 | import { DataConnectionsHeader } from '../data_connections_header'; 9 | import { HomeProps } from '../../home'; 10 | import { NewDatasourceCardView } from './new_datasource_card_view'; 11 | 12 | export const NewDatasource = (props: HomeProps) => { 13 | const { chrome } = props; 14 | 15 | useEffect(() => { 16 | chrome.setBreadcrumbs([ 17 | { 18 | text: 'Data sources', 19 | href: '#/', 20 | }, 21 | ]); 22 | }, []); 23 | 24 | return ( 25 | 26 | 27 | 28 | 29 | 30 | 31 | ); 32 | }; 33 | -------------------------------------------------------------------------------- /public/components/datasources/components/new/new_datasource_description.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiSpacer, EuiText, EuiTitle, EuiHorizontalRule } from '@elastic/eui'; 7 | import React from 'react'; 8 | 9 | export const NewDatasourceDescription = () => { 10 | return ( 11 |
12 | 13 |

Create a new data source

14 |
15 | 16 | 17 | 18 | Connect to a compatible data source or compute engine to bring your data into OpenSearch and 19 | OpenSearch Dashboards. 20 | 21 | 22 |
23 | ); 24 | }; 25 | -------------------------------------------------------------------------------- /public/components/datasources/components/no_access.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiSmallButton, EuiEmptyPrompt, EuiPage, EuiText } from '@elastic/eui'; 7 | import React from 'react'; 8 | 9 | export const NoAccess = () => { 10 | return ( 11 | 12 | {'No permissions to access'}} 15 | body={ 16 | 17 | { 18 | 'You are missing permissions to view connection details. Contact your administrator for permissions.' 19 | } 20 | 21 | } 22 | actions={ 23 | (window.location.hash = '')}> 24 | Return to data connections 25 | 26 | } 27 | /> 28 | 29 | ); 30 | }; 31 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/events_views/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export * from './docViewer'; 7 | export * from './docViewRow'; -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/events_views/json_code_block/json_code_block.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { EuiCodeBlock } from '@elastic/eui'; 8 | import { i18n } from '@osd/i18n'; 9 | import { IDocType } from '../docViewRow'; 10 | 11 | export function JsonCodeBlock({ hit }: { hit: IDocType }) { 12 | const label = i18n.translate('discover.docViews.json.codeEditorAriaLabel', { 13 | defaultMessage: 'Read only JSON view of an elasticsearch document', 14 | }); 15 | return ( 16 | 17 | {JSON.stringify(hit, null, 2)} 18 | 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/explorer.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .liveStream { 7 | margin: 8px; 8 | height: 40px; 9 | align-items: center; 10 | justify-content: center; 11 | flex-direction: row; 12 | display: flex; 13 | flex-grow: 1; 14 | vertical-align: baseline; 15 | } 16 | 17 | .mainContentTabs .euiResizableContainer { 18 | height: calc(100vh - 194px); 19 | } 20 | 21 | .explorer-loading-spinner { 22 | position: relative; 23 | left: 50%; 24 | top: 50vh; 25 | width: 20px; 26 | height: 20px; 27 | margin-left: -5vw; 28 | margin-top: -20vh; 29 | } 30 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/log_explorer.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .queryTabs { 7 | .euiTabs { 8 | .tab-title { 9 | max-width: 8rem; 10 | overflow: hidden; 11 | white-space: nowrap; 12 | text-overflow: ellipsis; 13 | } 14 | svg { 15 | vertical-align: inherit; 16 | } 17 | .linkNewTag { 18 | display: inline-block; 19 | text-align: center; 20 | font-size: 0.875rem; 21 | line-height: $tab-new-line-height; 22 | padding: $tab-new-padding; // align with content tab with small size 23 | min-width: 6rem; 24 | } 25 | } 26 | } 27 | 28 | .tab-title { 29 | display: inline-block; 30 | margin-right: 5px; 31 | } 32 | 33 | .search-area { 34 | position: relative; 35 | } 36 | 37 | pre.euiCodeBlock__pre.euiCodeBlock__pre--whiteSpacePreWrap { 38 | margin-bottom: 0; 39 | } -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/save_panel/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { SavePanel } from './save_panel'; -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/sidebar/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { Sidebar } from './sidebar'; -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/timechart/hits_counter/__tests__/hits_counter.test.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { configure, mount } from 'enzyme'; 7 | import Adapter from 'enzyme-adapter-react-16'; 8 | import React from 'react'; 9 | import { waitFor } from '@testing-library/react'; 10 | import { HitsCounter } from '../hits_counter'; 11 | 12 | describe('Hits counter component', () => { 13 | configure({ adapter: new Adapter() }); 14 | 15 | it('Renders hits counter', async () => { 16 | const onResetQuery = jest.fn(); 17 | 18 | const wrapper = mount( 19 | 24 | ); 25 | 26 | wrapper.update(); 27 | 28 | await waitFor(() => { 29 | expect(wrapper).toMatchSnapshot(); 30 | }); 31 | }); 32 | }); -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/timechart/hits_counter/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { HitsCounter } from './hits_counter'; 7 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/timechart/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { HitsCounter } from './hits_counter/hits_counter'; 7 | export { Timechart } from './timechart'; 8 | export { getTimeRangeFromCountDistribution } from './utils'; 9 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/timechart/timechart_header/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { TimechartHeader } from './timechart_header'; 7 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/timechart/utils.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { selectCountDistribution } from '../../redux/slices/count_distribution_slice'; 7 | 8 | export const getTimeRangeFromCountDistribution = ( 9 | countDistribution: ReturnType[string] 10 | ): { startTime?: string; endTime?: string } => { 11 | const { 12 | data, 13 | metadata: { fields }, 14 | } = countDistribution; 15 | // fields[1] is the x-axis (time buckets) in count distribution 16 | return { startTime: data[fields[1].name].at(0), endTime: data[fields[1].name].at(-1) }; 17 | }; 18 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/config_panel/config_panes/config_controls/config_data_links.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { EuiAccordion, EuiButton } from '@elastic/eui'; 8 | 9 | export const ConfigDataLinks = (props: any) => { 10 | return ( 11 | 12 | + Add link 13 | 14 | ); 15 | }; 16 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/config_panel/config_panes/config_controls/config_switch_button.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { EuiCompressedSwitch, EuiSpacer } from '@elastic/eui'; 8 | 9 | interface SwitchButtonProps { 10 | currentValue: boolean; 11 | title: string; 12 | onToggle: (value: boolean) => void; 13 | } 14 | export const SwitchButton = ({ currentValue, onToggle, title }: SwitchButtonProps) => { 15 | return ( 16 | <> 17 | 18 | onToggle(e.target.checked)} 22 | /> 23 | 24 | ); 25 | }; 26 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/config_panel/config_panes/config_controls/config_visualization_selector.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { EuiAccordion } from '@elastic/eui'; 8 | 9 | export const ConfigVisualizationSelector = ({ children }: any) => { 10 | return ( 11 | 17 | {children} 18 | 19 | ); 20 | }; 21 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/config_panel/config_panes/json_editor.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { PlotlyVizEditor } from '../../shared_components/plotly_viz_editor'; 8 | 9 | export const ConfigEditor = ({ 10 | spec, 11 | onConfigEditorChange, 12 | setToast, 13 | visualizations, 14 | ...rest 15 | }: any) => { 16 | return ( 17 |
18 | 25 |
26 | ); 27 | }; 28 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/config_panel/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { ConfigPanel } from './config_panel'; 7 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/count_distribution/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export * from './count_distribution'; -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/shared_components/empty_placeholder.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .visWorkspaceNoData { 7 | display: flex; 8 | justify-content: center; 9 | align-items: center; 10 | height: 100%; 11 | font-size: 20px; 12 | } 13 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/shared_components/empty_placeholder.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { EuiIcon, EuiText, EuiSpacer } from '@elastic/eui'; 8 | import { FormattedMessage } from '@osd/i18n/react'; 9 | 10 | export const EmptyPlaceholder = (props: { icon: string }) => ( 11 | <> 12 | 19 | 20 | 21 |

22 | 23 |

24 |
25 | 26 | ); 27 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/shared_components/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export * from './empty_placeholder'; 7 | export { VisWorkspaceDefault } from './vis_canvass_placeholder'; 8 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/shared_components/plotly_viz_editor/index.tsx: -------------------------------------------------------------------------------- 1 | export { PlotlyVizEditor } from './plotly_viz_editor'; 2 | export { PlotlyEditorActionsMenu } from './plotly_actions'; 3 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/shared_components/plotly_viz_editor/plotly_editor.scss: -------------------------------------------------------------------------------- 1 | .visEditor--vega { 2 | .visEditorSidebar__config { 3 | padding: 0; 4 | } 5 | } 6 | 7 | .vgaEditor { 8 | @include euiBreakpoint('xs', 's', 'm') { 9 | @include euiScrollBar; 10 | max-height: $euiSize * 15; 11 | overflow-y: auto; 12 | } 13 | } 14 | 15 | .vgaEditor__aceEditorActions { 16 | position: absolute; 17 | z-index: $euiZLevel1; 18 | top: $euiSizeS; 19 | // Adjust for sidebar collapse button 20 | right: $euiSizeXXL; 21 | line-height: 1; 22 | } 23 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/shared_components/vis_canvass_placeholder.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import React from 'react'; 7 | import { EuiIcon, EuiText, EuiSpacer } from '@elastic/eui'; 8 | import './empty_placeholder.scss'; 9 | 10 | export const VisWorkspaceDefault = (props: { message: string; icon: string }) => ( 11 | <> 12 | 19 | 20 | 21 |

{props.message}

22 |
23 | 24 | ); 25 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/visualization_specs/default.data.spec.hjson: -------------------------------------------------------------------------------- 1 | { 2 | /* data configurations */ 3 | data: {} 4 | } -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/visualization_specs/default.layout.spec.hjson: -------------------------------------------------------------------------------- 1 | { 2 | /* layout configurations */ 3 | layout: { 4 | /* configuration options can be found: https://plotly.com/javascript/reference/layout/ */ 5 | } 6 | 7 | /* figure configurations */ 8 | config: { 9 | /* configuration options can be found: https://plotly.com/javascript/configuration-options/ */ 10 | } 11 | } -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/visualization_specs/default_spec.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import defaultLayoutSpec from '!!raw-loader!./default.layout.spec.hjson'; 3 | import defaultDataSpec from '!!raw-loader!./default.data.spec.hjson'; 4 | 5 | export const getDefaultSpec = (type = 'layout') => { 6 | if (type === 'data') return defaultDataSpec; 7 | return defaultLayoutSpec; 8 | }; 9 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/visualizations.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .dataConfigContainer { 7 | height: 1242px; 8 | overflow: auto; 9 | } 10 | 11 | .explorerViz__commonPanel { 12 | display: grid; 13 | grid-template-rows: auto 1fr; 14 | grid-area: workspace; 15 | height: 100%; 16 | } 17 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/workspace_panel/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { WorkspacePanel } from './workspace_panel'; 7 | -------------------------------------------------------------------------------- /public/components/event_analytics/explorer/visualizations/workspace_panel/workspace_panel.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .ws__header-dark { 7 | background-color: transparent; 8 | } 9 | 10 | .ws__workspace_visPanel { 11 | grid-gap: 12px; 12 | padding: 12px; 13 | .workspace_visPanel { 14 | height: 40px; 15 | width: 140px; 16 | .ws__workspace_visPanelFlexitem { 17 | display: block; 18 | } 19 | } 20 | } 21 | 22 | #vis__mainContent .ws__central--canvas { 23 | border-right: 1px solid #D3DAE6; 24 | } 25 | 26 | .explorer-dark #vis__mainContent .ws__central--canvas { 27 | border-right: 1px solid $border-color-on-dark; 28 | } 29 | -------------------------------------------------------------------------------- /public/components/event_analytics/home/home.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | .event-home { 7 | #autocomplete-textarea { 8 | min-height: 80px; 9 | } 10 | .ppl-link { 11 | right: 5px; 12 | } 13 | } 14 | 15 | #home-his-title { 16 | padding-left: 10px; 17 | } -------------------------------------------------------------------------------- /public/components/event_analytics/hooks/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { useFetchEvents } from './use_fetch_events'; 7 | export { useFetchPatterns } from './use_fetch_patterns'; 8 | export { useFetchVisualizations } from './use_fetch_visualizations'; 9 | export { useRenderVisualization } from './use_render_visualizations'; 10 | export { TabContext } from './use_tab_context'; 11 | -------------------------------------------------------------------------------- /public/components/event_analytics/hooks/use_tab_context.ts: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react'; 2 | 3 | export const TabContext = createContext({}); 4 | -------------------------------------------------------------------------------- /public/components/event_analytics/index.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | @import 'home/home'; 7 | @import 'explorer/log_explorer'; 8 | @import 'explorer/explorer'; 9 | @import 'explorer/sidebar/sidebar'; 10 | @import 'explorer/events_views/data_grid'; 11 | @import 'explorer/events_views/docView'; 12 | @import 'explorer/visualizations/config_panel/config_panel'; 13 | @import 'explorer/visualizations/config_panel/config_panes/config_controls/data_configurations_panel'; 14 | @import 'explorer/visualizations/visualizations'; 15 | @import 'explorer/visualizations/shared_components/empty_placeholder'; 16 | @import 'explorer/visualizations/shared_components/plotly_viz_editor/plotly_editor'; 17 | @import 'explorer/visualizations/shared_components/plotly_viz_editor/plotly_vis'; 18 | @import 'explorer/visualizations/workspace_panel/workspace_panel'; -------------------------------------------------------------------------------- /public/components/event_analytics/redux/reducers/fetch_reducers.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const fetchSuccess = (state, { payload }) => { 7 | state[payload.tabId] = payload.data; 8 | }; 9 | 10 | export const fetchFailure = (state, { payload }) => { 11 | state[payload.tabId] = { error: payload.error }; 12 | }; 13 | -------------------------------------------------------------------------------- /public/components/event_analytics/redux/reducers/index.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { fetchSuccess, fetchFailure } from './fetch_reducers'; 7 | -------------------------------------------------------------------------------- /public/components/event_analytics/redux/reducers/query_reducers.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export const queryChange = (state = {}, action) => { 7 | return { 8 | ...action.payload 9 | }; 10 | }; -------------------------------------------------------------------------------- /public/components/event_analytics/utils/index.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | export { 7 | getTrs, 8 | getHeaders, 9 | fetchSurroundingData, 10 | rangeNumDocs, 11 | populateDataGrid, 12 | isValidTraceId, 13 | formatError, 14 | getDefaultVisConfig 15 | } from './utils'; 16 | -------------------------------------------------------------------------------- /public/components/getting_started/components/getting_started_header.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright OpenSearch Contributors 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | import { EuiPageHeader, EuiPageHeaderSection, EuiTitle } from '@elastic/eui'; 7 | import React from 'react'; 8 | 9 | export const GettingStartedConnectionsHeader = () => { 10 | return ( 11 |
12 | 13 | 14 | 15 |

Getting Started

16 |
17 |
18 |
19 |
20 | ); 21 | }; 22 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/getting-started/.env: -------------------------------------------------------------------------------- 1 | # OpenSearch version 2 | OPENSEARCH_VERSION=2.15.0 3 | OPENSEARCH_ADMIN_PASSWORD=my_%New%_passW0rd!@# 4 | OPENSEARCH_INITIAL_ADMIN_PASSWORD=my_%New%_passW0rd!@# 5 | 6 | # OpenSearch Node1 7 | OPENSEARCH_PORT=9200 8 | OPENSEARCH_HOST=opensearch 9 | OPENSEARCH_ADDR=${OPENSEARCH_HOST}:${OPENSEARCH_PORT} 10 | 11 | # OpenSearch Dashboard 12 | OPENSEARCH_DASHBOARD_PORT=5601 13 | OPENSEARCH_DASHBOARD_HOST=opensearch-dashboards 14 | OPENSEARCH_DASHBOARD_ADDR=${OPENSEARCH_DASHBOARD_HOST}:${OPENSEARCH_DASHBOARD_PORT} 15 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/getting-started/fluent-bit/fluent-bit.conf: -------------------------------------------------------------------------------- 1 | [SERVICE] 2 | Flush 1 3 | Log_Level info 4 | Parsers_File parsers.conf 5 | 6 | [INPUT] 7 | Name tail 8 | Path /logs/*.log 9 | Parser json 10 | Tag app.log 11 | 12 | [OUTPUT] 13 | Name opensearch 14 | Host opensearch-node1 15 | Match * 16 | Port 9200 17 | Type _doc 18 | Index applicative_logs 19 | tls On 20 | tls.verify Off 21 | Suppress_Type_Name On 22 | HTTP_User admin 23 | HTTP_Passwd my_%New%_passW0rd!@# 24 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/getting-started/fluent-bit/parsers.conf: -------------------------------------------------------------------------------- 1 | [PARSER] 2 | Name json 3 | Format json 4 | Time_Key time 5 | Time_Format %d/%b/%Y:%H:%M:%S %z 6 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/getting-started/golang-app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.18-alpine 2 | 3 | WORKDIR /app 4 | 5 | COPY go.mod ./ 6 | RUN go mod download 7 | 8 | COPY main.go ./ 9 | 10 | RUN go build -o main . 11 | 12 | CMD ["./main"] 13 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/getting-started/golang-app/go.mod: -------------------------------------------------------------------------------- 1 | module golang-app 2 | 3 | go 1.18 4 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/getting-started/opensearch_dashboards.yml: -------------------------------------------------------------------------------- 1 | opensearch.hosts: ["https://opensearch-node1:9200"] 2 | server.host: 0.0.0.0 3 | opensearch.ssl.verificationMode: none 4 | opensearch.username: "admin" 5 | opensearch.password: "my_%New%_passW0rd!@#" 6 | opensearch.requestHeadersWhitelist: [ authorization,securitytenant ] 7 | opensearch_security.multitenancy.enabled: false 8 | opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"] 9 | opensearch_security.readonly_mode.roles: ["kibana_read_only"] 10 | vis_type_vega.enableExternalUrls: true 11 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/schemas/applicative-logs-1.0.0.mapping.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns": ["applicative_logs-*"], 3 | "template": { 4 | "settings": { 5 | "number_of_shards": 1 6 | }, 7 | "mappings": { 8 | "properties": { 9 | "timestamp": { 10 | "type": "date" 11 | }, 12 | "level": { 13 | "type": "keyword" 14 | }, 15 | "message": { 16 | "type": "text" 17 | }, 18 | "source": { 19 | "type": "keyword" 20 | }, 21 | "module": { 22 | "type": "keyword" 23 | }, 24 | "function": { 25 | "type": "keyword" 26 | }, 27 | "error_code": { 28 | "type": "keyword" 29 | }, 30 | "user_id": { 31 | "type": "keyword" 32 | } 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/static/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/public/components/getting_started/getting_started_artifacts/golang_client/static/dashboard.png -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/golang_client/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/public/components/getting_started/getting_started_artifacts/golang_client/static/logo.png -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/java_client/getting-started/.env: -------------------------------------------------------------------------------- 1 | # OpenSearch version 2 | OPENSEARCH_VERSION=2.15.0 3 | OPENSEARCH_ADMIN_PASSWORD=my_%New%_passW0rd!@# 4 | OPENSEARCH_INITIAL_ADMIN_PASSWORD=my_%New%_passW0rd!@# 5 | 6 | # OpenSearch Node1 7 | OPENSEARCH_PORT=9200 8 | OPENSEARCH_HOST=opensearch 9 | OPENSEARCH_ADDR=${OPENSEARCH_HOST}:${OPENSEARCH_PORT} 10 | 11 | # OpenSearch Dashboard 12 | OPENSEARCH_DASHBOARD_PORT=5601 13 | OPENSEARCH_DASHBOARD_HOST=opensearch-dashboards 14 | OPENSEARCH_DASHBOARD_ADDR=${OPENSEARCH_DASHBOARD_HOST}:${OPENSEARCH_DASHBOARD_PORT} 15 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/java_client/getting-started/fluent-bit/fluent-bit.conf: -------------------------------------------------------------------------------- 1 | [SERVICE] 2 | Flush 1 3 | Log_Level info 4 | Parsers_File parsers.conf 5 | 6 | [INPUT] 7 | Name tail 8 | Path /logs/*.log 9 | Parser json 10 | Tag app.log 11 | 12 | [OUTPUT] 13 | Name opensearch 14 | Host opensearch-node1 15 | Match * 16 | Port 9200 17 | Type _doc 18 | Index applicative_logs 19 | tls On 20 | tls.verify Off 21 | Suppress_Type_Name On 22 | HTTP_User admin 23 | HTTP_Passwd my_%New%_passW0rd!@# 24 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/java_client/getting-started/fluent-bit/parsers.conf: -------------------------------------------------------------------------------- 1 | [PARSER] 2 | Name json 3 | Format json 4 | Time_Key time 5 | Time_Format %d/%b/%Y:%H:%M:%S %z 6 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/java_client/getting-started/java-app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3.8.4-openjdk-11-slim AS build 2 | 3 | WORKDIR /app 4 | 5 | COPY pom.xml . 6 | COPY src ./src 7 | 8 | RUN mvn clean package 9 | 10 | FROM openjdk:11-slim 11 | 12 | WORKDIR /app 13 | 14 | COPY --from=build /app/target/java-app-1.0-SNAPSHOT.jar app.jar 15 | 16 | CMD ["java", "-jar", "app.jar"] 17 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/java_client/getting-started/opensearch_dashboards.yml: -------------------------------------------------------------------------------- 1 | opensearch.hosts: ["https://opensearch-node1:9200"] 2 | server.host: 0.0.0.0 3 | opensearch.ssl.verificationMode: none 4 | opensearch.username: "admin" 5 | opensearch.password: "my_%New%_passW0rd!@#" 6 | opensearch.requestHeadersWhitelist: [ authorization,securitytenant ] 7 | opensearch_security.multitenancy.enabled: false 8 | opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"] 9 | opensearch_security.readonly_mode.roles: ["kibana_read_only"] 10 | vis_type_vega.enableExternalUrls: true 11 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/java_client/schemas/applicative-logs-1.0.0.mapping.json: -------------------------------------------------------------------------------- 1 | { 2 | "index_patterns": ["applicative_logs-*"], 3 | "template": { 4 | "settings": { 5 | "number_of_shards": 1 6 | }, 7 | "mappings": { 8 | "properties": { 9 | "timestamp": { 10 | "type": "date" 11 | }, 12 | "level": { 13 | "type": "keyword" 14 | }, 15 | "message": { 16 | "type": "text" 17 | }, 18 | "source": { 19 | "type": "keyword" 20 | }, 21 | "module": { 22 | "type": "keyword" 23 | }, 24 | "function": { 25 | "type": "keyword" 26 | }, 27 | "error_code": { 28 | "type": "keyword" 29 | }, 30 | "user_id": { 31 | "type": "keyword" 32 | } 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/java_client/static/dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opensearch-project/dashboards-observability/44c91046c44bbd88db476c083b9d69e821281883/public/components/getting_started/getting_started_artifacts/java_client/static/dashboard.png -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/nginx/assets/create_mv-1.0.0.sql: -------------------------------------------------------------------------------- 1 | CREATE MATERIALIZED VIEW {table_name}__mview AS 2 | SELECT 3 | to_timestamp(trim(BOTH '[]' FROM concat(time_local_1, ' ', time_local_2)), 'dd/MMM/yyyy:HH:mm:ss Z') AS `@timestamp`, 4 | split_part (request, ' ', 1) as `http.request.method`, 5 | split_part (request, ' ', 2) as `http.url`, 6 | split_part (request, ' ', 3) as `http.flavor`, 7 | status AS `http.response.status_code`, 8 | body_bytes_sent AS `http.response.bytes`, 9 | 'nginx.access' AS `event.domain` 10 | FROM {table_name} 11 | WITH ( 12 | auto_refresh = 'true', 13 | refresh_interval = '15 Minute', 14 | checkpoint_location = '{s3_checkpoint_location}', 15 | watermark_delay = '1 Minute' 16 | ) 17 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/nginx/assets/create_skipping_index-1.0.0.sql: -------------------------------------------------------------------------------- 1 | CREATE SKIPPING INDEX ON {table_name} ( 2 | remote_addr BLOOM_FILTER, 3 | `status` VALUE_SET, 4 | body_bytes_sent MIN_MAX 5 | ) WITH ( 6 | auto_refresh = true, 7 | refresh_interval = '15 Minutes', 8 | checkpoint_location = '{s3_checkpoint_location}', 9 | watermark_delay = '1 Minute' 10 | ) 11 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/nginx/assets/create_table-1.0.0.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTERNAL TABLE {table_name} ( 2 | remote_addr STRING, 3 | empty_col STRING, 4 | remote_user STRING, 5 | time_local_1 STRING, 6 | time_local_2 STRING, 7 | request STRING, 8 | status INT, 9 | body_bytes_sent INT, 10 | http_referer STRING, 11 | http_user_agent STRING, 12 | gzip_ratio STRING 13 | ) USING csv 14 | LOCATION '{s3_bucket_location}' 15 | OPTIONS ( 16 | sep=' ', 17 | nullValue='-' 18 | ) 19 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/nginx/getting-started/.env: -------------------------------------------------------------------------------- 1 | # Nginx Proxy 2 | NGINX_PORT=90 3 | NGINX_ADDR=nginx:${NGINX_PORT} 4 | 5 | # OpenSearch version 6 | OPENSEARCH_VERSION=2.15.0 7 | OPENSEARCH_ADMIN_PASSWORD=my_%New%_passW0rd!@# 8 | OPENSEARCH_INITIAL_ADMIN_PASSWORD=my_%New%_passW0rd!@# 9 | 10 | # OpenSearch Node1 11 | OPENSEARCH_PORT=9200 12 | OPENSEARCH_HOST=opensearch 13 | OPENSEARCH_ADDR=${OPENSEARCH_HOST}:${OPENSEARCH_PORT} 14 | 15 | # OpenSearch Dashboard 16 | OPENSEARCH_DASHBOARD_PORT=5601 17 | OPENSEARCH_DASHBOARD_HOST=opensearch-dashboards 18 | OPENSEARCH_DASHBOARD_ADDR=${OPENSEARCH_DASHBOARD_HOST}:${OPENSEARCH_DASHBOARD_PORT} 19 | -------------------------------------------------------------------------------- /public/components/getting_started/getting_started_artifacts/nginx/getting-started/fluent-bit/parsers.conf: -------------------------------------------------------------------------------- 1 | [PARSER] 2 | Name apache 3 | Format regex 4 | Regex ^(?[^ ]*) [^ ]* (?[^ ]*) \[(?