diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index b697e91e..8b806070 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -29,7 +29,7 @@ If applicable, add screenshots to help explain your problem. - Performance Co-Pilot: - Grafana: - grafana-pcp: -- Redis (if applicable): +- Valkey (if applicable): **Additional context** Add any other context about the problem here. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 93c2c51e..0fa54c11 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -72,7 +72,7 @@ jobs: name: build path: build - - name: Start PCP and Redis in a pod + - name: Start PCP and Valkey in a pod run: | # workaround required on GitHub Actions to allow running systemd in rootless containers # https://github.com/actions/virtual-environments/issues/3536 diff --git a/CHANGELOG.md b/CHANGELOG.md index 37bfb8a5..851a7774 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,20 @@ # Change Log -## 5.1.2 (unreleased) - +## 5.2.0 (2024-11-08) + +* **valkey**: new PCP Valkey datasource (replacement for PCP Redis) +* **redis**: PCP Redis datasource renamed to PCP Valkey due to licensing +* **dashboards**: new PCP Vector Top Consumers dashboard +* **dashboards**: new PCP Vector UWSGI overview dashboard +* **dashboards**: new PCP Prometheus Host Overview dashboard +* **test**: update cypress tests for grafana 10 +* **docs**: update donations page link with new fiscal sponsor details +* **docs**: add .readthedocs.yaml file to keep grafana-pcp.readthedocs.io working +* **docs**: fix command in installation doc to allow loading unsigned plugins for both containers and from source * **build**: update grafana/plugin-validator and pin nodejs version +* **build**: update Go and node dependencies +* **ci**: update release scrip to use gh instead of deprecated hub command +* **search**: metric search turned off until Valkey replacement arrives for RediSearch ## 5.1.1 (2022-10-27) diff --git a/Makefile b/Makefile index dd1c7d2c..339c6ad2 100644 --- a/Makefile +++ b/Makefile @@ -36,11 +36,11 @@ watch-frontend: deps-frontend build-dashboards ## Auto rebuilt frontend on file yarn run watch dev-backend: deps-backend - go build -race -o ./dist/datasources/redis/pcp_redis_datasource_$$(go env GOOS)_$$(go env GOARCH) -tags netgo -ldflags -w ./pkg + go build -race -o ./dist/datasources/valkey/pcp_valkey_datasource_$$(go env GOOS)_$$(go env GOARCH) -tags netgo -ldflags -w ./pkg restart-backend: ## Rebuild and restart backend data source (as root) sudo -u "$$(stat -c '%U' .)" make dev-backend - killall pcp_redis_datasource_$$(go env GOOS)_$$(go env GOARCH) + killall pcp_valkey_datasource_$$(go env GOOS)_$$(go env GOARCH) ##@ Build @@ -61,10 +61,10 @@ GO_LD_FLAGS := -w -s -extldflags "-static" build-backend: deps-backend ## Build backend data source #mage buildAll for arch in amd64 arm arm64 s390x ppc64le 386; do \ - CGO_ENABLED=0 GOOS=linux GOARCH=$${arch} go build -o dist/datasources/redis/pcp_redis_datasource_linux_$${arch} -ldflags '$(GO_LD_FLAGS)' ./pkg; \ + CGO_ENABLED=0 GOOS=linux GOARCH=$${arch} go build -o dist/datasources/valkey/pcp_valkey_datasource_linux_$${arch} -ldflags '$(GO_LD_FLAGS)' ./pkg; \ done - CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o dist/datasources/redis/pcp_redis_datasource_darwin_amd64 -ldflags '$(GO_LD_FLAGS)' ./pkg - CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o dist/datasources/redis/pcp_redis_datasource_windows_amd64.exe -ldflags '$(GO_LD_FLAGS)' ./pkg + CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -o dist/datasources/valkey/pcp_valkey_datasource_darwin_amd64 -ldflags '$(GO_LD_FLAGS)' ./pkg + CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -o dist/datasources/valkey/pcp_valkey_datasource_windows_amd64.exe -ldflags '$(GO_LD_FLAGS)' ./pkg build: build-dashboards build-frontend build-backend ## Build everything @@ -99,21 +99,21 @@ test: test-frontend test-backend ## Run all tests ##@ UI tests -test-ui-start-pod: ## Start PCP and Redis in a pod +test-ui-start-pod: ## Start PCP and Valkey in a pod -podman pod rm -f grafana-pcp-tests podman pod create --name grafana-pcp-tests -p 3001:3000 podman run --pod grafana-pcp-tests --name grafana-pcp-tests-pcp -d --systemd always quay.io/performancecopilot/pcp - podman run --pod grafana-pcp-tests --name grafana-pcp-tests-redis -d docker.io/library/redis:6 + podman run --pod grafana-pcp-tests --name grafana-pcp-tests-valkey -d docker.io/valkey/valkey:7 test-ui-start-grafana-dist: ## Start Grafana with grafana-pcp from the dist/ folder podman run --pod grafana-pcp-tests --name grafana-pcp-tests-grafana -d --replace \ - -e GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS="performancecopilot-pcp-app,performancecopilot-redis-datasource,performancecopilot-vector-datasource,performancecopilot-bpftrace-datasource,performancecopilot-flamegraph-panel,performancecopilot-breadcrumbs-panel,performancecopilot-troubleshooting-panel" \ + -e GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS="performancecopilot-pcp-app,performancecopilot-valkey-datasource,performancecopilot-vector-datasource,performancecopilot-bpftrace-datasource,performancecopilot-flamegraph-panel,performancecopilot-breadcrumbs-panel,performancecopilot-troubleshooting-panel" \ -v $$(pwd)/dist:/var/lib/grafana/plugins/performancecopilot-pcp-app \ $(GRAFANA_IMAGE) test-ui-start-grafana-build: ## Start Grafana with grafana-pcp from build/performancecopilot-pcp-app-*.zip podman run --pod grafana-pcp-tests --name grafana-pcp-tests-grafana -d --replace \ - -e GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS="performancecopilot-pcp-app,performancecopilot-redis-datasource,performancecopilot-vector-datasource,performancecopilot-bpftrace-datasource,performancecopilot-flamegraph-panel,performancecopilot-breadcrumbs-panel,performancecopilot-troubleshooting-panel" \ + -e GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS="performancecopilot-pcp-app,performancecopilot-valkey-datasource,performancecopilot-vector-datasource,performancecopilot-bpftrace-datasource,performancecopilot-flamegraph-panel,performancecopilot-breadcrumbs-panel,performancecopilot-troubleshooting-panel" \ -e GF_INSTALL_PLUGINS="/tmp/plugin.zip;performancecopilot-pcp-app" \ -v $$(pwd)/build/$$(basename build/performancecopilot-pcp-app-*.zip):/tmp/plugin.zip \ $(GRAFANA_IMAGE) diff --git a/README.md b/README.md index 6300266a..18d1180a 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ It presents a unifying abstraction for all of the performance data in a system, * support for repeated panels * sample dashboards for all data sources -[1] PCP Redis +[1] PCP Valkey [2] PCP Vector [3] PCP bpftrace diff --git a/ci/scripts/github-release.sh b/ci/scripts/github-release.sh index 20b56ba9..52317c58 100755 --- a/ci/scripts/github-release.sh +++ b/ci/scripts/github-release.sh @@ -16,10 +16,10 @@ if [[ "${GRAFANA_PLUGIN_VERSION}" == *beta* ]]; then PRERELEASE_ARG="-p" fi -hub release create \ - -m "grafana-pcp v${GRAFANA_PLUGIN_VERSION}" \ - -m "${RELEASE_NOTES}" \ - -a "build/${GRAFANA_PLUGIN_ARTIFACT}" \ - -a "build/${GRAFANA_PLUGIN_ARTIFACT_CHECKSUM}" \ - $PRERELEASE_ARG \ - "v${GRAFANA_PLUGIN_VERSION}" +gh release create \ + "v${GRAFANA_PLUGIN_VERSION}" \ + -t "grafana-pcp v${GRAFANA_PLUGIN_VERSION}" \ + -n "${RELEASE_NOTES}" \ + "build/${GRAFANA_PLUGIN_ARTIFACT}" \ + "build/${GRAFANA_PLUGIN_ARTIFACT_CHECKSUM}" \ + ${PRERELEASE_ARG} diff --git a/cypress/e2e/datasources/redis.cy.ts b/cypress/e2e/datasources/valkey.cy.ts similarity index 82% rename from cypress/e2e/datasources/redis.cy.ts rename to cypress/e2e/datasources/valkey.cy.ts index 76791296..eed2c0b9 100644 --- a/cypress/e2e/datasources/redis.cy.ts +++ b/cypress/e2e/datasources/valkey.cy.ts @@ -1,9 +1,9 @@ -describe('PCP Redis data source', () => { +describe('PCP Valkey data source', () => { before(() => { cy.task('grafana:reset'); cy.login(); cy.enablePlugin(); - cy.addDatasource('performancecopilot-redis-datasource', 'PCP Redis data source'); + cy.addDatasource('performancecopilot-valkey-datasource', 'PCP Valkey data source'); }); beforeEach(() => { @@ -12,9 +12,9 @@ describe('PCP Redis data source', () => { it('should import bundled dashboards', () => { cy.visit('/datasources'); - cy.contains('PCP Redis').click(); + cy.contains('PCP Valkey').click(); cy.contains('Dashboards').click({ force: true }); - cy.contains('td', 'PCP Redis: Host Overview').siblings().contains('Import').click({ force: true }); + cy.contains('td', 'PCP Valkey: Host Overview').siblings().contains('Import').click({ force: true }); cy.contains('Dashboard Imported'); }); @@ -27,7 +27,7 @@ describe('PCP Redis data source', () => { cy.contains('Add a new panel').click(); } else { cy.contains('Add visualization').click(); - cy.get('div.scrollbar-view').contains('PCP Redis').click(); + cy.get('div.scrollbar-view').contains('PCP Valkey').click(); } }); diff --git a/cypress/e2e/setup.cy.ts b/cypress/e2e/setup.cy.ts index 85794fe1..16bf26df 100644 --- a/cypress/e2e/setup.cy.ts +++ b/cypress/e2e/setup.cy.ts @@ -13,9 +13,9 @@ describe('grafana-pcp setup', () => { cy.get('button').should('include.text', 'Disable'); }); - it('should setup PCP Redis data source', () => { + it('should setup PCP Valkey data source', () => { cy.visit('/datasources/new'); - cy.contains('PCP Redis').click(); + cy.contains('PCP Valkey').click(); cy.get('input[placeholder="http://localhost:44322"]').type('http://localhost:44322'); cy.get('button[type=submit]').click(); cy.contains('Data source is working'); diff --git a/docs/architecture.rst b/docs/architecture.rst index 1f8366a3..b143e585 100644 --- a/docs/architecture.rst +++ b/docs/architecture.rst @@ -14,7 +14,7 @@ Monitored hosts run the **Performance Metrics Collector Daemon (PMCD)**, which c Each **PMDA** is responsible for gathering metrics of one specific domain - e.g., the kernel, services (e.g., PostgreSQL), or other instrumented applications. The **pmlogger** daemon records metrics from **pmcd** and stores them in archive files on the hard drive. -Since **PCP 5** metrics can also be stored in the redis database, which allows multi-host performance analysis, the **pmproxy** daemon discovers new archives (created by **pmlogger**) and stores them in a redis database. +Since **PCP 5** metrics can also be stored in the valkey database, which allows multi-host performance analysis, the **pmproxy** daemon discovers new archives (created by **pmlogger**) and stores them in a valkey database. Dashboards ---------- @@ -22,10 +22,10 @@ Dashboards Performance Co-Pilot metrics can be analyzed with Grafana dashboards, using the **grafana-pcp** plugin. There are two modes available: -* historical metrics across multiple hosts using the :doc:`datasources/redis` data source +* historical metrics across multiple hosts using the :doc:`datasources/valkey` data source * live, on-host metrics using the :doc:`datasources/vector` data source -The :doc:`datasources/redis` data source sends :ref:`pmseries ` queries to **pmproxy**, which in turn queries the redis database for metrics. +The :doc:`datasources/valkey` data source sends :ref:`pmseries ` queries to **pmproxy**, which in turn queries the valkey database for metrics. The :doc:`datasources/vector` data source connects to **pmproxy**, which in turn requests live metrics directly from a local or remote **PMCD**. In this case, metrics are stored temporarily in the browser, and metric values are lost when the browser tab is refreshed. -The :doc:`PCP Redis data source ` is required for persistence. +The :doc:`PCP Valkey data source ` is required for persistence. diff --git a/docs/datasources/index.rst b/docs/datasources/index.rst index 4c4225f9..dc656cfd 100644 --- a/docs/datasources/index.rst +++ b/docs/datasources/index.rst @@ -3,7 +3,7 @@ Overview .. include:: ../refs.rst -PCP Redis +PCP Valkey --------- This data source queries the fast, scalable time series capabilities provided by the `pmseries`_ functionality. diff --git a/docs/datasources/redis.rst b/docs/datasources/valkey.rst similarity index 92% rename from docs/datasources/redis.rst rename to docs/datasources/valkey.rst index 1c9e8de0..aee77efb 100644 --- a/docs/datasources/redis.rst +++ b/docs/datasources/valkey.rst @@ -1,4 +1,4 @@ -PCP Redis +PCP Valkey ========= .. include:: ../refs.rst @@ -8,15 +8,15 @@ Introduction This data source provides a native interface between `Grafana `_ and `Performance Co-Pilot `_ (PCP), allowing PCP metric data to be presented in Grafana panels, such as graphs, tables, heatmaps, etc. Under the hood, the data source makes REST API query requests to the PCP `pmproxy`_ service, which can be running either locally or on a remote host. -The pmproxy daemon can be local or remote and uses the Redis time-series database (local or remote) for persistent storage. +The pmproxy daemon can be local or remote and uses the Valkey time-series database (local or remote) for persistent storage. -Setup Redis and PCP daemons +Setup Valkey and PCP daemons --------------------------- .. code-block:: console - $ sudo dnf install redis - $ sudo systemctl start redis pmlogger pmproxy + $ sudo dnf install valkey + $ sudo systemctl start valkey pmlogger pmproxy .. _pmseries-query-language: diff --git a/docs/index.rst b/docs/index.rst index 7d8cf3b2..3287f210 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -27,7 +27,7 @@ Features * support for repeated panels * sample dashboards for all data sources -[1] PCP Redis +[1] PCP Valkey [2] PCP Vector [3] PCP bpftrace @@ -58,7 +58,7 @@ Getting started :hidden: datasources/authentication - datasources/redis + datasources/valkey datasources/vector datasources/bpftrace diff --git a/docs/installation.rst b/docs/installation.rst index 389fa179..5765df42 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -5,14 +5,14 @@ Minimum Software Requirements ----------------------------- ==== ===== ======= ==================== -PCP Redis Grafana grafana-pcp +PCP Valkey Grafana grafana-pcp ==== ===== ======= ==================== 5.2+ 5+ 7.x 3.x 5.2+ 5+ 8.x 4.x 5.2+ 5+ 9.x 5.x ==== ===== ======= ==================== -Note: Redis is only required for the :doc:`datasources/redis` data source. +Note: Valkey is only required for the :doc:`datasources/valkey` data source. Distribution Package -------------------- @@ -52,6 +52,7 @@ Replace X.Y.Z with the version of grafana-pcp you wish to install. $ podman run \ -e GF_INSTALL_PLUGINS="https://github.com/performancecopilot/grafana-pcp/releases/download/vX.Y.Z/performancecopilot-pcp-app-X.Y.Z.zip;performancecopilot-pcp-app" \ + -e GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS="performancecopilot-pcp-app,pcp-valkey-datasource,pcp-vector-datasource,pcp-bpftrace-datasource,pcp-flamegraph-panel,pcp-breadcrumbs-panel,pcp-troubleshooting-panel,performancecopilot-valkey-datasource,performancecopilot-vector-datasource,performancecopilot-bpftrace-datasource,performancecopilot-flamegraph-panel,performancecopilot-breadcrumbs-panel,performancecopilot-troubleshooting-panel" \ -p 3000:3000 \ docker.io/grafana/grafana @@ -59,6 +60,7 @@ Replace X.Y.Z with the version of grafana-pcp you wish to install. $ docker run \ -e GF_INSTALL_PLUGINS="https://github.com/performancecopilot/grafana-pcp/releases/download/vX.Y.Z/performancecopilot-pcp-app-X.Y.Z.zip;performancecopilot-pcp-app" \ + -e GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS="performancecopilot-pcp-app,pcp-valkey-datasource,pcp-vector-datasource,pcp-bpftrace-datasource,pcp-flamegraph-panel,pcp-breadcrumbs-panel,pcp-troubleshooting-panel,performancecopilot-valkey-datasource,performancecopilot-vector-datasource,performancecopilot-bpftrace-datasource,performancecopilot-flamegraph-panel,performancecopilot-breadcrumbs-panel,performancecopilot-troubleshooting-panel" \ -p 3000:3000 \ grafana/grafana @@ -73,7 +75,7 @@ The `yarn package manager `_, `Go compiler /*``) -* Verify that `pmproxy`_ is running, time series support is enabled and a connection to Redis is established: check the logfile at ``/var/log/pcp/pmproxy/pmproxy.log`` and make sure that it contains the following text: ``Info: Redis slots, command keys, schema version setup`` -* Check if the Redis database contains any keys: ``redis-cli dbsize`` -* Check if any PCP metrics are in the Redis database: ``pmseries disk.dev.read`` -* Check if PCP metric values are in the Redis database: ``pmseries 'disk.dev.read[count:10]'`` +* Verify that `pmproxy`_ is running, time series support is enabled and a connection to Valkey is established: check the logfile at ``/var/log/pcp/pmproxy/pmproxy.log`` and make sure that it contains the following text: ``Info: Valkey slots, command keys, schema version setup`` +* Check if the Valkey database contains any keys: ``valkey-cli dbsize`` +* Check if any PCP metrics are in the Valkey database: ``pmseries disk.dev.read`` +* Check if PCP metric values are in the Valkey database: ``pmseries 'disk.dev.read[count:10]'`` * Check the Grafana logs: ``journalctl -e -u grafana-server`` diff --git a/package.json b/package.json index 0ae31e23..f0dd8925 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "performancecopilot-pcp-app", "description": "Performance Co-Pilot Grafana Plugin", - "version": "5.1.2", + "version": "5.2.0", "scripts": { "build": "grafana-toolkit plugin:build", "test": "grafana-toolkit plugin:test", @@ -63,6 +63,21 @@ "redux-persist": "^6.0.0", "redux-thunk": "^2.3.0" }, + "resolutions": { + "moment": "^2.29.4", + "moment-timezone": "^0.5.35", + "d3-color": "^3.1.0", + "minimatch": "^3.0.5", + "loader-utils": "^2.0.3", + "simple-git": "^3.15.0", + "json5": "^2.2.2", + "ua-parser-js": "^1.0.33", + "@braintree/sanitize-url": "6.0.1", + "webpack": "^5.76.0", + "tough-cookie": "^4.1.3", + "semver": "^6.3.1", + "word-wrap": "^1.2.4" + }, "engines": { "node": ">=14" } diff --git a/pkg/datasources/redis/api/pmseries/models.go b/pkg/datasources/valkey/api/pmseries/models.go similarity index 100% rename from pkg/datasources/redis/api/pmseries/models.go rename to pkg/datasources/valkey/api/pmseries/models.go diff --git a/pkg/datasources/redis/api/pmseries/pmseries.go b/pkg/datasources/valkey/api/pmseries/pmseries.go similarity index 100% rename from pkg/datasources/redis/api/pmseries/pmseries.go rename to pkg/datasources/valkey/api/pmseries/pmseries.go diff --git a/pkg/datasources/redis/data_processor.go b/pkg/datasources/valkey/data_processor.go similarity index 82% rename from pkg/datasources/redis/data_processor.go rename to pkg/datasources/valkey/data_processor.go index f3b71015..ddab2372 100644 --- a/pkg/datasources/redis/data_processor.go +++ b/pkg/datasources/valkey/data_processor.go @@ -1,4 +1,4 @@ -package redis +package valkey import ( "fmt" @@ -10,9 +10,9 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/data" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/series" - series_ "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/series" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/series" + series_ "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/series" ) func getStringLabels(series *series.Series, instanceID string) data.Labels { @@ -117,7 +117,7 @@ func getFieldUnit(desc *series.Desc) string { return "" } -func (ds *redisDatasourceInstance) getFieldName(series *series.Series, instanceID string) string { +func (ds *valkeyDatasourceInstance) getFieldName(series *series.Series, instanceID string) string { if series.Instances == nil { return series.MetricName } @@ -131,16 +131,16 @@ func (ds *redisDatasourceInstance) getFieldName(series *series.Series, instanceI var legendFormatRegex = regexp.MustCompile(`\$\w+`) -func getFieldDisplayName(redisQuery *Query, series *series.Series, instanceID string, labels data.Labels) string { - if redisQuery.LegendFormat == "" { +func getFieldDisplayName(valkeyQuery *Query, series *series.Series, instanceID string, labels data.Labels) string { + if valkeyQuery.LegendFormat == "" { return "" } - return legendFormatRegex.ReplaceAllStringFunc(redisQuery.LegendFormat, func(match string) string { + return legendFormatRegex.ReplaceAllStringFunc(valkeyQuery.LegendFormat, func(match string) string { varName := match[1:] switch varName { case "expr": - return redisQuery.Expr + return valkeyQuery.Expr case "metric": return series.MetricName case "metric0": @@ -166,7 +166,7 @@ func getFieldDisplayName(redisQuery *Query, series *series.Series, instanceID st }) } -func (ds *redisDatasourceInstance) createField(redisQuery *Query, series *series.Series, instanceID string) (*data.Field, error) { +func (ds *valkeyDatasourceInstance) createField(valkeyQuery *Query, series *series.Series, instanceID string) (*data.Field, error) { name := ds.getFieldName(series, instanceID) vector, err := createFieldVector(series.Desc.Type) @@ -175,7 +175,7 @@ func (ds *redisDatasourceInstance) createField(redisQuery *Query, series *series } labels := getStringLabels(series, instanceID) - displayNameFromDS := getFieldDisplayName(redisQuery, series, instanceID, labels) + displayNameFromDS := getFieldDisplayName(valkeyQuery, series, instanceID, labels) unit := getFieldUnit(&series.Desc) field := data.NewField(name, labels, vector) @@ -197,7 +197,7 @@ func (ds *redisDatasourceInstance) createField(redisQuery *Query, series *series return field, nil } -func (ds *redisDatasourceInstance) maybeRefreshInstances(series *series.Series, instanceID string) (bool, error) { +func (ds *valkeyDatasourceInstance) maybeRefreshInstances(series *series.Series, instanceID string) (bool, error) { _, ok := series.Instances[instanceID] if ok { return false, nil @@ -211,7 +211,7 @@ func (ds *redisDatasourceInstance) maybeRefreshInstances(series *series.Series, } -func (ds *redisDatasourceInstance) createDataFrames(redisQuery *Query, series map[string]*series.Series, values []pmseries.ValuesResponseItem) (data.Frames, error) { +func (ds *valkeyDatasourceInstance) createDataFrames(valkeyQuery *Query, series map[string]*series.Series, values []pmseries.ValuesResponseItem) (data.Frames, error) { frames := data.Frames{} // values are in the format @@ -259,7 +259,7 @@ func (ds *redisDatasourceInstance) createDataFrames(redisQuery *Query, series ma } } - field, err = ds.createField(redisQuery, series[curSeriesID], values[i].Instance) + field, err = ds.createField(valkeyQuery, series[curSeriesID], values[i].Instance) if err != nil { return nil, err } @@ -293,7 +293,7 @@ func (ds *redisDatasourceInstance) createDataFrames(redisQuery *Query, series ma } } - applyFieldTransformations(redisQuery, &series[curSeriesID].Desc, curFrame) + applyFieldTransformations(valkeyQuery, &series[curSeriesID].Desc, curFrame) frames = append(frames, curFrame) } @@ -315,7 +315,7 @@ func getHeatMapDisplayName(field *data.Field) string { return "0-0" } -func (ds *redisDatasourceInstance) transformToHeatMap(frame *data.Frame) error { +func (ds *valkeyDatasourceInstance) transformToHeatMap(frame *data.Frame) error { var timeField *data.Field for _, field := range frame.Fields { if field.Type() == data.FieldTypeTime { @@ -337,13 +337,13 @@ func (ds *redisDatasourceInstance) transformToHeatMap(frame *data.Frame) error { return nil } -func (ds *redisDatasourceInstance) processQuery(redisQuery *Query, series map[string]*series.Series, values []pmseries.ValuesResponseItem) (data.Frames, error) { - frames, err := ds.createDataFrames(redisQuery, series, values) +func (ds *valkeyDatasourceInstance) processQuery(valkeyQuery *Query, series map[string]*series.Series, values []pmseries.ValuesResponseItem) (data.Frames, error) { + frames, err := ds.createDataFrames(valkeyQuery, series, values) if err != nil { return nil, err } - switch redisQuery.Format { + switch valkeyQuery.Format { case TimeSeries: return frames, nil case Heatmap: @@ -355,6 +355,6 @@ func (ds *redisDatasourceInstance) processQuery(redisQuery *Query, series map[st } return frames, nil default: - return nil, fmt.Errorf("invalid target format '%s'", redisQuery.Format) + return nil, fmt.Errorf("invalid target format '%s'", valkeyQuery.Format) } } diff --git a/pkg/datasources/redis/datasource.go b/pkg/datasources/valkey/datasource.go similarity index 76% rename from pkg/datasources/redis/datasource.go rename to pkg/datasources/valkey/datasource.go index 924097e4..25b4502d 100644 --- a/pkg/datasources/redis/datasource.go +++ b/pkg/datasources/valkey/datasource.go @@ -1,4 +1,4 @@ -package redis +package valkey import ( "context" @@ -9,22 +9,22 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/resource" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/series" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/resource" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/series" ) // NewDatasource returns datasource.ServeOpts. func NewDatasource() datasource.ServeOpts { im := datasource.NewInstanceManager(newDataSourceInstance) - ds := &redisDatasource{ + ds := &valkeyDatasource{ im: im, } mux := datasource.NewQueryTypeMux() mux.HandleFunc("", func(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { var response *backend.QueryDataResponse - return response, ds.im.Do(ctx, req.PluginContext, func(dsInst *redisDatasourceInstance) error { + return response, ds.im.Do(ctx, req.PluginContext, func(dsInst *valkeyDatasourceInstance) error { var err error response, err = dsInst.handleTimeSeriesQueries(ctx, req) return err @@ -38,11 +38,11 @@ func NewDatasource() datasource.ServeOpts { } } -type redisDatasource struct { +type valkeyDatasource struct { im instancemgmt.InstanceManager } -type redisDatasourceInstance struct { +type valkeyDatasourceInstance struct { pmseriesAPI pmseries.API resourceService *resource.Service seriesService *series.Service @@ -68,18 +68,18 @@ func newDataSourceInstance(ctx context.Context, setting backend.DataSourceInstan return nil, err } - return &redisDatasourceInstance{ + return &valkeyDatasourceInstance{ pmseriesAPI: pmseriesAPI, resourceService: resource.NewResourceService(pmseriesAPI), seriesService: seriesService, }, nil } -func (ds *redisDatasourceInstance) Dispose() { +func (ds *valkeyDatasourceInstance) Dispose() { // Called before creating a new instance } -func (ds *redisDatasource) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { +func (ds *valkeyDatasource) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { u, err := url.Parse(req.URL) if err != nil { return err @@ -91,7 +91,7 @@ func (ds *redisDatasource) CallResource(ctx context.Context, req *backend.CallRe } method := u.Path - return ds.im.Do(ctx, req.PluginContext, func(dsInst *redisDatasourceInstance) error { + return ds.im.Do(ctx, req.PluginContext, func(dsInst *valkeyDatasourceInstance) error { status := http.StatusOK result, err := dsInst.resourceService.CallResource(method, queryParams) if err != nil { @@ -117,9 +117,9 @@ func (ds *redisDatasource) CallResource(ctx context.Context, req *backend.CallRe // The main use case for these health checks is the test button on the // datasource configuration page which allows users to verify that // a datasource is working as expected. -func (ds *redisDatasource) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { +func (ds *valkeyDatasource) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { var result *backend.CheckHealthResult - err := ds.im.Do(ctx, req.PluginContext, func(dsInst *redisDatasourceInstance) error { + err := ds.im.Do(ctx, req.PluginContext, func(dsInst *valkeyDatasourceInstance) error { pingResponse, err := dsInst.pmseriesAPI.Ping() if err != nil { @@ -130,7 +130,7 @@ func (ds *redisDatasource) CheckHealth(ctx context.Context, req *backend.CheckHe } else if !pingResponse.Success { result = &backend.CheckHealthResult{ Status: backend.HealthStatusError, - Message: "Datasource is not working. Please check if Redis is running and consult the pmproxy logs.", + Message: "Datasource is not working. Please check if Valkey is running and consult the pmproxy logs.", } } else { result = &backend.CheckHealthResult{ diff --git a/pkg/datasources/redis/datasource_test.go b/pkg/datasources/valkey/datasource_test.go similarity index 92% rename from pkg/datasources/redis/datasource_test.go rename to pkg/datasources/valkey/datasource_test.go index 20f587e6..edc4eac8 100644 --- a/pkg/datasources/redis/datasource_test.go +++ b/pkg/datasources/valkey/datasource_test.go @@ -1,4 +1,4 @@ -package redis +package valkey import ( "context" @@ -8,13 +8,13 @@ import ( "testing" "time" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/test/fixtures/pmseriesf" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/test/fixtures/pmseriesf" "github.com/stretchr/testify/require" "github.com/grafana/grafana-plugin-sdk-go/backend" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/resource" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/series" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/resource" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/series" ) func TestDatasource(t *testing.T) { @@ -101,7 +101,7 @@ func TestDatasource(t *testing.T) { pmseriesAPI, _ := pmseries.NewPmseriesAPI(srv.URL, nil) seriesService, _ := series.NewSeriesService(pmseriesAPI, 1024) - datasourceInstance := &redisDatasourceInstance{ + datasourceInstance := &valkeyDatasourceInstance{ pmseriesAPI: pmseriesAPI, resourceService: resource.NewResourceService(pmseriesAPI), seriesService: seriesService, diff --git a/pkg/datasources/redis/field_transformations.go b/pkg/datasources/valkey/field_transformations.go similarity index 89% rename from pkg/datasources/redis/field_transformations.go rename to pkg/datasources/valkey/field_transformations.go index f3d7d83f..8bf4dc43 100644 --- a/pkg/datasources/redis/field_transformations.go +++ b/pkg/datasources/valkey/field_transformations.go @@ -1,4 +1,4 @@ -package redis +package valkey import ( "errors" @@ -7,7 +7,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana-plugin-sdk-go/data" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/series" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/series" ) func fieldSetRate(field *data.Field, idx int, delta time.Duration) error { @@ -104,9 +104,9 @@ var pcpTimeUnits = map[string]int{ "millisec": 1000, } -func applyFieldTransformations(redisQuery *Query, desc *series.Desc, frame *data.Frame) error { +func applyFieldTransformations(valkeyQuery *Query, desc *series.Desc, frame *data.Frame) error { if desc.Semantics == "counter" { - if redisQuery.Options.RateConversion { + if valkeyQuery.Options.RateConversion { err := rateConversion(frame) if err != nil { return err @@ -114,7 +114,7 @@ func applyFieldTransformations(redisQuery *Query, desc *series.Desc, frame *data } divisor, isTimeUtilization := pcpTimeUnits[desc.Units] - if redisQuery.Options.TimeUtilizationConversion && redisQuery.Format != Heatmap && isTimeUtilization { + if valkeyQuery.Options.TimeUtilizationConversion && valkeyQuery.Format != Heatmap && isTimeUtilization { err := timeUtilizationConversion(frame, divisor) if err != nil { return err diff --git a/pkg/datasources/redis/field_transformations_test.go b/pkg/datasources/valkey/field_transformations_test.go similarity index 98% rename from pkg/datasources/redis/field_transformations_test.go rename to pkg/datasources/valkey/field_transformations_test.go index c2b660f2..537c212c 100644 --- a/pkg/datasources/redis/field_transformations_test.go +++ b/pkg/datasources/valkey/field_transformations_test.go @@ -1,4 +1,4 @@ -package redis +package valkey import ( "fmt" @@ -6,7 +6,7 @@ import ( "time" "github.com/grafana/grafana-plugin-sdk-go/data" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/series" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/series" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/pkg/datasources/redis/models.go b/pkg/datasources/valkey/models.go similarity index 92% rename from pkg/datasources/redis/models.go rename to pkg/datasources/valkey/models.go index 27d5ce92..0dadb33f 100644 --- a/pkg/datasources/redis/models.go +++ b/pkg/datasources/valkey/models.go @@ -1,4 +1,4 @@ -package redis +package valkey type TargetFormat string @@ -7,7 +7,7 @@ const ( Heatmap TargetFormat = "heatmap" ) -// Query is a single redis query (target) +// Query is a single valkey query (target) type Query struct { Expr string `json:"expr"` Format TargetFormat `json:"format"` diff --git a/pkg/datasources/redis/query.go b/pkg/datasources/valkey/query.go similarity index 77% rename from pkg/datasources/redis/query.go rename to pkg/datasources/valkey/query.go index bce0c8c9..09173861 100644 --- a/pkg/datasources/redis/query.go +++ b/pkg/datasources/valkey/query.go @@ -1,4 +1,4 @@ -package redis +package valkey import ( "context" @@ -11,7 +11,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/data" ) -// The PCP Redis data source executes the following HTTP requests to gather the required data for a time series query: +// The PCP valkey data source executes the following HTTP requests to gather the required data for a time series query: // // (1) `/series/query?expr=...` to get a list of series ids // (2) `/series/metrics?series=...` to get the metric names of each series @@ -29,17 +29,17 @@ import ( // When a pmseries query matches many series (e.g. many hosts) or series with many instances, the list of series ids // can get quite long, too long to fit into an URL. Therefore the list of series ids is sent in the request body of a // POST request, even though it should be (semantically) a GET request. -func (ds *redisDatasourceInstance) executeTimeSeriesQuery(dataQuery *backend.DataQuery, redisQuery *Query) (data.Frames, error) { - if redisQuery.Expr == "" { +func (ds *valkeyDatasourceInstance) executeTimeSeriesQuery(dataQuery *backend.DataQuery, valkeyQuery *Query) (data.Frames, error) { + if valkeyQuery.Expr == "" { return data.Frames{}, nil } - seriesIds, err := ds.pmseriesAPI.Query(redisQuery.Expr) + seriesIds, err := ds.pmseriesAPI.Query(valkeyQuery.Expr) if err != nil { return nil, err } if len(seriesIds) == 0 { - return nil, fmt.Errorf("cannot find any series for query '%s'", redisQuery.Expr) + return nil, fmt.Errorf("cannot find any series for query '%s'", valkeyQuery.Expr) } series, err := ds.seriesService.GetSeries(seriesIds) @@ -58,25 +58,25 @@ func (ds *redisDatasourceInstance) executeTimeSeriesQuery(dataQuery *backend.Dat return nil, err } - frames, err := ds.processQuery(redisQuery, series, values) + frames, err := ds.processQuery(valkeyQuery, series, values) if err != nil { return nil, err } return frames, nil } -func (ds *redisDatasourceInstance) handleTimeSeriesQuery(ctx context.Context, dataQuery *backend.DataQuery) backend.DataResponse { +func (ds *valkeyDatasourceInstance) handleTimeSeriesQuery(ctx context.Context, dataQuery *backend.DataQuery) backend.DataResponse { response := backend.DataResponse{} - redisQuery := DefaultQuery() - err := json.Unmarshal(dataQuery.JSON, &redisQuery) + valkeyQuery := DefaultQuery() + err := json.Unmarshal(dataQuery.JSON, &valkeyQuery) if err != nil { response.Error = err return response } - log.DefaultLogger.Debug("Query", "query", &redisQuery) - frames, err := ds.executeTimeSeriesQuery(dataQuery, &redisQuery) + log.DefaultLogger.Debug("Query", "query", &valkeyQuery) + frames, err := ds.executeTimeSeriesQuery(dataQuery, &valkeyQuery) if err != nil { response.Error = err } else { @@ -90,7 +90,7 @@ func (ds *redisDatasourceInstance) handleTimeSeriesQuery(ctx context.Context, da // req contains the queries []DataQuery (where each query contains RefID as a unique identifer). // The QueryDataResponse contains a map of RefID to the response for each query, and each response // contains Frames ([]*Frame). -func (ds *redisDatasourceInstance) handleTimeSeriesQueries(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { +func (ds *valkeyDatasourceInstance) handleTimeSeriesQueries(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { log.DefaultLogger.Debug("handleTimeSeriesQueries", "request", req) response := backend.NewQueryDataResponse() diff --git a/pkg/datasources/redis/resource/metric_find_value.go b/pkg/datasources/valkey/resource/metric_find_value.go similarity index 100% rename from pkg/datasources/redis/resource/metric_find_value.go rename to pkg/datasources/valkey/resource/metric_find_value.go diff --git a/pkg/datasources/redis/resource/models.go b/pkg/datasources/valkey/resource/models.go similarity index 100% rename from pkg/datasources/redis/resource/models.go rename to pkg/datasources/valkey/resource/models.go diff --git a/pkg/datasources/redis/resource/resource.go b/pkg/datasources/valkey/resource/resource.go similarity index 88% rename from pkg/datasources/redis/resource/resource.go rename to pkg/datasources/valkey/resource/resource.go index b324c3ef..e4d93151 100644 --- a/pkg/datasources/redis/resource/resource.go +++ b/pkg/datasources/valkey/resource/resource.go @@ -4,7 +4,7 @@ import ( "fmt" "net/url" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" ) type Service struct { diff --git a/pkg/datasources/redis/series/models.go b/pkg/datasources/valkey/series/models.go similarity index 96% rename from pkg/datasources/redis/series/models.go rename to pkg/datasources/valkey/series/models.go index 02ca8804..339d7810 100644 --- a/pkg/datasources/redis/series/models.go +++ b/pkg/datasources/valkey/series/models.go @@ -1,6 +1,6 @@ package series -import "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" +import "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" // Series is a single time series with descriptor, labels and instances, but without values type Series struct { diff --git a/pkg/datasources/redis/series/series.go b/pkg/datasources/valkey/series/series.go similarity index 98% rename from pkg/datasources/redis/series/series.go rename to pkg/datasources/valkey/series/series.go index cb74391b..338251d3 100644 --- a/pkg/datasources/redis/series/series.go +++ b/pkg/datasources/valkey/series/series.go @@ -5,7 +5,7 @@ import ( "sync" lru "github.com/hashicorp/golang-lru" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" "github.com/grafana/grafana-plugin-sdk-go/backend/log" ) diff --git a/pkg/datasources/redis/series/series_test.go b/pkg/datasources/valkey/series/series_test.go similarity index 97% rename from pkg/datasources/redis/series/series_test.go rename to pkg/datasources/valkey/series/series_test.go index 5138679a..77938fc1 100644 --- a/pkg/datasources/redis/series/series_test.go +++ b/pkg/datasources/valkey/series/series_test.go @@ -8,7 +8,7 @@ import ( "testing" "time" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" "github.com/stretchr/testify/require" ) diff --git a/pkg/datasources/redis/test/fixtures/pmseriesf/fixtures.go b/pkg/datasources/valkey/test/fixtures/pmseriesf/fixtures.go similarity index 93% rename from pkg/datasources/redis/test/fixtures/pmseriesf/fixtures.go rename to pkg/datasources/valkey/test/fixtures/pmseriesf/fixtures.go index 9398e7af..1e884524 100644 --- a/pkg/datasources/redis/test/fixtures/pmseriesf/fixtures.go +++ b/pkg/datasources/valkey/test/fixtures/pmseriesf/fixtures.go @@ -1,8 +1,8 @@ package pmseriesf import ( - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/series" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/series" ) var metrics = map[string]series.Series{ diff --git a/pkg/datasources/redis/test/fixtures/pmseriesf/generators.go b/pkg/datasources/valkey/test/fixtures/pmseriesf/generators.go similarity index 98% rename from pkg/datasources/redis/test/fixtures/pmseriesf/generators.go rename to pkg/datasources/valkey/test/fixtures/pmseriesf/generators.go index 92f835ac..0956a82a 100644 --- a/pkg/datasources/redis/test/fixtures/pmseriesf/generators.go +++ b/pkg/datasources/valkey/test/fixtures/pmseriesf/generators.go @@ -1,6 +1,6 @@ package pmseriesf -import "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis/api/pmseries" +import "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey/api/pmseries" func Query(sids []string) pmseries.QueryResponse { return sids diff --git a/pkg/datasources/redis/utils.go b/pkg/datasources/valkey/utils.go similarity index 96% rename from pkg/datasources/redis/utils.go rename to pkg/datasources/valkey/utils.go index f463011e..6ca6f524 100644 --- a/pkg/datasources/redis/utils.go +++ b/pkg/datasources/valkey/utils.go @@ -1,4 +1,4 @@ -package redis +package valkey import ( "fmt" diff --git a/pkg/main.go b/pkg/main.go index 68715fa1..50f6d75e 100644 --- a/pkg/main.go +++ b/pkg/main.go @@ -5,14 +5,14 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" "github.com/grafana/grafana-plugin-sdk-go/backend/log" - "github.com/performancecopilot/grafana-pcp/pkg/datasources/redis" + "github.com/performancecopilot/grafana-pcp/pkg/datasources/valkey" ) func main() { // Start listening to requests send from Grafana. This call is blocking so // it wont finish until Grafana shutsdown the process or the plugin choose // to exit close down by itself - err := datasource.Serve(redis.NewDatasource()) + err := datasource.Serve(valkey.NewDatasource()) // Log any error if we could start the plugin. if err != nil { diff --git a/src/common/services/pmsearch/types.ts b/src/common/services/pmsearch/types.ts index f0d59b52..e4dead35 100644 --- a/src/common/services/pmsearch/types.ts +++ b/src/common/services/pmsearch/types.ts @@ -57,7 +57,7 @@ export interface TextItemResponse { } export interface TextResponse { - total: number; // Redisearch returns total number of matching records even if results themselves are limited + total: number; // ValkeySearch returns total number of matching records even if results themselves are limited elapsed: number; limit: number; offset: number; @@ -73,7 +73,7 @@ export interface IndomQueryParams { export class SearchNotAvailableError extends Error { constructor(message?: string) { super( - message ?? `Metric Search not available. Please install the RediSearch Redis module and restart pmproxy.` + message ?? `Metric Search not available. Please install the ValkeySearch Valkey module and restart pmproxy.` ); Object.setPrototypeOf(this, new.target.prototype); } diff --git a/src/components/app/App.tsx b/src/components/app/App.tsx new file mode 100644 index 00000000..7fa53f4f --- /dev/null +++ b/src/components/app/App.tsx @@ -0,0 +1,30 @@ +import React from 'react'; +import { AppRootProps } from '@grafana/data'; +import { css } from '@emotion/css'; + +export function App(props: AppRootProps) { + return ( +
+

