1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-11-24 20:06:55 +01:00
Commit Graph

945 Commits

Author SHA1 Message Date
Mateusz Kwasniewski
fce4c5bbab
feat: milestone progression executed at in read model (#10771) 2025-10-10 09:00:15 +02:00
Mateusz Kwasniewski
cf018020df
chore: feature release plans flag (#10762) 2025-10-08 14:19:22 +02:00
Mateusz Kwasniewski
bb3d938f57
fix: transition condition type (#10760) 2025-10-08 12:50:05 +02:00
Mateusz Kwasniewski
f35804e55f
Improve release plan write model (#10759) 2025-10-08 12:27:32 +02:00
Mateusz Kwasniewski
43fa239e72
feat: milestone transition condition (#10757) 2025-10-08 11:30:04 +02:00
Nuno Góis
9948e577ee
fix: clone environments (#10755)
https://linear.app/unleash/issue/2-3932/cloned-environments-enable-disabled-strategies-unexpectedly

Cloning environments didn't work as expected. This fixes a few of
issues:
 - Disabled strategies remain disabled after cloning
 - All strategy properties are cloned (including e.g. title)
 - Strategy cloning respects the selected projects
 - Release plans and their milestones are now correctly cloned
2025-10-08 09:48:40 +01:00
Mateusz Kwasniewski
f2115cc3db
feat: move release plans to feature environments (#10746) 2025-10-08 09:39:37 +02:00
Gastón Fournier
b1f4ebd5eb
chore: return user id alongside max updated_at (#10732)
This is for internal use
2025-10-06 11:43:40 +02:00
Mateusz Kwasniewski
c65a336783
feat: milestone start time update (#10730) 2025-10-03 14:09:49 +02:00
Gastón Fournier
a927f1f42b
chore: new method that considers users updated at the same time (#10723)
We could have users updated at the exact same time, so we need to
include that timestamp in the next fetch to avoid missing users, but
also include the latest user id so we can exclude the ones already
fetched.

The following test shows how to process pages with this new method:

c03df86ee0/src/lib/features/users/user-updates-read-model.test.ts (L39-L65)
2025-10-03 09:24:53 +02:00
unleash-bot[bot]
da22cb0d65
chore(AI): etagVariant flag cleanup (#10714)
This PR cleans up the etagVariant flag. These changes were automatically
generated by AI and should be reviewed carefully.

Fixes #10711

## 🧹 AI Flag Cleanup Summary
This PR removes the `etagVariant` feature flag, making the versioned
ETag format
(`v2`) the default and only behavior for the client features API.
### 🚮 Removed
- **Feature Flag**
- Removed the `etagVariant` flag definition from `experimental.ts`.
- Removed conditional logic for ETag generation in
`client-feature-toggle.controller.ts`.
- **Testing**
- Removed parameterized tests for both states of the flag in
`feature.optimal304.e2e.test.ts`.
- Removed configuration of the `etagVariant` flag in test setup.
### 🛠 Kept
- **ETag Generation**
- The logic to generate ETags with a version suffix (`v1`) is now the
standard
behavior.
- **Testing**
- Tests have been updated to exclusively assert the presence of the `v1`
suffix in ETags.
### 📝 Why
The `etagVariant` feature flag has been successfully rolled out and is
now
considered complete. By removing the flag, we are simplifying the
codebase by
eliminating conditional paths and making the improved ETag format
permanent.
This change ensures all client API responses for features include a
versioned
ETag, which helps with cache-busting when the ETag format changes in the
future.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Gastón Fournier <gaston@getunleash.io>
2025-10-02 11:26:53 +02:00
Nuno Góis
7462465a0b
chore: resource limits service (#10709)
https://linear.app/unleash/issue/2-3927/implement-resource-limits-service

Implements a resource limits service.

The implementation looks trivial (or even redundant) in OSS, but by
implementing a resource limits service we can make this potentially
dynamic and overridable.
2025-10-01 09:57:18 +01:00
Gastón Fournier
e0cdf6addd
feat: add users updated read model (#10693)
## About the changes
This adds a user read model using the updated_at new field in the users
table.
2025-09-24 17:39:03 +02:00
Mateusz Kwasniewski
413847374e
feat: using histogram metrics (#10695) 2025-09-24 17:02:29 +02:00
Gastón Fournier
907727947a
Revert "feat: enforce email null when deleted is set" (#10682)
Reverts Unleash/unleash#10680

SCIM protocol requires us to keep the email stored, so this constraint
doesn't hold.
2025-09-23 17:25:39 +02:00
Gastón Fournier
d33e57a05f
feat: enforce email null when deleted is set (#10680)
## About the changes
When deleting a user we set the email to null and deleted_at to the
current date, there's no case where email is set and deleted_at is also
set.

We found some situations where this happens, specifically when SAML and
SCIM are used in conjunction
2025-09-23 14:43:53 +02:00
Gastón Fournier
a628755506
fix: SSO auto create with SCIM tend to override each other (#10675)
## About the changes
Having SCIM enabled with SAML and auto-create can generate issues with
each protocol stepping into the other protocol's toes.

This PR adds protection to avoid updating SCIM-managed users with SAML
data (cause SCIM will override this data later).

It also adds a new method in the store to check if we have cases where
deleted_at is set but the email is not cleared, and there's no delete
event in the audit log (we've found one case, and we believe it might be
related to interoperability issues between SAML and SCIM)
2025-09-22 17:55:22 +02:00
Mateusz Kwasniewski
8d03ce340d
feat: histogram impact metric ingestion (#10674) 2025-09-22 17:14:07 +02:00
Mateusz Kwasniewski
3296add50f
feat: batch histogram metric type (#10672) 2025-09-22 13:22:53 +02:00
Nuno Góis
d5f834e851
chore: add unknown flag metric for unique flag names (#10601)
https://linear.app/unleash/issue/2-3845/add-metric-for-unique-unknown-flag-names

Adds a new unknown flag metric for unique unknown flag names.

<img width="864" height="126" alt="image"
src="https://github.com/user-attachments/assets/c20ce53e-eff3-4cda-af4b-f2c2aae8575c"
/>
2025-09-03 08:44:28 +01:00
unleash-bot[bot]
dfa89d7d58
chore(AI): reportUnknownFlags flag cleanup (#10596)
This PR cleans up the reportUnknownFlags flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10595

## 🧹 AI Flag Cleanup Summary
This change removes the `reportUnknownFlags` feature flag and makes its
functionality a permanent part of the application. The "Unknown flags"
feature
is now always enabled.
### 🚮 Removed
- **Flag Definitions**
- Removed `reportUnknownFlags` from `IFlagKey` and `UiFlags` types.
- Removed `reportUnknownFlags` from the experimental flags configuration
in `src/lib/types/experimental.ts`.
- Removed the flag from development and test configurations
(`src/server-dev.ts`, `unknown-flags.e2e.test.ts`).
- **Conditional Logic**
- Removed conditional checks for `reportUnknownFlags` in backend
services
(`UnknownFlagsService`, `ClientMetricsServiceV2`) and API controllers
(`UnknownFlagsController`).
- Removed `useUiFlag('reportUnknownFlags')` and related conditional
rendering from frontend components (`UnknownFlagsTable`,
`FeatureToggleListTable`). The UI elements are now always visible.
- Modified the `useUnknownFlags` hook to always fetch data.
### 🛠 Kept
- **Core Functionality**
- The feature to report and display unknown flags is now always active.
- The "Unknown flags" link is now permanently visible on the feature
flags
overview page.
- Backend logic for processing and storing unknown flags is now always
executed.
### 📝 Why
The `reportUnknownFlags` feature flag was marked as completed with the
feature
being kept. This cleanup removes the flag and its associated conditional
logic,
simplifying the code and making the unknown flags reporting a permanent
feature.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Nuno Góis <github@nunogois.com>
2025-09-02 14:18:35 +01:00
Jaanus
6c11b57c53
fix: remove lifecycle backfill on every startup 2025-09-02 13:55:18 +03:00
Nuno Góis
c70c864b81
chore: promote unknown flags to a stable OpenAPI tag (#10594)
https://linear.app/unleash/issue/2-3832/promote-api-to-a-stable-openapi-tag

Promotes the Unknown Flags API to a stable OpenAPI tag as we prepare for
GA.
2025-09-02 11:45:21 +01:00
Nuno Góis
ed28d9f2b4
chore: one unknown flag per row (#10590)
https://linear.app/unleash/issue/2-3833/show-one-flag-name-per-row

Groups unknown flags by flag name, showing a single flag name per row.
This greatly simplifies the way we show unknown flags.

Just to be safe, we're limiting the app names we're showing to 20, and
environments per app name to 10.

Required some plumbing.

### Basic example
<img width="1350" height="866" alt="image"
src="https://github.com/user-attachments/assets/ad8ee198-e5f8-45e4-8e3b-f2d8b7701cf9"
/>

### App name search example, with highlight

<img width="367" height="204" alt="image"
src="https://github.com/user-attachments/assets/a1cc27ee-9ca1-4980-a3af-c08302c1d617"
/>
2025-09-02 10:47:02 +01:00
Jaanus Sellin
2442e5c973
fix: lifecycle metrics will now be posted across all environments (#10586) 2025-09-02 10:37:34 +03:00
Jaanus Sellin
a1a43d1177
feat: start tracking database calls for lifecycle (#10582)
Start tracking db calls for lifecycle store.
2025-09-01 12:19:27 +03:00
Nuno Góis
e7b757d7e1
chore: unknown flags should not include flags that exist in Unleash (#10568)
https://linear.app/unleash/issue/2-3825/fetching-unknown-flags-should-not-include-flags-that-currently-exist

Fetching unknown flags should not include flags that currently exist in
Unleash.

This is especially noticeable if you create a flag with an unknown
flag's name, since it won't go away from the list right away.
2025-08-29 10:20:43 +01:00
David Leek
31a924dd4b
chore: rollback hashing of release-plans and templates (#10574)
Rolls back hashing of the newly added releasePlans and releaseTemplates
fields
2025-08-29 11:19:20 +02:00
unleash-bot[bot]
3e4edfbfa9
chore(AI): etagByEnv flag cleanup (#10560)
This PR cleans up the etagByEnv flag. These changes were automatically
generated by AI and should be reviewed carefully.

Fixes #10556

## 🧹 AI Flag Cleanup Summary
This change removes the `etagByEnv` feature flag and makes its
functionality
permanent. This modifies the ETag generation for client API requests to
be
environment-specific, improving caching efficiency. The cleanup involved
removing the flag definition, updating the controller logic to
permanently use
the environment-specific ETag calculation, and refactoring the
corresponding E2E
tests to only cover the enabled behavior.
### 🚮 Removed
- **Flag Definition**
- The `etagByEnv` flag from `IFlagKey` in
`src/lib/types/experimental.ts`.
- **Conditional Logic**
- The check for the `etagByEnv` flag in `calculateMeta` method in

`src/lib/features/client-feature-toggles/client-feature-toggle.controller.ts`.
- **Tests**
- Test cases in `src/test/e2e/api/client/feature.optimal304.e2e.test.ts`
that
covered the disabled state of the `etagByEnv` flag.
### 🛠 Kept
- **Environment-Specific ETags**
- The behavior of generating environment-specific ETags is now the
default and
only behavior.
- **Tests**
- E2E tests verifying the functionality of environment-specific ETags
have
been retained and simplified.
### 📝 Why
The `etagByEnv` feature has been successfully rolled out and validated.
By
removing the feature flag and associated conditional logic, we simplify
the
codebase, reduce complexity, and make it easier to maintain. This change
makes
the improved ETag generation strategy a permanent part of the system.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Gastón Fournier <gaston@getunleash.io>
2025-08-28 10:41:04 -03:00
David Leek
7fb523e348
chore: add release plans/templates count to instance stats (#10540) 2025-08-28 14:44:24 +02:00
unleash-bot[bot]
fa7857dff1
chore(AI): debugEtag flag cleanup (#10558)
This PR cleans up the debugEtag flag. These changes were automatically
generated by AI and should be reviewed carefully.

Fixes #10557

## 🧹 AI Flag Cleanup Summary
This removes the `debugEtag` feature flag from the codebase. This flag
was used
to enable additional logging for debugging ETag generation for the
client
features endpoint.
### 🚮 Removed
- **Flag Definition**
- The `debugEtag` flag from the `IFlagKey` type in
`src/lib/types/experimental.ts`.
- **Conditional Logging**
- Removed logging statements guarded by the `debugEtag` flag in
`client-feature-toggle.controller.ts` and
`configuration-revision-service.ts`.
### 🛠 Kept
- **Default Behavior**
- The existing code paths for when the flag was disabled, which is now
the
only behavior.
### 📝 Why
The `debugEtag` flag was marked as completed with the outcome
"discarded". The
debugging functionality it provided is no longer needed. This change
removes the
dead code associated with the flag, simplifying the codebase.

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
2025-08-28 07:54:38 -03:00
Jaanus Sellin
b8521121a1
fix: feature link should return same id as it sends to db (#10553)
During feature link creation, we should return same id as it sends to
db.
2025-08-28 11:43:46 +03:00
Gastón Fournier
750a32f0e9
chore: Etag log and code improvements (#10542)
This is a follow-up on the comments in
https://github.com/Unleash/unleash/pull/10512

Mostly using get and set when accessing the Map
2025-08-26 13:21:37 -03:00
Gastón Fournier
ac11af8c05
chore: add some debug statements controlled by a flag (#10532)
## About the changes
Add some **info** logs prefixed with `[etag]` so que can control them
and with this investigate the increase in traffic after the new etag
implementation.
2025-08-25 11:26:36 -03:00
Gastón Fournier
7ea0c9ca9b
feat: support different etags per environment (#10512)
## About the changes
This PR introduces environment-specific etags. This way clients will not
react by updating features when there are changes in environments the
SDK doesn't care about.

## Details
There's a bit of scouting work (please don't make me split this 🙏)
and other details are in comments, but the most relevant for the lazy
ones:
- Important **decision** on how we detect changes, unifying polling and
delta:
https://github.com/Unleash/unleash/pull/10512#discussion_r2285677129
- **Decision** on how we update revision id per environment:
https://github.com/Unleash/unleash/pull/10512#discussion_r2291888401
- and how we do initial fetch on the read path:
https://github.com/Unleash/unleash/pull/10512#discussion_r2291884777
- The singleton pattern that gave me **nightmares**:
https://github.com/Unleash/unleash/pull/10512#discussion_r2291848934
- **Do we still have ALL_ENVS tokens?**
https://github.com/Unleash/unleash/pull/10512#discussion_r2291913249

## Feature flag
To control the rollout introduced `etagByEnv` feature:
[0da567d](0da567dd9b)
2025-08-22 10:35:17 -03:00
Nuno Góis
885d3e1817
chore: implement unknown flags UX feedback (#10519)
https://linear.app/unleash/issue/2-3809/implement-the-latest-feedback-from-ux

Implements the latest feedback from UX regarding **unknown flags**.

Bit unsure about our column headers. E.g. instead of "Last seen" and
"Seen in Unleash" we could call them "Reported" and "Last event".

<img width="1490" height="838" alt="image"
src="https://github.com/user-attachments/assets/30ca2570-1395-429f-8d60-ccc6fe83ba92"
/>
2025-08-22 14:04:01 +01:00
Gastón Fournier
92480554dc
feat: incorporate backend as a valid api token type replacing client (#10500)
This PR deprecates `CLIENT` api token type in favor of `BACKEND` but
both will continue working.

Also replaces:
- `INIT_CLIENT_API_TOKENS` with `INIT_BACKEND_API_TOKENS`. The former is
kept for backward compatibility.
2025-08-21 09:43:54 -03:00
unleash-bot[bot]
d6ddc95c1e
chore(AI): improvedJsonDiff flag cleanup (#10486)
This PR cleans up the improvedJsonDiff flag. These changes were
automatically generated by AI and should be reviewed carefully.

Fixes #10483

## 🧹 AI Flag Cleanup Summary
This PR removes the `improvedJsonDiff` feature flag, making the enhanced
JSON
diffing component the default and only option. The now-unused legacy
diff
component and all related feature flag logic have been removed to
streamline the
codebase.
### 🚮 Removed
- **Components**
- `OldEventDiff` component was removed, along with its helper types and
constants.
- **Flag Logic**
- All conditional rendering based on the `improvedJsonDiff` flag was
removed.
- The `sort` prop from `EventDiff` was removed as it was only used by
the
legacy component.
- **Configuration**
- `improvedJsonDiff` flag definition was removed from `uiConfig.ts`,
`experimental.ts`, and `server-dev.ts`.
- **Tests**
- Mock configuration for `improvedJsonDiff` in tests was removed.
### 🛠 Kept
- **Components**
- `NewEventDiff` was renamed to `EventDiff` and is now the standard
implementation.
### 📝 Why
The `improvedJsonDiff` feature flag was marked as completed with its
outcome
being "kept". This cleanup finalizes the feature rollout by removing the
flag
and associated legacy code, simplifying the implementation and reducing
code
complexity.

---------

Co-authored-by: unleash-bot <194219037+unleash-bot[bot]@users.noreply.github.com>
Co-authored-by: Thomas Heartman <thomas@getunleash.io>
2025-08-21 09:50:48 +00:00
Gastón Fournier
32ddf1487b
chore: ignore CR events with feature name (#10503)
## About the changes
This ignores Change Request event types when calculating the etag
because Change Request events don't change data.

They were being included when the change request event contained a
featureName. After this change, those should be excluded.
2025-08-19 09:46:00 -03:00
Tymoteusz Czech
918e792af6
fix: health to technical debt on projects list (#10485) 2025-08-11 11:45:27 +02:00
Gastón Fournier
60a2fa675b
chore: add next.js to findOutdatedSdks (#10479)
Next js also works as a backend SDK (thanks @Tymek for the explanation)
and might be already reporting as
69e8c64927/lib/src/getDefinitions.ts (L79)
2025-08-07 19:31:35 +02:00
Gastón Fournier
057a906892
chore: set min version for new SDK names (#10477)
## About the changes
This sets the minimum version for the new SDK names to the current
latest version. The versions with the new SDK name will be newer, but
this will set the baseline for the future.
2025-08-07 10:30:45 -03:00
Tymoteusz Czech
e1b6979627
Feat: filter flags by "last seen at" (#10449)
This lets users filter features by when they were last reported in metrics.
2025-08-04 14:50:21 +02:00
Nuno Góis
3338ea4300
chore: clear unknown flags every 24h instead of every 7d (#10446)
https://linear.app/unleash/issue/2-3738/clear-unknown-flags-every-24h-instead-of-every-7d

Clears unknown flags every 24h instead of every 7d.

This ensures the list stays more relevant by removing stale entries
sooner, allowing users to focus on actively reported unknown flags.

Also includes small improvements, including a new paragraph on the
unknown flags page that better explains the concept of unknown flag
reports.
2025-07-31 11:22:40 +01:00
Gastón Fournier
2f1ca50bc4
fix: should be allowed to change strategy (#10441)
## About the changes
Previous PR: https://github.com/Unleash/unleash/pull/10439 introduced a
bug not allowing to update the strategy name

This PR modifies a test to also validate the change of strategy and
fixes the problem
2025-07-30 17:25:17 +02:00
Gastón Fournier
9eb19618bf
fix: stickiness should be preserved on strategy updates (#10439)
## About the changes
When stickiness was set to empty or undefined while updating a strategy
via API the stickiness would be lost.

This adds a validation step after creating a strategy, that updating
with the same data used to create the strategy yields the same result.

The main change was lifting the default logic from the store layer to
the service layer and adapting tests accordingly
2025-07-30 15:47:51 +02:00
Melinda Fekete
b354c4dda3
docs: update OpenAPI Edge name (#10415)
Change the tag of Edge to Unleash Edge in the OpenAPI spec to help with
search relevance in the docs
2025-07-25 12:41:06 +02:00
Gastón Fournier
020e9a49ef
chore: don't fail if array is not ordered properly (#10391)
Spotted it here:
https://github.com/Unleash/unleash/actions/runs/16443263365/job/46468801248
<img width="928" height="584" alt="image"
src="https://github.com/user-attachments/assets/5e430b91-2664-4a79-9f13-cf6da4640046"
/>

where the sort order is different.
2025-07-22 14:30:56 +02:00
Nuno Góis
51f8244a5d
chore: emit CLIENT_METRICS event after sifting (#10376)
https://linear.app/unleash/issue/2-3705/only-emit-client-metrics-after-sifting-metrics

Only emits the `CLIENT_METRICS` event after metric sifting.

This ensures the event is emitted only for valid metrics tied to known
flags, instead of all flags included in the metrics payload.

See:
https://github.com/Unleash/unleash/pull/10375#discussion_r2218974109
2025-07-21 15:40:02 +01:00
Nuno Góis
8f0c0ccef3
chore: sift metrics on both endpoints (#10375)
https://linear.app/unleash/issue/2-3696/report-unknown-flags-when-sent-to-the-bulk-metrics-endpoint

Unifies metrics sifting logic across both metrics endpoints:
- `/metrics`
- `/metrics/bulk`

This PR improves consistency between the `/metrics` and `/metrics/bulk`
endpoints by introducing a shared `siftMetrics` method, now used within
`registerBulkMetrics`. Both endpoints already call this method at the
end of their respective logic flows, ensuring that metrics are sifted in
the same way regardless of the path taken.

While the primary goal was to enable reporting of unknown flags via the
`/metrics/bulk` endpoint, this change also improves bulk processing by
consistently dropping invalid or unknown flags before insertion, just
like in the regular `/metrics` endpoint.
2025-07-21 12:40:41 +01:00