{"id":13646809,"url":"https://github.com/cloudspannerecosystem/autoscaler","last_synced_at":"2026-01-28T11:15:45.118Z","repository":{"id":42521049,"uuid":"274828089","full_name":"cloudspannerecosystem/autoscaler","owner":"cloudspannerecosystem","description":"Automatically scale the capacity of your Spanner instances based on their utilization.","archived":false,"fork":false,"pushed_at":"2025-06-18T12:01:33.000Z","size":3885,"stargazers_count":94,"open_issues_count":27,"forks_count":37,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-06-18T13:19:27.608Z","etag":null,"topics":["gcp","google-cloud","spanner"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cloudspannerecosystem.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"contributing.md","funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-06-25T04:24:13.000Z","updated_at":"2025-06-18T11:53:22.000Z","dependencies_parsed_at":"2023-12-18T18:48:56.285Z","dependency_job_id":"afc08675-eb8c-4f4c-b37e-eb6a8b8d6b37","html_url":"https://github.com/cloudspannerecosystem/autoscaler","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/cloudspannerecosystem/autoscaler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudspannerecosystem%2Fautoscaler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudspannerecosystem%2Fautoscaler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudspannerecosystem%2Fautoscaler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudspannerecosystem%2Fautoscaler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloudspannerecosystem","download_url":"https://codeload.github.com/cloudspannerecosystem/autoscaler/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudspannerecosystem%2Fautoscaler/sbom","scorecard":{"id":293277,"data":{"date":"2025-08-11","repo":{"name":"github.com/cloudspannerecosystem/autoscaler","commit":"3838b8379df0264d49f7d58eb1204a630a52464e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.2,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":3,"reason":"4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codehealth.yaml:12","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codehealth.yaml:13","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yaml:25","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yaml:26","Warn: no topLevel permission defined: .github/workflows/codehealth.yaml:1","Warn: no topLevel permission defined: .github/workflows/codeql.yaml:1","Warn: no topLevel permission defined: .github/workflows/unit_tests.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":8,"reason":"Found 23/28 approved changesets -- score normalized to 8","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codehealth.yaml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/codehealth.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codehealth.yaml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/codehealth.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/codehealth.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/codehealth.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yaml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/codeql.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yaml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/codeql.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yaml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/codeql.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yaml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/codeql.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit_tests.yaml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/unit_tests.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unit_tests.yaml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/cloudspannerecosystem/autoscaler/unit_tests.yaml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile-poller:16","Warn: containerImage not pinned by hash: Dockerfile-poller:28","Warn: containerImage not pinned by hash: Dockerfile-scaler:16","Warn: containerImage not pinned by hash: Dockerfile-scaler:27","Warn: containerImage not pinned by hash: Dockerfile-unified:16","Warn: containerImage not pinned by hash: Dockerfile-unified:30","Warn: npmCommand not pinned by hash: Dockerfile-poller:24","Warn: npmCommand not pinned by hash: Dockerfile-scaler:23","Warn: npmCommand not pinned by hash: Dockerfile-unified:26","Warn: npmCommand not pinned by hash: configeditor/build-configeditor.sh:23","Warn: npmCommand not pinned by hash: .github/workflows/codehealth.yaml:32","Warn: npmCommand not pinned by hash: .github/workflows/unit_tests.yaml:41","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned","Info:   0 out of   6 containerImage dependencies pinned","Info:   0 out of   6 npmCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 21 commits out of 25 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":7,"reason":"3 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GO-2022-0635","Warn: Project is vulnerable to: GO-2022-0646"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T18:51:26.551Z","repository_id":42521049,"created_at":"2025-08-17T18:51:26.551Z","updated_at":"2025-08-17T18:51:26.551Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28844862,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T10:53:21.605Z","status":"ssl_error","status_checked_at":"2026-01-28T10:53:20.789Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["gcp","google-cloud","spanner"],"created_at":"2024-08-02T01:03:07.947Z","updated_at":"2026-01-28T11:15:45.097Z","avatar_url":"https://github.com/cloudspannerecosystem.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"\u003cbr /\u003e\n\u003cp align=\"center\"\u003e\n  \u003ch2 align=\"center\"\u003eAutoscaler tool for Cloud Spanner\u003c/h2\u003e\n  \u003cimg alt=\"Autoscaler\" src=\"resources/BlogHeader_Database_3.max-2200x2200.jpg\"\u003e\n\n  \u003cp align=\"center\"\u003e\n    An open source tool to autoscale Spanner instances\n    \u003cbr /\u003e\n    Home\n    ·\n    \u003ca href=\"src/poller/README.md\"\u003ePoller component\u003c/a\u003e\n    ·\n    \u003ca href=\"src/scaler/README.md\"\u003eScaler component\u003c/a\u003e\n    ·\n    \u003ca href=\"src/forwarder/README.md\"\u003eForwarder component\u003c/a\u003e\n    ·\n    \u003ca href=\"terraform/README.md\"\u003eTerraform configuration\u003c/a\u003e\n    ·\n    \u003ca href=\"terraform/README.md#Monitoring\"\u003eMonitoring\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n## Table of Contents\n\n*   [Table of Contents](#table-of-contents)\n*   [Overview](#overview)\n*   [Architecture](#architecture)\n*   [Deployment](#deployment)\n*   [Configuration](#configuration)\n*   [Licensing](#licensing)\n*   [Contributing](#contributing)\n\n## Overview\n\nThe Autoscaler tool for Cloud Spanner is a companion tool to Cloud Spanner\nthat allows you to automatically increase or reduce the number of nodes or\nprocessing units in one or more Spanner instances, based on their utilization.\n\nWhen you create a [Cloud Spanner instance][spanner-instance], you choose the\nnumber of [nodes or processing units][compute-capacity] that provide compute\nresources for the instance. As the instance's workload changes, Cloud Spanner\ndoes *not* automatically adjust the number of nodes or processing units in the\ninstance.\n\nThe Autoscaler monitors your instances and automatically adds or\nremoves compute capacity to ensure that they stay within the\n[recommended maximums for CPU utilization][spanner-max-cpu] and the\n[recommended limit for storage per node][spanner-max-storage], plus or\nminus an [allowed margin](src/poller/README.md#margins). Note that the\nrecommended thresholds are different depending if a Spanner instance is\n[regional or multi-region][spanner-regional].\n\n## Architecture\n\n![architecture-abstract](resources/architecture-abstract.png)\n\nThe diagram above shows the high level components of the Autoscaler and the\ninteraction flow:\n\n1.  The Autoscaler consists of two main decoupled components:\n    *   [The Poller component][autoscaler-poller]\n    *   [The Scaler component][autoscaler-scaler]\n\n    These can be deployed to either [Cloud Run functions][cloud-functions] or\n    [Google Kubernetes Engine (GKE)][gke], and configured so that the\n    Autoscaler runs according to a user-defined schedule. In certain deployment\n    topologies a third component, the [Forwarder][autoscaler-forwarder], is also\n    deployed.\n\n2.  At the specified time and frequency, the Poller component queries the\n    [Cloud Monitoring][cloud-monitoring] API to retrieve the utilization metrics\n    for each Spanner instance.\n\n3.  For each instance, the Poller component pushes one message to the Scaler\n    component. The payload contains the utilization metrics for the\n    specific Spanner instance, and some of its corresponding configuration\n    parameters.\n\n4.  Using the chosen [scaling method](src/scaler/README.md#scaling-methods),\n    the Scaler compares the Spanner instance metrics against the recommended\n    thresholds, (plus or minus an [allowed margin](src/poller/README.md#margins)),\n    and determines if the instance should be scaled, and the number of nodes or\n    processing units that it should be scaled to. If the configured cooldown\n    period has passed, then the Scaler component requests the Spanner Instance\n    to scale out or in.\n\nThroughout the flow, the Autoscaler writes a step by step summary\nof its recommendations and actions to [Cloud Logging][cloud-logging] for\ntracking and auditing.\n\n## Deployment\n\nTo deploy the Autoscaler, decide which of the following strategies\nis best adjusted to fulfill your technical and operational needs:\n\n*   [Deployment to Cloud Run functions](terraform/cloud-functions/README.md)\n*   [Deployment to Google Kubernetes Engine (GKE)](terraform/gke/README.md)\n\nIn both of the above instances, the Google Cloud Platform resources are\ndeployed using Terraform. Please see the [Terraform instructions](terraform/README.md)\nfor more information on the deployment options available.\n\n## Monitoring\n\nThe autoscaler publishes the following metrics to Cloud Monitoring which can be\nused to monitor the behavior of the autoscaler, and to configure alerts.\n\n### Poller\n\n*   Message processing counters:\n    *   `cloudspannerecosystem/autoscaler/poller/requests-success` - the number\n        of polling request messages recieved and processed successfully.\n    *   `cloudspannerecosystem/autoscaler/poller/requests-failed` - the number\n        of polling request messages which failed processing.\n\n*   Spanner Instance polling counters:\n    *   `cloudspannerecosystem/autoscaler/poller/polling-success` - the number\n        of successful polls of the Spanner instance metrics.\n    *   `cloudspannerecosystem/autoscaler/poller/polling-failed` - the number of\n        failed polls of the Spanner instance metrics.\n    *   Both of these metrics have `projectid` and `instanceid` to identify the\n        Spanner instance.\n\n### Scaler\n\n*   Message processing counters:\n    *   `cloudspannerecosystem/autoscaler/scaler/requests-success` - the number\n        of scaling request messages recieved and processed successfully.\n    *   `cloudspannerecosystem/autoscaler/scaler/requests-failed` - the number\n        of scaling request messages which failed processing.\n*   Spanner Instance scaling counters:\n    *   `cloudspannerecosystem/autoscaler/scaler/scaling-success` - the number\n        of succesful rescales of the Spanner instance.\n    *   `cloudspannerecosystem/autoscaler/scaler/scaling-denied` - the number of\n        Spanner instance rescale attempts that failed\n    *   `cloudspannerecosystem/autoscaler/scaler/scaling-failed` - the number of\n        Spanner instance rescale attempts that were denied by autoscaler\n        configuration or policy.\n\n    *   These three metrics have the following attributes:\n        *   `spanner_project_id` - the Project ID of the affected Spanner\n            instance\n        *   `spanner_instance_id` - the Instance ID of the affected Spanner\n            instance\n        *   `scaling_method` - the scaling method used\n        *   `scaling_direction` - which can be `SCALE_UP`, `SCALE_DOWN` or\n            `SCALE_SAME` (when the calculated rescale size is equal to the\n            current size)\n        *   In addition, the `scaling-denied` counter has a `scaling_denied_reason`\n            attribute containing the reason why the scaling was not performed, which\n            can be:\n            *   `SAME_SIZE` - when the calculated rescale size is equal to the\n                current instance size.\n            *   `MAX_SIZE` - when the instance has already been scaled up to the\n                maximum configured size.\n            *   `WITHIN_COOLDOWN` - when the instance has been recently rescaled,\n                and the autoscaler is waiting for the cooldown period to end.\n            *   `IN_PROGRESS` - when an instance scaling operation is still\n                ongoing.\n\n## Configuration\n\nThe parameters for configuring the Autoscaler are identical regardless of the chosen\ndeployment type, but the mechanism for configuration differs slightly:\n\n*   [Cloud Run functions](terraform/cloud-functions/README.md#configuration)\n*   [Google Kubernetes Engine (GKE)](terraform/gke/README.md#building-and-deploying-the-autoscaler-services)\n\nThere is also a [browser-based configuration file editor and a command line\nconfiguration file validator][configeditor].\n\n## Licensing\n\n```lang-none\nCopyright 2020 Google LLC\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    https://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n\n## Getting Support\n\nThe Autoscaler is a [Cloud Spanner Ecosystem](https://www.cloudspannerecosystem.dev/about)\nproject based on open source contributions. We'd love for you to\n[report issues, file feature requests][new-issue], and [send pull requests][new-pr]\n(see [Contributing](README.md#contributing)). You may file bugs and feature\nrequests using GitHub's issue tracker or using the existing Cloud Spanner\nsupport channels.\n\n## Contributing\n\n*   [Contributing guidelines][contributing-guidelines]\n*   [Code of conduct][code-of-conduct]\n\n\u003c!-- LINKS: https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[autoscaler-poller]: src/poller/README.md\n[autoscaler-scaler]: src/scaler/README.md\n[autoscaler-forwarder]: src/forwarder/README.md\n[cloud-functions]: https://cloud.google.com/functions\n[cloud-monitoring]: https://cloud.google.com/monitoring\n[cloud-logging]: https://cloud.google.com/logging\n[compute-capacity]: https://cloud.google.com/spanner/docs/compute-capacity#compute_capacity\n[code-of-conduct]: code-of-conduct.md\n[configeditor]: configeditor/README.md\n[contributing-guidelines]: contributing.md\n[gke]: https://cloud.google.com/kubernetes-engine\n[new-issue]: https://github.com/cloudspannerecosystem/autoscaler/issues/new\n[new-pr]: https://github.com/cloudspannerecosystem/autoscaler/compare\n[spanner-instance]: https://cloud.google.com/spanner/docs/instances\n[spanner-max-cpu]: https://cloud.google.com/spanner/docs/cpu-utilization#recommended-max\n[spanner-max-storage]: https://cloud.google.com/spanner/docs/monitoring-cloud#storage\n[spanner-regional]: https://cloud.google.com/spanner/docs/instances#configuration\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudspannerecosystem%2Fautoscaler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudspannerecosystem%2Fautoscaler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudspannerecosystem%2Fautoscaler/lists"}