1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-11-10 01:19:53 +01:00
Commit Graph

95 Commits

Author SHA1 Message Date
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
Mateusz Kwasniewski
f04dd454d9
feat: sanitize impact metrics (#10364) 2025-07-17 12:59:50 +02:00
Mateusz Kwasniewski
1ab8275996
feat: default origin for impact metrics (#10362) 2025-07-16 14:45:44 +02:00
Thomas Heartman
642b209b9d
fix: don't overwrite seenClients in instance-service; merge if same client appears again (#10357)
Fixes a bug where `registerInstance` and
`register{Frontend|Backend}Client` would overwrite each other's data in
the instance service, leading to the bulk update being made with partial
data, often missing SDK version. There's a different issue in the actual
store that causes sdk version and type to be overwritten when it's
updated (because we don't use `setLastSeen` anymore), but I'll handle
that in a different PR.

This PR adds tests for the changes I've made. Additionally, I've made
these semi-related bonus changes:
- In registerInstance, don't expect a partial `IClientApp`. We used to
validate that it was actual a metrics object instead. Instead, update
the signature to expect the actual properties we need from the cilent
metrics schema and set a default for instanceId the way Joi did.
- In `metrics.ts`, use the `ClientMetricsSchema` type in the function
signature, so that the request body is correctly typed in the function
(instead of being `any`).
- Delete two unused properties from the`createApplicationSchema`. They
would get ignored and were never used as far as I can tell. (`appName`
is taken from the URL, and applications don't store `sdkVersion`
information).
- Add `sdkVersion` to `IClientApp` because it's used in instance
service.

I've been very confused about all the weird type shenanigans we do in
the instance service (expecting `IClientApp`, then validating with a
different Joi schema etc). I think this makes it a little bit better and
updates the bits I'm touching, but I'm happy to take input if you
disagree.
2025-07-16 14:02:25 +02:00
Nuno Góis
3d78fbea7f
chore: prevent unknown flag deadlocks by sorting and batching inserts (#10348)
https://linear.app/unleash/issue/2-3692/prevent-deadlocks-by-sorting-and-batching-inserts

Tries to prevent deadlocks by sorting and batching unknown flag inserts
when flushing.
2025-07-15 08:58:42 +01:00
Nuno Góis
e51b3bb6c2
chore: allow bulk metrics with empty flag names (#10353)
https://linear.app/unleash/issue/2-3695/allow-empty-flag-names-to-be-reported-in-bulk-metrics

Accepts metrics with empty flag names in the `/api/client/metrics/bulk`
endpoint.

When testing unknown flags through Edge, which uses the `/bulk`
endpoint, we noticed that there's a slight difference in validation
behavior compared to the regular metrics endpoint. While the regular
endpoint allows empty flag names, this one does not.

We can argue that we don't care about empty flag names in the first
place, which is true, but this inconsistency between the metric
endpoints can be confusing, and it also means that a single empty flag
name evaluation would break metrics being reported for that entire Edge
instance, for example.

This way we still accept it, just like we currently do if we point to
Unleash directly instead of going through Edge.

**Note**: We noticed that, due to the slightly different logic branch,
the bulk metrics endpoint does not report unknown flags. We'll take a
look at this at a later point.
2025-07-14 14:30:06 +01:00
Thomas Heartman
ed9eccd743
chore: add application_created event type (#10351)
This is primarily to facilitate reading and processing these events in
the payg cloud section of Unleash. We only emit these in one place, so I
added the types in there.
2025-07-14 11:02:29 +00:00
Mateusz Kwasniewski
ca485959b0
feat: prefix unleash impact metrics labels (#10350) 2025-07-14 11:47:45 +02:00
Saulius Astromskis
64f7004721
chore: reduced log level of metrics log statements (#10343)
## About the changes
Reducing the log level of metrics log statements.
2025-07-11 11:55:54 +03:00
Mateusz Kwasniewski
3ea30eb7a1
feat: impact metrics total requests (#10334) 2025-07-09 14:45:51 +02:00
Mateusz Kwasniewski
d7be47609d
feat: prefix impact metrics with unleash and type (#10331) 2025-07-09 09:09:44 +02:00
Nuno Góis
3b6613360c
chore: unknown flags UI (#10332)
https://linear.app/unleash/issue/2-3682/add-unknown-flags-page-with-table-and-description

Adds a `/unknown-flags` page with a table of unknown flag reports and a
short description of what this is.

It’s only accessible via direct URL for now (if the flag is enabled),
but it allows us to share the list with some customers.

<img width="1026" alt="image"
src="https://github.com/user-attachments/assets/feee88bb-bbce-4871-98d7-f76f95076ee2"
/>

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-08 17:51:03 +01:00
Nuno Góis
43a6166673
chore: unknown flags with environment (#10325)
https://linear.app/unleash/issue/2-3681/add-environment-to-unknown-flag-reports

This does a few things:
 - Adds environment to our unknown flag reports
 - Increases our max unknown flag reports from 10 to 100
 - Reduces our clean up interval from 24 to 2 hours
- Flattens our response (easier to get started with and display in a
table, we can later decide if we want to group this data)

<img width="496" alt="image"
src="https://github.com/user-attachments/assets/11350639-9f7f-4011-8b39-b135c820ca21"
/>
2025-07-08 10:56:33 +01:00
unleash-bot[bot]
f7fcd1c4df
chore(AI): registerFrontendClient flag cleanup (#10297) 2025-07-03 10:52:48 +02:00
Mateusz Kwasniewski
661fd6febf
feat: bulk impact metrics (#10251) 2025-07-01 09:50:44 +02:00
Mateusz Kwasniewski
7c31ec71a1
feat: Count errors and gauge for heap memory (#10203) 2025-06-25 08:03:15 +02:00
Mateusz Kwasniewski
3f9db9195c
feat: count created feature links with impact metrics (#10201) 2025-06-24 13:18:06 +02:00
Tymoteusz Czech
daa6461d9b
chore: bulk metrics - remove a flag (#10190) 2025-06-23 13:25:25 +02:00
Mateusz Kwasniewski
632f3a04cb
feat: validate impact metrics (#10181) 2025-06-19 14:46:36 +02:00
Mateusz Kwasniewski
63a354ab6f
test: impact metrics e2e (#10178) 2025-06-19 12:34:22 +02:00
Simon Hornby
40c7c25db9
feat: ingest new impact metrics (#10169)
Accepts the new impact metrics into the singleton registry and then does
nothing with them. If the relevant flag is off, the metrics are stripped
from the existing metrics data format and dropped on the floor
2025-06-19 11:31:51 +02:00
Mateusz Kwasniewski
2444bd7ccd
test: impact metrics collection e2e (#10162) 2025-06-18 13:44:55 +02:00
Mateusz Kwasniewski
6f7f48a361
Revert "chore: use logger instead of console.error" (#10153)
Reverts Unleash/unleash#10150
2025-06-17 17:20:39 +02:00
Gastón Fournier
0bad9101fc
chore: use logger instead of console.error (#10150) 2025-06-17 15:37:57 +02:00
Mateusz Kwasniewski
02876a1c08
feat: expose impact metrics (#10151) 2025-06-17 14:17:46 +02:00
Mateusz Kwasniewski
d2b9751e01
feat: translate impact metrics to prom format (#10147) 2025-06-17 11:52:41 +02:00
Gastón Fournier
bdb763c9d5
chore!: remove deprecated default env from new installs (#10080)
**BREAKING CHANGE**: DEFAULT_ENV changed from `default` (should not be
used anymore) to `development`

## About the changes
- Only delete default env if the install is fresh new.
- Consider development the new default. The main consequence of this
change is that the default is no longer considered `type=production`
environment but also for frontend tokens due to this assumption:
724c4b78a2/src/lib/schema/api-token-schema.test.ts (L54-L59)
(I believe this is mostly due to the [support for admin
tokens](https://github.com/Unleash/unleash/pull/10080#discussion_r2126871567))
- `feature_toggle_update_total` metric reports `n/a` in environment and
environment type as it's not environment specific
2025-06-06 12:02:21 +02:00
Gastón Fournier
f1c2706db7
chore: prepare to remove default env (#10087)
Use DEFAULT_ENV instead of just 'default'
2025-06-06 09:20:16 +02:00
Mateusz Kwasniewski
68660e1e1f
chore: remove flag removeInactiveApplications (#10075) 2025-06-03 13:22:11 +02:00
Gastón Fournier
63bf01d211
chore: print out 10 unknown flag names (#10062)
- Move logs, and replace a debug log with just the info log while adding
appName to it
- Print out at most 10 invalid flag names
2025-05-30 12:24:41 +02:00
Gastón Fournier
27781fea47
chore: remove console.log and reuse package scripts (#10025)
Make `start:dev` re-use `dev:backend`, the only difference is start:dev
runs a clean before running
2025-05-23 12:24:03 +02:00
Jaanus Sellin
5fb718efcd
feat: custom metrics poc (#10018)
Now we can receive custom metrics, return those for UI and have extra
prometheus endpoint for it.

---------

Co-authored-by: Christopher Kolstad <chriswk@getunleash.io>
2025-05-21 16:55:30 +03:00
Christopher Kolstad
b681702b77
task: migrate tests to vitest
Vitest Pros:
* Automated failing test comments on github PRs
* A nice local UI with incremental testing when changing files (`yarn
test:ui`)
* Also nicely supported in all major IDEs, click to run test works (so
we won't miss what we had with jest).
* Works well with ESM

Vitest Cons:
* The ESBuild transformer vitest uses takes a little longer to transform
than our current SWC/jest setup, however, it is possible to setup SWC as
the transformer for vitest as well (though it only does one transform,
so we're paying ~7-10 seconds instead of ~ 2-3 seconds in transform
phase).
* Exposes how slow our tests are (tongue in cheek here)
2025-05-16 11:19:10 +02:00
Nuno Góis
4d1b44818f
chore: remove filterExistingFlagNames feature flag (#9957)
https://linear.app/unleash/issue/2-3564/remove-filterexistingflagnames-feature-flag

We're removing the `filterExistingFlagNames` feature flag since we've
decided we want this to be the default behavior.

We don't need to rush to merge it, just in case we need to disable this
for any reason. However it should also be pretty easy to just revert if
needed.

Changes in tests are a bit tricky since they assumed the previous
behavior where we always registered metrics, even for non existing flag
names. `cachedFeatureNames` is also memoized with a TTL of 10s, so the
easiest way to overcome this was to override `cachedFeatureNames` to
return what we expected. As long as they return the same flag names that
we expect, we're able to register their metrics.

Let me know if you can think of a better approach.
2025-05-16 08:52:27 +01:00
Tymoteusz Czech
4d92d54f9a
feat: track last seen clients using bulk update (#9981)
Let's not update `lastSeen` in the db on each client call
2025-05-15 13:06:54 +02:00
Gastón Fournier
abe160eb7d
feat: Unleash v7 ESM migration (#9877)
We're migrating to ESM, which will allow us to import the latest
versions of our dependencies.

Co-Authored-By: Christopher Kolstad <chriswk@getunleash.io>
2025-05-14 09:47:12 +02:00
Mateusz Kwasniewski
e414c4446d
feat: remove instances older than 1 day not 2 days (#9944) 2025-05-09 13:58:52 +02:00
Nuno Góis
bfc583b5b7
chore: prevent duplicate key errors in unknown flags (#9940)
https://linear.app/unleash/issue/2-3561/fix-duplicate-key-errors-in-unknown-flags

This should prevent `duplicate_key` errors in unknown flags.

Follow-up to: https://github.com/Unleash/unleash/pull/9837

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-09 10:02:38 +01:00
Nuno Góis
eb238f502a
chore: unknown flags (#9837)
https://linear.app/unleash/issue/2-3406/hold-unknown-flags-in-memory-and-show-them-in-the-ui-somehow

This PR introduces a suggestion for a “unknown flags” feature.

When clients report metrics for flags that don’t exist in Unleash (e.g.
due to typos), we now track a limited set of these unknown flag names
along with the appnames that reported them. The goal is to help users
identify and clean up incorrect flag usage across their apps.

We store up to 10 unknown flag + appName combinations, keeping only the
most recent reports. Data is collected in-memory and flushed
periodically to the DB, with deduplication and merging to ensure we
don’t exceed the cap even across pods.

We were especially careful to make this implementation defensive, as
unknown flags could be reported in very high volumes. Writes are
batched, deduplicated, and hard-capped to avoid DB pressure.

No UI has been added yet — this is backend-only for now and intended as
a step toward better visibility into client misconfigurations.

I would suggest starting with a simple banner that opens a dialog
showing the list of unknown flags and which apps reported them.

<img width="497" alt="image"
src="https://github.com/user-attachments/assets/b7348e0d-0163-4be4-a7f8-c072e8464331"
/>
2025-05-07 11:48:36 +01:00
Mateusz Kwasniewski
1b9c0e5000
feat: bulk apps should respect multi projects and multi envs (#9879) 2025-05-02 10:12:41 +02:00
Mateusz Kwasniewski
3ef32dca93
feat: handle nullable sdk type (#9872) 2025-04-30 12:36:18 +02:00
Mateusz Kwasniewski
58a01d0c47
feat: separate frontend and backend applications from edge (#9863) 2025-04-29 15:42:47 +02:00
Mateusz Kwasniewski
3980cfa2a8
feat: show backend and frontend sdks separately (#9857) 2025-04-29 10:36:02 +02:00
Mateusz Kwasniewski
1ccc6cae19
feat: Spike frontend applications registration (#9846) 2025-04-28 09:01:07 +02:00
Mateusz Kwasniewski
d24bcff404
feat: remove inactive applications (#9835) 2025-04-24 15:17:47 +02:00
Mateusz Kwasniewski
67d59d6141
chore: aggregate daily metrics query time instrumentation (#9764) 2025-04-15 14:52:03 +02:00
Fredrik Strand Oseberg
832b651f5b
fix: flaky test once an hour (#9615)
This test was flaky once an hour because subminutes 3 made it fall into
the wrong bucket when tests were run exactly or minutes after the our
had passed.

Also, the databases created were created with the system clock. I
altered it to be explicitly UTC.
2025-03-25 22:25:32 +01:00
Christopher Kolstad
efcf04487d
chore: make it build with strict null checks set to true (#9554)
As part of preparation for ESM and node/TSC updates, this PR will make
Unleash build with strictNullChecks set to true, since that's what's in
our tsconfig file. Hence, this PR also removes the `--strictNullChecks
false` flag in our compile tasks in package.json.

TL;DR - Clean up your code rather than turning off compiler security
features :)
2025-03-19 10:01:49 +01:00
Jaanus Sellin
9ae9221960
feat: now instances are only shown for last 24 hours (#9372) 2025-02-27 09:19:48 +02:00