Performance Co-Pilot App

+ This app integrates metrics from Performance Co-Pilot. +
+
+ It includes the following data sources: +
    +
  • + PCP Valkey for fast, scalable time series aggregation across multiple hosts +
  • +
  • + PCP Vector for live, on-host metrics analysis, with container support +
  • +
  • + PCP bpftrace for system introspection using bpftrace scripts +
  • +
+
+ ); +} diff --git a/src/components/appconfig/config.tsx b/src/components/appconfig/config.tsx index b28970c1..3c14febc 100644 --- a/src/components/appconfig/config.tsx +++ b/src/components/appconfig/config.tsx @@ -46,7 +46,7 @@ export class AppConfig extends PureComponent { `} >
  • - PCP Redis for fast, scalable time series aggregation across multiple hosts + PCP Valkey for fast, scalable time series aggregation across multiple hosts
  • PCP Vector for live, on-host metrics analysis, with container support diff --git a/src/components/search/pages/Detail/DetailPage.test.tsx b/src/components/search/pages/Detail/DetailPage.test.tsx index 0c213856..99cffda8 100644 --- a/src/components/search/pages/Detail/DetailPage.test.tsx +++ b/src/components/search/pages/Detail/DetailPage.test.tsx @@ -192,7 +192,7 @@ describe('', () => { type: 'graph', }); expect(locationSrvMock.update.mock.calls[0][0]).toEqual({ - path: '/d/pcp-redis-metric-preview-graph/pcp-redis-metric-preview-graph', + path: '/d/pcp-valkey-metric-preview-graph/pcp-valkey-metric-preview-graph', query: { 'var-metric': id, refresh: '5s', @@ -212,7 +212,7 @@ describe('', () => { type: 'table', }); expect(locationSrvMock.update.mock.calls[0][0]).toEqual({ - path: '/d/pcp-redis-metric-preview-table/pcp-redis-metric-preview-table', + path: '/d/pcp-valkey-metric-preview-table/pcp-valkey-metric-preview-table', query: { 'var-metric': id, refresh: '5s', diff --git a/src/components/search/pages/Detail/DetailPage.tsx b/src/components/search/pages/Detail/DetailPage.tsx index 6e1419dd..387ffefd 100644 --- a/src/components/search/pages/Detail/DetailPage.tsx +++ b/src/components/search/pages/Detail/DetailPage.tsx @@ -62,10 +62,10 @@ export class DetailPage extends React.Component ds.type === redisPluginConfig.id); - if (!redisDatasource) { + const valkeyDatasource = datasources.find((ds: any) => ds.type === valkeyPluginConfig.id); + if (!valkeyDatasource) { throw new GenericError( - `Could not find any PCP Redis data source. Please create a PCP Redis data source before using the search feature.` + `Could not find any PCP Valkey data source. Please create a PCP Valkey data source before using the search feature.` ); } - return redisDatasource; + return valkeyDatasource; } export const initServices = async (): Promise => { diff --git a/src/dashboards/redis/preview/pcp-redis-metric-preview-graph.jsonnet b/src/dashboards/valkey/preview/pcp-valkey-metric-preview-graph.jsonnet similarity index 70% rename from src/dashboards/redis/preview/pcp-redis-metric-preview-graph.jsonnet rename to src/dashboards/valkey/preview/pcp-valkey-metric-preview-graph.jsonnet index bd2462f6..6e170c3c 100644 --- a/src/dashboards/redis/preview/pcp-redis-metric-preview-graph.jsonnet +++ b/src/dashboards/valkey/preview/pcp-valkey-metric-preview-graph.jsonnet @@ -1,9 +1,9 @@ local grafana = import 'grafonnet/grafana.libsonnet'; grafana.dashboard.new( - 'PCP Redis: Metric Preview (Graph)', // Gets converted to slug URL => /d/pcp-redis-metric-preview-graph/pcp-redis-metric-preview-graph - uid='pcp-redis-metric-preview-graph', - tags=['pcp-redis'], + 'PCP Valkey: Metric Preview (Graph)', // Gets converted to slug URL => /d/pcp-valkey-metric-preview-graph/pcp-valkey-metric-preview-graph + uid='pcp-valkey-metric-preview-graph', + tags=['pcp-valkey'], time_from='now-6h', time_to='now', refresh='10s', @@ -11,8 +11,8 @@ grafana.dashboard.new( .addTemplate( grafana.template.datasource( 'datasource', - 'performancecopilot-redis-datasource', - 'PCP Redis', + 'performancecopilot-valkey-datasource', + 'PCP Valkey', hide='variable', ) ) diff --git a/src/dashboards/redis/preview/pcp-redis-metric-preview-table.jsonnet b/src/dashboards/valkey/preview/pcp-valkey-metric-preview-table.jsonnet similarity index 71% rename from src/dashboards/redis/preview/pcp-redis-metric-preview-table.jsonnet rename to src/dashboards/valkey/preview/pcp-valkey-metric-preview-table.jsonnet index cfd91ff2..f2ae91be 100644 --- a/src/dashboards/redis/preview/pcp-redis-metric-preview-table.jsonnet +++ b/src/dashboards/valkey/preview/pcp-valkey-metric-preview-table.jsonnet @@ -1,9 +1,9 @@ local grafana = import 'grafonnet/grafana.libsonnet'; grafana.dashboard.new( - 'PCP Redis: Metric Preview (Table)', // Gets converted to slug URL => /d/pcp-redis-metric-preview-table/pcp-redis-metric-preview-table - uid='pcp-redis-metric-preview-table', - tags=['pcp-redis'], + 'PCP Valkey: Metric Preview (Table)', // Gets converted to slug URL => /d/pcp-valkey-metric-preview-table/pcp-valkey-metric-preview-table + uid='pcp-valkey-metric-preview-table', + tags=['pcp-valkey'], time_from='now-6h', time_to='now', refresh='10s', @@ -11,8 +11,8 @@ grafana.dashboard.new( .addTemplate( grafana.template.datasource( 'datasource', - 'performancecopilot-redis-datasource', - 'PCP Redis', + 'performancecopilot-valkey-datasource', + 'PCP Valkey', hide='variable', ) ) diff --git a/src/datasources/lib/pmapi/poller/poller.ts b/src/datasources/lib/pmapi/poller/poller.ts index cb25335d..d3bd942c 100644 --- a/src/datasources/lib/pmapi/poller/poller.ts +++ b/src/datasources/lib/pmapi/poller/poller.ts @@ -21,7 +21,7 @@ interface PollerHooks { registerEndpoint?: (endpoint: EndpointWithCtx) => Promise; registerTarget: (endpoint: EndpointWithCtx, target: Target) => Promise; deregisterTarget?: (target: Target) => void; - redisBackfill?: (endpoint: EndpointWithCtx, targets: Target[]) => Promise; + valkeyBackfill?: (endpoint: EndpointWithCtx, targets: Target[]) => Promise; } interface PollerConfig { @@ -171,17 +171,17 @@ export class Poller { } } - if (endpoint.hasRedis && readyTargets.length > 0) { + if (endpoint.hasValkey && readyTargets.length > 0) { try { - await this.config.hooks.redisBackfill?.(endpoint, readyTargets); + await this.config.hooks.valkeyBackfill?.(endpoint, readyTargets); } catch (error) { - // redis backfill is entirely optional, therefore ignore any errors - log.error('Error in redisBackfill hook', error); + // valkey backfill is entirely optional, therefore ignore any errors + log.error('Error in valkeyBackfill hook', error); } } } - async endpointHasRedis(endpoint: Endpoint): Promise { + async endpointHasValkey(endpoint: Endpoint): Promise { // the instance id of pmseries doesn't match instance id of pmapi // which leads to wrong association of instance names... disable backfilling until this is solved. return false; @@ -190,8 +190,8 @@ export class Poller { const pingRespone = await this.pmSeriesApiService.ping(endpoint.url); return pingRespone.success; } catch (error) { - // redis backfill is entirely optional, therefore ignore any errors - log.debug('Error checking if endpoint has redis', error); + // valkey backfill is entirely optional, therefore ignore any errors + log.debug('Error checking if endpoint has valkey', error); return false; } } @@ -201,7 +201,7 @@ export class Poller { hostspec: endpoint.hostspec, polltimeout: Math.round((this.state.refreshIntervalMs + this.config.gracePeriodMs) / 1000), }); - endpoint.hasRedis = this.config.hooks.redisBackfill && (await this.endpointHasRedis(endpoint)); + endpoint.hasValkey = this.config.hooks.valkeyBackfill && (await this.endpointHasValkey(endpoint)); endpoint.state = EndpointState.CONNECTED; await this.config.hooks.registerEndpoint?.(endpoint as EndpointWithCtx); } diff --git a/src/datasources/lib/pmapi/poller/types.ts b/src/datasources/lib/pmapi/poller/types.ts index 4bfa3757..bb6883df 100644 --- a/src/datasources/lib/pmapi/poller/types.ts +++ b/src/datasources/lib/pmapi/poller/types.ts @@ -42,8 +42,8 @@ export interface Endpoint { /** context, will be created at next poll */ context?: Context; - /** backfilling with redis */ - hasRedis?: boolean; + /** backfilling with valkey */ + hasValkey?: boolean; } export type EndpointWithCtx = Required; diff --git a/src/datasources/redis/img/redis.png b/src/datasources/redis/img/redis.png deleted file mode 100644 index 47a7dbfb..00000000 Binary files a/src/datasources/redis/img/redis.png and /dev/null differ diff --git a/src/datasources/redis/module.ts b/src/datasources/redis/module.ts deleted file mode 100644 index 0a64d678..00000000 --- a/src/datasources/redis/module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { DataSourcePlugin } from '@grafana/data'; -import { RedisQueryEditor } from './components/RedisQueryEditor'; -import { RedisConfigEditor } from './configuration/RedisConfigEditor'; -import { PCPRedisDataSource } from './datasource'; -import { RedisOptions, RedisQuery } from './types'; - -export const plugin = new DataSourcePlugin(PCPRedisDataSource) - .setConfigEditor(RedisConfigEditor) - .setQueryEditor(RedisQueryEditor); diff --git a/src/datasources/redis/README.md b/src/datasources/valkey/README.md similarity index 55% rename from src/datasources/redis/README.md rename to src/datasources/valkey/README.md index 7b0c3b27..89d03d79 100644 --- a/src/datasources/redis/README.md +++ b/src/datasources/valkey/README.md @@ -1,3 +1,3 @@ -# PCP Redis +# PCP Valkey -#### [Data source documentation](https://grafana-pcp.readthedocs.io/en/latest/datasources/redis.html) +#### [Data source documentation](https://grafana-pcp.readthedocs.io/en/latest/datasources/valkey.html) diff --git a/src/datasources/redis/components/RedisQueryEditor.tsx b/src/datasources/valkey/components/ValkeyQueryEditor.tsx similarity index 94% rename from src/datasources/redis/components/RedisQueryEditor.tsx rename to src/datasources/valkey/components/ValkeyQueryEditor.tsx index 8609d85c..115cba6e 100644 --- a/src/datasources/redis/components/RedisQueryEditor.tsx +++ b/src/datasources/valkey/components/ValkeyQueryEditor.tsx @@ -7,11 +7,11 @@ import { isBlank } from '../../../common/utils'; import { Monaco } from '../../../components/monaco'; import { MonacoEditorLazy } from '../../../components/monaco/MonacoEditorLazy'; import { TargetFormat } from '../../../datasources/lib/types'; -import { PCPRedisDataSource } from '../datasource'; -import { defaultRedisQuery, RedisOptions, RedisQuery, RedisQueryOptions } from '../types'; +import { PCPValkeyDataSource } from '../datasource'; +import { defaultValkeyQuery, ValkeyOptions, ValkeyQuery, ValkeyQueryOptions } from '../types'; import { registerLanguage } from './language/PmseriesLanguage'; -type Props = QueryEditorProps; +type Props = QueryEditorProps; const FORMAT_OPTIONS: Array> = [ { label: 'Time series', value: TargetFormat.TimeSeries }, @@ -22,13 +22,13 @@ interface State { expr: string; format: SelectableValue; legendFormat?: string; - options: RedisQueryOptions; + options: ValkeyQueryOptions; } -export class RedisQueryEditor extends PureComponent { +export class ValkeyQueryEditor extends PureComponent { constructor(props: Props) { super(props); - const query = defaultsDeep({}, this.props.query, defaultRedisQuery); + const query = defaultsDeep({}, this.props.query, defaultValkeyQuery); this.state = { expr: query.expr, format: FORMAT_OPTIONS.find(option => option.value === query.format) ?? FORMAT_OPTIONS[0], @@ -63,7 +63,7 @@ export class RedisQueryEditor extends PureComponent { this.setState({ options: { ...this.state.options, timeUtilizationConversion } }, this.runQuery); }; - getQuery = (): RedisQuery => { + getQuery = (): ValkeyQuery => { return { ...this.props.query, expr: this.state.expr, diff --git a/src/datasources/redis/components/language/PmseriesBuiltins.json b/src/datasources/valkey/components/language/PmseriesBuiltins.json similarity index 100% rename from src/datasources/redis/components/language/PmseriesBuiltins.json rename to src/datasources/valkey/components/language/PmseriesBuiltins.json diff --git a/src/datasources/redis/components/language/PmseriesCompletionItemProvider.ts b/src/datasources/valkey/components/language/PmseriesCompletionItemProvider.ts similarity index 97% rename from src/datasources/redis/components/language/PmseriesCompletionItemProvider.ts rename to src/datasources/valkey/components/language/PmseriesCompletionItemProvider.ts index aa8e6876..70d3261f 100644 --- a/src/datasources/redis/components/language/PmseriesCompletionItemProvider.ts +++ b/src/datasources/valkey/components/language/PmseriesCompletionItemProvider.ts @@ -4,7 +4,7 @@ import { MetricFindValue } from '@grafana/data'; import { getTemplateSrv } from '@grafana/runtime'; import { Monaco, MonacoType } from '../../../../components/monaco'; import { findToken, getTokenValues, TokenValue } from '../../../lib/language'; -import { PCPRedisDataSource } from '../../datasource'; +import { PCPValkeyDataSource } from '../../datasource'; import PmseriesBuiltins from './PmseriesBuiltins.json'; const log = getLogger('PmseriesCompletionItemProvider'); @@ -14,7 +14,7 @@ export class PmseriesCompletionItemProvider implements MonacoType.languages.Comp triggerCharacters = ['(', '{', '"', '&', '|', ',']; - constructor(private monaco: Monaco, private datasource: PCPRedisDataSource) { + constructor(private monaco: Monaco, private datasource: PCPValkeyDataSource) { this.functionCompletions = PmseriesBuiltins.functions.map(f => { const name = f.def.substring(0, f.def.indexOf('(')); return { diff --git a/src/datasources/redis/components/language/PmseriesLanguage.ts b/src/datasources/valkey/components/language/PmseriesLanguage.ts similarity index 96% rename from src/datasources/redis/components/language/PmseriesLanguage.ts rename to src/datasources/valkey/components/language/PmseriesLanguage.ts index a462f3fb..c6f59f41 100644 --- a/src/datasources/redis/components/language/PmseriesLanguage.ts +++ b/src/datasources/valkey/components/language/PmseriesLanguage.ts @@ -1,5 +1,5 @@ import { Monaco, MonacoType } from '../../../../components/monaco'; -import { PCPRedisDataSource } from '../../datasource'; +import { PCPValkeyDataSource } from '../../datasource'; import { PmseriesCompletionItemProvider } from './PmseriesCompletionItemProvider'; const languageConfiguration: MonacoType.languages.LanguageConfiguration = { @@ -61,7 +61,7 @@ const languageDefinition: MonacoType.languages.IMonarchLanguage = { }, }; -export const registerLanguage = (monaco: Monaco, languageId: string, datasource: PCPRedisDataSource) => { +export const registerLanguage = (monaco: Monaco, languageId: string, datasource: PCPValkeyDataSource) => { const languages = monaco.languages.getLanguages(); if (languages.find(language => language.id === languageId)) { return; diff --git a/src/datasources/redis/configuration/RedisConfigEditor.tsx b/src/datasources/valkey/configuration/ValkeyConfigEditor.tsx similarity index 74% rename from src/datasources/redis/configuration/RedisConfigEditor.tsx rename to src/datasources/valkey/configuration/ValkeyConfigEditor.tsx index 11e570b8..038015bc 100644 --- a/src/datasources/redis/configuration/RedisConfigEditor.tsx +++ b/src/datasources/valkey/configuration/ValkeyConfigEditor.tsx @@ -1,11 +1,11 @@ import React from 'react'; import { DataSourcePluginOptionsEditorProps } from '@grafana/data'; import { DataSourceHttpSettings } from '@grafana/ui'; -import { RedisOptions } from '../types'; +import { ValkeyOptions } from '../types'; -export type Props = DataSourcePluginOptionsEditorProps; +export type Props = DataSourcePluginOptionsEditorProps; -export const RedisConfigEditor = (props: Props) => { +export const ValkeyConfigEditor = (props: Props) => { const { options, onOptionsChange } = props; return ( diff --git a/src/datasources/redis/dashboards/pcp-redis-host-overview.jsonnet b/src/datasources/valkey/dashboards/pcp-valkey-host-overview.jsonnet similarity index 98% rename from src/datasources/redis/dashboards/pcp-redis-host-overview.jsonnet rename to src/datasources/valkey/dashboards/pcp-valkey-host-overview.jsonnet index d8dedb37..389bb118 100644 --- a/src/datasources/redis/dashboards/pcp-redis-host-overview.jsonnet +++ b/src/datasources/valkey/dashboards/pcp-valkey-host-overview.jsonnet @@ -1,8 +1,8 @@ local grafana = import 'grafonnet/grafana.libsonnet'; grafana.dashboard.new( - 'PCP Redis: Host Overview', - tags=['pcp-redis'], + 'PCP Valkey: Host Overview', + tags=['pcp-valkey'], time_from='now-6h', time_to='now', refresh='10s', @@ -10,8 +10,8 @@ grafana.dashboard.new( .addTemplate( grafana.template.datasource( 'datasource', - 'performancecopilot-redis-datasource', - 'PCP Redis', + 'performancecopilot-valkey-datasource', + 'PCP Valkey', ) ) .addTemplate( diff --git a/src/datasources/redis/dashboards/pcp-redis-mssql-server.jsonnet b/src/datasources/valkey/dashboards/pcp-valkey-mssql-server.jsonnet similarity index 98% rename from src/datasources/redis/dashboards/pcp-redis-mssql-server.jsonnet rename to src/datasources/valkey/dashboards/pcp-valkey-mssql-server.jsonnet index 7833317f..f7d2456e 100644 --- a/src/datasources/redis/dashboards/pcp-redis-mssql-server.jsonnet +++ b/src/datasources/valkey/dashboards/pcp-valkey-mssql-server.jsonnet @@ -1,8 +1,8 @@ local grafana = import 'grafonnet/grafana.libsonnet'; grafana.dashboard.new( - 'PCP Redis: Microsoft SQL Server', - tags=['pcp-redis', 'mssql'], + 'PCP Valkey: Microsoft SQL Server', + tags=['pcp-valkey', 'mssql'], time_from='now-5m', time_to='now', refresh='5s', @@ -10,8 +10,8 @@ grafana.dashboard.new( .addTemplate( grafana.template.datasource( 'datasource', - 'performancecopilot-redis-datasource', - 'PCP Redis', + 'performancecopilot-valkey-datasource', + 'PCP Valkey', ) ) .addTemplate( diff --git a/src/datasources/redis/datasource.ts b/src/datasources/valkey/datasource.ts similarity index 85% rename from src/datasources/redis/datasource.ts rename to src/datasources/valkey/datasource.ts index 1034de9f..ef196410 100644 --- a/src/datasources/redis/datasource.ts +++ b/src/datasources/valkey/datasource.ts @@ -2,12 +2,12 @@ import 'core-js/features/instance/replace-all'; import { DataSourceInstanceSettings, MetricFindValue, ScopedVars, VariableModel } from '@grafana/data'; import { DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime'; import { isBlank } from '../../common/utils'; -import { RedisOptions, RedisQuery } from './types'; +import { ValkeyOptions, ValkeyQuery } from './types'; //const log = getLogger('datasource'); -export class PCPRedisDataSource extends DataSourceWithBackend { - constructor(instanceSettings: DataSourceInstanceSettings) { +export class PCPValkeyDataSource extends DataSourceWithBackend { + constructor(instanceSettings: DataSourceInstanceSettings) { super(instanceSettings); } @@ -36,7 +36,7 @@ export class PCPRedisDataSource extends DataSourceWithBackend { + applyTemplateVariables(query: ValkeyQuery, scopedVars: ScopedVars): Record { const expr = getTemplateSrv().replace(query.expr.trim(), scopedVars); const exprWithAdhocQualifiers = this.applyAdhocQualifiers(expr, getTemplateSrv().getVariables()); return { @@ -45,11 +45,11 @@ export class PCPRedisDataSource extends DataSourceWithBackend): Observable { + /*query(request: DataQueryRequest): Observable { const data = super.query(request); data.subscribe({ next: x => { diff --git a/src/datasources/valkey/img/valkey.png b/src/datasources/valkey/img/valkey.png new file mode 100644 index 00000000..8d63fe98 Binary files /dev/null and b/src/datasources/valkey/img/valkey.png differ diff --git a/src/datasources/redis/img/redis.svg b/src/datasources/valkey/img/valkey.svg similarity index 98% rename from src/datasources/redis/img/redis.svg rename to src/datasources/valkey/img/valkey.svg index 55b6621f..ba7d4b40 100644 --- a/src/datasources/redis/img/redis.svg +++ b/src/datasources/valkey/img/valkey.svg @@ -18,9 +18,9 @@ viewBox="0 0 200 180" enable-background="new 0 0 800 600" xml:space="preserve" - sodipodi:docname="redis.svg" + sodipodi:docname="valkey.svg" inkscape:version="0.92.4 (unknown)" - inkscape:export-filename="/home/nathans/redis.png" + inkscape:export-filename="/home/nathans/valkey.png" inkscape:export-xdpi="273.06668" inkscape:export-ydpi="273.06668">(PCPValkeyDataSource) + .setConfigEditor(ValkeyConfigEditor) + .setQueryEditor(ValkeyQueryEditor); diff --git a/src/datasources/redis/plugin.json b/src/datasources/valkey/plugin.json similarity index 58% rename from src/datasources/redis/plugin.json rename to src/datasources/valkey/plugin.json index f1450a88..d9b34e7a 100644 --- a/src/datasources/redis/plugin.json +++ b/src/datasources/valkey/plugin.json @@ -1,6 +1,6 @@ { - "name": "PCP Redis", - "id": "performancecopilot-redis-datasource", + "name": "PCP Valkey", + "id": "performancecopilot-valkey-datasource", "type": "datasource", "category": "tsdb", "metrics": true, @@ -8,12 +8,12 @@ "annotations": false, "tables": true, "backend": true, - "executable": "pcp_redis_datasource", + "executable": "pcp_valkey_datasource", "info": { "description": "fast, scalable time series aggregation across multiple hosts", "logos": { - "small": "img/redis.png", - "large": "img/redis.png" + "small": "img/valkey.png", + "large": "img/valkey.png" }, "links": [ { @@ -25,13 +25,13 @@ "includes": [ { "type": "dashboard", - "name": "PCP Redis: Host Overview", - "path": "dashboards/pcp-redis-host-overview.json" + "name": "PCP Valkey: Host Overview", + "path": "dashboards/pcp-valkey-host-overview.json" }, { "type": "dashboard", - "name": "PCP Redis: Microsoft SQL Server", - "path": "dashboards/pcp-redis-mssql-server.json" + "name": "PCP Valkey: Microsoft SQL Server", + "path": "dashboards/pcp-valkey-mssql-server.json" } ] } diff --git a/src/datasources/redis/types.ts b/src/datasources/valkey/types.ts similarity index 62% rename from src/datasources/redis/types.ts rename to src/datasources/valkey/types.ts index c47a17c8..52fcd9b2 100644 --- a/src/datasources/redis/types.ts +++ b/src/datasources/valkey/types.ts @@ -1,21 +1,21 @@ import { DataQuery, DataSourceJsonData } from '@grafana/data'; import { TargetFormat } from '../../datasources/lib/types'; -export interface RedisOptions extends DataSourceJsonData {} +export interface ValkeyOptions extends DataSourceJsonData {} -export interface RedisQueryOptions { +export interface ValkeyQueryOptions { rateConversion: boolean; timeUtilizationConversion: boolean; } -export interface RedisQuery extends DataQuery { +export interface ValkeyQuery extends DataQuery { expr: string; format: TargetFormat; legendFormat?: string; - options?: Partial; + options?: Partial; } -export const defaultRedisQuery: Partial = { +export const defaultValkeyQuery: Partial = { expr: '', format: TargetFormat.TimeSeries, options: { diff --git a/src/datasources/vector/__snapshots__/datasource.test.ts.snap b/src/datasources/vector/__snapshots__/datasource.test.ts.snap index 041fb7fb..94162be2 100644 --- a/src/datasources/vector/__snapshots__/datasource.test.ts.snap +++ b/src/datasources/vector/__snapshots__/datasource.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`PCP Vector redisBackfill hook should request series api for backfilling and populate metric values 1`] = ` +exports[`PCP Vector valkeyBackfill hook should request series api for backfilling and populate metric values 1`] = ` Array [ Object { "instanceDomain": Object { diff --git a/src/datasources/vector/dashboards/pcp-vector-top-consumers.jsonnet b/src/datasources/vector/dashboards/pcp-vector-top-consumers.jsonnet new file mode 100644 index 00000000..d33bd6ed --- /dev/null +++ b/src/datasources/vector/dashboards/pcp-vector-top-consumers.jsonnet @@ -0,0 +1,76 @@ +local grafana = import 'grafonnet/grafana.libsonnet'; + +grafana.dashboard.new( + 'PCP Vector: Top Consumers', + tags=['pcp-vector'], + time_from='now-5m', + time_to='now', + refresh='5s', +) +.addTemplate( + grafana.template.datasource( + 'datasource', + 'performancecopilot-vector-datasource', + 'PCP Vector', + ) +) +.addPanel( + grafana.tablePanel.new( + 'Top CPU consumers', + datasource='$datasource', + styles=null, + ) + .addTargets([ + { expr: 'proc.hog.cpu', format: 'metrics_table', legendFormat: '$metric' }, + ]) + { options+: {sortBy: [{desc: true, displayName: 'proc.hog.cpu'}]}}, gridPos={ + x: 0, + y: 0, + w: 12, + h: 8, + } +) +.addPanel( + grafana.tablePanel.new( + 'Top Memory Consumers', + datasource='$datasource', + styles=null, + ) + .addTargets([ + { expr: 'proc.hog.mem', format: 'metrics_table', legendFormat: '$metric' }, + ]) + { options+: {sortBy: [{desc: true, displayName: 'proc.hog.mem'}]}}, gridPos={ + x: 12, + y: 0, + w: 12, + h: 8, + } +) +.addPanel( + grafana.tablePanel.new( + 'Top Disk Consumers', + datasource='$datasource', + styles=null, + ) + .addTargets([ + { expr: 'proc.hog.disk', format: 'metrics_table', legendFormat: '$metric' }, + ]) + { options+: {sortBy: [{desc: true, displayName: 'proc.hog.disk'}]}}, gridPos={ + x: 0, + y: 8, + w: 12, + h: 8, + } +) +.addPanel( + grafana.tablePanel.new( + 'Top Network Consumers', + datasource='$datasource', + styles=null, + ) + .addTargets([ + { expr: 'proc.hog.net', format: 'metrics_table', legendFormat: '$metric' }, + ]) + { options+: {sortBy: [{desc: true, displayName: 'proc.hog.net'}]}}, gridPos={ + x: 12, + y: 8, + w: 12, + h: 8, + } +) \ No newline at end of file diff --git a/src/datasources/vector/datasource.test.ts b/src/datasources/vector/datasource.test.ts index c46a7467..46083803 100644 --- a/src/datasources/vector/datasource.test.ts +++ b/src/datasources/vector/datasource.test.ts @@ -223,7 +223,7 @@ describe('PCP Vector', () => { expect(registerDeriverMetricSpy).toBeCalledTimes(1); }); - it.skip('redisBackfill hook should request series api for backfilling and populate metric values', async () => { + it.skip('valkeyBackfill hook should request series api for backfilling and populate metric values', async () => { const targets = [ poller.target({ query: { expr: 'disk.dev.read', refId: 'A' } }), poller.target({ query: { expr: 'kernel.all.sysfork', refId: 'B' } }), @@ -236,7 +236,7 @@ describe('PCP Vector', () => { pmseries.instances(['disk.dev.read']), pmseries.labels(['disk.dev.read[sda]', 'disk.dev.read[nvme0n1]']), ]); - await datasource.redisBackfill(endpoint, targets); + await datasource.valkeyBackfill(endpoint, targets); expect(endpoint.metrics).toMatchSnapshot(); expect(backendSrvMock.fetch.mock.calls.map(([{ url, params }]) => ({ url, params }))).toMatchInlineSnapshot(` Array [ @@ -265,7 +265,7 @@ describe('PCP Vector', () => { `); }); - it.skip('redisBackfill hook should use panel url', async () => { + it.skip('valkeyBackfill hook should use panel url', async () => { const targets = [ds.query({ expr: 'kernel.all.sysfork', url: 'http://panel_url:1234' })]; let response = await datasource.query(grafana.dataQueryRequest({ targets })); expect(response).toEqual({ data: [] }); diff --git a/src/datasources/vector/datasource.ts b/src/datasources/vector/datasource.ts index 8aa3d81e..ee45a783 100644 --- a/src/datasources/vector/datasource.ts +++ b/src/datasources/vector/datasource.ts @@ -29,7 +29,7 @@ export class PCPVectorDataSource extends DataSourceBase>) { + async valkeyBackfill(endpoint: Endpoint, targets: Array>) { const metricNames = new Set(targets.flatMap(target => target.metricNames)); // split into series (metrics) with and without instance domains diff --git a/src/datasources/vector/plugin.json b/src/datasources/vector/plugin.json index 277c8c92..7741eaf7 100644 --- a/src/datasources/vector/plugin.json +++ b/src/datasources/vector/plugin.json @@ -50,6 +50,11 @@ "type": "dashboard", "name": "PCP Vector: UWSGI Overview", "path": "dashboards/pcp-vector-uwsgi-overview.json" + }, + { + "type": "dashboard", + "name": "PCP Vector: Top Consumers", + "path": "dashboards/pcp-vector-top-consumers.json" } ] } diff --git a/src/module.ts b/src/module.ts index 0e89426b..c09e8de8 100644 --- a/src/module.ts +++ b/src/module.ts @@ -1,8 +1,8 @@ import { AppPlugin } from '@grafana/data'; import { AppConfig } from './components/appconfig/config'; import { AppSettings } from './components/appconfig/types'; -import { Search } from './components/search/Search'; +import { App } from './components/app/App'; export const plugin = new AppPlugin() .addConfigPage({ id: 'config', title: 'Config', icon: 'cog', body: AppConfig }) - .setRootPage(Search); + .setRootPage(App); diff --git a/src/plugin.json b/src/plugin.json index cd9fb4db..2bfdc03b 100644 --- a/src/plugin.json +++ b/src/plugin.json @@ -51,15 +51,18 @@ "includes": [ { "type": "datasource", - "name": "PCP Redis" + "name": "PCP Valkey", + "path": "datasources/valkey/plugin.json" }, { "type": "datasource", - "name": "PCP Vector" + "name": "PCP Vector", + "path": "datasources/vector/plugin.json" }, { "type": "datasource", - "name": "PCP bpftrace" + "name": "PCP bpftrace", + "path": "datasources/bpftrace/plugin.json" }, { "type": "page", @@ -70,25 +73,28 @@ }, { "type": "panel", - "name": "PCP Flame Graph" + "name": "PCP Flame Graph", + "path": "panels/flamegraph/plugin.json" }, { "type": "panel", - "name": "PCP Troubleshooting Panel" + "name": "PCP Troubleshooting Panel", + "path": "panels/troubleshooting/plugin.json" }, { "type": "panel", - "name": "PCP Breadcrumbs panel" + "name": "PCP Breadcrumbs panel", + "path": "panels/breadcrumbs/plugin.json" }, { "type": "dashboard", - "name": "PCP Redis: Metric Preview (Graph)", - "path": "dashboards/redis/preview/pcp-redis-metric-preview-graph.json" + "name": "PCP Valkey: Metric Preview (Graph)", + "path": "dashboards/valkey/preview/pcp-valkey-metric-preview-graph.json" }, { "type": "dashboard", - "name": "PCP Redis: Metric Preview (Table)", - "path": "dashboards/redis/preview/pcp-redis-metric-preview-table.json" + "name": "PCP Valkey: Metric Preview (Table)", + "path": "dashboards/valkey/preview/pcp-valkey-metric-preview-table.json" }, { "type": "dashboard", diff --git a/yarn.lock b/yarn.lock index 44bcec7a..d74671c3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1312,10 +1312,10 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@braintree/sanitize-url@6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" - integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== +"@braintree/sanitize-url@6.0.0", "@braintree/sanitize-url@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.1.tgz#45ff061b9ded1c6e4474b33b336ebb1b986b825a" + integrity sha512-zr9Qs9KFQiEvMWdZesjcmRJlUck5NR+eKGS1uyKk+oYTWwlYrsoPEi6VmG6/TzBD1hKCGEimrhTgGS6hvn/xIQ== "@colors/colors@1.5.0": version "1.5.0" @@ -2296,16 +2296,35 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/source-map@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" @@ -2314,11 +2333,24 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + "@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@^0.3.14": version "0.3.15" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" @@ -2327,6 +2359,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" @@ -3096,10 +3136,10 @@ "@types/cheerio" "*" "@types/react" "*" -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: "@types/eslint" "*" "@types/estree" "*" @@ -3125,10 +3165,10 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe" integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ== -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": version "4.17.29" @@ -3662,125 +3702,125 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.41.tgz#fbc95422df654ea64e8428eced96ba6ad555d2bb" integrity sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw== -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== + dependencies: + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@wojtekmaj/date-utils@^1.0.2": @@ -3816,11 +3856,6 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -3836,12 +3871,17 @@ acorn@^7.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.14.0, acorn@^8.8.2: + version "8.14.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + acorn@^8.2.4: version "8.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== -acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: +acorn@^8.5.0, acorn@^8.8.0: version "8.8.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== @@ -4397,7 +4437,7 @@ browserslist@^4.0.0, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4 node-releases "^2.0.5" update-browserslist-db "^1.0.4" -browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.21.3, browserslist@^4.21.4: +browserslist@^4.20.2, browserslist@^4.21.3, browserslist@^4.21.4: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -4407,6 +4447,16 @@ browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.21.3, browserslist@^ node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + dependencies: + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -4505,6 +4555,11 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz#52917791a453eb3265143d2cd08d80629e82c735" integrity sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw== +caniuse-lite@^1.0.30001669: + version "1.0.30001677" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz#27c2e2c637e007cfa864a16f7dfe7cde66b38b5f" + integrity sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -5194,15 +5249,10 @@ d3-collection@1: resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -"d3-color@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" - integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== +d3-color@1, "d3-color@1 - 2", d3-color@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== d3-contour@1: version "1.3.2" @@ -5516,6 +5566,13 @@ debug@^3.1.0, debug@^3.2.6: dependencies: ms "^2.1.1" +debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + decimal.js@^10.2.1: version "10.3.1" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" @@ -5740,6 +5797,11 @@ electron-to-chromium@^1.4.251: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.5.41: + version "1.5.50" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.50.tgz#d9ba818da7b2b5ef1f3dd32bce7046feb7e93234" + integrity sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw== + emittery@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" @@ -5770,7 +5832,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: +enhanced-resolve@^5.0.0: version "5.10.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== @@ -5778,6 +5840,14 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.17.1: + version "5.17.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -5957,10 +6027,10 @@ es-array-method-boxes-properly@^1.0.0: resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== es-shim-unscopables@^1.0.0: version "1.0.0" @@ -5988,6 +6058,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -6843,6 +6918,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graceful-fs@^4.2.11: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -8078,10 +8158,10 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@2.x, json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@2.x, json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: version "6.1.0" @@ -8209,20 +8289,15 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-utils@^2.0.0, loader-utils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129" - integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A== +loader-utils@^2.0.0, loader-utils@^2.0.2, loader-utils@^2.0.3, loader-utils@^3.2.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: big.js "^5.2.2" emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" - integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== - locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" @@ -8480,14 +8555,7 @@ mini-css-extract-plugin@^2.6.0: dependencies: schema-utils "^4.0.0" -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@3.0.4, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -8504,22 +8572,17 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -moment-timezone@0.5.34: - version "0.5.34" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" - integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg== +moment-timezone@0.5.34, moment-timezone@^0.5.35: + version "0.5.46" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.46.tgz#a21aa6392b3c6b3ed916cd5e95858a28d893704a" + integrity sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw== dependencies: - moment ">= 2.9.0" - -moment@2.29.4: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + moment "^2.29.4" -moment@2.x, "moment@>= 2.9.0": - version "2.29.3" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" - integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== +moment@2.29.4, moment@2.x, moment@^2.29.4: + version "2.30.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== monaco-editor-webpack-plugin@^7.0.1: version "7.0.1" @@ -8555,7 +8618,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -8631,6 +8694,11 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + node-releases@^2.0.5, node-releases@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" @@ -9053,6 +9121,11 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -9711,11 +9784,6 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" @@ -9739,6 +9807,11 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -10679,7 +10752,7 @@ schema-utils@^2.6.5: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.0.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -10688,6 +10761,15 @@ schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + schema-utils@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" @@ -10713,29 +10795,10 @@ selection-is-backward@^1.0.0: resolved "https://registry.yarnpkg.com/selection-is-backward/-/selection-is-backward-1.0.0.tgz#97a54633188a511aba6419fc5c1fa91b467e6be1" integrity sha512-C+6PCOO55NLCfS8uQjUKV/6E5XMuUcfOVsix5m0QqCCCKi495NgeQVNfWtAaD71NKHsdmFCJoXUGfir3qWdr9A== -semver@7.x, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" +semver@7.x, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0, semver@^6.3.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== serialize-javascript@^6.0.0: version "6.0.0" @@ -10744,6 +10807,13 @@ serialize-javascript@^6.0.0: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + set-harmonic-interval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-harmonic-interval/-/set-harmonic-interval-1.0.1.tgz#e1773705539cdfb80ce1c3d99e7f298bb3995249" @@ -10790,14 +10860,14 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-git@^3.6.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.14.1.tgz#68018a5f168f8a568862e30b692004b37c3b5ced" - integrity sha512-1ThF4PamK9wBORVGMK9HK5si4zoGS2GpRO7tkAFObA4FZv6dKaCVHLQT+8zlgiBm6K2h+wEU9yOaFCu/SR3OyA== +simple-git@^3.15.0, simple-git@^3.6.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.27.0.tgz#f4b09e807bda56a4a3968f635c0e4888d3decbd5" + integrity sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA== dependencies: "@kwsites/file-exists" "^1.1.1" "@kwsites/promise-deferred" "^1.1.1" - debug "^4.3.4" + debug "^4.3.5" simple-is@~0.2.0: version "0.2.0" @@ -11235,7 +11305,7 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: +terser-webpack-plugin@^5.3.1: version "5.3.6" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c" integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== @@ -11246,6 +11316,17 @@ terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1: serialize-javascript "^6.0.0" terser "^5.14.1" +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + terser@^5.10.0, terser@^5.14.1: version "5.15.0" resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.0.tgz#e16967894eeba6e1091509ec83f0c60e179f2425" @@ -11256,6 +11337,16 @@ terser@^5.10.0, terser@^5.14.1: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.26.0: + version "5.36.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e" + integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -11365,22 +11456,15 @@ toggle-selection@^1.0.6: resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== +tough-cookie@^4.0.0, tough-cookie@^4.1.3, tough-cookie@~2.5.0: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" punycode "^2.1.1" - universalify "^0.1.2" - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" tr46@^2.1.0: version "2.1.0" @@ -11515,10 +11599,10 @@ typescript@4.7.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== -ua-parser-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775" - integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg== +ua-parser-js@^1.0.2, ua-parser-js@^1.0.33: + version "1.0.39" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018" + integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw== unbox-primitive@^1.0.1, unbox-primitive@^1.0.2: version "1.0.2" @@ -11553,10 +11637,10 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== -universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" @@ -11584,6 +11668,14 @@ update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + uplot@1.6.22: version "1.6.22" resolved "https://registry.yarnpkg.com/uplot/-/uplot-1.6.22.tgz#28a136c7c5fce92ce5e25f38f19314a029bec390" @@ -11605,6 +11697,14 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + use-memo-one@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.2.tgz#0c8203a329f76e040047a35a1197defe342fab20" @@ -11686,10 +11786,10 @@ warning@^4.0.2: dependencies: loose-envify "^1.0.0" -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -11726,34 +11826,33 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.72.0: - version "5.74.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" - integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" +webpack@^5.72.0, webpack@^5.76.0: + version "5.96.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.96.1.tgz#3676d1626d8312b6b10d0c18cc049fba7ac01f0c" + integrity sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" + acorn "^8.14.0" + browserslist "^4.24.0" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.17.1" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" whatwg-encoding@^1.0.5: @@ -11802,10 +11901,10 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.3, word-wrap@^1.2.4, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wrap-ansi@^6.2.0: version "6.2.0"