1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-08-18 13:48:58 +02:00

fix: decouple metrics from ofter-read table

Signed-off-by: andreas-unleash <andreas@getunleash.ai>
This commit is contained in:
andreas-unleash 2023-09-19 14:04:10 +03:00
parent 12d9297f68
commit db6dd27d04
No known key found for this signature in database
GPG Key ID: DB82A1577B38F66B
3 changed files with 119 additions and 3 deletions

View File

@ -507,6 +507,11 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
'feature_environments.feature_name',
'features.name',
)
.leftJoin(
'feature_environments_metrics',
'feature_environments_metrics.feature_name',
'features.name',
)
.leftJoin(
'environments',
'feature_environments.environment',
@ -525,7 +530,7 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore {
'feature_environments.enabled as enabled',
'feature_environments.environment as environment',
'feature_environments.variants as variants',
'feature_environments.last_seen_at as env_last_seen_at',
'feature_environments_metrics.last_seen_at as env_last_seen_at',
'environments.type as environment_type',
'environments.sort_order as environment_sort_order',
'ft.tag_value as tag_value',

View File

@ -42,6 +42,7 @@ interface VariantDTO {
}
const TABLE = 'features';
const FEATURE_ENVIRONMENTS_METRICS_TABLE = 'feature_environments_metrics';
const FEATURE_ENVIRONMENTS_TABLE = 'feature_environments';
export default class FeatureToggleStore implements IFeatureToggleStore {
@ -175,12 +176,12 @@ export default class FeatureToggleStore implements IFeatureToggleStore {
try {
for (const env of Object.keys(environmentArrays)) {
const toggleNames = environmentArrays[env].sort();
await this.db(FEATURE_ENVIRONMENTS_TABLE)
await this.db(FEATURE_ENVIRONMENTS_METRICS_TABLE)
.update({ last_seen_at: now })
.where('environment', env)
.whereIn(
'feature_name',
this.db(FEATURE_ENVIRONMENTS_TABLE)
this.db(FEATURE_ENVIRONMENTS_METRICS_TABLE)
.select('feature_name')
.whereIn('feature_name', toggleNames)
.forUpdate()

View File

@ -0,0 +1,110 @@
'use strict';
exports.up = function (db, cb) {
db.runSql(
`
CREATE TABLE IF NOT EXISTS feature_environments_metrics(
environment varchar(100) not null
references environments(name)
on delete cascade,
feature_name varchar(255) not null
references features(name)
on delete cascade,
last_seen_at timestamp with time zone,
primary key (environment, feature_name)
);
INSERT INTO feature_environments_metrics (environment, feature_name, last_seen_at)
SELECT
feature_environments.environment,
feature_environments.feature_name,
feature_environments.last_seen_at
FROM feature_environments
ON CONFLICT (environment, feature_name)
DO NOTHING;
DROP VIEW features_view;
CREATE VIEW features_view AS
SELECT features.name as name,
features.description as description,
features.type as type,
features.project as project,
features.stale as stale,
features.impression_data as impression_data,
features.created_at as created_at,
features.archived_at as archived_at,
features.last_seen_at as last_seen_at,
feature_environments_metrics.last_seen_at as env_last_seen_at,
feature_environments.enabled as enabled,
feature_environments.environment as environment,
feature_environments.variants as variants,
environments.name as environment_name,
environments.type as environment_type,
environments.sort_order as environment_sort_order,
feature_strategies.id as strategy_id,
feature_strategies.strategy_name as strategy_name,
feature_strategies.parameters as parameters,
feature_strategies.constraints as constraints,
feature_strategies.sort_order as sort_order,
fss.segment_id as segments,
feature_strategies.title as strategy_title,
feature_strategies.disabled as strategy_disabled,
feature_strategies.variants as strategy_variants
FROM features
LEFT JOIN feature_environments ON feature_environments.feature_name = features.name
LEFT JOIN feature_environments_metrics ON feature_environments_metrics.feature_name = features.name
LEFT JOIN feature_strategies ON feature_strategies.feature_name = feature_environments.feature_name
and feature_strategies.environment = feature_environments.environment
LEFT JOIN environments ON feature_environments.environment = environments.name
LEFT JOIN feature_strategy_segment as fss ON fss.feature_strategy_id = feature_strategies.id;
`,
cb(),
);
};
exports.down = function (db, cb) {
db.runSql(
`
DROP VIEW features_view;
CREATE VIEW features_view AS
SELECT
features.name as name,
features.description as description,
features.type as type,
features.project as project,
features.stale as stale,
features.impression_data as impression_data,
features.created_at as created_at,
features.archived_at as archived_at,
features.last_seen_at as last_seen_at,
feature_environments.last_seen_at as env_last_seen_at,
feature_environments.enabled as enabled,
feature_environments.environment as environment,
feature_environments.variants as variants,
environments.name as environment_name,
environments.type as environment_type,
environments.sort_order as environment_sort_order,
feature_strategies.id as strategy_id,
feature_strategies.strategy_name as strategy_name,
feature_strategies.parameters as parameters,
feature_strategies.constraints as constraints,
feature_strategies.sort_order as sort_order,
fss.segment_id as segments,
feature_strategies.title as strategy_title,
feature_strategies.disabled as strategy_disabled,
feature_strategies.variants as strategy_variants
FROM
features
LEFT JOIN feature_environments ON feature_environments.feature_name = features.name
LEFT JOIN feature_strategies ON feature_strategies.feature_name = feature_environments.feature_name
and feature_strategies.environment = feature_environments.environment
LEFT JOIN environments ON feature_environments.environment = environments.name
LEFT JOIN feature_strategy_segment as fss ON fss.feature_strategy_id = feature_strategies.id;
DROP TABLE IF EXISTS feature_environments_metrics
`,
cb,
);
};