Skip to content

Commit

Permalink
chore: Establish a baseline for the number of envs disabled per proje…
Browse files Browse the repository at this point in the history
…ct (#6807)

This PR adds a counter in Prometheus for counting the number of
"environment disabled" events we get per project. The purpose of this is
to establish a baseline for one of the "project management UI" project's
key results.

## On gauges vs counters

This PR uses a counter. Using a gauge would give you the total number of
envs disabled, not the number of disable events. The difference is
subtle, but important.

For projects that were created before the new feature, the gauge might
be appropriate. Because each disabled env would require at least one
disabled event, we can get a floor of how many events were triggered for
each project.

However, for projects created after we introduce the planned change,
we're not interested in the total envs anymore, because you can disable
a hundred envs on creation with a single action. In this case, a gauge
showing 100 disabled envs would be misleading, because it didn't take
100 events to disable them.

So the interesting metric here is how many times did you specifically
disable an environment in project settings, hence the counter.

## Assumptions and future plans

To make this easier on ourselves, we make the follow assumption: people
primarily disable envs **when creating a project**.

This means that there might be a few lagging indicators granting some
projects a smaller number of events than expected, but we may be able to
filter those out.

Further, if we had a metric for each project and its creation date, we
could correlate that with the metrics to answer the question "how many
envs do people disable in the first week? Two weeks? A month?". Or
worded differently: after creating a project, how long does it take for
people to configure environments?

Similarly, if we gather that data, it will also make filtering out the
number of events for projects created **after** the new changes have
been released much easier.

The good news: Because the project creation metric with dates is a
static aggregate, it can be applied at any time, even retroactively, to
see the effects.
  • Loading branch information
thomasheartman committed Apr 10, 2024
1 parent fb9855c commit cfd9e48
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/lib/metrics.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
CLIENT_REGISTER,
FEATURE_ENVIRONMENT_ENABLED,
FEATURE_UPDATED,
PROJECT_ENVIRONMENT_REMOVED,
} from './types/events';
import { createMetricsMonitor } from './metrics';
import createStores from '../test/fixtures/store';
Expand Down Expand Up @@ -258,3 +259,19 @@ test('Should not collect client sdk version if sdkVersion is of wrong format or
);
expect(metrics).not.toMatch(/unleash-client-rust/);
});

test('should collect metrics for project disabled numbers', async () => {
eventStore.emit(PROJECT_ENVIRONMENT_REMOVED, {
project: 'default',
environment: 'staging',
createdBy: 'Jay',
createdByUserId: 26,
});

const recordedMetric = await prometheusRegister.getSingleMetricAsString(
'project_environments_disabled',
);
expect(recordedMetric).toMatch(
/project_environments_disabled{project_id=\"default\"} 1/,
);
});
10 changes: 10 additions & 0 deletions src/lib/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
FEATURE_UPDATED,
CLIENT_METRICS,
CLIENT_REGISTER,
PROJECT_ENVIRONMENT_REMOVED,
} from './types/events';
import type { IUnleashConfig } from './types/option';
import type { IUnleashStores } from './types/stores';
Expand Down Expand Up @@ -258,6 +259,12 @@ export default class MetricsMonitor {
help: 'Duration of mapFeaturesForClient function',
});

const projectEnvironmentsDisabled = createCounter({
name: 'project_environments_disabled',
help: 'How many "environment disabled" events we have received for each project',
labelNames: ['project_id'],
});

async function collectStaticCounters() {
try {
const stats = await instanceStatsService.getStats();
Expand Down Expand Up @@ -607,6 +614,9 @@ export default class MetricsMonitor {
});
}
});
eventStore.on(PROJECT_ENVIRONMENT_REMOVED, ({ project }) => {
projectEnvironmentsDisabled.increment({ project_id: project });
});

await this.configureDbMetrics(db, eventBus, schedulerService);

Expand Down

0 comments on commit cfd9e48

Please sign in to comment.