Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
37e806e
OSN-1265. Regenerated demo
nk-hystax Jan 23, 2026
0776dac
OSN-1266. Remove obsolete_images from the recommendation page
ka-hystax Jan 23, 2026
970c664
OSN-1287: update auto-assign workflow configuration
Jan 23, 2026
511a835
Reapply vm.sh + fixes
nexusriot Jan 26, 2026
ab4c596
OSN-1287: update auto-assign workflow configuration (#828)
km-hystax Jan 27, 2026
eaffb1c
Pull request update/260126
stanfra Jan 28, 2026
7059af2
OSN-1260. Rename Components folder to components
ek-hystax Jan 30, 2026
ed7f0a4
OSN-1322. Mark expired Power Schedules
DoRightt Jan 30, 2026
55a488c
Pull request update/260130
stanfra Jan 30, 2026
8f0a2e0
OSN-1228. Include GraphQL operation name in /api requests
ek-hystax Feb 2, 2026
9f01b93
OSN-1308. Fix "Lodash has Prototype Pollution Vulnerability in `_.uns…
ek-hystax Feb 2, 2026
59e4008
OSN-1323: fixed optscale-info output
nexusriot Feb 2, 2026
d6a2fce
OSN-1331. Fixed Alibaba LB discovery on LBs in one region
nk-hystax Feb 2, 2026
466c8cc
Pull request update/260203
stanfra Feb 3, 2026
4b0c604
OSN-1332. Updated CODEOWNERS
ek-hystax Feb 4, 2026
1e5919d
OSN-1303. Update react-router-dom to 6.30.3
ek-hystax Feb 4, 2026
2322919
OSN-1306. Updated storybook packages
ek-hystax Feb 4, 2026
e85264f
OSN-1300. Update dependencies to address qs vulnerability
ek-hystax Feb 4, 2026
cd33598
OSN-1296. Update jspdf and jspdf-autotable
ek-hystax Feb 4, 2026
4b6d535
OSN-1302. vite allows server.fs.deny bypass via backslash on Windows
DoRightt Feb 4, 2026
1ea86d2
OSN-1334. Fixed couldn't convert string to float: '' on instance_subs…
nk-hystax Feb 5, 2026
b0c19a8
OSN-1300. [jira-ui] Update body-parser to 1.20.4
ek-hystax Feb 5, 2026
d5a2258
OSN-1319. Update markdown packages
ek-hystax Feb 5, 2026
2ced549
OSN-1336. Fixed not cleaning some indexes on cleanelkdb
nk-hystax Feb 6, 2026
ca102d7
OSN-1333. Enhance instance subscription description with dynamic days…
ek-hystax Feb 6, 2026
8327e7f
Pull request update/260206
stanfra Feb 6, 2026
5fb4d3a
OSN-1314. Update js-yaml to 4.1.1
ek-hystax Feb 9, 2026
e1a8552
OSN-1305. Fix "glob CLI: Command injection via -c/--cmd executes matc…
ka-hystax Feb 10, 2026
4ca3a26
OSS-211. Use cloud adapter in gemini
nk-hystax Feb 16, 2026
59e2a2d
OSN-1335. Updated @apollo-server
ka-hystax Feb 17, 2026
d0de61a
OSN-1327. Integrate @hystax/eslint-config-ui
ka-hystax Feb 17, 2026
c29bcd6
OSN-1347. Fix not getting files in gemini
nk-hystax Feb 17, 2026
803a88a
Pull request update/260218
stanfra Feb 18, 2026
60e98ee
Update ReadMe - adding a block with a Quote
mirlena777 Feb 19, 2026
df31a37
OSN-1342. Update axios to 1.13.5
ek-hystax Feb 24, 2026
db76517
OSN-1349. Fixed gemini exception on many buckets
sd-hystax Feb 27, 2026
1475950
OSN-1358. Decrease available bucket count for selection to one run to 10
ka-hystax Mar 2, 2026
d7d31f0
Pull request update/260302
stanfra Mar 2, 2026
3962150
Update ReadMe description
mirlena777 Mar 4, 2026
e057985
Pull request update/260310
nexusriot Mar 10, 2026
661c043
feat: Add open telemetry integration to the rest_api
arturbalabanov Mar 10, 2026
849e95d
Merge branch 'main' into sync-661c043
michal-zielonka Mar 10, 2026
ab837de
style: Fixing Linter issues
michal-zielonka Mar 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Frontend only for ngui
# Frontend
ngui/ @hystax/ui
jira_ui/ @hystax/ui

# Backend for other directories
# Backend
auth/ @hystax/backend
bi_exporter/ @hystax/backend
bumischeduler/ @hystax/backend
Expand All @@ -13,7 +14,6 @@ gemini/ @hystax/backend
herald/ @hystax/backend
insider/ @hystax/backend
jira_bus/ @hystax/backend
jira_ui/ @hystax/backend
katara/ @hystax/backend
keeper/ @hystax/backend
metroculus/ @hystax/backend
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/auto-assign-author.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ jobs:
pull-requests: write
issues: write # Required because assignees API works via issues
contents: read # Minimal read access to repository contents
issues: write # Required because assignees API works via issues
contents: read # Minimal read access to repository contents

steps:
- name: Assign PR author
Expand Down Expand Up @@ -56,4 +58,3 @@ jobs:
`Skipping assignment for ${prAuthor}: not a collaborator`
);
}

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ rest_api/.clickhouse
**/.pytest_cache/
**/.ruff_cache/
# Build files
**/build
**/dist
**/*egg-info/
**/*.tar.gz
Expand Down Expand Up @@ -50,6 +51,8 @@ jira_ui/*/.env
jira_ui/*/node_modules
jira_ui/*/build/

# Vagrant
optscale-deploy/.vagrant/
# Playwright E2E tests
/e2etests/.env.local
/e2etests/test-results/
Expand Down
66 changes: 52 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@
⭐ Drop a star to support OptScale ⭐
</p>

# FinOps and cloud cost management platform to run any cloud workload with optimal performance and cost
# Open-Source FinOps & Cloud Cost Optimization Platform

<p align="center">
<a href="documentation/images/cover-GitHub.png"><img src="documentation/images/FinOps-platform.png" width="40%" align="middle"></a>
</p>
OptScale is an open source FinOps platform that optimizes cloud costs and performance for any workload, providing effective cloud cost management for all types of organizations.

<br>OptScale is an open-source [FinOps and cloud cost optimization platform](https://hystax.com/optscale/finops-overview/) that helps engineering and finance teams control and reduce spend across AWS, Microsoft Azure, GCP, Alibaba Cloud, and Kubernetes clusters.
It provides deep visibility into infrastructure costs, automated optimization recommendations, and governance tools for R&D and data platforms.

<br>
<br>
<p align="center">
Expand All @@ -29,21 +32,56 @@ OptScale is an open source FinOps platform that optimizes cloud costs and perfor
![Average cloud cost savings](https://img.shields.io/badge/Average_cloud_cost_savings-38%25-yellow)

</div>

<br>

<div>
<br>
<img src="documentation/images/Max_Kuzkin.png" width="80" align="left" style="border-radius: 50%; margin-right: 15px">
<i>
“Hystax OptScale has been a game-changer for our FinOps practice. Its powerful capabilities, flexibility, and seamless integration have empowered us to deliver unprecedented transparency, control, and cost optimization for our clients. We truly value our partnership with Hystax and are excited to innovate further together.”
</i>
<div align="right">
<i><b>Max Kuzkin</b>, General Manager, SoftwareOne Platform</i>
</div>
</div>

<br>

<br>

## OptScale FinOps and cloud cost optimization capabilities
## Overview
OptScale connects to your cloud accounts and Kubernetes clusters, ingests billing and usage data, and analyzes infrastructure consumption to surface actionable insights that eliminate waste and optimize resource usage.
It supports multi-cloud environments and integrates with popular data platforms, including Databricks, Amazon S3, and Amazon Redshift.

<br>

## Key Features
### Cost optimization
<li>Unused and idle resource detection for VMs, volumes, databases, and other cloud resources</li>
<li>Rightsizing recommendations for overprovisioned instances and workloads</li>
<li>R&D resource power management to automatically stop non-production environments outside working hours</li>
<li>Commitment utilization analysis for Reserved Instances, Savings Plans, and Spot Instances</li>


### FinOps and governance
<li>FinOps dashboards for engineering, finance, and product teams to track and allocate cloud spend</li>
<li>Budgeting and alerting for cost anomalies, spikes, and budget overruns</li>
<li>Tagging and ownership visibility to attribute costs to teams, projects, and environments</li>
<li>Policy-driven governance and automation controls</li>


### Data and AI/ML workloads
<li>Databricks cost analytics with detailed visibility into cluster usage and idle time</li>
<li>S3 and object storage optimization (lifecycle, unused buckets, storage class recommendations)</li>


### Kubernetes and multi‑cloud
<li>Kubernetes cluster cost allocation per namespace, workload, and label with workload-level visibility</li>
<li>Multi-cloud support for AWS, Microsoft Azure, Google Cloud, and Alibaba Cloud from a single OptScale instance</li>

<li>Optimal utilization of Reserved Instances, Savings Plans, and Spot Instances</li>
<li>Unused resource detection</li>
<li>R&D resource power management and rightsizing</li>
<li>S3 duplicate object finder</li>
<li>Resource bottleneck identification</li>
<li>Optimal instance type and family selection</li>
<li>Databricks support</li>
<li>S3 and Redshift instrumentation</li>
<li>VM Power Schedules</li>
<br><br>Learn more about [OptScale features for FinOps and multi-cloud cost management](https://hystax.com/optscale/finops-capabilities-and-benefits/).


<br>You can check OptScale [live demo](https://my.optscale.com/live-demo) to explore product features on a pre-generated demo organization.
<br>Learn more about the Hystax OptScale platform and its capabilities at [our website](https://hystax.com).

Expand Down Expand Up @@ -83,7 +121,7 @@ NVMe SSD is recommended.

**OS Required**: [Ubuntu 24.04](https://releases.ubuntu.com/noble/).

_The current installation process should work also on Ubuntu 22.04_
_The current installation process should also work on Ubuntu 22.04_

#### Updating old installation
please follow [this document](documentation/update_to_24.04.md) to upgrade your existing installation on Ubuntu 20.04.
Expand Down
6 changes: 6 additions & 0 deletions build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,12 @@ do
else
echo "Building image for ${COMPONENT}, build tag: ${BUILD_TAG}"
$BUILD_TOOL build $FLAGS -t ${COMPONENT}:${BUILD_TAG} -f ${DOCKERFILE} .

# If the build fails, exit with the same status code as the build command
build_status_code="$?"
if [ "$build_status_code" -gt 0 ]; then
exit $build_status_code
fi
fi

if use_registry; then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,13 @@ def __init__(self, *args, **kwargs):
def supported_cloud_types(self):
return SUPPORTED_CLOUD_TYPES

def _has_discounts(self, raw_info):
@staticmethod
def _has_discounts(raw_info):
if raw_info.get('cost') == 0:
# savings plan applied
return True
for key in ['coupons_discount', 'resource_package_discount']:
if key in raw_info and float(raw_info[key]):
if key in raw_info and float(raw_info[key] or 0):
return True

def _get(self, previous_options, optimizations, cloud_accounts_map,
Expand Down
6 changes: 3 additions & 3 deletions docker_images/cleanelkdb/clean-elk-db.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ remove_line_from_filebeat() {

remove_index_from_elk() {
echo "DELETING "$2" INDEX FROM ELK"
curl -s -X DELETE $1':'$ELK_PORT'/'$2
encoded_index=$(jq -rn --arg index "$2" '$index|@uri')
curl -s -X DELETE $1':'$ELK_PORT'/'$encoded_index
}

m_total_log_size=$(get_size_of_logs $ELK_IP)
Expand All @@ -34,12 +35,11 @@ fi

echo "SIZE OF LOGS BIGGER "$LOG_SIZE_MAX"Mb -> START TO REMOVE LOGS"
curl -s -X GET "$ELK_IP:$ELK_PORT/_cat/indices?v" > curl_test.txt
cat curl_test.txt | awk '/filebeat/ { print $3 }' | sort --reverse > filebeat.txt
grep -oE '(%{[^}]+}|[a-zA-Z_]+)-[0-9]{4}\.[0-9]{2}\.[0-9]{2}' curl_test.txt | sort -t '-' -k2,2 > filebeat.txt

while [ $m_total_log_size -gt $LOG_SIZE_MAX ]; do
m_filebeat=$(tail -n -1 filebeat.txt)
filebeat_date=$(echo $m_filebeat | awk -F '-' '{ print $2 }')

if [ "$m_filebeat" = "" ] ; then
break
else
Expand Down
31 changes: 31 additions & 0 deletions docker_images/common/install-peer-finder.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/usr/bin/env bash

# TODO: Instead of this script we should use multi stage docker builds
# but this is good enough until we get arround to it
# Or even better -- see if we need this tool at all or if there is a better
# way to install it (e.g. via a package manager)

set -x

arch="$(uname -m)"
dest_bin_path="/usr/local/bin/peer-finder"

apt-get update
apt-get install -y --no-install-recommends openssl ca-certificates wget
rm -rf /var/lib/apt/lists/*

if [[ "$arch" == "x86_64" || "$arch" == "amd64" ]]; then
wget -O $dest_bin_path https://storage.googleapis.com/kubernetes-release/pets/peer-finder
elif [[ "$arch" == "aarch64" || "$arch" == "arm64" ]]; then
wget https://github.com/kmodules/peer-finder/releases/download/v1.0.2/peer-finder-linux-arm64.tar.gz \
-O /tmp/peer-finder-linux-arm64.tar.gz
tar -xzf /tmp/peer-finder-linux-arm64.tar.gz -C /tmp
mv /tmp/peer-finder-linux-arm64 $dest_bin_path
else
echo "Unsupported architecture: $arch"
exit 1
fi

chmod +x $dest_bin_path
apt-get purge -y --auto-remove ca-certificates wget

9 changes: 8 additions & 1 deletion docker_images/error_pages/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
FROM ingressnginx/custom-error-pages:v1.2.0
# TODO: The base image doesn't support arm64 yet but shouldn't be too hard to change that,
# though it will require a change in the `kubernetes/ingress-nginx` repo.
# References:
# * Base image's Dockerfile: https://github.com/kubernetes/ingress-nginx/blob/main/images/custom-error-pages/rootfs/Dockerfile
# * Relevant issue on GitHub: https://github.com/kubernetes/ingress-nginx/issues/10245

ARG arch=amd64
FROM --platform="linux/${arch}" ingressnginx/custom-error-pages:v1.2.0

COPY docker_images/error_pages/www /www
23 changes: 17 additions & 6 deletions docker_images/etcd/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
FROM gcr.io/etcd-development/etcd:v3.2.13
RUN apk update
# https://github.com/Yelp/dumb-init/issues/73#issuecomment-240439732
RUN apk add ca-certificates wget && update-ca-certificates
RUN apk --no-cache add curl
RUN wget $(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/nexusriot/etcd-walker/releases/tags/0.0.11 | grep -Eo 'https://(.*linux_x64_static)') -O /bin/etcd-walker
# etcd is a distroless image starting from v3.5, meaning we don't have access to a shell or package manager.
# this is why we use multi-stage builds to build and copy the binary into the final image.
# ref: https://github.com/GoogleContainerTools/distroless?tab=readme-ov-file#docker

FROM golang:1.24.6 AS build-etcd-walker

RUN git clone https://github.com/nexusriot/etcd-walker/ /tmp/etcd-walker-src

WORKDIR /tmp/etcd-walker-src
RUN git checkout 0.2.1
RUN go build -ldflags "-linkmode external -extldflags -static" -o etcd-walker cmd/etcd-walker/main.go

RUN mv etcd-walker /bin/etcd-walker
RUN chmod +x /bin/etcd-walker

# NOTE: v3.6+ require significant changes as they removed support for the V2 API, see https://etcd.io/docs/v3.6/upgrades/upgrade_3_6/
FROM gcr.io/etcd-development/etcd:v3.2.13
COPY --from=build-etcd-walker /bin/etcd-walker /bin/etcd-walker
2 changes: 1 addition & 1 deletion docker_images/grafana/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM grafana/grafana:8.2.1
FROM grafana/grafana:12.3.2

COPY docker_images/grafana/datasource.yaml /etc/grafana/provisioning/datasources/
COPY docker_images/grafana/dashboard.yaml /etc/grafana/provisioning/dashboards/
15 changes: 15 additions & 0 deletions docker_images/grafana/datasource.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,18 @@ datasources:
version: 1
# <bool> allow users to edit datasources from the UI.
editable: false
- name: Tempo
type: tempo
uid: tempo
access: proxy
url: http://tempo:3200
basicAuth: false
isDefault: false
jsonData:
search:
hide: false
nodeGraph:
enabled: true
spanBar:
type: Tag
tag: http.path
9 changes: 3 additions & 6 deletions docker_images/mariadb/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
FROM mariadb:10.3

RUN set -x \
&& apt-get update && apt-get install -y --no-install-recommends ca-certificates wget \
&& rm -rf /var/lib/apt/lists/* \
&& wget -O /usr/local/bin/peer-finder https://storage.googleapis.com/kubernetes-release/pets/peer-finder \
&& chmod +x /usr/local/bin/peer-finder \
&& apt-get purge -y --auto-remove ca-certificates wget
COPY docker_images/common/install-peer-finder.sh /tmp/install-peer-finder.sh
RUN chmod +x /tmp/install-peer-finder.sh
RUN /tmp/install-peer-finder.sh

COPY docker_images/mariadb/galera /opt/galera/
COPY docker_images/mariadb/docker-entrypoint.sh /usr/local/bin/
Expand Down
9 changes: 3 additions & 6 deletions docker_images/mongo/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
FROM mongo:3.6

RUN set -x \
&& apt-get update && apt-get install -y --no-install-recommends openssl ca-certificates wget \
&& rm -rf /var/lib/apt/lists/* \
&& wget -O /usr/local/bin/peer-finder https://storage.googleapis.com/kubernetes-release/pets/peer-finder \
&& chmod +x /usr/local/bin/peer-finder \
&& apt-get purge -y --auto-remove ca-certificates wget
COPY docker_images/common/install-peer-finder.sh /tmp/install-peer-finder.sh
RUN chmod +x /tmp/install-peer-finder.sh
RUN /tmp/install-peer-finder.sh

COPY docker_images/mongo/on-start.sh /on-start.sh
Binary file added documentation/images/Max_Kuzkin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading