mirror of
https://github.com/elastic/kibana.git
synced 2025-06-28 03:01:21 -04:00
[packages] add kbn-performance-testing-dataset-extractor (#131631)
This commit is contained in:
parent
692c47f616
commit
7f62a784df
14 changed files with 545 additions and 69 deletions
|
@ -19,14 +19,20 @@ for i in "${journeys[@]}"; do
|
||||||
JOURNEY_NAME="${i}"
|
JOURNEY_NAME="${i}"
|
||||||
echo "Looking for JOURNEY=${JOURNEY_NAME} and BUILD_ID=${BUILD_ID} in APM traces"
|
echo "Looking for JOURNEY=${JOURNEY_NAME} and BUILD_ID=${BUILD_ID} in APM traces"
|
||||||
|
|
||||||
./node_modules/.bin/performance-testing-dataset-extractor -u "${USER_FROM_VAULT}" -p "${PASS_FROM_VAULT}" -c "${ES_SERVER_URL}" -b "${BUILD_ID}" -n "${JOURNEY_NAME}"
|
node scripts/extract_performance_testing_dataset \
|
||||||
|
--journeyName "${JOURNEY_NAME}" \
|
||||||
|
--buildId "${BUILD_ID}" \
|
||||||
|
--es-url "${ES_SERVER_URL}" \
|
||||||
|
--es-username "${USER_FROM_VAULT}" \
|
||||||
|
--es-password "${PASS_FROM_VAULT}"
|
||||||
done
|
done
|
||||||
|
|
||||||
# archive json files with traces and upload as build artifacts
|
|
||||||
echo "--- Upload Kibana build, plugins and scalability traces to the public bucket"
|
echo "--- Upload Kibana build, plugins and scalability traces to the public bucket"
|
||||||
mkdir "${BUILD_ID}"
|
mkdir "${BUILD_ID}"
|
||||||
tar -czf "${BUILD_ID}/scalability_traces.tar.gz" output
|
# Archive json files with traces and upload as build artifacts
|
||||||
|
tar -czf "${BUILD_ID}/scalability_traces.tar.gz" -C target scalability_traces
|
||||||
buildkite-agent artifact upload "${BUILD_ID}/scalability_traces.tar.gz"
|
buildkite-agent artifact upload "${BUILD_ID}/scalability_traces.tar.gz"
|
||||||
|
# Upload Kibana build, plugins, commit sha and traces to the bucket
|
||||||
buildkite-agent artifact download kibana-default.tar.gz ./"${BUILD_ID}"
|
buildkite-agent artifact download kibana-default.tar.gz ./"${BUILD_ID}"
|
||||||
buildkite-agent artifact download kibana-default-plugins.tar.gz ./"${BUILD_ID}"
|
buildkite-agent artifact download kibana-default-plugins.tar.gz ./"${BUILD_ID}"
|
||||||
echo "${BUILDKITE_COMMIT}" > "${BUILD_ID}/KIBANA_COMMIT_HASH"
|
echo "${BUILDKITE_COMMIT}" > "${BUILD_ID}/KIBANA_COMMIT_HASH"
|
||||||
|
|
|
@ -474,7 +474,6 @@
|
||||||
"@elastic/eslint-plugin-eui": "0.0.2",
|
"@elastic/eslint-plugin-eui": "0.0.2",
|
||||||
"@elastic/github-checks-reporter": "0.0.20b3",
|
"@elastic/github-checks-reporter": "0.0.20b3",
|
||||||
"@elastic/makelogs": "^6.0.0",
|
"@elastic/makelogs": "^6.0.0",
|
||||||
"@elastic/performance-testing-dataset-extractor": "^0.0.3",
|
|
||||||
"@elastic/synthetics": "^1.0.0-beta.22",
|
"@elastic/synthetics": "^1.0.0-beta.22",
|
||||||
"@emotion/babel-preset-css-prop": "^11.2.0",
|
"@emotion/babel-preset-css-prop": "^11.2.0",
|
||||||
"@emotion/jest": "^11.9.0",
|
"@emotion/jest": "^11.9.0",
|
||||||
|
@ -501,6 +500,7 @@
|
||||||
"@kbn/import-resolver": "link:bazel-bin/packages/kbn-import-resolver",
|
"@kbn/import-resolver": "link:bazel-bin/packages/kbn-import-resolver",
|
||||||
"@kbn/jest-serializers": "link:bazel-bin/packages/kbn-jest-serializers",
|
"@kbn/jest-serializers": "link:bazel-bin/packages/kbn-jest-serializers",
|
||||||
"@kbn/optimizer": "link:bazel-bin/packages/kbn-optimizer",
|
"@kbn/optimizer": "link:bazel-bin/packages/kbn-optimizer",
|
||||||
|
"@kbn/performance-testing-dataset-extractor": "link:bazel-bin/packages/kbn-performance-testing-dataset-extractor",
|
||||||
"@kbn/plugin-generator": "link:bazel-bin/packages/kbn-plugin-generator",
|
"@kbn/plugin-generator": "link:bazel-bin/packages/kbn-plugin-generator",
|
||||||
"@kbn/plugin-helpers": "link:bazel-bin/packages/kbn-plugin-helpers",
|
"@kbn/plugin-helpers": "link:bazel-bin/packages/kbn-plugin-helpers",
|
||||||
"@kbn/pm": "link:packages/kbn-pm",
|
"@kbn/pm": "link:packages/kbn-pm",
|
||||||
|
@ -647,6 +647,7 @@
|
||||||
"@types/kbn__mapbox-gl": "link:bazel-bin/packages/kbn-mapbox-gl/npm_module_types",
|
"@types/kbn__mapbox-gl": "link:bazel-bin/packages/kbn-mapbox-gl/npm_module_types",
|
||||||
"@types/kbn__monaco": "link:bazel-bin/packages/kbn-monaco/npm_module_types",
|
"@types/kbn__monaco": "link:bazel-bin/packages/kbn-monaco/npm_module_types",
|
||||||
"@types/kbn__optimizer": "link:bazel-bin/packages/kbn-optimizer/npm_module_types",
|
"@types/kbn__optimizer": "link:bazel-bin/packages/kbn-optimizer/npm_module_types",
|
||||||
|
"@types/kbn__performance-testing-dataset-extractor": "link:bazel-bin/packages/kbn-performance-testing-dataset-extractor/npm_module_types",
|
||||||
"@types/kbn__plugin-discovery": "link:bazel-bin/packages/kbn-plugin-discovery/npm_module_types",
|
"@types/kbn__plugin-discovery": "link:bazel-bin/packages/kbn-plugin-discovery/npm_module_types",
|
||||||
"@types/kbn__plugin-generator": "link:bazel-bin/packages/kbn-plugin-generator/npm_module_types",
|
"@types/kbn__plugin-generator": "link:bazel-bin/packages/kbn-plugin-generator/npm_module_types",
|
||||||
"@types/kbn__plugin-helpers": "link:bazel-bin/packages/kbn-plugin-helpers/npm_module_types",
|
"@types/kbn__plugin-helpers": "link:bazel-bin/packages/kbn-plugin-helpers/npm_module_types",
|
||||||
|
|
|
@ -62,6 +62,7 @@ filegroup(
|
||||||
"//packages/kbn-mapbox-gl:build",
|
"//packages/kbn-mapbox-gl:build",
|
||||||
"//packages/kbn-monaco:build",
|
"//packages/kbn-monaco:build",
|
||||||
"//packages/kbn-optimizer:build",
|
"//packages/kbn-optimizer:build",
|
||||||
|
"//packages/kbn-performance-testing-dataset-extractor:build",
|
||||||
"//packages/kbn-plugin-discovery:build",
|
"//packages/kbn-plugin-discovery:build",
|
||||||
"//packages/kbn-plugin-generator:build",
|
"//packages/kbn-plugin-generator:build",
|
||||||
"//packages/kbn-plugin-helpers:build",
|
"//packages/kbn-plugin-helpers:build",
|
||||||
|
@ -160,6 +161,7 @@ filegroup(
|
||||||
"//packages/kbn-mapbox-gl:build_types",
|
"//packages/kbn-mapbox-gl:build_types",
|
||||||
"//packages/kbn-monaco:build_types",
|
"//packages/kbn-monaco:build_types",
|
||||||
"//packages/kbn-optimizer:build_types",
|
"//packages/kbn-optimizer:build_types",
|
||||||
|
"//packages/kbn-performance-testing-dataset-extractor:build_types",
|
||||||
"//packages/kbn-plugin-discovery:build_types",
|
"//packages/kbn-plugin-discovery:build_types",
|
||||||
"//packages/kbn-plugin-generator:build_types",
|
"//packages/kbn-plugin-generator:build_types",
|
||||||
"//packages/kbn-plugin-helpers:build_types",
|
"//packages/kbn-plugin-helpers:build_types",
|
||||||
|
|
122
packages/kbn-performance-testing-dataset-extractor/BUILD.bazel
Normal file
122
packages/kbn-performance-testing-dataset-extractor/BUILD.bazel
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
load("@npm//@bazel/typescript:index.bzl", "ts_config")
|
||||||
|
load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
|
||||||
|
load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project")
|
||||||
|
|
||||||
|
PKG_DIRNAME = "kbn-performance-testing-dataset-extractor"
|
||||||
|
PKG_REQUIRE_NAME = "@kbn/performance-testing-dataset-extractor"
|
||||||
|
|
||||||
|
SOURCE_FILES = glob(
|
||||||
|
[
|
||||||
|
"src/**/*.ts",
|
||||||
|
],
|
||||||
|
exclude = [
|
||||||
|
"**/*.test.*",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
SRCS = SOURCE_FILES
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "srcs",
|
||||||
|
srcs = SRCS,
|
||||||
|
)
|
||||||
|
|
||||||
|
NPM_MODULE_EXTRA_FILES = [
|
||||||
|
"package.json",
|
||||||
|
]
|
||||||
|
|
||||||
|
# In this array place runtime dependencies, including other packages and NPM packages
|
||||||
|
# which must be available for this code to run.
|
||||||
|
#
|
||||||
|
# To reference other packages use:
|
||||||
|
# "//repo/relative/path/to/package"
|
||||||
|
# eg. "//packages/kbn-utils"
|
||||||
|
#
|
||||||
|
# To reference a NPM package use:
|
||||||
|
# "@npm//name-of-package"
|
||||||
|
# eg. "@npm//lodash"
|
||||||
|
RUNTIME_DEPS = [
|
||||||
|
"//packages/kbn-dev-utils",
|
||||||
|
"//packages/kbn-utils",
|
||||||
|
"//packages/kbn-tooling-log",
|
||||||
|
"@npm//@elastic/elasticsearch",
|
||||||
|
]
|
||||||
|
|
||||||
|
# In this array place dependencies necessary to build the types, which will include the
|
||||||
|
# :npm_module_types target of other packages and packages from NPM, including @types/*
|
||||||
|
# packages.
|
||||||
|
#
|
||||||
|
# To reference the types for another package use:
|
||||||
|
# "//repo/relative/path/to/package:npm_module_types"
|
||||||
|
# eg. "//packages/kbn-utils:npm_module_types"
|
||||||
|
#
|
||||||
|
# References to NPM packages work the same as RUNTIME_DEPS
|
||||||
|
TYPES_DEPS = [
|
||||||
|
"//packages/kbn-dev-utils:npm_module_types",
|
||||||
|
"//packages/kbn-utils:npm_module_types",
|
||||||
|
"//packages/kbn-tooling-log:npm_module_types",
|
||||||
|
"@npm//@elastic/elasticsearch",
|
||||||
|
"@npm//@types/node",
|
||||||
|
"@npm//@types/jest",
|
||||||
|
]
|
||||||
|
|
||||||
|
jsts_transpiler(
|
||||||
|
name = "target_node",
|
||||||
|
srcs = SRCS,
|
||||||
|
build_pkg_name = package_name(),
|
||||||
|
)
|
||||||
|
|
||||||
|
ts_config(
|
||||||
|
name = "tsconfig",
|
||||||
|
src = "tsconfig.json",
|
||||||
|
deps = [
|
||||||
|
"//:tsconfig.base.json",
|
||||||
|
"//:tsconfig.bazel.json",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
ts_project(
|
||||||
|
name = "tsc_types",
|
||||||
|
args = ['--pretty'],
|
||||||
|
srcs = SRCS,
|
||||||
|
deps = TYPES_DEPS,
|
||||||
|
declaration = True,
|
||||||
|
emit_declaration_only = True,
|
||||||
|
out_dir = "target_types",
|
||||||
|
root_dir = "src",
|
||||||
|
tsconfig = ":tsconfig",
|
||||||
|
)
|
||||||
|
|
||||||
|
js_library(
|
||||||
|
name = PKG_DIRNAME,
|
||||||
|
srcs = NPM_MODULE_EXTRA_FILES,
|
||||||
|
deps = RUNTIME_DEPS + [":target_node"],
|
||||||
|
package_name = PKG_REQUIRE_NAME,
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
pkg_npm(
|
||||||
|
name = "npm_module",
|
||||||
|
deps = [":" + PKG_DIRNAME],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "build",
|
||||||
|
srcs = [":npm_module"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
pkg_npm_types(
|
||||||
|
name = "npm_module_types",
|
||||||
|
srcs = SRCS,
|
||||||
|
deps = [":tsc_types"],
|
||||||
|
package_name = PKG_REQUIRE_NAME,
|
||||||
|
tsconfig = ":tsconfig",
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
filegroup(
|
||||||
|
name = "build_types",
|
||||||
|
srcs = [":npm_module_types"],
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
14
packages/kbn-performance-testing-dataset-extractor/README.md
Normal file
14
packages/kbn-performance-testing-dataset-extractor/README.md
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# @kbn/performance-testing-dataset-extractor
|
||||||
|
|
||||||
|
A library to convert APM traces into JSON format for performance testing.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
node scripts/extract_performance_testing_dataset \
|
||||||
|
--journeyName "<_source.labels.journeyName>" \
|
||||||
|
--buildId "<_source.labels.testBuildId>" \
|
||||||
|
--es-url "<ES baseURL>" \
|
||||||
|
--es-username "<ES username>" \
|
||||||
|
--es-password "<ES password>"
|
||||||
|
```
|
|
@ -0,0 +1,13 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
preset: '@kbn/test/jest_node',
|
||||||
|
rootDir: '../..',
|
||||||
|
roots: ['<rootDir>/packages/kbn-performance-testing-dataset-extractor'],
|
||||||
|
};
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"name": "@kbn/performance-testing-dataset-extractor",
|
||||||
|
"description": "A library to convert APM traces into JSON format for performance testing.",
|
||||||
|
"private": true,
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "./target_node/index.js",
|
||||||
|
"license": "SSPL-1.0 OR Elastic License 2.0",
|
||||||
|
"kibana": {
|
||||||
|
"devOnly": true
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** ***********************************************************
|
||||||
|
*
|
||||||
|
* Run `node scripts/extract_performance_testing_dataset --help` for usage information
|
||||||
|
*
|
||||||
|
*************************************************************/
|
||||||
|
|
||||||
|
import { run, createFlagError } from '@kbn/dev-utils';
|
||||||
|
import { extractor } from './extractor';
|
||||||
|
|
||||||
|
export async function runExtractor() {
|
||||||
|
run(
|
||||||
|
async ({ log, flags }) => {
|
||||||
|
const baseURL = flags['es-url'];
|
||||||
|
if (baseURL && typeof baseURL !== 'string') {
|
||||||
|
throw createFlagError('--es-url must be a string');
|
||||||
|
}
|
||||||
|
if (!baseURL) {
|
||||||
|
throw createFlagError('--es-url must be defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
const username = flags['es-username'];
|
||||||
|
if (username && typeof username !== 'string') {
|
||||||
|
throw createFlagError('--es-username must be a string');
|
||||||
|
}
|
||||||
|
if (!username) {
|
||||||
|
throw createFlagError('--es-username must be defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
const password = flags['es-password'];
|
||||||
|
if (password && typeof password !== 'string') {
|
||||||
|
throw createFlagError('--es-password must be a string');
|
||||||
|
}
|
||||||
|
if (!password) {
|
||||||
|
throw createFlagError('--es-password must be defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
const journeyName = flags.journeyName;
|
||||||
|
if (journeyName && typeof journeyName !== 'string') {
|
||||||
|
throw createFlagError('--journeyName must be a string');
|
||||||
|
}
|
||||||
|
if (!journeyName) {
|
||||||
|
throw createFlagError('--journeyName must be defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
const buildId = flags.buildId;
|
||||||
|
if (buildId && typeof buildId !== 'string') {
|
||||||
|
throw createFlagError('--buildId must be a string');
|
||||||
|
}
|
||||||
|
if (!buildId) {
|
||||||
|
throw createFlagError('--buildId must be defined');
|
||||||
|
}
|
||||||
|
|
||||||
|
return extractor({
|
||||||
|
param: { journeyName, buildId },
|
||||||
|
client: { baseURL, username, password },
|
||||||
|
log,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{
|
||||||
|
description: `CLI to fetch and normalize APM traces for journey scalability testing`,
|
||||||
|
flags: {
|
||||||
|
string: ['journeyName', 'buildId', 'es-url', 'es-username', 'es-password'],
|
||||||
|
help: `
|
||||||
|
--journeyName Single user performance journey name, stored in APM-based document as label: 'labels.journeyName'
|
||||||
|
--buildId BUILDKITE_JOB_ID or uuid generated locally, stored in APM-based document as label: 'labels.testBuildId'
|
||||||
|
--es-url url for Elasticsearch (APM cluster)
|
||||||
|
--es-username username for Elasticsearch (APM cluster)
|
||||||
|
--es-password password for Elasticsearch (APM cluster)
|
||||||
|
`,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
|
@ -0,0 +1,148 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Client } from '@elastic/elasticsearch';
|
||||||
|
|
||||||
|
interface ClientOptions {
|
||||||
|
node: string;
|
||||||
|
username: string;
|
||||||
|
password: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Labels {
|
||||||
|
journeyName: string;
|
||||||
|
maxUsersCount: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Request {
|
||||||
|
method: string;
|
||||||
|
headers: string;
|
||||||
|
body?: { original: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Response {
|
||||||
|
status_code: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Transaction {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
type: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Document {
|
||||||
|
labels: Labels;
|
||||||
|
character: string;
|
||||||
|
quote: string;
|
||||||
|
service: { version: string };
|
||||||
|
processor: string;
|
||||||
|
trace: { id: string };
|
||||||
|
'@timestamp': string;
|
||||||
|
environment: string;
|
||||||
|
url: { path: string };
|
||||||
|
http: {
|
||||||
|
request: Request;
|
||||||
|
response: Response;
|
||||||
|
};
|
||||||
|
transaction: Transaction;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function initClient(options: ClientOptions) {
|
||||||
|
const client = new Client({
|
||||||
|
node: options.node,
|
||||||
|
auth: {
|
||||||
|
username: options.username,
|
||||||
|
password: options.password,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
async getTransactions(buildId: string, journeyName: string) {
|
||||||
|
const result = await client.search<Document>({
|
||||||
|
body: {
|
||||||
|
track_total_hits: true,
|
||||||
|
sort: [
|
||||||
|
{
|
||||||
|
'@timestamp': {
|
||||||
|
order: 'desc',
|
||||||
|
unmapped_type: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
size: 10000,
|
||||||
|
stored_fields: ['*'],
|
||||||
|
_source: true,
|
||||||
|
query: {
|
||||||
|
bool: {
|
||||||
|
must: [],
|
||||||
|
filter: [
|
||||||
|
{
|
||||||
|
bool: {
|
||||||
|
filter: [
|
||||||
|
{
|
||||||
|
bool: {
|
||||||
|
should: [
|
||||||
|
{
|
||||||
|
match_phrase: {
|
||||||
|
'transaction.type': 'request',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
minimum_should_match: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bool: {
|
||||||
|
should: [
|
||||||
|
{
|
||||||
|
match_phrase: {
|
||||||
|
'processor.event': 'transaction',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
minimum_should_match: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bool: {
|
||||||
|
should: [
|
||||||
|
{
|
||||||
|
match_phrase: {
|
||||||
|
'labels.testBuildId': buildId,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
minimum_should_match: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
bool: {
|
||||||
|
should: [
|
||||||
|
{
|
||||||
|
match_phrase: {
|
||||||
|
'labels.journeyName': journeyName,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
minimum_should_match: 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
should: [],
|
||||||
|
must_not: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return result?.hits?.hits;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import fs from 'fs/promises';
|
||||||
|
import { existsSync } from 'fs';
|
||||||
|
import path from 'path';
|
||||||
|
import { ToolingLog } from '@kbn/tooling-log';
|
||||||
|
import { initClient, Document } from './es_client';
|
||||||
|
|
||||||
|
interface CLIParams {
|
||||||
|
param: {
|
||||||
|
journeyName: string;
|
||||||
|
buildId: string;
|
||||||
|
};
|
||||||
|
client: {
|
||||||
|
baseURL: string;
|
||||||
|
username: string;
|
||||||
|
password: string;
|
||||||
|
};
|
||||||
|
log: ToolingLog;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const extractor = async ({ param, client, log }: CLIParams) => {
|
||||||
|
const authOptions = {
|
||||||
|
node: client.baseURL,
|
||||||
|
username: client.username,
|
||||||
|
password: client.password,
|
||||||
|
};
|
||||||
|
const esClient = initClient(authOptions);
|
||||||
|
const hits = await esClient.getTransactions(param.buildId, param.journeyName);
|
||||||
|
if (!hits || hits.length === 0) {
|
||||||
|
log.warning(`
|
||||||
|
No transactions found with 'labels.testBuildId=${param.buildId}' and 'labels.journeyName=${param.journeyName}'
|
||||||
|
\nOutput file won't be generated
|
||||||
|
`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const source = hits[0]!._source as Document;
|
||||||
|
const journeyName = source.labels.journeyName || 'Unknown Journey';
|
||||||
|
const kibanaVersion = source.service.version;
|
||||||
|
const maxUsersCount = source.labels.maxUsersCount || '0';
|
||||||
|
|
||||||
|
const data = hits
|
||||||
|
.map((hit) => hit!._source as Document)
|
||||||
|
.map((hit) => {
|
||||||
|
return {
|
||||||
|
processor: hit.processor,
|
||||||
|
traceId: hit.trace.id,
|
||||||
|
timestamp: hit['@timestamp'],
|
||||||
|
environment: hit.environment,
|
||||||
|
request: {
|
||||||
|
url: { path: hit.url.path },
|
||||||
|
headers: hit.http.request.headers,
|
||||||
|
method: hit.http.request.method,
|
||||||
|
body: hit.http.request.body ? JSON.parse(hit.http.request.body.original) : '',
|
||||||
|
},
|
||||||
|
response: { statusCode: hit.http.response.status_code },
|
||||||
|
transaction: {
|
||||||
|
id: hit.transaction.id,
|
||||||
|
name: hit.transaction.name,
|
||||||
|
type: hit.transaction.type,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const output = {
|
||||||
|
journeyName,
|
||||||
|
kibanaVersion,
|
||||||
|
maxUsersCount,
|
||||||
|
traceItems: data,
|
||||||
|
};
|
||||||
|
|
||||||
|
const outputDir = path.resolve('target/scalability_traces');
|
||||||
|
const fileName = `${output.journeyName.replace(/ /g, '')}-${param.buildId}.json`;
|
||||||
|
const filePath = path.resolve(outputDir, fileName);
|
||||||
|
|
||||||
|
log.info(`Found ${hits.length} transactions, output file: ${filePath}`);
|
||||||
|
if (!existsSync(outputDir)) {
|
||||||
|
await fs.mkdir(outputDir, { recursive: true });
|
||||||
|
}
|
||||||
|
await fs.writeFile(filePath, JSON.stringify(output, null, 2), 'utf8');
|
||||||
|
};
|
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export { extractor } from './extractor';
|
||||||
|
export * from './cli';
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"extends": "../../tsconfig.bazel.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"declaration": true,
|
||||||
|
"emitDeclarationOnly": true,
|
||||||
|
"outDir": "target_types",
|
||||||
|
"rootDir": "src",
|
||||||
|
"stripInternal": false,
|
||||||
|
"types": [
|
||||||
|
"jest",
|
||||||
|
"node"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"src/**/*"
|
||||||
|
]
|
||||||
|
}
|
10
scripts/extract_performance_testing_dataset.js
Normal file
10
scripts/extract_performance_testing_dataset.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
/*
|
||||||
|
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
||||||
|
* or more contributor license agreements. Licensed under the Elastic License
|
||||||
|
* 2.0 and the Server Side Public License, v 1; you may not use this file except
|
||||||
|
* in compliance with, at your election, the Elastic License 2.0 or the Server
|
||||||
|
* Side Public License, v 1.
|
||||||
|
*/
|
||||||
|
|
||||||
|
require('../src/setup_node_env');
|
||||||
|
require('@kbn/performance-testing-dataset-extractor').runExtractor();
|
83
yarn.lock
83
yarn.lock
|
@ -1496,16 +1496,6 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
"@elastic/ecs-helpers" "^1.1.0"
|
"@elastic/ecs-helpers" "^1.1.0"
|
||||||
|
|
||||||
"@elastic/elasticsearch@7.17.0":
|
|
||||||
version "7.17.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-7.17.0.tgz#589fb219234cf1b0da23744e82b1d25e2fe9a797"
|
|
||||||
integrity sha512-5QLPCjd0uLmLj1lSuKSThjNpq39f6NmlTy9ROLFwG5gjyTgpwSqufDeYG/Fm43Xs05uF7WcscoO7eguI3HuuYA==
|
|
||||||
dependencies:
|
|
||||||
debug "^4.3.1"
|
|
||||||
hpagent "^0.1.1"
|
|
||||||
ms "^2.1.3"
|
|
||||||
secure-json-parse "^2.4.0"
|
|
||||||
|
|
||||||
"@elastic/elasticsearch@npm:@elastic/elasticsearch-canary@8.2.0-canary.2":
|
"@elastic/elasticsearch@npm:@elastic/elasticsearch-canary@8.2.0-canary.2":
|
||||||
version "8.2.0-canary.2"
|
version "8.2.0-canary.2"
|
||||||
resolved "https://registry.yarnpkg.com/@elastic/elasticsearch-canary/-/elasticsearch-canary-8.2.0-canary.2.tgz#2513926cdbfe7c070e1fa6926f7829171b27cdba"
|
resolved "https://registry.yarnpkg.com/@elastic/elasticsearch-canary/-/elasticsearch-canary-8.2.0-canary.2.tgz#2513926cdbfe7c070e1fa6926f7829171b27cdba"
|
||||||
|
@ -1628,19 +1618,6 @@
|
||||||
resolved "https://registry.yarnpkg.com/@elastic/numeral/-/numeral-2.5.1.tgz#96acf39c3d599950646ef8ccfd24a3f057cf4932"
|
resolved "https://registry.yarnpkg.com/@elastic/numeral/-/numeral-2.5.1.tgz#96acf39c3d599950646ef8ccfd24a3f057cf4932"
|
||||||
integrity sha512-Tby6TKjixRFY+atVNeYUdGr9m0iaOq8230KTwn8BbUhkh7LwozfgKq0U98HRX7n63ZL62szl+cDKTYzh5WPCFQ==
|
integrity sha512-Tby6TKjixRFY+atVNeYUdGr9m0iaOq8230KTwn8BbUhkh7LwozfgKq0U98HRX7n63ZL62szl+cDKTYzh5WPCFQ==
|
||||||
|
|
||||||
"@elastic/performance-testing-dataset-extractor@^0.0.3":
|
|
||||||
version "0.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/@elastic/performance-testing-dataset-extractor/-/performance-testing-dataset-extractor-0.0.3.tgz#c9823154c1d23c0dfec86f7183a5e2327999d0ca"
|
|
||||||
integrity sha512-ND33m4P1yOLPqnKnwWTcwDNB5dCw5NK9503e2WaZzljoy75RN9Lg5+YsQM7RFZKDs/+yNp7XRCJszeiUOcMFvg==
|
|
||||||
dependencies:
|
|
||||||
"@elastic/elasticsearch" "7.17.0"
|
|
||||||
axios "^0.26.1"
|
|
||||||
axios-curlirize "1.3.7"
|
|
||||||
lodash "^4.17.21"
|
|
||||||
qs "^6.10.3"
|
|
||||||
tslib "^2.3.1"
|
|
||||||
yargs "^17.4.0"
|
|
||||||
|
|
||||||
"@elastic/react-search-ui-views@1.6.0":
|
"@elastic/react-search-ui-views@1.6.0":
|
||||||
version "1.6.0"
|
version "1.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/@elastic/react-search-ui-views/-/react-search-ui-views-1.6.0.tgz#7211d47c29ef0636c853721491b9905ac7ae58da"
|
resolved "https://registry.yarnpkg.com/@elastic/react-search-ui-views/-/react-search-ui-views-1.6.0.tgz#7211d47c29ef0636c853721491b9905ac7ae58da"
|
||||||
|
@ -2955,6 +2932,10 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
|
"@kbn/analytics-shippers-elastic-v3-browser@link:bazel-bin/packages/analytics/shippers/elastic_v3/browser":
|
||||||
|
version "0.0.0"
|
||||||
|
uid ""
|
||||||
|
|
||||||
"@kbn/analytics-shippers-elastic-v3-common@link:bazel-bin/packages/analytics/shippers/elastic_v3/common":
|
"@kbn/analytics-shippers-elastic-v3-common@link:bazel-bin/packages/analytics/shippers/elastic_v3/common":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
@ -2963,10 +2944,6 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
"@kbn/analytics-shippers-elastic-v3-browser@link:bazel-bin/packages/analytics/shippers/elastic_v3/browser":
|
|
||||||
version "0.0.0"
|
|
||||||
uid ""
|
|
||||||
|
|
||||||
"@kbn/analytics-shippers-fullstory@link:bazel-bin/packages/analytics/shippers/fullstory":
|
"@kbn/analytics-shippers-fullstory@link:bazel-bin/packages/analytics/shippers/fullstory":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
@ -3135,6 +3112,10 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
|
"@kbn/performance-testing-dataset-extractor@link:bazel-bin/packages/kbn-performance-testing-dataset-extractor":
|
||||||
|
version "0.0.0"
|
||||||
|
uid ""
|
||||||
|
|
||||||
"@kbn/plugin-discovery@link:bazel-bin/packages/kbn-plugin-discovery":
|
"@kbn/plugin-discovery@link:bazel-bin/packages/kbn-plugin-discovery":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
@ -6067,6 +6048,10 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
|
"@types/kbn__analytics-shippers-elastic-v3-browser@link:bazel-bin/packages/analytics/shippers/elastic_v3/browser/npm_module_types":
|
||||||
|
version "0.0.0"
|
||||||
|
uid ""
|
||||||
|
|
||||||
"@types/kbn__analytics-shippers-elastic-v3-common@link:bazel-bin/packages/analytics/shippers/elastic_v3/common/npm_module_types":
|
"@types/kbn__analytics-shippers-elastic-v3-common@link:bazel-bin/packages/analytics/shippers/elastic_v3/common/npm_module_types":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
@ -6075,10 +6060,6 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
"@types/kbn__analytics-shippers-elastic-v3-browser@link:bazel-bin/packages/analytics/shippers/elastic_v3/browser/npm_module_types":
|
|
||||||
version "0.0.0"
|
|
||||||
uid ""
|
|
||||||
|
|
||||||
"@types/kbn__analytics-shippers-fullstory@link:bazel-bin/packages/analytics/shippers/fullstory/npm_module_types":
|
"@types/kbn__analytics-shippers-fullstory@link:bazel-bin/packages/analytics/shippers/fullstory/npm_module_types":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
@ -6223,6 +6204,10 @@
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
|
||||||
|
"@types/kbn__performance-testing-dataset-extractor@link:bazel-bin/packages/kbn-performance-testing-dataset-extractor/npm_module_types":
|
||||||
|
version "0.0.0"
|
||||||
|
uid ""
|
||||||
|
|
||||||
"@types/kbn__plugin-discovery@link:bazel-bin/packages/kbn-plugin-discovery/npm_module_types":
|
"@types/kbn__plugin-discovery@link:bazel-bin/packages/kbn-plugin-discovery/npm_module_types":
|
||||||
version "0.0.0"
|
version "0.0.0"
|
||||||
uid ""
|
uid ""
|
||||||
|
@ -8714,11 +8699,6 @@ axe-core@^4.2.0:
|
||||||
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5"
|
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.3.5.tgz#78d6911ba317a8262bfee292aeafcc1e04b49cc5"
|
||||||
integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==
|
integrity sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==
|
||||||
|
|
||||||
axios-curlirize@1.3.7:
|
|
||||||
version "1.3.7"
|
|
||||||
resolved "https://registry.yarnpkg.com/axios-curlirize/-/axios-curlirize-1.3.7.tgz#0153c51a5af0e92370169daea33f234d588baad1"
|
|
||||||
integrity sha512-csSsuMyZj1dv1fL0zRPnDAHWrmlISMvK+wx9WJI/igRVDT4VMgbf2AVenaHghFLfI1nQijXUevYEguYV6u5hjA==
|
|
||||||
|
|
||||||
axios@^0.21.1:
|
axios@^0.21.1:
|
||||||
version "0.21.1"
|
version "0.21.1"
|
||||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
|
resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
|
||||||
|
@ -8740,13 +8720,6 @@ axios@^0.25.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects "^1.14.7"
|
follow-redirects "^1.14.7"
|
||||||
|
|
||||||
axios@^0.26.1:
|
|
||||||
version "0.26.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
|
|
||||||
integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
|
|
||||||
dependencies:
|
|
||||||
follow-redirects "^1.14.8"
|
|
||||||
|
|
||||||
axobject-query@^2.2.0:
|
axobject-query@^2.2.0:
|
||||||
version "2.2.0"
|
version "2.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
|
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
|
||||||
|
@ -14793,7 +14766,7 @@ follow-redirects@1.12.1:
|
||||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6"
|
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6"
|
||||||
integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==
|
integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==
|
||||||
|
|
||||||
follow-redirects@^1.0.0, follow-redirects@^1.10.0, follow-redirects@^1.14.4, follow-redirects@^1.14.7, follow-redirects@^1.14.8:
|
follow-redirects@^1.0.0, follow-redirects@^1.10.0, follow-redirects@^1.14.4, follow-redirects@^1.14.7:
|
||||||
version "1.14.9"
|
version "1.14.9"
|
||||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
|
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
|
||||||
integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
|
integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
|
||||||
|
@ -16254,7 +16227,7 @@ hpack.js@^2.1.6:
|
||||||
readable-stream "^2.0.1"
|
readable-stream "^2.0.1"
|
||||||
wbuf "^1.1.0"
|
wbuf "^1.1.0"
|
||||||
|
|
||||||
hpagent@^0.1.1, hpagent@^0.1.2:
|
hpagent@^0.1.2:
|
||||||
version "0.1.2"
|
version "0.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.2.tgz#cab39c66d4df2d4377dbd212295d878deb9bdaa9"
|
resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-0.1.2.tgz#cab39c66d4df2d4377dbd212295d878deb9bdaa9"
|
||||||
integrity sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==
|
integrity sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==
|
||||||
|
@ -23516,13 +23489,6 @@ qs@^6.10.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
side-channel "^1.0.4"
|
side-channel "^1.0.4"
|
||||||
|
|
||||||
qs@^6.10.3:
|
|
||||||
version "6.10.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
|
|
||||||
integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
|
|
||||||
dependencies:
|
|
||||||
side-channel "^1.0.4"
|
|
||||||
|
|
||||||
qs@^6.7.0:
|
qs@^6.7.0:
|
||||||
version "6.9.4"
|
version "6.9.4"
|
||||||
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
|
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
|
||||||
|
@ -30698,19 +30664,6 @@ yargs@^17.0.1, yargs@^17.2.1, yargs@^17.3.1:
|
||||||
y18n "^5.0.5"
|
y18n "^5.0.5"
|
||||||
yargs-parser "^21.0.0"
|
yargs-parser "^21.0.0"
|
||||||
|
|
||||||
yargs@^17.4.0:
|
|
||||||
version "17.4.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.4.1.tgz#ebe23284207bb75cee7c408c33e722bfb27b5284"
|
|
||||||
integrity sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==
|
|
||||||
dependencies:
|
|
||||||
cliui "^7.0.2"
|
|
||||||
escalade "^3.1.1"
|
|
||||||
get-caller-file "^2.0.5"
|
|
||||||
require-directory "^2.1.1"
|
|
||||||
string-width "^4.2.3"
|
|
||||||
y18n "^5.0.5"
|
|
||||||
yargs-parser "^21.0.0"
|
|
||||||
|
|
||||||
yargs@^3.15.0:
|
yargs@^3.15.0:
|
||||||
version "3.32.0"
|
version "3.32.0"
|
||||||
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
|
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue