Skip to content

Commit

Permalink
feat: Unique connection tracking (#9067)
Browse files Browse the repository at this point in the history
  • Loading branch information
kwasniew authored Jan 8, 2025
1 parent 73515d7 commit cef10ee
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/lib/metrics.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ test('should collect metrics for requests', async () => {

const metrics = await prometheusRegister.metrics();
expect(metrics).toMatch(
/http_request_duration_milliseconds\{quantile="0\.99",path="somePath",method="GET",status="200",appName="undefined"\}.*1337/,
/http_request_duration_milliseconds\{quantile="0\.99",path="somePath",method="GET",status="200",appName="undefined",connectionId="undefined"\}.*1337/,
);
});

Expand Down
5 changes: 3 additions & 2 deletions src/lib/metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ export function registerPrometheusMetrics(
const requestDuration = createSummary({
name: 'http_request_duration_milliseconds',
help: 'App response time',
labelNames: ['path', 'method', 'status', 'appName'],
labelNames: ['path', 'method', 'status', 'appName', 'connectionId'],
percentiles: [0.1, 0.5, 0.9, 0.95, 0.99],
maxAgeSeconds: 600,
ageBuckets: 5,
Expand Down Expand Up @@ -700,13 +700,14 @@ export function registerPrometheusMetrics(

eventBus.on(
events.REQUEST_TIME,
({ path, method, time, statusCode, appName }) => {
({ path, method, time, statusCode, appName, connectionId }) => {
requestDuration
.labels({
path,
method,
status: statusCode,
appName,
connectionId,
})
.observe(time);
},
Expand Down
10 changes: 9 additions & 1 deletion src/lib/middleware/response-time-metrics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,19 @@ export function responseTimeMetrics(
// when pathname is undefined use a fallback
pathname = pathname ?? collapse(req.path);
let appName: string | undefined;
let connectionId: string | undefined;
if (
!flagResolver.isEnabled('responseTimeWithAppNameKillSwitch') &&
(instanceStatsService.getAppCountSnapshot('7d') ??
appNameReportingThreshold) < appNameReportingThreshold
) {
appName = req.headers['unleash-appname'] ?? req.query.appName;
appName =
req.headers['x-unleash-appname'] ??
req.headers['unleash-appname'] ??
req.query.appName;
if (flagResolver.isEnabled('uniqueSdkTracking')) {
connectionId = req.headers['x-unleash-connection-id'];
}
}

const timingInfo = {
Expand All @@ -69,6 +76,7 @@ export function responseTimeMetrics(
statusCode,
time,
appName,
connectionId,
};
if (!res.locals.responseTimeEmitted) {
res.locals.responseTimeEmitted = true;
Expand Down
7 changes: 6 additions & 1 deletion src/lib/types/experimental.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ export type IFlagKey =
| 'etagVariant'
| 'oidcRedirect'
| 'deltaApi'
| 'newHostedAuthHandler';
| 'newHostedAuthHandler'
| 'uniqueSdkTracking';

export type IFlags = Partial<{ [key in IFlagKey]: boolean | Variant }>;

Expand Down Expand Up @@ -290,6 +291,10 @@ const flags: IFlags = {
process.env.UNLEASH_EXPERIMENTAL_NEW_HOSTED_AUTH_HANDLER,
false,
),
uniqueSdkTracking: parseEnvVarBoolean(
process.env.UNLEASH_EXPERIMENTAL_UNIQUE_SDK_TRACKING,
false,
),
};

export const defaultExperimentalOptions: IExperimentalOptions = {
Expand Down

0 comments on commit cef10ee

Please sign in to comment.