Skip to content

Commit

Permalink
feat: Monitoring & Alarming
Browse files Browse the repository at this point in the history
  • Loading branch information
giantcow committed Mar 3, 2023
1 parent 61bf2bb commit e47309f
Show file tree
Hide file tree
Showing 6 changed files with 806 additions and 47 deletions.
3 changes: 2 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ VALHEIM_DOCKER_STEAMCMD_ARGS="validate"

# Config values specific to this package
APPGW_START_STOP_PASSWORD="changeme" # You should really change this if you want to use this feature
BOOTSTRAP_WITH_WORLD_NAME=""
BOOTSTRAP_WITH_WORLD_NAME=""
DISCORD_WEBHOOK_URL_FOR_ALARMS=""
10 changes: 8 additions & 2 deletions bin/valheim-server-aws-cdk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import "source-map-support/register";
import { ValheimServerAwsCdkStack } from "../lib/valheim-server-aws-cdk-stack";
import { LambdaEcsFargateUpdownstatusStack } from '../lib/lambda-ecs-fargate-updownstatus-stack';
import { Construct } from "constructs";
import { Annotations, App, Fn } from "aws-cdk-lib";
import { Annotations, App } from "aws-cdk-lib";
import { config } from "dotenv";
import { readdir } from "fs/promises";
import WorldBootstrapResourcesStack from "../lib/world-bootstrap-resources-stack";
import { readdirSync } from "fs";
import { MonitoringStack } from "../lib/monitoring";
config();

const BOOTSTRAP_WITH_WORLD_NAME = process.env.BOOTSTRAP_WITH_WORLD_NAME;
Expand Down Expand Up @@ -48,6 +48,11 @@ class ValheimServer extends Construct {
});
lambdaStack.addDependency(ecsStack);
}

new MonitoringStack(this, "ValheimServerMonitoringStack", {
fargateService: ecsStack.valheimService,
discordWebhookUrl: DISCORD_WEBHOOK_URL_FOR_ALARMS,
})
}
}

Expand All @@ -64,6 +69,7 @@ const getWorldAssetLocations = () => {
const app = new App();
const worldAssetLocations = getWorldAssetLocations();
const APPGW_START_STOP_PASSWORD = process.env.APPGW_START_STOP_PASSWORD;
const DISCORD_WEBHOOK_URL_FOR_ALARMS = process.env.DISCORD_WEBHOOK_URL_FOR_ALARMS;

new ValheimServer(app, "ValheimServer", {
worldAssetLocations,
Expand Down
90 changes: 90 additions & 0 deletions lib/monitoring.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import { Duration, Stack, StackProps } from "aws-cdk-lib";
import { TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
import { FargateService } from "aws-cdk-lib/aws-ecs";
import { Runtime } from "aws-cdk-lib/aws-lambda";
import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
import { Topic } from "aws-cdk-lib/aws-sns";
import { LambdaSubscription } from "aws-cdk-lib/aws-sns-subscriptions";
import { AlarmFactoryDefaults, MonitoringFacade, SnsAlarmActionStrategy } from "cdk-monitoring-constructs";
import { Construct } from "constructs";

interface MonitoringStackProps extends StackProps {
fargateService: FargateService;
discordWebhookUrl?: string;
}

export class MonitoringStack extends Stack {
constructor(scope: Construct, id: string, props: MonitoringStackProps) {
super(scope, id, props);

const { fargateService } = props;

let alarmFactoryDefaults: AlarmFactoryDefaults = {
actionsEnabled: false,
alarmNamePrefix: "ValheimCDK",
};

if (props.discordWebhookUrl) {
const topicForDiscordNotif = new Topic(this, "AlarmTopic");
const embedAlarmInDiscordLambda = new NodejsFunction(this, "EmbedAlarmInDiscordLambda", {
runtime: Runtime.NODEJS_18_X,
entry: 'resources/embedAlarmInDiscordLambda.ts',
handler: "handler",
bundling: {
nodeModules: ['discord.js'],
},
environment: {
DISCORD_WEBHOOK_URL: props.discordWebhookUrl,
}
});
topicForDiscordNotif.addSubscription(new LambdaSubscription(embedAlarmInDiscordLambda));

alarmFactoryDefaults = {
...alarmFactoryDefaults,
actionsEnabled: true,
action: new SnsAlarmActionStrategy({
onAlarmTopic: topicForDiscordNotif,
onOkTopic: topicForDiscordNotif,
}),
}
}

const monitoring = new MonitoringFacade(this, "Monitoring", {
alarmFactoryDefaults,
});

monitoring
.monitorSimpleFargateService({
fargateService,

addCpuUsageAlarm: {
"CRITICAL": {
maxUsagePercent: 95,
datapointsToAlarm: 3,
period: Duration.minutes(1),
treatMissingDataOverride: TreatMissingData.IGNORE,
},
"WARNING": {
maxUsagePercent: 90,
datapointsToAlarm: 10,
period: Duration.minutes(1),
treatMissingDataOverride: TreatMissingData.IGNORE,
}
},
addMemoryUsageAlarm: {
"CRITICAL": {
maxUsagePercent: 95,
datapointsToAlarm: 3,
period: Duration.minutes(1),
treatMissingDataOverride: TreatMissingData.IGNORE,
},
"WARNING": {
maxUsagePercent: 90,
datapointsToAlarm: 10,
period: Duration.minutes(1),
treatMissingDataOverride: TreatMissingData.IGNORE,
}
}
});
}
}
Loading

0 comments on commit e47309f

Please sign in to comment.