From 211bb5f51ba3d74f2a0572593e9ac5993b7ee247 Mon Sep 17 00:00:00 2001 From: Sam Feifer Date: Wed, 6 Nov 2024 12:19:14 -0500 Subject: [PATCH 1/6] Replace PCP Redis datasource with PCP Valkey --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/workflows/ci.yml | 2 +- Makefile | 18 ++++---- README.md | 2 +- .../datasources/{redis.cy.ts => valkey.cy.ts} | 10 ++--- cypress/e2e/setup.cy.ts | 4 +- docs/architecture.rst | 8 ++-- docs/datasources/index.rst | 2 +- docs/datasources/{redis.rst => valkey.rst} | 10 ++--- docs/index.rst | 4 +- docs/installation.rst | 6 +-- docs/{pcp-redis.md => pcp-valkey.md} | 2 +- docs/quickstart.rst | 6 +-- docs/troubleshooting.rst | 10 ++--- .../{redis => valkey}/api/pmseries/models.go | 0 .../api/pmseries/pmseries.go | 0 .../{redis => valkey}/data_processor.go | 40 +++++++++--------- .../{redis => valkey}/datasource.go | 30 ++++++------- .../{redis => valkey}/datasource_test.go | 12 +++--- .../field_transformations.go | 10 ++--- .../field_transformations_test.go | 4 +- pkg/datasources/{redis => valkey}/models.go | 4 +- pkg/datasources/{redis => valkey}/query.go | 26 ++++++------ .../resource/metric_find_value.go | 0 .../{redis => valkey}/resource/models.go | 0 .../{redis => valkey}/resource/resource.go | 2 +- .../{redis => valkey}/series/models.go | 2 +- .../{redis => valkey}/series/series.go | 2 +- .../{redis => valkey}/series/series_test.go | 2 +- .../test/fixtures/pmseriesf/fixtures.go | 4 +- .../test/fixtures/pmseriesf/generators.go | 2 +- pkg/datasources/{redis => valkey}/utils.go | 2 +- pkg/main.go | 4 +- src/common/services/pmsearch/types.ts | 4 +- src/components/appconfig/config.tsx | 2 +- .../search/pages/Detail/DetailPage.test.tsx | 4 +- .../search/pages/Detail/DetailPage.tsx | 4 +- src/components/search/services/services.ts | 10 ++--- .../pcp-valkey-metric-preview-graph.jsonnet} | 10 ++--- .../pcp-valkey-metric-preview-table.jsonnet} | 10 ++--- src/datasources/lib/pmapi/poller/poller.ts | 18 ++++---- src/datasources/lib/pmapi/poller/types.ts | 4 +- src/datasources/redis/img/redis.png | Bin 27995 -> 0 bytes src/datasources/redis/module.ts | 9 ---- src/datasources/{redis => valkey}/README.md | 4 +- .../components/ValkeyQueryEditor.tsx} | 14 +++--- .../components/language/PmseriesBuiltins.json | 0 .../PmseriesCompletionItemProvider.ts | 4 +- .../components/language/PmseriesLanguage.ts | 4 +- .../configuration/ValkeyConfigEditor.tsx} | 6 +-- .../pcp-valkey-host-overview.jsonnet} | 8 ++-- .../pcp-valkey-mssql-server.jsonnet} | 8 ++-- .../{redis => valkey}/datasource.ts | 12 +++--- src/datasources/valkey/img/valkey.png | Bin 0 -> 8602 bytes .../img/redis.svg => valkey/img/valkey.svg} | 4 +- src/datasources/valkey/module.ts | 9 ++++ src/datasources/{redis => valkey}/plugin.json | 18 ++++---- src/datasources/{redis => valkey}/types.ts | 10 ++--- .../__snapshots__/datasource.test.ts.snap | 2 +- src/datasources/vector/datasource.test.ts | 6 +-- src/datasources/vector/datasource.ts | 6 +-- src/plugin.json | 10 ++--- 62 files changed, 216 insertions(+), 216 deletions(-) rename cypress/e2e/datasources/{redis.cy.ts => valkey.cy.ts} (82%) rename docs/datasources/{redis.rst => valkey.rst} (92%) rename docs/{pcp-redis.md => pcp-valkey.md} (69%) rename pkg/datasources/{redis => valkey}/api/pmseries/models.go (100%) rename pkg/datasources/{redis => valkey}/api/pmseries/pmseries.go (100%) rename pkg/datasources/{redis => valkey}/data_processor.go (82%) rename pkg/datasources/{redis => valkey}/datasource.go (76%) rename pkg/datasources/{redis => valkey}/datasource_test.go (92%) rename pkg/datasources/{redis => valkey}/field_transformations.go (89%) rename pkg/datasources/{redis => valkey}/field_transformations_test.go (98%) rename pkg/datasources/{redis => valkey}/models.go (92%) rename pkg/datasources/{redis => valkey}/query.go (77%) rename pkg/datasources/{redis => valkey}/resource/metric_find_value.go (100%) rename pkg/datasources/{redis => valkey}/resource/models.go (100%) rename pkg/datasources/{redis => valkey}/resource/resource.go (88%) rename pkg/datasources/{redis => valkey}/series/models.go (96%) rename pkg/datasources/{redis => valkey}/series/series.go (98%) rename pkg/datasources/{redis => valkey}/series/series_test.go (97%) rename pkg/datasources/{redis => valkey}/test/fixtures/pmseriesf/fixtures.go (93%) rename pkg/datasources/{redis => valkey}/test/fixtures/pmseriesf/generators.go (98%) rename pkg/datasources/{redis => valkey}/utils.go (96%) rename src/dashboards/{redis/preview/pcp-redis-metric-preview-graph.jsonnet => valkey/preview/pcp-valkey-metric-preview-graph.jsonnet} (70%) rename src/dashboards/{redis/preview/pcp-redis-metric-preview-table.jsonnet => valkey/preview/pcp-valkey-metric-preview-table.jsonnet} (71%) delete mode 100644 src/datasources/redis/img/redis.png delete mode 100644 src/datasources/redis/module.ts rename src/datasources/{redis => valkey}/README.md (55%) rename src/datasources/{redis/components/RedisQueryEditor.tsx => valkey/components/ValkeyQueryEditor.tsx} (94%) rename src/datasources/{redis => valkey}/components/language/PmseriesBuiltins.json (100%) rename src/datasources/{redis => valkey}/components/language/PmseriesCompletionItemProvider.ts (97%) rename src/datasources/{redis => valkey}/components/language/PmseriesLanguage.ts (96%) rename src/datasources/{redis/configuration/RedisConfigEditor.tsx => valkey/configuration/ValkeyConfigEditor.tsx} (74%) rename src/datasources/{redis/dashboards/pcp-redis-host-overview.jsonnet => valkey/dashboards/pcp-valkey-host-overview.jsonnet} (98%) rename src/datasources/{redis/dashboards/pcp-redis-mssql-server.jsonnet => valkey/dashboards/pcp-valkey-mssql-server.jsonnet} (98%) rename src/datasources/{redis => valkey}/datasource.ts (85%) create mode 100644 src/datasources/valkey/img/valkey.png rename src/datasources/{redis/img/redis.svg => valkey/img/valkey.svg} (98%) create mode 100644 src/datasources/valkey/module.ts rename src/datasources/{redis => valkey}/plugin.json (58%) rename src/datasources/{redis => valkey}/types.ts (62%) 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/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/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..2ffdbf3a 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 -------------------- @@ -73,7 +73,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/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/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 47a7dbfbbfcf4687a3a1ce9003fa4513ebee8f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27995 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�FHHIMQ(2$ zAj*x+^zhlk!(WC*cy&vSV2>SEtE57xF%p&u?K#Y<8nZ?0Tb-%&wKv{=Jx4gWa+yi~ zPbvl=$C{?5I6#Y2y~w!Ah=D!J#M)NE0b_f=V(9yZxA=lzLc7gWbGxWzIVf%&G637C z+$5(rlFEX30h29&-f*dSVOMYmN@j>H#w`IV<^aTB9wehHbPi$8#Kt(aImrm4Lko$u zlT5MJXNxtw=EF|nivN2TAa>S^0N9P&B351|wO5k>yx(LS+{g_({f0-TN{S0ynvVw~ z&V1fJ9)xjW*6DK4&f;j}tSjd`V@Mi4wU@z-YJj643O)Zrqzsw#aoAAC4x4ve0aX5C zmT(Agy5x>RJ$-u+HkSj4*{jg#2!=FsBhtuh5T79={ZFj+)Lo)R=tnegIv&Hnr|qFv;P@DvA;c-~wXe?@7clTV04{ zK4+pfCfiA7{KbI!n&0TF&*>$(uja@B@E;_t6aw^8r|8V$h4n24rg?p=B6;GrR~fRM z==dPO`7J7_X?^Q5D8E{%0f_I~8|sw2OrNr-5OvFmb<2G6os;)Z7{8)%&N)ol^cp)` zLl^!>eKxPmkT4zkw}|kmM2UkO(8h`1Br+Ut0>|7hz`j4E|GsADt;goCo@jgdOHWph zPldV?NZHTaznqXcqsZVpWj0NLvi)+tfy&Z(Ikq|@=R%Sxb21q6>lF>QDcJUojY3tp z%K6jsb8#$(A&c{l#Z0lV=l_NKCZhffO4<9t>(ybA3Sv23oE*b-%DwMaorGHHdNsy5 zYsFEX>8GgBx~Riq!(#?}0n;-@O(R6-6j%_l>~AeZ1E4<<7V2a;sD=L-kQ9FrzdynL zguiS4JJM$J$tZh|HUvd0fd&CNgM?%AW#md*^)1AI5P*&8vP3=dzKW0E*}k&Z`3C

    +0SeRP7F%Jh#-+cjES72K1D%{P+;G(Y)4wc9#;miH3BYTHN6@^>hDS@3$L?G1E z#2bGyYxo3P9c2DUd^B_7B3FeEYX46Q*e;2c>~G+R@A^4?NCNy{x%l5`i+baa0Y`OH z&#yagVYOok)heE69>||=$ALqylS00J(tdjO|EE!#;Gl#*TOmcn8C1JFXhKs=Q8wN8 z7VUms;@!Cf=;sKcgEIq+^Ur8sfxKjuESy~1NdJcwJU$;TdVV+PH()q%Sp0FcuUUF6 zoun59W^nuW+t_levon>$k-z&ll~@X{TulZCl@oo$IwC**|I^)9|3%e(Z4aGN!hj&% zFbIPJ5+V)=k`g1`As_V^BWj=~JRjnj)Dy1qqARS6f^e*xRVXF!Lv%);u4b#i*&lC> zvdeF!K4n|6zcRnRsn4IYYi~Kc{5^O(znf)nICK52)a2Svlg-k3`onXrcFulwUVp;y z&RXrZ^$FUd+t@u_(S*j;dG7PGRmg@v3}(D70d0|XN3JyWOAR(@rc5Lba&O!;&8O;e z!73eP>VM$I=1V=YGmGV7uVt2mP#>s{>3GpYyNE!_yV$5<*26(kPlM3Q$ z)V-$bQLOIVoURISt0Wtu!xjB?+H}fZ9Gmw9U`$kA=c8d0nOV+^W7@|zl2>1TgfDUX z_#1cKuyxTsFd>8(X@p>5V_T(o%znvxCMUCLp z$XRc^${H!Gu_OgEPp2oj8U1(`{!KB+0hn<+ei3P**oI^zGx*2I>B0-^{Vq*o#&46g zUy(ZgwVx1N*xaG5w;4ozj#y3OZm>FO7;+^gO2@;ExW6`J^xbx$Q&QXPh)j`G{E4~( zow-Lz$i%x%EnTQox z;b#nBg=1a0hG`^UcikkHn{A`<9-EB2eA5UqQY?v^WgO_a5r6w`zo9D2dt`fJKu2qy zqv+sbrIINa?pkcIV7{7aG@sBlVdYO z*+QPf-LS@Gn($Ht@=K88I@bU4;Ux9zIGa@N{`Jci2jb`pJVGa2h>m3JFiV#yY>Ig> zys5SJHI0Q(vbIpg!}+!LCamJEt|uDNM#9e|88nQiS$@RicfD@7jrwT^*Yjmo-<)_RIcZoSpdB4EK=`8V8@`t zgCN%$(OBnZEtOtOie3U#Sol`g+Phm%NAUJfXYrrFjzEr#!e;?v`Fl*p3 zfk$$fsr{#8L4~|Jd%_=_=(AzO=9$o}xxSqWAL{wK^*1#IIx}@8*FnmlS;JX+bI6zt z%7r&J|9uiJR%pJQfBM@=eeNRyuDgeRGqpt%Z+l-ZxeC7}~X@&M!Yv z(VwVIr_+Yg#AU_xwmeJ8?GyVg()vNinrz&1{Helb)`!nW#i;3ZTA8!$eVW?{VSHWz*o#Nu4?AB+dQI8A( zL!*UyK3L|Qc+-)Ly{4bmw~)5WT+GlVbRC5MF(1yUx}#gpS)rBgu~py=Kfa@=MJnD< zeLm-K`6u;uOX5R4&;H1*N8>8fVR<6CzL`I?i+}E9wP9BvF*gz=la)vp&B?KPF$Zge zy6A;2s8~pk#@VmGXTvg8pv!$2`Gv6`#^w-!>Mx%VD%3Q@kfeP?Am_?eVO%SZpck7u zem{O{%sD+OeWy6_@#aac(e&jiTlqDf45{PBWa-A)v+%beuW&(RJhlrY;Tl9FuLljk zW1SSM$8jJGWHbv$^OW8^B&Bqwtz=!KSK*H#8n5i@Xz_G$jf#vAi@m5>>Tuu9-{Ya5 z8td#Ax!kgIypgsT55sD6czA1Qe}^lnGQ-;Cm?ub6y*>2{vofw~d&;BEF@4ykxTc*3 zd?uf}7TR22HtUazV1Z)CQG`Da;2>3}!cuzHmC@j)`)G!}$#1fPD!x_6pebskAX z$JtVrc`Bz5B}r;sC(Nb${gg(9EXub3S*moaC(a`^b>b&0&5zFAAu7%dk$8PB zRSUPu*cY6%PdmY>+PHvw4ruiw zK#$8h39r;Vpz|5)^iCTv9Ex#flx1%-Z1yPBVs44PVg`xGdT(dV`%8+)A=x6`hwvW46&YCOzt5vyf6XKybQCqd}i;KjmYVUDn zfnVaQAHt=c{AG~jll#^uoYC5RFl3>CMkls(rKU{>qZcnVwy%@RdE!Ivucx3!>Ksaj;W^-O_SjK_ z0?<|`(#=?`gN!oaSI&*2_7%iUZ%bK-@ zPddFRX=$C-Ny9hXXcSvCB=JJK*p5u>W>P`i(Rg=uN2_jexu$C~ z2h;=o=n;fz_N<2Zn<>1y@ZHn=i9+57M>`A3iWH_STkumv@^_>aku8?-=XPahu#{~i zp4d?Qo_d3!Z&{s$G}~bQ?AyJ+AWm1+N-uLmGV$5;R%<&sWg<(n=gCKvfxoP&*^-e4 z-U&0hrjII2H49L@DMt^6u>xw7s5vQfxgY2TPKa_#dB}4?7 zIwP}&AkuiuMa2ds97W&m!8&=|^AB5Yq|DQ>VA1*l{i?DOmB8j0|J`6=f&#g(BTJ$p z;8Zw_dfq2DlUXTyrfxuH8ZlbRQA2NufCz zgLl`K8Af{=qaEb|vYHcp%inXbd|_0W=e)a*iK7m9^KCpt$w{qX$N()=8(KcGmp+u>zl>j&;G-ZrAd4$(c95L#SAGX zBe2SGu0dYbSf)%0gF|G!m)D6`$n40;C3aKFtXM-<#vtJIh zMKmGWNB`)4`i#WFQ+3|mswJI#0Lzv{*AyXxsIS-{U^Tg8bRd-iLg`!6r{1HdH)n1J zFDS+9e~a0sg|1bp83Zf7YPVV<#_NyabB)JAHlAD84U|uO;kH;#NxUdDaPi9d+?}rt zL!PH&36;=rxw&c2-XYp^Pj0PqNpPl}W}m5#6rj;gpbsW05Gv71W-ZUPk`|Z|6GPb+ zr0$oq5n+>Z7et{()+2RZ`!;^CzL+%+ZO|9nTzQQ6l8g8IERA!y`B<3;_m6pmQN)JY z6>${Tpxj7d;@q^bqMFf@1ztPU&ExJ5i7%Qe{3%J2qO5r*oxE)+1z(klkX9fYU7RYx z8{ZeK=kmPecSbCqUDIrRCSA9U{N0wq7%65j$|>%47WyKAZ&P&VRkeDvZe2UFahjjg zy`M$LDR`8Pjg>hYDaipdmV zC@dwm08;Fb+)w-RYa<)njnEN#OXyJfvo|n4uZeZ;Nzi%&jB4h_4F1tEZI5A4aTXow zF<0VOv2{Bp_IA84d(_ZnHLuY;4}$>;p^RCzE&Cq#b!KKTyn1DTkxM+S*bncz;8DK} zY)a6gPimxP>;$oilIooI{p2Gl=l3ruJE>Ac<>M{>Z^Vnne3&`BZ_N#vuDRy%wRnke zPu>d5+fTWYXyTc-_7B}cSS1!0g$&JegyYC@cN_CP!I?yfsnD1#f5J;h7qGO`!LfF& zPdfqa5kF^Bql-9{@2*JW?(?X8_o<*u(NR6!vEAJkkt|S>YR%$nRiUT%i%$QOLX{)B zbrGLU`mA(|RlXW7_P*iX_d~ZdBVLmh)(wPct1kyS=mQR@_gY}!&9}tX^*7ru$?)6% z89`Wea8laG{)zia;TT={W@;lv{jK*diL?=8^FGhs+A>SCz3S}yZuE%U()vGf$gvd@ zeqG3E>Oj-lXtHC<#-qSL%h^+p`U9fjEaLojBH)O8;;9OO6Lq}1F_+%C;R>4k8?)w` z{3`jxk%L>t=JC^V!glW-sKS#A=Z9I{b!aLzi=`55Up{z5)y)0B^+TY9znb64Nod#> zF;g)`da4)7K?tW9+}W-O<%bC(wF?&$<6KO`D<43y{#cGhk(X6NKv)kXnd_`!o5fFW z0MI=eKh~_+CR=UO=EeyG?KlI~@LswcfAzuPuCwkKPYej62*DSqUXH=LW#`M^gWT}C z5ms!Fvy2Hk*?6(XIxZ!uD8xXaA*%mnM_BT&<$t5f629DZcw%Dam2(n3OQ*%l_g*V6 zh=lbEyTyJyk&+>8W%Y+`IvrjHbORxmIMZl(f0GhCN4NOBKn}&uN2+U0^GwtTQvK{% zYWZqwJeE)%4S`hy3zs-v7h-c@h9s%JK1G}Ot^{gL59(F!hnFt+SO=6HRX$YulBht0 zqFQ%347v60%S=DQR43jv95u4RN;cBg@F$Mi<1P63S&e!#e3T@Kf4~&Mt741S+bI18 zv9I*rt*~M1_{E!6UBQEehr_m5Fr-@5?mQj@=>&YZYFJ4k^^8*yIL zS1F~wdw;970(LZ6X<>t#kPZbYW+0>qS={zPCoOniz{St+lS!93dH-7& z3jH5?YNTyl-etlhE^-+QDE{9WKhg(J)q!dEK0FIxP$qK!2oPn!4vNxjJj0ggN3gev zrD%JNeYZ{h2Qa@CH;NeZcv*;U@iGr+AYQN29FaAu9P!o{zCsb zVW2c`4S(E+Hf+DtWqlPpR1NakaWZn65hgi8~3 zD&9$}3cFkV)c0a+3_cfF{?WsvmHXHEl_O;JhXh$m2x=sz8Cg6gHp^Bvw?wKKF)>v3 zYe?W@p2R~36{oOi9Kpq|6}OF_`zB3fmh5dl9E_`TzG3xilNhu8=d?uKh)w*B>J$xn z3%=(l5??diT#3)5+|oSq z(Ys}_Llx54f<|crB&4e3rQ7O~B=$hCm?0l2i$w$WqAY&OQ&C_iEgz{Rb1w!{_$b-W zug-=}@T_gOa)mwDvrX66?`zV0(QNQ7>ShejUSCC8)d9Bh{?R_ z$2)(O&57@}(KS%3@l46_a&}TD+4yY!NTaZSkRXX@+NtoOqQ~LwW`Ui=cUHV?T(`<9 zEf$DZxWKcz)P%+zRhPlDkwB~@5kZ4ZE+Hq#7=F~$z79?MRe@H}H1;u;xmwPNJF%7v z)JZ`|nWGQ?yh|Tf%~SvPccZ;PhPNe zHJ)CFzT`VP&$;bS(XA$UJ2#+h& z-3Yc)#zUC0py3?K>9`##Z$QCLL`<;ru8tA$qZe?QTTXwUwC$NTDCcyvLn&S!{E%j2 zktWSv1yY~;e(`b&N@_4f37+>59Xl@J!{ zeJmv`wl0zKL%SG=hJC8RvR;)>VF9u{JGT~7Af*wQiy~W-l@;`Oqn?PdP+(uz^xaVm zN->ClJfP{W%}Qu2G&|PdSnJkaY}PCJvbr@Gc6p;pkwPA%plb{iyt8`{s|umaLfti- z60@_7*BYgx~`ph|MUe8597^sH_cM5?sA{I-d0nr;h35*R-q8t++gi` zxZWZ&W~KD&N@kh0pDXz&u!A+%@KdV;O@NInu8`}(`tGoi&sU!O)YM|7Rvq6I0x_FD zKK@^OZunC6JuAF3#Coz5ccRy3e^XRVuz`-Sf1u02Rb{KwrgnMziAF zio#S#P3S`(p@Bzps||b-oJ?R=hE+wHl$`FtSX6 zPGBml?!3_-weHjE&_H;Ivu^;|f5%8}uhOpW^-)EAO=GqcdO~WUWTs|!xVndj>;0zH zOR_mFY>ZCDHioDoTi0>wuznIvu+^Y>_<{L28x}#}HBhIWGI~;2u@o*B zu)>3=N=$!4PBsD~yn}He>{B?9GP;S}GmQ)?dmpT}|Ks-qoHp_O6k*6b(wi#102ZU^T(x&UwBp#lmFOK0b@#tC0u6w{=3gAS$JfgSAh{zE3LassLYXws6sC+4qbC z!rPe??tvK1Z=OB-1~Q$WZW3NDFLgdG+`?E^a7;S^BGwUvKZodKYvdT1i|3GVeA*LI zAT9MTXUA_3iM^|%ACc48z(e~bP^_OnS zWmjH#&ki9wsUnoG>iKH{Kz~Q*H)h#tp{aOdksI95|5iJ}OH|Jw_i(S)3{lU{=HIFC z!j6fXs+=JvGAw=>XQE3{dm~)l`vW&RAvs>$rvBJ6VSjymK*Oi}!dSM*-WBk9`PX`m z>m^=*-P$ai2V2= z+ETe~dYoM@7wbaRWB~Ze_5C{ghniZ~1>UXgMx|omvPs~Kz$*l_`sS#RnLR3;* z=u6Jhi7fQo7*gc~AdWs?EYCNdP|C%(oLv&!GK4@#>;C>mfO(Ksm+!A22oqZMW{E(4 zd$ck*XU0jyy?EC2=o`cj7eexcH~=-`DxmCzcB)XV$ydZBPG1554Zw$O*~ova zeCuE@y^p^y329pa;Ucc|EC6Uxf@rDUOp^+i zE}ZjEfn49)LFIJrO-V@yRwfZH&!h3YX~AZ6s3@(@D{_Io=F9!8@Xp=V<$9xJkNgl>m%Dk9|*-EWml&wI2E$< zWn1I3EnjObRN`<)i`(`h=b}$;V4W%!!nRST86BwAUg99!O zYi#}3x^{Nrf$2;5FmG`lXp!^LLVW>=Kn=yc;{PTL#5R?p6zxw5UDpNNj$1 znI#EW<*^(nz-mG%FZ$Y&>TUT3{tBh(yeo+(llNJe?&ka+`mR-LZAc(H9$02UVg|;8 z{NR#5fJs+^7tl00t<$pZi^cSFzy0+7r1JQf1R!Cnhok5@pr)Sgp_J~NR2dp$g6_e| z(cR5;LH8 zC1_RQFiZz-Llk1}j*#>D@~L?bRLkT-spON% zY3#K?&-|+e97wC+KcC>kIb{-m?^MoQ%9C6gLsq|oC}^4x>QQH#qUo=cU4VjC51wQ$ zz0P7Ai-cSmLyj538%r^^T|jo@EEU zdugHA#Y8JF<@p~<7@V`V791fO4cyZt#{M~1n5{gO-YN;w@@H)xyO`+In3ofJ;bFZh z{`+4RPPIVJShI+iP5Y}&)q*=Q4E;Ni=0yo#1Yi@^;y?+jO_hHWU8`&Jr0*egYksY3 zzv$2lf6?vHR|(){@?Uh-5wNzb5gM6=oC_`fBOeTv;he1bu$?mbXshENlu2$+%Ox5giNYT8>;vEHj-!iYp^&y(q9Ffc~84tW1cKVZ)XSl;Oc;W2GQw zF-We`C9$!~u6X{M)Dc00ADdtN8$iSUSF2BpapChLZJ=d%y~Mg`qglIQw;nNZXC$3c zQgI$iwL*;?VjX2vuCwOKFF27L7sI=Q9hoxxhTR^?>GX1hed_s)*p$SoYek2JYqMuk zcJ=b@yuUh_F5<7uV{KvL690<)D|)z62TYRuZ!!p<4FYf}03pletfHbjuaK+q{tB~j z5(Tc&CkNO3L?8ZWX?9OMgF>#s)O<~yv=rq1h1U@{d3nkJ){CH#-H1^}jcnNmTu9Fy zQ_#F1!;oNi<4DElvYExp8heAsb2@{n4)1~|fsw?NZ%_IrgHI4Q!5 zgNdC_N-1_yaSqo$zUb)C!JqA5tab!RYPdpNMv4n@8rNI&da{Wubch>_sr)`{;4O*j zi8Yw_!D<_DllrRE*9aRMwEsWZF^~0xGU0wMJ}7ey=ZqBRF%ZNYT!U4Q@QNt1iwM=mDe`tAO)+$GIQSZeNJseVKg; zCTDq^i*$H**dcw!4FecdPX%ll?ALtnU|=^ptm$dHLm><1vVUk17^deayFmtQ*!Q4E z1lAKFOp)wYvw^g)w?IMpI+C(MA%4`?QRx_b2Yf|b24oR1;v16G{I75aC zvH+mr>E4$99v+rQud$AeA(!CX?OuZ-MzeOUFp<~^QYc%?eJ}^t5hsg8Yt?1UY@`QP zQ?Hwps}V`SMLyy9bvpO+uWev5k<>wlegEflpFBQqt7(1uOu;PH>~}OSn2`lyoYIKl zuaWw+Egzre5qQzy)=WFg_AXhpKP?f-|~AO7^dc7wFtei<5LZuvWaoK`M3 z$kVxLyPl2uP-K>gN@fl8D!P~|$T7cy{D}Xq1e9&@J=iwlt^egnhxpY?Zc?hdqgY2+ z2g?*Rf0r8cx4tpWTw7qTbz*zg?|FX0jV%b*C;aqF)Gg1LCWq^_CY=}>BOC#Zpx_D{h=1$O>M znl+n$Bjf-JJXDvdDoT!lvyUkpN`SXM+=S%*gAM4pWaIfEOyE=2qn-{eh@cDOB>r_U zo*%znB$_!T-S8bS*F4A(77la_hlS}&U&soXnLmZh#^ZeXaT3;>A{x(&iRsNM5QE{L zNWdAij9K*his9#obHK>3Jlpp?wR0fvpUK>hRlU?AkXQI;EjywxPLXpEwrmr;L3>v zd(F}8_>pNx(`EmH;3}4-!NqBKaRAtxsh0blB|gl;$Bg(*Muf}wm`#X7&thev0fZgW z!OD_ZKPzpGbK2Nzz11<29~v$i2|Tg?B#1RNf3U*v*3{=@=o}x~Uj3};Y88&ZO_}DR u0aXpn(9$C4Alu|KX8Zr~&w1|_=T1_>y$90Wir|OPAd1h`(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 0000000000000000000000000000000000000000..8d63fe98bd73d20d73f774322596c8438cc6fb44 GIT binary patch literal 8602 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 + .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/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/plugin.json b/src/plugin.json index cd9fb4db..d5dde0d4 100644 --- a/src/plugin.json +++ b/src/plugin.json @@ -51,7 +51,7 @@ "includes": [ { "type": "datasource", - "name": "PCP Redis" + "name": "PCP Valkey" }, { "type": "datasource", @@ -82,13 +82,13 @@ }, { "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", From fa4a3aa4718ec134da8a97f6108d7b26db26c3c8 Mon Sep 17 00:00:00 2001 From: Sam Feifer Date: Wed, 6 Nov 2024 12:20:53 -0500 Subject: [PATCH 2/6] Bumper versions of vulnerable packages --- package.json | 15 ++ yarn.lock | 607 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 368 insertions(+), 254 deletions(-) diff --git a/package.json b/package.json index 0ae31e23..61b8dd19 100644 --- a/package.json +++ b/package.json @@ -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/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" From 7819d02f59080589ea10aaefaa55dfee60c7b01e Mon Sep 17 00:00:00 2001 From: Sam Feifer Date: Wed, 6 Nov 2024 12:23:21 -0500 Subject: [PATCH 3/6] Remove search until ValkeySearch arrives --- src/components/app/App.tsx | 30 ++++++++++++++++++++++++++++++ src/module.ts | 4 ++-- 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/components/app/App.tsx 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/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); From 220f26fe9c7976d4c14f4d1e068cce693a75b455 Mon Sep 17 00:00:00 2001 From: Sam Feifer Date: Wed, 6 Nov 2024 12:23:52 -0500 Subject: [PATCH 4/6] Add PCP Vector top consumers dashboard --- CHANGELOG.md | 15 +++- package.json | 2 +- .../pcp-vector-top-consumers.jsonnet | 76 +++++++++++++++++++ src/datasources/vector/plugin.json | 5 ++ src/plugin.json | 18 +++-- 5 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 src/datasources/vector/dashboards/pcp-vector-top-consumers.jsonnet diff --git a/CHANGELOG.md b/CHANGELOG.md index 37bfb8a5..77af4ae3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,19 @@ # Change Log -## 5.1.2 (unreleased) - +## 5.2.0 + +* **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 * **build**: update grafana/plugin-validator and pin nodejs version +* **build**: update Go and node dependencies +* **search**: metric search turned off until Valkey replacement arrives for RediSearch ## 5.1.1 (2022-10-27) diff --git a/package.json b/package.json index 61b8dd19..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", 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/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/plugin.json b/src/plugin.json index d5dde0d4..2bfdc03b 100644 --- a/src/plugin.json +++ b/src/plugin.json @@ -51,15 +51,18 @@ "includes": [ { "type": "datasource", - "name": "PCP Valkey" + "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,15 +73,18 @@ }, { "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", From ede7680e74d69b15635cbe0086bbd87ce226f39a Mon Sep 17 00:00:00 2001 From: Sam Feifer Date: Thu, 7 Nov 2024 15:09:57 -0500 Subject: [PATCH 5/6] update to use gh in release script --- ci/scripts/github-release.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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} From 41600453c8c1d7d15e19172e592f925d7c35547e Mon Sep 17 00:00:00 2001 From: Sam Feifer Date: Fri, 8 Nov 2024 09:56:42 -0500 Subject: [PATCH 6/6] Fix container docs --- CHANGELOG.md | 5 +++-- docs/installation.rst | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 77af4ae3..851a7774 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Change Log -## 5.2.0 +## 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 @@ -10,9 +10,10 @@ * **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 +* **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 diff --git a/docs/installation.rst b/docs/installation.rst index 2ffdbf3a..5765df42 100644 --- a/docs/installation.rst +++ b/docs/installation.rst @@ -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