From e0155e8dc7734bf2ee12511ee9f6a2f22e6275d0 Mon Sep 17 00:00:00 2001 From: Simeon Widdis Date: Mon, 30 Oct 2023 17:24:29 -0700 Subject: [PATCH 01/18] Add S3 integration for Nginx and VPC (#1214) * Add nginx integration Signed-off-by: Simeon Widdis * Add VPC S3 integration Signed-off-by: Simeon Widdis --------- Signed-off-by: Simeon Widdis --- .../assets/create_mv_vpc-1.0.0.sql | 24 +++++++++++++++++++ .../assets/create_table_vpc-1.0.0.sql | 20 ++++++++++++++++ .../assets/refresh_mv_vpc-1.0.0.sql | 1 + .../aws_vpc_flow/aws_vpc_flow-1.0.0.json | 21 ++++++++++++++-- .../nginx/assets/create_mv-1.0.0.sql | 10 ++++++++ .../nginx/assets/create_table-1.0.0.sql | 18 ++++++++++++++ .../nginx/assets/refresh_mv-1.0.0.sql | 1 + .../repository/nginx/nginx-1.0.0.json | 21 ++++++++++++++-- 8 files changed, 112 insertions(+), 4 deletions(-) create mode 100644 server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql create mode 100644 server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_table_vpc-1.0.0.sql create mode 100644 server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql create mode 100644 server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql create mode 100644 server/adaptors/integrations/__data__/repository/nginx/assets/create_table-1.0.0.sql create mode 100644 server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql diff --git a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql new file mode 100644 index 0000000000..2612638e74 --- /dev/null +++ b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql @@ -0,0 +1,24 @@ +CREATE MATERIALIZED VIEW {table_name}_mview AS + SELECT + CAST(FROM_UNIXTIME(start) AS TIMESTAMP) as `@timestamp`, + version as `aws.vpc.version`, + account_id as `aws.vpc.account-id`, + interface_id as `aws.vpc.interface-id`, + srcaddr as `aws.vpc.srcaddr`, + dstaddr as `aws.vpc.dstaddr`, + CAST(srcport AS LONG) as `aws.vpc.srcport`, + CAST(dstport AS LONG) as `aws.vpc.dstport`, + protocol as `aws.vpc.protocol`, + CAST(packets AS LONG) as `aws.vpc.packets`, + CAST(bytes AS LONG) as `aws.vpc.bytes`, + CAST(FROM_UNIXTIME(start) AS TIMESTAMP) as `aws.vpc.start`, + CAST(FROM_UNIXTIME(end) AS TIMESTAMP) as `aws.vpc.end`, + action as `aws.vpc.action`, + log_status as `aws.vpc.log-status`, + CASE + WHEN regexp(dstaddr, '(10\\..*)|(192\\.168\\..*)|(172\\.1[6-9]\\..*)|(172\\.2[0-9]\\..*)|(172\\.3[0-1]\\.*)') + THEN 'ingress' + ELSE 'egress' + END AS `aws.vpc.flow-direction` +FROM + {table_name}; diff --git a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_table_vpc-1.0.0.sql b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_table_vpc-1.0.0.sql new file mode 100644 index 0000000000..bb73fa9340 --- /dev/null +++ b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_table_vpc-1.0.0.sql @@ -0,0 +1,20 @@ +CREATE EXTERNAL TABLE IF NOT EXISTS {table_name} ( + version INT, + account_id STRING, + interface_id STRING, + srcaddr STRING, + dstaddr STRING, + srcport STRING, + dstport STRING, + protocol STRING, + packets STRING, + bytes STRING, + start BIGINT, + end BIGINT, + action STRING, + log_status STRING +) USING csv +LOCATION '{s3_bucket_location}' +OPTIONS ( + sep=' ' +); diff --git a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql new file mode 100644 index 0000000000..458202eaeb --- /dev/null +++ b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql @@ -0,0 +1 @@ +REFRESH MATERIALIZED VIEW {table_name}_mview diff --git a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json index 1d92e26658..2a2fbf3f56 100644 --- a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json +++ b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json @@ -5,7 +5,7 @@ "description": "AWS VPC Flow log collector", "license": "Apache-2.0", "type": "logs_vpc", - "labels": ["Observability", "Logs", "AWS", "Cloud"], + "labels": ["Observability", "Logs", "AWS", "Cloud", "Flint S3"], "author": "Haidong Wang", "sourceUrl": "https://github.com/opensearch-project/dashboards-observability/tree/main/server/adaptors/integrations/__data__/repository/aws_vpc_flow/info", "statics": { @@ -46,7 +46,24 @@ "savedObjects": { "name": "aws_vpc_flow", "version": "1.0.0" - } + }, + "queries": [ + { + "name": "create_table_vpc", + "version": "1.0.0", + "language": "sql" + }, + { + "name": "create_mv_vpc", + "version": "1.0.0", + "language": "sql" + }, + { + "name": "refresh_mv_vpc", + "version": "1.0.0", + "language": "sql" + } + ] }, "sampleData": { "path": "sample.json" diff --git a/server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql b/server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql new file mode 100644 index 0000000000..8b29fdf0b0 --- /dev/null +++ b/server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql @@ -0,0 +1,10 @@ +CREATE MATERIALIZED VIEW {table_name}_mview AS +SELECT + to_timestamp(trim(BOTH '[]' FROM concat(time_local_1, ' ', time_local_2)), 'dd/MMM/yyyy:HH:mm:ss Z') AS `@timestamp`, + split_part (request, ' ', 1) as `http.request.method`, + split_part (request, ' ', 2) as `http.url`, + split_part (request, ' ', 3) as `http.flavor`, + status AS `http.response.status_code`, + body_bytes_sent AS `http.response.bytes`, + 'nginx.access' AS `event.domain` +FROM {table_name} diff --git a/server/adaptors/integrations/__data__/repository/nginx/assets/create_table-1.0.0.sql b/server/adaptors/integrations/__data__/repository/nginx/assets/create_table-1.0.0.sql new file mode 100644 index 0000000000..38f7194213 --- /dev/null +++ b/server/adaptors/integrations/__data__/repository/nginx/assets/create_table-1.0.0.sql @@ -0,0 +1,18 @@ +CREATE EXTERNAL TABLE {table_name} ( + remote_addr STRING, + empty_col STRING, + remote_user STRING, + time_local_1 STRING, + time_local_2 STRING, + request STRING, + status INT, + body_bytes_sent INT, + http_referer STRING, + http_user_agent STRING, + gzip_ratio STRING +) USING csv +LOCATION '{s3_bucket_location}' +OPTIONS ( + sep=' ', + nullValue='-' +) diff --git a/server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql b/server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql new file mode 100644 index 0000000000..458202eaeb --- /dev/null +++ b/server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql @@ -0,0 +1 @@ +REFRESH MATERIALIZED VIEW {table_name}_mview diff --git a/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json b/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json index 975430d0d8..aadcae2f04 100644 --- a/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json +++ b/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json @@ -5,7 +5,7 @@ "description": "Nginx HTTP server collector", "license": "Apache-2.0", "type": "logs", - "labels": ["Observability", "Logs"], + "labels": ["Observability", "Logs", "Flint S3"], "author": "OpenSearch", "sourceUrl": "https://github.com/opensearch-project/dashboards-observability/tree/main/server/adaptors/integrations/__data__/repository/nginx/info", "statics": { @@ -38,7 +38,24 @@ "savedObjects": { "name": "nginx", "version": "1.0.0" - } + }, + "queries": [ + { + "name": "create_table", + "version": "1.0.0", + "language": "sql" + }, + { + "name": "create_mv", + "version": "1.0.0", + "language": "sql" + }, + { + "name": "refresh_mv", + "version": "1.0.0", + "language": "sql" + } + ] }, "sampleData": { "path": "sample.json" From 4c93be76efbc37c61f84ed84420eee9997c01d12 Mon Sep 17 00:00:00 2001 From: Derek Ho Date: Tue, 31 Oct 2023 17:33:02 -0400 Subject: [PATCH 02/18] Update empty allowed roles to admin only (#1217) Signed-off-by: Derek Ho --- .../datasources/components/new/query_permissions.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/components/datasources/components/new/query_permissions.tsx b/public/components/datasources/components/new/query_permissions.tsx index 1a66ae1987..0c0853b57e 100644 --- a/public/components/datasources/components/new/query_permissions.tsx +++ b/public/components/datasources/components/new/query_permissions.tsx @@ -30,7 +30,8 @@ export const QueryPermissionsConfiguration = (props: PermissionsConfigurationPro }, { id: QUERY_ALL, - label: 'Everyone - accessible by all users on this cluster', + label: 'Admin only - only accessible by the admin', + disabled: !hasSecurityAccess, }, ]; From 03b5892e6fc234ccdb4732a8db6d2bd5c7a994b1 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 1 Nov 2023 19:01:14 -0400 Subject: [PATCH 03/18] Onboard prod jenkins docker images to github actions Signed-off-by: Peter Zhu --- ...-observability-test-and-build-workflow.yml | 80 ++++++++++++++++--- .github/workflows/dco.yml | 18 ----- 2 files changed, 70 insertions(+), 28 deletions(-) delete mode 100644 .github/workflows/dco.yml diff --git a/.github/workflows/dashboards-observability-test-and-build-workflow.yml b/.github/workflows/dashboards-observability-test-and-build-workflow.yml index eadd458944..9c85a0aa16 100644 --- a/.github/workflows/dashboards-observability-test-and-build-workflow.yml +++ b/.github/workflows/dashboards-observability-test-and-build-workflow.yml @@ -9,11 +9,79 @@ env: OPENSEARCH_PLUGIN_VERSION: 3.0.0.0 jobs: + Get-CI-Image-Tag: + uses: opensearch-project/opensearch-build/.github/workflows/get-ci-image-tag.yml@main + with: + product: opensearch-dashboards - build: + build-linux: + needs: Get-CI-Image-Tag + strategy: + fail-fast: false + runs-on: ubuntu-latest + container: + # using the same image which is used by opensearch-build team to build the OpenSearch Distribution + # this image tag is subject to change as more dependencies and updates will arrive over time + image: ${{ needs.Get-CI-Image-Tag.outputs.ci-image-version-linux }} + # need to switch to root so that github actions can install runner binary on container without permission issues. + options: --user root + + steps: + - name: Checkout OpenSearch Dashboards + uses: actions/checkout@v2 + with: + repository: opensearch-project/OpenSearch-Dashboards + ref: ${{ env.OPENSEARCH_VERSION }} + path: OpenSearch-Dashboards + + - name: Checkout Dashboards Observability + uses: actions/checkout@v2 + with: + path: OpenSearch-Dashboards/plugins/dashboards-observability + + - name: Plugin Bootstrap + uses: nick-fields/retry@v2 + with: + timeout_minutes: 20 + max_attempts: 2 + command: | + chown -R 1000:1000 `pwd` + cd ./OpenSearch-Dashboards/ + su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && + yarn config set network-timeout 1000000 -g && + yarn osd bootstrap" + + - name: Test all dashboards-observability modules + run: | + chown -R 1000:1000 `pwd` + cd ./OpenSearch-Dashboards/ + su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && + cd dashboards-observability && + yarn osd bootstrap && yarn test --coverage --maxWorkers=100%" + + - name: Upload coverage + uses: codecov/codecov-action@v1 + with: + flags: dashboards-observability + directory: ./OpenSearch-Dashboards/plugins/dashboards-observability + token: ${{ secrets.CODECOV_TOKEN }} + + - name: Build Artifact + run: | + cd OpenSearch-Dashboards/plugins/dashboards-observability + yarn build + mv ./build/*.zip ./build/${{ env.PLUGIN_NAME }}-${{ env.OPENSEARCH_PLUGIN_VERSION }}.zip + + - name: Upload Artifact + uses: actions/upload-artifact@v1 + with: + name: dashboards-observability-ubuntu-latest + path: ./OpenSearch-Dashboards/plugins/dashboards-observability/build + + build-windows-macos: strategy: matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + os: [windows-latest, macos-latest] # Since Windows is inconsistent, we want to let other OSes run on a fail fail-fast: false runs-on: ${{ matrix.os }} @@ -68,14 +136,6 @@ jobs: cd OpenSearch-Dashboards/plugins/dashboards-observability yarn test --coverage --maxWorkers=100% - - name: Upload coverage - if: ${{ matrix.os == 'ubuntu-latest' }} - uses: codecov/codecov-action@v1 - with: - flags: dashboards-observability - directory: ./OpenSearch-Dashboards/plugins/dashboards-observability - token: ${{ secrets.CODECOV_TOKEN }} - - name: Build Artifact run: | cd OpenSearch-Dashboards/plugins/dashboards-observability diff --git a/.github/workflows/dco.yml b/.github/workflows/dco.yml deleted file mode 100644 index cf30ea89dc..0000000000 --- a/.github/workflows/dco.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Developer Certificate of Origin Check - -on: [pull_request] - -jobs: - check: - runs-on: ubuntu-latest - - steps: - - name: Get PR Commits - id: 'get-pr-commits' - uses: tim-actions/get-pr-commits@v1.1.0 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: DCO Check - uses: tim-actions/dco@v1.1.0 - with: - commits: ${{ steps.get-pr-commits.outputs.commits }} From e96954e448e44b4bfcdf1409da7c466e42b14ae0 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Wed, 1 Nov 2023 23:53:48 -0400 Subject: [PATCH 04/18] Add more Signed-off-by: Peter Zhu --- ...ashboards-observability-test-and-build-workflow.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dashboards-observability-test-and-build-workflow.yml b/.github/workflows/dashboards-observability-test-and-build-workflow.yml index 9c85a0aa16..5585bc229a 100644 --- a/.github/workflows/dashboards-observability-test-and-build-workflow.yml +++ b/.github/workflows/dashboards-observability-test-and-build-workflow.yml @@ -56,7 +56,7 @@ jobs: chown -R 1000:1000 `pwd` cd ./OpenSearch-Dashboards/ su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && - cd dashboards-observability && + cd plugins/dashboards-observability && yarn osd bootstrap && yarn test --coverage --maxWorkers=100%" - name: Upload coverage @@ -68,9 +68,11 @@ jobs: - name: Build Artifact run: | - cd OpenSearch-Dashboards/plugins/dashboards-observability - yarn build - mv ./build/*.zip ./build/${{ env.PLUGIN_NAME }}-${{ env.OPENSEARCH_PLUGIN_VERSION }}.zip + chown -R 1000:1000 `pwd` + cd ./OpenSearch-Dashboards/ + su `id -un 1000` -c "source $NVM_DIR/nvm.sh && nvm use && node -v && yarn -v && + cd plugins/dashboards-observability && + yarn build && mv ./build/*.zip ./build/${{ env.PLUGIN_NAME }}-${{ env.OPENSEARCH_PLUGIN_VERSION }}.zip" - name: Upload Artifact uses: actions/upload-artifact@v1 From ae76f36b0eea4d3b1df75e7de8da9dc87fb9d93d Mon Sep 17 00:00:00 2001 From: Eric Wei Date: Thu, 2 Nov 2023 10:39:27 -0700 Subject: [PATCH 05/18] Add new maintainers (#1213) * remove unused files Signed-off-by: Eric Wei * missing snapshots Signed-off-by: Eric Wei * remove unused files Signed-off-by: Eric Wei * add paul and sumukh to maintainers Signed-off-by: Eric * remove adam Signed-off-by: Eric * add snapshots Signed-off-by: Eric --------- Signed-off-by: Eric Wei Signed-off-by: Eric --- .github/CODEOWNERS | 2 +- MAINTAINERS.md | 35 ++++++++++++++++++----------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 2108cc1859..0362760f1d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1,2 @@ # This should match the owning team set up in https://github.com/orgs/opensearch-project/teams -* @pjfitzgibbons @ps48 @kavithacm @derek-ho @joshuali925 @dai-chen @YANG-DB @rupal-bq @mengweieric @vamsi-amazon @swiddis @penghuo @seankao-az @anirudha @TackAdam +* @pjfitzgibbons @ps48 @kavithacm @derek-ho @joshuali925 @dai-chen @YANG-DB @rupal-bq @mengweieric @vamsi-amazon @swiddis @penghuo @seankao-az @anirudha @paulstn @sumukhswamy diff --git a/MAINTAINERS.md b/MAINTAINERS.md index dd45e0f197..daba95b027 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -4,23 +4,24 @@ This document contains a list of maintainers in this repo. See [opensearch-proje ## Current Maintainers -| Maintainer | GitHub ID | Affiliation | -| ----------------- | ------------------------------------------------- | ----------- | -| Eric Wei | [mengweieric](https://github.com/mengweieric) | Amazon | -| Joshua Li | [joshuali925](https://github.com/joshuali925) | Amazon | -| Shenoy Pratik | [ps48](https://github.com/ps48) | Amazon | -| Kavitha Mohan | [kavithacm](https://github.com/kavithacm) | Amazon | -| Rupal Mahajan | [rupal-bq](https://github.com/rupal-bq) | Amazon | -| Derek Ho | [derek-ho](https://github.com/derek-ho) | Amazon | -| Lior Perry | [YANG-DB](https://github.com/YANG-DB) | Amazon | -| Peter Fitzgibbons | [pjfitzgibbons](https://github.com/pjfitzgibbons) | Amazon | -| Simeon Widdis | [swiddis](https://github.com/swiddis) | Amazon | -| Chen Dai | [dai-chen](https://github.com/dai-chen) | Amazon | -| Vamsi Manohar | [vamsi-amazon](https://github.com/vamsi-amazon) | Amazon | -| Peng Huo | [penghuo](https://github.com/penghuo) | Amazon | -| Sean Kao | [seankao-az](https://github.com/seankao-az) | Amazon | -| Adam Tackett | [TackAdam](https://github.com/TackAdam) | Amazon | -| Anirudha Jadhav | [anirudha](https://github.com/anirudha) | Amazon | +| Maintainer | GitHub ID | Affiliation | +| ----------------------- | ------------------------------------------------- | ----------- | +| Eric Wei | [mengweieric](https://github.com/mengweieric) | Amazon | +| Joshua Li | [joshuali925](https://github.com/joshuali925) | Amazon | +| Shenoy Pratik | [ps48](https://github.com/ps48) | Amazon | +| Kavitha Mohan | [kavithacm](https://github.com/kavithacm) | Amazon | +| Rupal Mahajan | [rupal-bq](https://github.com/rupal-bq) | Amazon | +| Derek Ho | [derek-ho](https://github.com/derek-ho) | Amazon | +| Lior Perry | [YANG-DB](https://github.com/YANG-DB) | Amazon | +| Peter Fitzgibbons | [pjfitzgibbons](https://github.com/pjfitzgibbons) | Amazon | +| Simeon Widdis | [swiddis](https://github.com/swiddis) | Amazon | +| Chen Dai | [dai-chen](https://github.com/dai-chen) | Amazon | +| Vamsi Manohar | [vamsi-amazon](https://github.com/vamsi-amazon) | Amazon | +| Peng Huo | [penghuo](https://github.com/penghuo) | Amazon | +| Sean Kao | [seankao-az](https://github.com/seankao-az) | Amazon | +| Anirudha Jadhav | [anirudha](https://github.com/anirudha) | Amazon | +| Paul Sebastian | [paulstn](https://github.com/paulstn) | Amazon | +| Sumukh Hanumantha Swamy | [sumukhswamy](https://github.com/sumukhswamy) | Amazon | ## Emeritus Maintainers From 80f112a27c98eb0031011a24ad2a22a22ddca0e7 Mon Sep 17 00:00:00 2001 From: Simeon Widdis Date: Thu, 2 Nov 2023 16:20:18 -0700 Subject: [PATCH 06/18] Remove manual refresh for S3 integrations (#1226) --- .../integrations/components/setup_integration.tsx | 8 +++++++- .../repository/aws_elb/assets/create_mv-1.0.0.sql | 8 +++++++- .../repository/aws_elb/assets/refresh_mv-1.0.0.sql | 1 - .../__data__/repository/aws_elb/aws_elb-1.0.0.json | 5 ----- .../aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql | 8 +++++++- .../aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql | 1 - .../repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json | 5 ----- .../__data__/repository/nginx/assets/create_mv-1.0.0.sql | 6 ++++++ .../__data__/repository/nginx/assets/refresh_mv-1.0.0.sql | 1 - .../__data__/repository/nginx/nginx-1.0.0.json | 5 ----- 10 files changed, 27 insertions(+), 21 deletions(-) delete mode 100644 server/adaptors/integrations/__data__/repository/aws_elb/assets/refresh_mv-1.0.0.sql delete mode 100644 server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql delete mode 100644 server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql diff --git a/public/components/integrations/components/setup_integration.tsx b/public/components/integrations/components/setup_integration.tsx index 038c042ced..080fa46463 100644 --- a/public/components/integrations/components/setup_integration.tsx +++ b/public/components/integrations/components/setup_integration.tsx @@ -397,7 +397,13 @@ export function SetupBottomBar({ '{table_name}', `${config.connectionDataSource}.default.${config.connectionTableName}` ); - queryStr = queryStr.replaceAll('{s3_bucket_location}', config.connectionLocation); + // We append to this URI in internal queries, so we normalize it to have no trailing slash + let trimmedLocation = config.connectionLocation.trim(); + trimmedLocation = trimmedLocation.endsWith('/') + ? trimmedLocation.slice(0, trimmedLocation.length - 1) + : trimmedLocation; + + queryStr = queryStr.replaceAll('{s3_bucket_location}', trimmedLocation); queryStr = queryStr.replaceAll('{object_name}', config.connectionTableName); queryStr = queryStr.replaceAll(/\s+/g, ' '); const result = await runQuery(queryStr, config.connectionDataSource, sessionId); diff --git a/server/adaptors/integrations/__data__/repository/aws_elb/assets/create_mv-1.0.0.sql b/server/adaptors/integrations/__data__/repository/aws_elb/assets/create_mv-1.0.0.sql index ecb48c084e..86a23f32f9 100644 --- a/server/adaptors/integrations/__data__/repository/aws_elb/assets/create_mv-1.0.0.sql +++ b/server/adaptors/integrations/__data__/repository/aws_elb/assets/create_mv-1.0.0.sql @@ -38,4 +38,10 @@ SELECT classification as `aws.elb.classification`, classification_reason as `aws.elb.classification_reason` FROM - {table_name}; + {table_name} +WITH ( + auto_refresh = 'true', + checkpoint_location = '{s3_bucket_location}/checkpoint', + watermark_delay = '1 Minute', + extra_options = '{ "{table_name}": { "maxFilesPerTrigger": "10" }}' +); diff --git a/server/adaptors/integrations/__data__/repository/aws_elb/assets/refresh_mv-1.0.0.sql b/server/adaptors/integrations/__data__/repository/aws_elb/assets/refresh_mv-1.0.0.sql deleted file mode 100644 index 0f6ba98960..0000000000 --- a/server/adaptors/integrations/__data__/repository/aws_elb/assets/refresh_mv-1.0.0.sql +++ /dev/null @@ -1 +0,0 @@ -REFRESH MATERIALIZED VIEW {table_name}_mview; diff --git a/server/adaptors/integrations/__data__/repository/aws_elb/aws_elb-1.0.0.json b/server/adaptors/integrations/__data__/repository/aws_elb/aws_elb-1.0.0.json index 27480a5d07..6fbc6714fe 100644 --- a/server/adaptors/integrations/__data__/repository/aws_elb/aws_elb-1.0.0.json +++ b/server/adaptors/integrations/__data__/repository/aws_elb/aws_elb-1.0.0.json @@ -61,11 +61,6 @@ "name": "create_mv", "version": "1.0.0", "language": "sql" - }, - { - "name": "refresh_mv", - "version": "1.0.0", - "language": "sql" } ] }, diff --git a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql index 2612638e74..0706db3b5a 100644 --- a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql +++ b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/create_mv_vpc-1.0.0.sql @@ -21,4 +21,10 @@ CREATE MATERIALIZED VIEW {table_name}_mview AS ELSE 'egress' END AS `aws.vpc.flow-direction` FROM - {table_name}; + {table_name} +WITH ( + auto_refresh = 'true', + checkpoint_location = '{s3_bucket_location}/checkpoint', + watermark_delay = '1 Minute', + extra_options = '{ "{table_name}": { "maxFilesPerTrigger": "10" }}' +) diff --git a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql deleted file mode 100644 index 458202eaeb..0000000000 --- a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/assets/refresh_mv_vpc-1.0.0.sql +++ /dev/null @@ -1 +0,0 @@ -REFRESH MATERIALIZED VIEW {table_name}_mview diff --git a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json index 2a2fbf3f56..6720e0be93 100644 --- a/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json +++ b/server/adaptors/integrations/__data__/repository/aws_vpc_flow/aws_vpc_flow-1.0.0.json @@ -57,11 +57,6 @@ "name": "create_mv_vpc", "version": "1.0.0", "language": "sql" - }, - { - "name": "refresh_mv_vpc", - "version": "1.0.0", - "language": "sql" } ] }, diff --git a/server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql b/server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql index 8b29fdf0b0..cb36863843 100644 --- a/server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql +++ b/server/adaptors/integrations/__data__/repository/nginx/assets/create_mv-1.0.0.sql @@ -8,3 +8,9 @@ SELECT body_bytes_sent AS `http.response.bytes`, 'nginx.access' AS `event.domain` FROM {table_name} +WITH ( + auto_refresh = 'true', + checkpoint_location = '{s3_bucket_location}/checkpoint', + watermark_delay = '1 Minute', + extra_options = '{ "{table_name}": { "maxFilesPerTrigger": "10" }}' +); diff --git a/server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql b/server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql deleted file mode 100644 index 458202eaeb..0000000000 --- a/server/adaptors/integrations/__data__/repository/nginx/assets/refresh_mv-1.0.0.sql +++ /dev/null @@ -1 +0,0 @@ -REFRESH MATERIALIZED VIEW {table_name}_mview diff --git a/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json b/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json index aadcae2f04..ec821ecf0c 100644 --- a/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json +++ b/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json @@ -49,11 +49,6 @@ "name": "create_mv", "version": "1.0.0", "language": "sql" - }, - { - "name": "refresh_mv", - "version": "1.0.0", - "language": "sql" } ] }, From d7efbd4f2b2a9bbb524c08b60d369419cfdb4a3d Mon Sep 17 00:00:00 2001 From: Simeon Widdis Date: Mon, 13 Nov 2023 13:07:21 -0800 Subject: [PATCH 07/18] Refactor repository reading for recursive directory searching (#1239) --- .../__test__/local_repository.test.ts | 4 ++-- .../integrations/__test__/manager.test.ts | 4 ++-- .../integrations/integrations_manager.ts | 8 +++---- .../repository/__test__/repository.test.ts | 10 +++++--- .../repository/fs_data_adaptor.ts | 23 +++++++++++++++++-- .../integrations/repository/repository.ts | 16 +++++++------ 6 files changed, 45 insertions(+), 20 deletions(-) diff --git a/server/adaptors/integrations/__test__/local_repository.test.ts b/server/adaptors/integrations/__test__/local_repository.test.ts index f1bfeb9b23..622547f116 100644 --- a/server/adaptors/integrations/__test__/local_repository.test.ts +++ b/server/adaptors/integrations/__test__/local_repository.test.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { RepositoryReader } from '../repository/repository'; +import { TemplateManager } from '../repository/repository'; import { IntegrationReader } from '../repository/integration'; import path from 'path'; import * as fs from 'fs/promises'; @@ -27,7 +27,7 @@ describe('The local repository', () => { }); it('Should pass deep validation for all local integrations.', async () => { - const repository: RepositoryReader = new RepositoryReader( + const repository: TemplateManager = new TemplateManager( path.join(__dirname, '../__data__/repository') ); const integrations: IntegrationReader[] = await repository.getIntegrationList(); diff --git a/server/adaptors/integrations/__test__/manager.test.ts b/server/adaptors/integrations/__test__/manager.test.ts index 75b89e5200..3ee62470c4 100644 --- a/server/adaptors/integrations/__test__/manager.test.ts +++ b/server/adaptors/integrations/__test__/manager.test.ts @@ -5,14 +5,14 @@ import { IntegrationsManager } from '../integrations_manager'; import { SavedObject, SavedObjectsClientContract } from '../../../../../../src/core/server/types'; -import { RepositoryReader } from '../repository/repository'; +import { TemplateManager } from '../repository/repository'; import { IntegrationInstanceBuilder } from '../integrations_builder'; import { IntegrationReader } from '../repository/integration'; import { SavedObjectsFindResponse } from '../../../../../../src/core/server'; describe('IntegrationsKibanaBackend', () => { let mockSavedObjectsClient: jest.Mocked; - let mockRepository: jest.Mocked; + let mockRepository: jest.Mocked; let backend: IntegrationsManager; beforeEach(() => { diff --git a/server/adaptors/integrations/integrations_manager.ts b/server/adaptors/integrations/integrations_manager.ts index d365e48eef..c516d3fc78 100644 --- a/server/adaptors/integrations/integrations_manager.ts +++ b/server/adaptors/integrations/integrations_manager.ts @@ -8,17 +8,17 @@ import { addRequestToMetric } from '../../common/metrics/metrics_helper'; import { IntegrationsAdaptor } from './integrations_adaptor'; import { SavedObject, SavedObjectsClientContract } from '../../../../../src/core/server/types'; import { IntegrationInstanceBuilder } from './integrations_builder'; -import { RepositoryReader } from './repository/repository'; +import { TemplateManager } from './repository/repository'; export class IntegrationsManager implements IntegrationsAdaptor { client: SavedObjectsClientContract; instanceBuilder: IntegrationInstanceBuilder; - repository: RepositoryReader; + repository: TemplateManager; - constructor(client: SavedObjectsClientContract, repository?: RepositoryReader) { + constructor(client: SavedObjectsClientContract, repository?: TemplateManager) { this.client = client; this.repository = - repository ?? new RepositoryReader(path.join(__dirname, '__data__/repository')); + repository ?? new TemplateManager(path.join(__dirname, '__data__/repository')); this.instanceBuilder = new IntegrationInstanceBuilder(this.client); } diff --git a/server/adaptors/integrations/repository/__test__/repository.test.ts b/server/adaptors/integrations/repository/__test__/repository.test.ts index d66fc5e863..ea5c853c66 100644 --- a/server/adaptors/integrations/repository/__test__/repository.test.ts +++ b/server/adaptors/integrations/repository/__test__/repository.test.ts @@ -4,7 +4,7 @@ */ import * as fs from 'fs/promises'; -import { RepositoryReader } from '../repository'; +import { TemplateManager } from '../repository'; import { IntegrationReader } from '../integration'; import { Dirent, Stats } from 'fs'; import path from 'path'; @@ -12,10 +12,14 @@ import path from 'path'; jest.mock('fs/promises'); describe('Repository', () => { - let repository: RepositoryReader; + let repository: TemplateManager; beforeEach(() => { - repository = new RepositoryReader('path/to/directory'); + repository = new TemplateManager('path/to/directory'); + }); + + afterEach(() => { + jest.resetAllMocks(); }); describe('getIntegrationList', () => { diff --git a/server/adaptors/integrations/repository/fs_data_adaptor.ts b/server/adaptors/integrations/repository/fs_data_adaptor.ts index b6915d5eea..d39a0de889 100644 --- a/server/adaptors/integrations/repository/fs_data_adaptor.ts +++ b/server/adaptors/integrations/repository/fs_data_adaptor.ts @@ -109,13 +109,32 @@ export class FileSystemCatalogDataAdaptor implements CatalogDataAdaptor { async findIntegrations(dirname: string = '.'): Promise> { try { - const files = await fs.readdir(path.join(this.directory, dirname)); - return { ok: true, value: files }; + const integrations: string[] = []; + await this.collectIntegrationsRecursive(dirname, integrations); + return { ok: true, value: integrations }; } catch (err: any) { return { ok: false, error: err }; } } + private async collectIntegrationsRecursive( + dirname: string, + integrations: string[] + ): Promise { + const entries = await fs.readdir(path.join(this.directory, dirname)); + + for (const entry of entries) { + const fullPath = path.join(dirname, entry); + const isDirectory = (await this.getDirectoryType(fullPath)) === 'integration'; + + if (isDirectory) { + integrations.push(fullPath); + } else if ((await this.getDirectoryType(fullPath)) === 'repository') { + await this.collectIntegrationsRecursive(fullPath, integrations); + } + } + } + async findIntegrationVersions(dirname: string = '.'): Promise> { let files; const integPath = path.join(this.directory, dirname); diff --git a/server/adaptors/integrations/repository/repository.ts b/server/adaptors/integrations/repository/repository.ts index 08200d474f..ca56767b0d 100644 --- a/server/adaptors/integrations/repository/repository.ts +++ b/server/adaptors/integrations/repository/repository.ts @@ -7,7 +7,7 @@ import * as path from 'path'; import { IntegrationReader } from './integration'; import { FileSystemCatalogDataAdaptor } from './fs_data_adaptor'; -export class RepositoryReader { +export class TemplateManager { reader: CatalogDataAdaptor; directory: string; @@ -24,20 +24,22 @@ export class RepositoryReader { return []; } const integrations = await Promise.all( - folders.value.map((i) => this.getIntegration(path.basename(i))) + folders.value.map((i) => + this.getIntegration(path.relative(this.directory, path.join(this.directory, i))) + ) ); return integrations.filter((x) => x !== null) as IntegrationReader[]; } - async getIntegration(name: string): Promise { - if ((await this.reader.getDirectoryType(name)) !== 'integration') { - console.error(`Requested integration '${name}' does not exist`); + async getIntegration(integPath: string): Promise { + if ((await this.reader.getDirectoryType(integPath)) !== 'integration') { + console.error(`Requested integration '${integPath}' does not exist`); return null; } - const integ = new IntegrationReader(name, this.reader.join(name)); + const integ = new IntegrationReader(integPath, this.reader.join(integPath)); const checkResult = await integ.getConfig(); if (!checkResult.ok) { - console.error(`Integration '${name}' is invalid:`, checkResult.error); + console.error(`Integration '${integPath}' is invalid:`, checkResult.error); return null; } return integ; From 43a044fa5075eedf0ab4c232e39bd5b149c63751 Mon Sep 17 00:00:00 2001 From: Peter Fitzgibbons Date: Mon, 13 Nov 2023 13:27:57 -0800 Subject: [PATCH 08/18] Add wrapAll to paragarph output on CodeBlocks (#1238) * Add wrapAll to paragarph output on CodeBlocks --------- Signed-off-by: Peter Fitzgibbons --- .../__snapshots__/para_output.test.tsx.snap | 2 +- .../__snapshots__/paragraphs.test.tsx.snap | 2 +- .../paragraph_components/para_output.tsx | 255 ++++++++++-------- .../paragraph_components/para_query_grid.tsx | 80 +++--- public/components/notebooks/index.scss | 5 + 5 files changed, 179 insertions(+), 165 deletions(-) diff --git a/public/components/notebooks/components/paragraph_components/__tests__/__snapshots__/para_output.test.tsx.snap b/public/components/notebooks/components/paragraph_components/__tests__/__snapshots__/para_output.test.tsx.snap index a56281a104..fc29baee65 100644 --- a/public/components/notebooks/components/paragraph_components/__tests__/__snapshots__/para_output.test.tsx.snap +++ b/public/components/notebooks/components/paragraph_components/__tests__/__snapshots__/para_output.test.tsx.snap @@ -2,7 +2,7 @@ exports[` spec renders markdown outputs 1`] = `
spec renders the component 1`] = ` style="opacity: 1; padding: 15px;" >
void; DashboardContainerByValueRenderer: DashboardStart['DashboardContainerByValueRenderer']; }) => { + /* Returns a component to render paragraph outputs using the para.typeOut property + * Currently supports HTML, TABLE, IMG + * TODO: add table rendering + */ + const dateFormat = uiSettingsService.get('dateFormat'); + const createQueryColumns = (jsonColumns: any[]) => { let index = 0; - let datagridColumns = []; + const datagridColumns = []; for (index = 0; index < jsonColumns.length; ++index) { const datagridColumnObject = { id: jsonColumns[index].name, @@ -54,7 +61,7 @@ export const ParaOutput = (props: { let index = 0; let schemaIndex = 0; for (index = 0; index < queryObject.datarows.length; ++index) { - let datarowValue = {}; + const datarowValue = {}; for (schemaIndex = 0; schemaIndex < queryObject.schema.length; ++schemaIndex) { const columnName = queryObject.schema[schemaIndex].name; if (typeof queryObject.datarows[index][schemaIndex] === 'object') { @@ -70,120 +77,134 @@ export const ParaOutput = (props: { return data; }; - const outputBody = (key: string, typeOut: string, val: string) => { - /* Returns a component to render paragraph outputs using the para.typeOut property - * Currently supports HTML, TABLE, IMG - * TODO: add table rendering - */ - const dateFormat = uiSettingsService.get('dateFormat'); - - if (typeOut !== undefined) { - switch (typeOut) { - case 'QUERY': - const inputQuery = para.inp.substring(4, para.inp.length); - const queryObject = JSON.parse(val); - if (queryObject.hasOwnProperty('error')) { - return {val}; - } else { - const columns = createQueryColumns(queryObject.schema); - const data = getQueryOutputData(queryObject); - const [visibleColumns, setVisibleColumns] = useState(() => columns.map(({ id }) => id)); - return ( -
- - {inputQuery} - - - -
- ); - } - case 'MARKDOWN': - return ( - - - - ); - case 'VISUALIZATION': - let from = moment(visInput?.timeRange?.from).format(dateFormat); - let to = moment(visInput?.timeRange?.to).format(dateFormat); - from = from === 'Invalid date' ? visInput.timeRange.from : from; - to = to === 'Invalid date' ? visInput.timeRange.to : to; + if (typeOut !== undefined) { + switch (typeOut) { + case 'QUERY': + const inputQuery = inp.substring(4, inp.length); + const queryObject = JSON.parse(val); + if (queryObject.hasOwnProperty('error')) { + return {val}; + } else { + const columns = createQueryColumns(queryObject.schema); + const data = getQueryOutputData(queryObject); return ( - <> - - {`${from} - ${to}`} +
+ + {inputQuery} - + - - ); - case 'OBSERVABILITY_VISUALIZATION': - let fromObs = moment(visInput?.timeRange?.from).format(dateFormat); - let toObs = moment(visInput?.timeRange?.to).format(dateFormat); - fromObs = fromObs === 'Invalid date' ? visInput.timeRange.from : fromObs; - toObs = toObs === 'Invalid date' ? visInput.timeRange.to : toObs; - const onEditClick = (savedVisualizationId: string) => { - window.location.assign(`observability-logs#/explorer/${savedVisualizationId}`); - }; - return ( - <> - - {`${fromObs} - ${toObs}`} - -
- -
- +
); - case 'HTML': - return ( - - {/* eslint-disable-next-line react/jsx-pascal-case */} - + } + case 'MARKDOWN': + return ( + + + + ); + case 'VISUALIZATION': + let from = moment(visInput?.timeRange?.from).format(dateFormat); + let to = moment(visInput?.timeRange?.to).format(dateFormat); + from = from === 'Invalid date' ? visInput.timeRange.from : from; + to = to === 'Invalid date' ? visInput.timeRange.to : to; + return ( + <> + + {`${from} - ${to}`} - ); - case 'TABLE': - return
{val}
; - case 'IMG': - return ; - default: - return
{val}
; - } - } else { - console.log('output not supported', typeOut); - return
;
+            
+          
+        );
+      case 'OBSERVABILITY_VISUALIZATION':
+        let fromObs = moment(visInput?.timeRange?.from).format(dateFormat);
+        let toObs = moment(visInput?.timeRange?.to).format(dateFormat);
+        fromObs = fromObs === 'Invalid date' ? visInput.timeRange.from : fromObs;
+        toObs = toObs === 'Invalid date' ? visInput.timeRange.to : toObs;
+        const onEditClick = (savedVisualizationId: string) => {
+          window.location.assign(`observability-logs#/explorer/${savedVisualizationId}`);
+        };
+        return (
+          <>
+            
+              {`${fromObs} - ${toObs}`}
+            
+            
+ +
+ + ); + case 'HTML': + return ( + + {/* eslint-disable-next-line react/jsx-pascal-case */} + + + ); + case 'TABLE': + return
{val}
; + case 'IMG': + return ; + default: + return
{val}
; } - }; + } else { + console.log('output not supported', typeOut); + return
;
+  }
+};
 
+/*
+ * "ParaOutput" component is used by notebook to populate paragraph outputs for an open notebook.
+ *
+ * Props taken in as params are:
+ * para - parsed paragraph from notebook
+ *
+ * Outputs component of nteract used as a container for notebook UI.
+ * https://components.nteract.io/#outputs
+ */
+export const ParaOutput = (props: {
+  http: CoreStart['http'];
+  pplService: PPLService;
+  para: ParaType;
+  visInput: DashboardContainerInput;
+  setVisInput: (input: DashboardContainerInput) => void;
+  DashboardContainerByValueRenderer: DashboardStart['DashboardContainerByValueRenderer'];
+}) => {
   const { para, DashboardContainerByValueRenderer, visInput, setVisInput } = props;
 
   return !para.isOutputHidden ? (
     <>
       {para.typeOut.map((typeOut: string, tIdx: number) => {
-        return outputBody(para.uniqueId + '_paraOutputBody', typeOut, para.out[tIdx]);
+        return (
+          
+        );
       })}
     
   ) : null;
diff --git a/public/components/notebooks/components/paragraph_components/para_query_grid.tsx b/public/components/notebooks/components/paragraph_components/para_query_grid.tsx
index 8b8425278f..6321c57026 100644
--- a/public/components/notebooks/components/paragraph_components/para_query_grid.tsx
+++ b/public/components/notebooks/components/paragraph_components/para_query_grid.tsx
@@ -5,49 +5,39 @@
 
 import React, { useCallback, useEffect, useMemo, useState } from 'react';
 import $ from 'jquery';
-import { 
-  EuiDataGrid,
-  EuiLoadingSpinner,
-  EuiSpacer
-} from '@elastic/eui';
+import { EuiDataGrid, EuiLoadingSpinner, EuiSpacer } from '@elastic/eui';
 
-type QueryDataGridProps = {
-  rowCount: number,
-  queryColumns: Array,
-  visibleColumns: Array,
-  setVisibleColumns: (visibleColumns: string[]) => void,
-  dataValues: Array,
+interface QueryDataGridProps {
+  rowCount: number;
+  queryColumns: any[];
+  dataValues: any[];
 }
 
-type RenderCellValueProps = {
-  rowIndex: number,
-  columnId: string
+interface RenderCellValueProps {
+  rowIndex: number;
+  columnId: string;
 }
 
 function QueryDataGrid(props: QueryDataGridProps) {
-  const {
-    rowCount,
-    queryColumns,
-    visibleColumns,
-    setVisibleColumns,
-    dataValues,
-  } = props;
+  const { rowCount, queryColumns, dataValues } = props;
   const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });
   // ** Sorting config
   const [sortingColumns, setSortingColumns] = useState([]);
+  const [visibleColumns, setVisibleColumns] = useState>([]);
+
   const [isVisible, setIsVisible] = useState(false);
 
   const onSort = useCallback(
-    (sortingColumns) => {
-      setSortingColumns(sortingColumns);
+    (newColumns) => {
+      setSortingColumns(newColumns);
     },
     [setSortingColumns]
   );
 
   const onChangeItemsPerPage = useCallback(
     (pageSize) =>
-      setPagination((pagination) => ({
-        ...pagination,
+      setPagination((newPagination) => ({
+        ...newPagination,
         pageSize,
         pageIndex: 0,
       })),
@@ -55,28 +45,24 @@ function QueryDataGrid(props: QueryDataGridProps) {
   );
 
   const onChangePage = useCallback(
-    (pageIndex) =>
-      setPagination((pagination) => ({ ...pagination, pageIndex })),
+    (pageIndex) => setPagination((newPagination) => ({ ...newPagination, pageIndex })),
     [setPagination]
   );
 
   const renderCellValue = useMemo(() => {
     return ({ rowIndex, columnId }: RenderCellValueProps) => {
-      return dataValues.hasOwnProperty(rowIndex)
-        ? dataValues[rowIndex][columnId]
-        : null;
+      return dataValues.hasOwnProperty(rowIndex) ? dataValues[rowIndex][columnId] : null;
     };
   }, []);
 
-  const getUpdatedVisibleColumns = (queryColumns: Array) => {
-    let updatedVisibleColumns = [];
+  const getUpdatedVisibleColumns = () => {
+    const updatedVisibleColumns = [];
     for (let index = 0; index < queryColumns.length; ++index) {
       updatedVisibleColumns.push(queryColumns[index].displayAsText);
     }
     return updatedVisibleColumns;
-  }
+  };
 
-  
   useEffect(() => {
     if ($('.euiDataGrid__overflow').is(':visible')) {
       setIsVisible(true);
@@ -86,12 +72,12 @@ function QueryDataGrid(props: QueryDataGridProps) {
         setIsVisible(true);
       }
     }, 1000);
-    setVisibleColumns(getUpdatedVisibleColumns(queryColumns));
+    setVisibleColumns(getUpdatedVisibleColumns());
   }, []);
 
-  const displayLoadingSpinner = (!isVisible) ? (
+  const displayLoadingSpinner = !isVisible ? (
     <>
-      
+      
       
     
   ) : null;
@@ -100,7 +86,7 @@ function QueryDataGrid(props: QueryDataGridProps) {
     
{displayLoadingSpinner}
- ) + ); } function queryDataGridPropsAreEqual(prevProps: QueryDataGridProps, nextProps: QueryDataGridProps) { - return prevProps.rowCount === nextProps.rowCount - && JSON.stringify(prevProps.queryColumns) === JSON.stringify(nextProps.queryColumns) - && JSON.stringify(prevProps.visibleColumns) === JSON.stringify(nextProps.visibleColumns) - && JSON.stringify(prevProps.dataValues) === JSON.stringify(nextProps.dataValues) + return ( + prevProps.rowCount === nextProps.rowCount && + JSON.stringify(prevProps.queryColumns) === JSON.stringify(nextProps.queryColumns) && + JSON.stringify(prevProps.visibleColumns) === JSON.stringify(nextProps.visibleColumns) && + JSON.stringify(prevProps.dataValues) === JSON.stringify(nextProps.dataValues) + ); } -export const QueryDataGridMemo = React.memo(QueryDataGrid, queryDataGridPropsAreEqual); \ No newline at end of file +export const QueryDataGridMemo = React.memo(QueryDataGrid, queryDataGridPropsAreEqual); diff --git a/public/components/notebooks/index.scss b/public/components/notebooks/index.scss index d21d4c8668..ef56660922 100644 --- a/public/components/notebooks/index.scss +++ b/public/components/notebooks/index.scss @@ -25,6 +25,11 @@ 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; } +.wrapAll { + word-break: break-all; + word-wrap: break-word; +} + .notebooks-paragraph button[aria-label='Expand'] { display: none; } From c9c1a3208208270d6ac58622e5b6000f24fbc88c Mon Sep 17 00:00:00 2001 From: Nagammai-S-ML <108322039+Nagammai-S-ML@users.noreply.github.com> Date: Fri, 17 Nov 2023 00:39:09 +0530 Subject: [PATCH 09/18] Added following visualizations in nginx log overview dashboard (#1250) --- .../nginx/assets/nginx-1.0.0.ndjson | 20 ++++++++++-------- .../__data__/repository/nginx/info/README.md | 1 + .../repository/nginx/nginx-1.0.0.json | 4 ++++ .../repository/nginx/static/dashboard2.png | Bin 0 -> 59790 bytes 4 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 server/adaptors/integrations/__data__/repository/nginx/static/dashboard2.png diff --git a/server/adaptors/integrations/__data__/repository/nginx/assets/nginx-1.0.0.ndjson b/server/adaptors/integrations/__data__/repository/nginx/assets/nginx-1.0.0.ndjson index 581cdf42d6..cbafbc80ef 100644 --- a/server/adaptors/integrations/__data__/repository/nginx/assets/nginx-1.0.0.ndjson +++ b/server/adaptors/integrations/__data__/repository/nginx/assets/nginx-1.0.0.ndjson @@ -1,9 +1,11 @@ -{"attributes":{"fields":"[{\"count\":0,\"name\":\"@message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"attributes.data_stream.dataset\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attributes.data_stream.namespace\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attributes.data_stream.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"body\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.address.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.destination.address\"}}},{\"count\":0,\"name\":\"communication.destination.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.domain.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.destination.domain\"}}},{\"count\":0,\"name\":\"communication.destination.geo.city_name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.country_iso_code\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.country_name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.location\",\"type\":\"geo_point\",\"esTypes\":[\"geo_point\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.mac\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.packets\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.port\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.sock.family\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.source.address.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.source.address\"}}},{\"count\":0,\"name\":\"communication.source.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.source.domain.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.source.domain\"}}},{\"count\":0,\"name\":\"communication.source.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.mac\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.packets\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.port\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.category\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.domain\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.exception.message\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.exception.stacktrace\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"event.exception.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.kind\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.result\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.source\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.client.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.flavor\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.body.content\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.request.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.request.id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"http.request.id\"}}},{\"count\":0,\"name\":\"http.request.method\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.mime_type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.referrer\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.resent_count\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.response.body.content\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.response.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.response.id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.response.id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"http.response.id\"}}},{\"count\":0,\"name\":\"http.response.status_code\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.route\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.schema\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.target\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.url\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.user_agent\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.dropped_attributes_count\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.name.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.name\"}}},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.schemaUrl\"}}},{\"count\":0,\"name\":\"instrumentationScope.version\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.version.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.version\"}}},{\"count\":0,\"name\":\"observedTimestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"observerTime\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"schemaUrl\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"schemaUrl.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"schemaUrl\"}}},{\"count\":0,\"name\":\"severity.number\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"severity.text\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"severity.text.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"severity.text\"}}},{\"count\":0,\"name\":\"spanId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"span_id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"span_id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"span_id\"}}},{\"count\":0,\"name\":\"traceId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"trace_id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trace_id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trace_id\"}}}]","timeFieldName":"@timestamp","title":"ss4o_logs-nginx-sample-sample"},"id":"e9c4434d-198a-46a7-81f9-e5af307272fd","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2023-08-01T17:53:22.326Z","version":"WzE4NywxXQ=="} -{"attributes":{"columns":["http.request.method","http.response.status_code"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"event.domain:nginx.access\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"[NGINX Core Logs 1.0] Nginx Access Logs","version":1},"id":"d4e96d86-b743-4044-9f7b-a0e6f20f8359","migrationVersion":{"search":"7.9.3"},"references":[{"id":"e9c4434d-198a-46a7-81f9-e5af307272fd","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-08-01T17:53:22.326Z","version":"WzE4OCwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"[NGINX Core Logs 1.0] Response codes over time","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"[NGINX Core Logs 1.0] Response codes over time\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-24h\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"filters\",\"params\":{\"filters\":[{\"input\":{\"query\":\"http.response.status_code:[200 TO 299]\",\"language\":\"lucene\"},\"label\":\"200s\"},{\"input\":{\"query\":\"http.response.status_code:[300 TO 399]\",\"language\":\"lucene\"},\"label\":\"300s\"},{\"input\":{\"query\":\"http.response.status_code:[400 TO 499]\",\"language\":\"lucene\"},\"label\":\"400s\"},{\"input\":{\"query\":\"http.response.status_code:[500 TO 599]\",\"language\":\"lucene\"},\"label\":\"500s\"},{\"input\":{\"query\":\"http.response.status_code:0\",\"language\":\"lucene\"},\"label\":\"0\"}]},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"86dba7b7-0d08-40bd-9963-bcd49a029fbf","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"d4e96d86-b743-4044-9f7b-a0e6f20f8359","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-08-01T17:53:22.326Z","version":"WzE4OSwxXQ=="} -{"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"query\":{\"query\":\"http.response.status_code >= 300 and event.domain:nginx.access\",\"language\":\"kuery\"},\"version\":true,\"highlight\":{\"post_tags\":[\"@/kibana-highlighted-field@\"],\"fields\":{\"*\":{}},\"pre_tags\":[\"@kibana-highlighted-field@\"],\"require_field_match\":false,\"fragment_size\":2147483647},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"[NGINX Core Logs 1.0] Nginx Error Logs","version":1},"id":"d42a5702-8e4c-4ac3-bbc4-c15af70ec6fe","migrationVersion":{"search":"7.9.3"},"references":[{"id":"e9c4434d-198a-46a7-81f9-e5af307272fd","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-08-01T17:53:22.326Z","version":"WzE5MCwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"[NGINX Core Logs 1.0] Errors over time","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"[NGINX Core Logs 1.0] Errors over time\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-24h\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"077afa4b-55ea-4e28-afef-b0a686f695d5","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"d42a5702-8e4c-4ac3-bbc4-c15af70ec6fe","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-08-01T17:53:22.326Z","version":"WzE5MSwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Data Volume","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Data Volume\",\"type\":\"area\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"params\":{\"field\":\"http.response.bytes\",\"customLabel\":\"Response Bytes\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-15m\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"m\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Response Bytes\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Response Bytes\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"},\"labels\":{}}}"},"id":"183959af-f76c-483c-97b6-b976a1eb27c6","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"d4e96d86-b743-4044-9f7b-a0e6f20f8359","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-08-01T17:55:50.854Z","version":"WzE5OCwxXQ=="} -{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"HTTP Top URLs","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"HTTP Top URLs\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.url\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"57a32ca3-5c6f-453a-a87c-5f90bb009e14","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"e9c4434d-198a-46a7-81f9-e5af307272fd","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-08-01T17:53:22.326Z","version":"WzE5MywxXQ=="} -{"attributes":{"description":"Nginx dashboard with basic Observability on access / error logs","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"version\":\"3.0.0\",\"gridData\":{\"h\":8,\"i\":\"1f31e50b-06e3-41e6-972e-e4e5fe1a9872\",\"w\":48,\"x\":0,\"y\":0},\"panelIndex\":\"1f31e50b-06e3-41e6-972e-e4e5fe1a9872\",\"embeddableConfig\":{\"title\":\"HTTP Status Codes over Time\",\"hidePanelTitles\":false},\"title\":\"HTTP Status Codes over Time\",\"panelRefName\":\"panel_0\"},{\"version\":\"3.0.0\",\"gridData\":{\"h\":9,\"i\":\"d91a8da4-b34b-470a-aca6-9c76b47cd6fb\",\"w\":24,\"x\":0,\"y\":8},\"panelIndex\":\"d91a8da4-b34b-470a-aca6-9c76b47cd6fb\",\"embeddableConfig\":{\"title\":\"HTTP Errors over Time\",\"hidePanelTitles\":false},\"title\":\"HTTP Errors over Time\",\"panelRefName\":\"panel_1\"},{\"version\":\"3.0.0\",\"gridData\":{\"h\":15,\"i\":\"4d8c2aa7-159c-4a1a-80ff-00a9299056ce\",\"w\":24,\"x\":0,\"y\":17},\"panelIndex\":\"4d8c2aa7-159c-4a1a-80ff-00a9299056ce\",\"embeddableConfig\":{\"title\":\"HTTP Data Volume\",\"hidePanelTitles\":false},\"title\":\"HTTP Data Volume\",\"panelRefName\":\"panel_2\"},{\"version\":\"3.0.0\",\"gridData\":{\"x\":24,\"y\":8,\"w\":24,\"h\":15,\"i\":\"8e658e0d-7b64-4be8-8ad9-3b28eadf30f0\"},\"panelIndex\":\"8e658e0d-7b64-4be8-8ad9-3b28eadf30f0\",\"embeddableConfig\":{},\"panelRefName\":\"panel_3\"}]","refreshInterval":{"pause":true,"value":0},"timeFrom":"now-15m","timeRestore":true,"timeTo":"now","title":"Nginx Logs Overview","version":1},"id":"39ca87b7-d4ac-4891-bb89-fabb31869516","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"86dba7b7-0d08-40bd-9963-bcd49a029fbf","name":"panel_0","type":"visualization"},{"id":"077afa4b-55ea-4e28-afef-b0a686f695d5","name":"panel_1","type":"visualization"},{"id":"183959af-f76c-483c-97b6-b976a1eb27c6","name":"panel_2","type":"visualization"},{"id":"57a32ca3-5c6f-453a-a87c-5f90bb009e14","name":"panel_3","type":"visualization"}],"type":"dashboard","updated_at":"2023-08-01T17:53:22.326Z","version":"WzE5NCwxXQ=="} -{"exportedCount":8,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file +{"attributes":{"fields":"[{\"count\":0,\"name\":\"@message\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"@timestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"_id\",\"type\":\"string\",\"esTypes\":[\"_id\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_index\",\"type\":\"string\",\"esTypes\":[\"_index\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_score\",\"type\":\"number\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_source\",\"type\":\"_source\",\"esTypes\":[\"_source\"],\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"_type\",\"type\":\"string\",\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"attributes.data_stream.dataset\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attributes.data_stream.namespace\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"attributes.data_stream.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"body\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.address.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.destination.address\"}}},{\"count\":0,\"name\":\"communication.destination.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.destination.domain.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.destination.domain\"}}},{\"count\":0,\"name\":\"communication.destination.geo.city_name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.country_iso_code\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.country_name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.geo.location\",\"type\":\"geo_point\",\"esTypes\":[\"geo_point\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.mac\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.packets\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.destination.port\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.sock.family\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.address\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.source.address.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.source.address\"}}},{\"count\":0,\"name\":\"communication.source.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.domain\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"communication.source.domain.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"communication.source.domain\"}}},{\"count\":0,\"name\":\"communication.source.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.mac\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.packets\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"communication.source.port\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.category\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.domain\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.exception.message\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.exception.stacktrace\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"event.exception.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.kind\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.name\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.result\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.source\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"event.type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.client.ip\",\"type\":\"ip\",\"esTypes\":[\"ip\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.flavor\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.body.content\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.request.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.request.id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"http.request.id\"}}},{\"count\":0,\"name\":\"http.request.method\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.mime_type\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.request.referrer\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.resent_count\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.response.body.content\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.response.bytes\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.response.id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"http.response.id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"http.response.id\"}}},{\"count\":0,\"name\":\"http.response.status_code\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.route\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.schema\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.target\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.url\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"http.user_agent\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.dropped_attributes_count\",\"type\":\"number\",\"esTypes\":[\"integer\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"instrumentationScope.name\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.name.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.name\"}}},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.schemaUrl.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.schemaUrl\"}}},{\"count\":0,\"name\":\"instrumentationScope.version\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"instrumentationScope.version.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"instrumentationScope.version\"}}},{\"count\":0,\"name\":\"observedTimestamp\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"observerTime\",\"type\":\"date\",\"esTypes\":[\"date\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"schemaUrl\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"schemaUrl.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"schemaUrl\"}}},{\"count\":0,\"name\":\"severity.number\",\"type\":\"number\",\"esTypes\":[\"long\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"severity.text\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"severity.text.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"severity.text\"}}},{\"count\":0,\"name\":\"spanId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"span_id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"span_id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"span_id\"}}},{\"count\":0,\"name\":\"traceId\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"count\":0,\"name\":\"trace_id\",\"type\":\"string\",\"esTypes\":[\"text\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"count\":0,\"name\":\"trace_id.keyword\",\"type\":\"string\",\"esTypes\":[\"keyword\"],\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true,\"subType\":{\"multi\":{\"parent\":\"trace_id\"}}}]","timeFieldName":"@timestamp","title":"ss4o_logs-nginx-sample-sample"},"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","migrationVersion":{"index-pattern":"7.6.0"},"references":[],"type":"index-pattern","updated_at":"2023-11-06T06:10:10.775Z","version":"WzExOSwxXQ=="} +{"attributes":{"columns":["http.request.method","http.response.status_code"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"event.domain:nginx.access\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[],"title":"[NGINX Core Logs 1.0] Nginx Access Logs","version":1},"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","migrationVersion":{"search":"7.9.3"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMCwxXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"[NGINX Core Logs 1.0] Response codes over time","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"[NGINX Core Logs 1.0] Response codes over time\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-24h\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"filters\",\"params\":{\"filters\":[{\"input\":{\"query\":\"http.response.status_code:[200 TO 299]\",\"language\":\"lucene\"},\"label\":\"200s\"},{\"input\":{\"query\":\"http.response.status_code:[300 TO 399]\",\"language\":\"lucene\"},\"label\":\"300s\"},{\"input\":{\"query\":\"http.response.status_code:[400 TO 499]\",\"language\":\"lucene\"},\"label\":\"400s\"},{\"input\":{\"query\":\"http.response.status_code:[500 TO 599]\",\"language\":\"lucene\"},\"label\":\"500s\"},{\"input\":{\"query\":\"http.response.status_code:0\",\"language\":\"lucene\"},\"label\":\"0\"}]},\"schema\":\"group\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"feb24bf8-f5e4-4f24-a9e0-c6618a8db3c3","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMSwxXQ=="} +{"attributes":{"columns":["_source"],"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"highlightAll\":true,\"query\":{\"query\":\"http.response.status_code >= 300 and event.domain:nginx.access\",\"language\":\"kuery\"},\"version\":true,\"highlight\":{\"post_tags\":[\"@/kibana-highlighted-field@\"],\"fields\":{\"*\":{}},\"pre_tags\":[\"@kibana-highlighted-field@\"],\"require_field_match\":false,\"fragment_size\":2147483647},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"sort":[["@timestamp","desc"]],"title":"[NGINX Core Logs 1.0] Nginx Error Logs","version":1},"id":"aae90f71-83e6-4154-83f8-80185a58cde7","migrationVersion":{"search":"7.9.3"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"search","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMiwxXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"[NGINX Core Logs 1.0] Errors over time","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"[NGINX Core Logs 1.0] Errors over time\",\"type\":\"histogram\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-24h\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"auto\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{}},\"schema\":\"segment\"}],\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"labels\":{\"show\":false},\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"}}}"},"id":"bfa0e172-75fa-485d-aebd-b623713359b3","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"aae90f71-83e6-4154-83f8-80185a58cde7","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyMywxXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[],\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"HTTP Top URLs","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"HTTP Top URLs\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.url\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":10,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"69b27677-9127-4581-9f1a-cc3a84822354","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyNSwxXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Data Volume","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Data Volume\",\"type\":\"area\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"sum\",\"params\":{\"field\":\"http.response.bytes\",\"customLabel\":\"Response Bytes\"},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"params\":{\"field\":\"@timestamp\",\"timeRange\":{\"from\":\"now-15m\",\"to\":\"now\"},\"useNormalizedOpenSearchInterval\":true,\"scaleMetricValues\":false,\"interval\":\"m\",\"drop_partials\":false,\"min_doc_count\":1,\"extended_bounds\":{},\"customLabel\":\"\"},\"schema\":\"segment\"}],\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"filter\":true,\"truncate\":100},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Response Bytes\"}}],\"seriesParams\":[{\"show\":true,\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Response Bytes\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"lineWidth\":2,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"thresholdLine\":{\"show\":false,\"value\":10,\"width\":1,\"style\":\"full\",\"color\":\"#E7664C\"},\"labels\":{}}}"},"id":"de792cf1-b1f1-4705-890d-4206709c7360","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-06T06:10:10.775Z","version":"WzEyNCwxXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"title":"Status code dropdown","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Status code dropdown\",\"type\":\"input_control_vis\",\"aggs\":[],\"params\":{\"controls\":[{\"id\":\"1700045798676\",\"fieldName\":\"http.response.status_code\",\"parent\":\"\",\"label\":\"Dropdown\",\"type\":\"list\",\"options\":{\"type\":\"terms\",\"multiselect\":true,\"dynamicOptions\":true,\"size\":5,\"order\":\"desc\"},\"indexPatternRefName\":\"control_0_index_pattern\"}],\"updateFiltersOnChange\":false,\"useTimeFilter\":false,\"pinFilters\":false}}"},"id":"c4fcd310-83a5-11ee-8c8a-a1faaf8536ee","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"689b4f16-5275-4e1e-9835-91dd5e06161e","name":"control_0_index_pattern","type":"index-pattern"}],"type":"visualization","updated_at":"2023-11-15T10:57:29.280Z","version":"WzEyNywxXQ=="} +{"attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"savedSearchRefName":"search_0","title":"Transactions by API","uiStateJSON":"{}","version":1,"visState":"{\"title\":\"Transactions by API\",\"type\":\"table\",\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"params\":{},\"schema\":\"metric\"},{\"id\":\"2\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.url\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":500,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"\"},\"schema\":\"bucket\"},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"params\":{\"field\":\"http.response.status_code\",\"orderBy\":\"1\",\"order\":\"desc\",\"size\":500,\"otherBucket\":false,\"otherBucketLabel\":\"Other\",\"missingBucket\":false,\"missingBucketLabel\":\"Missing\",\"customLabel\":\"\"},\"schema\":\"bucket\"}],\"params\":{\"perPage\":10,\"showPartialRows\":false,\"showMetricsAtAllLevels\":false,\"showTotal\":false,\"totalFunc\":\"sum\",\"percentageCol\":\"\"}}"},"id":"0e69fad0-76ec-11ee-8c8a-a1faaf8536ee","migrationVersion":{"visualization":"7.10.0"},"references":[{"id":"78ce24fc-c71c-4f58-be16-6d736e788a80","name":"search_0","type":"search"}],"type":"visualization","updated_at":"2023-11-16T05:08:59.573Z","version":"WzEzMCwxXQ=="} +{"attributes":{"description":"Nginx dashboard with basic Observability on access / error logs","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"language\":\"kuery\",\"query\":\"\"},\"filter\":[]}"},"optionsJSON":"{\"hidePanelTitles\":false,\"useMargins\":true}","panelsJSON":"[{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":8,\"i\":\"1f31e50b-06e3-41e6-972e-e4e5fe1a9872\",\"w\":48,\"x\":0,\"y\":15},\"panelIndex\":\"1f31e50b-06e3-41e6-972e-e4e5fe1a9872\",\"title\":\"HTTP Status Codes over Time\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_0\"},{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":9,\"i\":\"d91a8da4-b34b-470a-aca6-9c76b47cd6fb\",\"w\":24,\"x\":0,\"y\":23},\"panelIndex\":\"d91a8da4-b34b-470a-aca6-9c76b47cd6fb\",\"title\":\"HTTP Errors over Time\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_1\"},{\"embeddableConfig\":{\"vis\":{\"sortColumn\":{\"colIndex\":0,\"direction\":\"asc\"}}},\"gridData\":{\"h\":15,\"i\":\"8e658e0d-7b64-4be8-8ad9-3b28eadf30f0\",\"w\":24,\"x\":24,\"y\":23},\"panelIndex\":\"8e658e0d-7b64-4be8-8ad9-3b28eadf30f0\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_2\"},{\"embeddableConfig\":{\"hidePanelTitles\":false},\"gridData\":{\"h\":15,\"i\":\"4d8c2aa7-159c-4a1a-80ff-00a9299056ce\",\"w\":24,\"x\":0,\"y\":32},\"panelIndex\":\"4d8c2aa7-159c-4a1a-80ff-00a9299056ce\",\"title\":\"HTTP Data Volume\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_3\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"742783de-3ed5-4ba8-aafd-948220697bc6\",\"w\":24,\"x\":0,\"y\":0},\"panelIndex\":\"742783de-3ed5-4ba8-aafd-948220697bc6\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_4\"},{\"embeddableConfig\":{},\"gridData\":{\"h\":15,\"i\":\"8f9de824-cffd-43d1-b59e-8912ec9da1c5\",\"w\":24,\"x\":24,\"y\":0},\"panelIndex\":\"8f9de824-cffd-43d1-b59e-8912ec9da1c5\",\"version\":\"2.9.0\",\"panelRefName\":\"panel_5\"}]","refreshInterval":{"pause":true,"value":0},"timeFrom":"now-90d","timeRestore":true,"timeTo":"now","title":"Nginx Logs Overview","version":1},"id":"49e36499-ca0a-4636-9216-6db5095cc96e","migrationVersion":{"dashboard":"7.9.3"},"references":[{"id":"feb24bf8-f5e4-4f24-a9e0-c6618a8db3c3","name":"panel_0","type":"visualization"},{"id":"bfa0e172-75fa-485d-aebd-b623713359b3","name":"panel_1","type":"visualization"},{"id":"69b27677-9127-4581-9f1a-cc3a84822354","name":"panel_2","type":"visualization"},{"id":"de792cf1-b1f1-4705-890d-4206709c7360","name":"panel_3","type":"visualization"},{"id":"c4fcd310-83a5-11ee-8c8a-a1faaf8536ee","name":"panel_4","type":"visualization"},{"id":"0e69fad0-76ec-11ee-8c8a-a1faaf8536ee","name":"panel_5","type":"visualization"}],"type":"dashboard","updated_at":"2023-11-16T05:16:26.850Z","version":"WzEzMiwxXQ=="} +{"exportedCount":10,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file diff --git a/server/adaptors/integrations/__data__/repository/nginx/info/README.md b/server/adaptors/integrations/__data__/repository/nginx/info/README.md index 6bc757b1f5..35cddafaf5 100644 --- a/server/adaptors/integrations/__data__/repository/nginx/info/README.md +++ b/server/adaptors/integrations/__data__/repository/nginx/info/README.md @@ -15,3 +15,4 @@ Nginx integration includes dashboards, visualisations, queries and an index mapp ### Dashboards ![](../static/dashboard1.png) +![](../static/dashboard2.png) diff --git a/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json b/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json index ec821ecf0c..9d95bc0b9f 100644 --- a/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json +++ b/server/adaptors/integrations/__data__/repository/nginx/nginx-1.0.0.json @@ -17,6 +17,10 @@ { "annotation": "NginX Dashboard", "path": "dashboard1.png" + }, + { + "annotation": "NginX Dashboard view", + "path": "dashboard2.png" } ] }, diff --git a/server/adaptors/integrations/__data__/repository/nginx/static/dashboard2.png b/server/adaptors/integrations/__data__/repository/nginx/static/dashboard2.png new file mode 100644 index 0000000000000000000000000000000000000000..5056581f540ce5347532f492395e08a3486b2cc8 GIT binary patch literal 59790 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 WTOh!G5z1pB9PQ8kTy@It+P?wZ8DFgc literal 0 HcmV?d00001 From e9a0674e84fe761bea4d4e427042117f9e828a46 Mon Sep 17 00:00:00 2001 From: Simeon Widdis Date: Wed, 22 Nov 2023 10:49:02 -0800 Subject: [PATCH 10/18] Fix Integrations integration tests (#1242) --- .cypress/integration/9_integrations.spec.js | 17 +++++++---------- .../setup_integration.test.tsx.snap | 12 ++++++++++++ .../components/setup_integration.tsx | 3 +++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/.cypress/integration/9_integrations.spec.js b/.cypress/integration/9_integrations.spec.js index 18a4c15ada..162acd9587 100644 --- a/.cypress/integration/9_integrations.spec.js +++ b/.cypress/integration/9_integrations.spec.js @@ -75,17 +75,14 @@ describe('Tests the add nginx integration instance flow', () => { createSamples(); moveToAvailableNginxIntegration(); cy.get('[data-test-subj="add-integration-button"]').click(); - cy.get('[data-test-subj="new-instance-name"]').should('have.value', 'nginx'); - cy.get('[data-test-subj="createInstanceButton"]').should('be.disabled') - cy.get('[data-test-subj="addIntegrationFlyoutTitle"]').should('exist') + cy.get('[data-test-subj="new-instance-name"]').should('have.value', 'nginx Integration'); + cy.get('[data-test-subj="create-instance-button"]').should('be.disabled') // Modifies the name of the integration - cy.get('[data-test-subj="new-instance-name"]').type(testInstance.substring(5)); - // validates the created sample index - cy.get('[data-test-subj="data-source-name"]').type('ss4o_logs-nginx-sample-sample'); - cy.get('[data-test-subj="validateIndex"]').click(); - cy.get('.euiToastHeader__title').should('contain', 'valid'); - cy.get('[data-test-subj="createInstanceButton"]').click(); - cy.get('.euiToastHeader__title').should('contain', 'successfully'); + cy.get('[data-test-subj="new-instance-name"]').clear().type(testInstance); + // Validates the created sample index + cy.get('[data-test-subj="data-source-name"]').type('ss4o_logs-nginx-sample-sample{enter}'); + cy.get('[data-test-subj="create-instance-button"]').click(); + cy.get('[data-test-subj="eventHomePageTitle"]').should('contain', 'nginx'); }) it('Navigates to installed integrations page and verifies that nginx-test exists', () => { diff --git a/public/components/integrations/components/__tests__/__snapshots__/setup_integration.test.tsx.snap b/public/components/integrations/components/__tests__/__snapshots__/setup_integration.test.tsx.snap index 3688bcb349..ac06da656e 100644 --- a/public/components/integrations/components/__tests__/__snapshots__/setup_integration.test.tsx.snap +++ b/public/components/integrations/components/__tests__/__snapshots__/setup_integration.test.tsx.snap @@ -128,6 +128,7 @@ exports[`Integration Setup Page Renders integration setup page as expected 1`] = className="euiFormRow__fieldWrapper" > @@ -761,6 +765,7 @@ exports[`Integration Setup Page Renders integration setup page as expected 1`] = >