Skip to content

Commit

Permalink
feat(groups): consolidate shread logic for stress group type (#168)
Browse files Browse the repository at this point in the history
  • Loading branch information
aaronkvanmeerten authored Dec 12, 2024
1 parent a8fa8a4 commit ab6cf46
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 214 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ An autoscaler for Jitsi instances (`jibri`, `sip-jibri`, `jigasi`, `JVB`, `nomad
* as a Droplet in Digital Ocean
* custom deployment model

The autoscaler manages multiple `groups` of instances, each having a `type` (`jibri`, `sip-jibri`, `jigasi`, `JVB`, `nomad`, `whisper`) and being deployed in a specific `cloud` (`oracle`, `digitalocean`, `custom`).
The autoscaler manages multiple `groups` of instances, each having a `type` `stress`or `availability` and being deployed in a specific `cloud` (`oracle`, `digitalocean`, `custom`).

The autoscaler knows the Jitsi instances status and communicates with them via the [jitsi-autoscaler-sidecar](https://github.com/jitsi/jitsi-autoscaler-sidecar),
which needs to be co-located on each Jitsi instance. The sidecar periodically checks in with the autoscaler via a REST call and sends its status.
Expand Down
4 changes: 3 additions & 1 deletion src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -630,7 +630,9 @@ app.put(
body('options.scaleDownPeriodsCount').optional().isInt({ min: 0 }).withMessage('Value must be positive'),
body('instanceType').custom(async (value) => {
if (!(await validator.supportedInstanceType(value))) {
throw new Error('Instance type not supported. Use jvb, jigasi, nomad, jibri, whisper or sip-jibri instead');
throw new Error(
'Instance type not supported. Use stress, availabity, jvb, jigasi, nomad, jibri, whisper or sip-jibri instead',
);
}
return true;
}),
Expand Down
19 changes: 9 additions & 10 deletions src/autoscaler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,20 +192,18 @@ export default class AutoscaleProcessor {
switch (group.type) {
case 'jibri':
case 'sip-jibri':
// in the jibri case only scale up if value (available count) is below threshold
case 'availability':
// in the availability case only scale up if value (available count) is below threshold
return (
(count < group.scalingOptions.maxDesired && value < group.scalingOptions.scaleUpThreshold) ||
count < group.scalingOptions.minDesired
);
case 'jigasi':
case 'nomad':
case 'JVB':
// in the case of JVB scale up only if value (average stress level) is above or equal to threshhold
return (
(count < group.scalingOptions.maxDesired && value >= group.scalingOptions.scaleUpThreshold) ||
count < group.scalingOptions.minDesired
);
case 'whisper':
case 'stress':
// in the case of stress scale up only if value (average stress level) is above or equal to threshhold
return (
(count < group.scalingOptions.maxDesired && value >= group.scalingOptions.scaleUpThreshold) ||
count < group.scalingOptions.minDesired
Expand All @@ -218,14 +216,15 @@ export default class AutoscaleProcessor {
switch (group.type) {
case 'jibri':
case 'sip-jibri':
// in the jibri case only scale up if value (available count) is above threshold
case 'availability':
// in the availability case only scale up if value (available count) is above threshold
return count > group.scalingOptions.minDesired && value > group.scalingOptions.scaleDownThreshold;
case 'jigasi':
case 'nomad':
case 'JVB':
// in the case of JVB scale down only if value (average stress level) is below threshhold
return count > group.scalingOptions.minDesired && value < group.scalingOptions.scaleDownThreshold;
case 'whisper':
case 'JVB':
case 'stress':
// in the case of stress scale down only if value (average stress level) is below threshhold
return count > group.scalingOptions.minDesired && value < group.scalingOptions.scaleDownThreshold;
}

Expand Down
73 changes: 34 additions & 39 deletions src/group_report.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { CloudInstance } from './cloud_manager';
import ShutdownManager from './shutdown_manager';
import MetricsLoop from './metrics_loop';
import ReconfigureManager from './reconfigure_manager';
import { InstanceGroup, InstanceState, JibriStatusState } from './instance_store';
import { InstanceGroup, InstanceState, JibriStatusState, StressStatus } from './instance_store';

export interface InstanceReport {
instanceId: string;
Expand Down Expand Up @@ -148,6 +148,7 @@ export default class GroupReportGenerator {
switch (group.type) {
case 'jibri':
case 'sip-jibri':
case 'availability':
if (instanceReport.scaleStatus == JibriStatusState.Idle) {
groupReport.availableCount++;
}
Expand All @@ -162,6 +163,7 @@ export default class GroupReportGenerator {
case 'nomad':
case 'whisper':
case 'JVB':
case 'stress':
// @TODO: implement JVB instance counting
break;
}
Expand Down Expand Up @@ -209,57 +211,50 @@ export default class GroupReportGenerator {
} else if (instanceState.status.provisioning) {
instanceReport.scaleStatus = 'PROVISIONING';
} else {
let stats: StressStatus;
switch (group.type) {
case 'jibri':
case 'sip-jibri':
case 'availability':
instanceReport.scaleStatus = 'SIDECAR_RUNNING';
if (instanceState.status.jibriStatus && instanceState.status.jibriStatus.busyStatus) {
instanceReport.scaleStatus = instanceState.status.jibriStatus.busyStatus.toString();
}
break;
case 'nomad':
// @TODO: convert nomad stats into more explict statuses
instanceReport.scaleStatus = 'SIDECAR_RUNNING';
if (instanceState.status.nomadStatus && instanceState.status.nomadStatus.allocatedCPU > 1000) {
instanceReport.scaleStatus = 'IN USE';
}
if (
instanceState.status.jigasiStatus &&
!instanceState.status.nomadStatus.eligibleForScheduling
) {
instanceReport.scaleStatus = 'GRACEFUL SHUTDOWN';
}
break;
case 'jigasi':
// @TODO: convert Jigasi stats into more explict statuses
instanceReport.scaleStatus = 'ONLINE';
if (instanceState.status.jigasiStatus && instanceState.status.jigasiStatus.participants) {
instanceReport.scaleStatus = 'IN USE';
}
if (instanceState.status.jigasiStatus && instanceState.status.jigasiStatus.graceful_shutdown) {
instanceReport.scaleStatus = 'GRACEFUL SHUTDOWN';
}
break;
case 'JVB':
// @TODO: convert JVB stats into more explict statuses
instanceReport.scaleStatus = 'ONLINE';
if (instanceState.status.jvbStatus && instanceState.status.jvbStatus.participants) {
instanceReport.scaleStatus = 'IN USE';
}
if (instanceState.status.jvbStatus && instanceState.status.jvbStatus.graceful_shutdown) {
instanceReport.scaleStatus = 'GRACEFUL SHUTDOWN';
}
break;
case 'whisper':
case 'stress':
stats = <StressStatus>(
(instanceState.status.stats
? instanceState.status.stats
: instanceState.status.jvbStatus
? instanceState.status.jvbStatus
: instanceState.status.jigasiStatus
? instanceState.status.jigasiStatus
: instanceState.status.whisperStatus
? instanceState.status.whisperStatus
: instanceState.status.nomadStatus
? instanceState.status.nomadStatus
: null)
);

instanceReport.scaleStatus = 'ONLINE';
if (instanceState.status.whisperStatus && instanceState.status.whisperStatus.connections) {
instanceReport.scaleStatus = 'IN USE';
}
if (
instanceState.status.whisperStatus &&
instanceState.status.whisperStatus.graceful_shutdown
) {
instanceReport.scaleStatus = 'GRACEFUL SHUTDOWN';
if (stats) {
instanceReport.scaleStatus = 'SIDECAR_RUNNING';
if (stats.participants) {
instanceReport.scaleStatus = 'IN USE';
}
if (stats.connections) {
instanceReport.scaleStatus = 'IN USE';
}
if (stats.allocatedCPU > 1000) {
instanceReport.scaleStatus = 'IN USE';
}
if (stats.graceful_shutdown) {
instanceReport.scaleStatus = 'GRACEFUL SHUTDOWN';
}
}
break;
}
Expand Down
Loading

0 comments on commit ab6cf46

Please sign in to comment.