@wheatstalk/cdk-crashy-task-metrics
Version:
Create metrics and alarms for ECS tasks that stop for reasons other than scaling activities. (i.e., crashes.)
90 lines • 10.4 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CrashyTaskMetrics = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = require("path");
const cw = require("@aws-cdk/aws-cloudwatch");
const events = require("@aws-cdk/aws-events");
const events_targets = require("@aws-cdk/aws-events-targets");
const iam = require("@aws-cdk/aws-iam");
const lambda = require("@aws-cdk/aws-lambda");
const logs = require("@aws-cdk/aws-logs");
const cdk = require("@aws-cdk/core");
/**
* Provide metrics for crashy tasks run by an ECS Service.
*
* @stability stable
*/
class CrashyTaskMetrics extends cdk.Construct {
/**
* @stability stable
*/
constructor(scope, id, props) {
var _b, _c;
super(scope, id);
// Defaults
this.metricNamespace = (_b = props.metricNamespace) !== null && _b !== void 0 ? _b : 'cdk-crashy-task-metrics';
this.metricName = (_c = props.metricName) !== null && _c !== void 0 ? _c : 'TaskCrashes';
this.service = props.service;
const putMetricFunction = new lambda.Function(this, 'PutMetricFunction', {
runtime: lambda.Runtime.NODEJS_14_X,
handler: 'put-metric.putTaskCrashedMetric',
code: lambda.Code.fromAsset(path.join(__dirname, '..', 'functions')),
initialPolicy: [
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
resources: ['*'],
actions: ['cloudwatch:PutMetricData'],
}),
],
logRetention: logs.RetentionDays.ONE_DAY,
});
new events.Rule(this, 'TaskCrashed', {
eventPattern: renderEventPattern(props.service),
targets: [new events_targets.LambdaFunction(putMetricFunction, {
event: events.RuleTargetInput.fromObject({
metricNamespace: this.metricNamespace,
metricName: this.metricName,
ecsTaskStateChangeEvent: events.EventField.fromPath('$'),
}),
})],
});
}
/**
* Provide a metric for task crashes.
*
* @stability stable
*/
metricTaskCrashes(props = {}) {
return new cw.Metric({
namespace: this.metricNamespace,
metricName: this.metricName,
dimensionsMap: {
clusterArn: this.service.cluster.clusterArn,
group: cdk.Fn.join(':', ['service', this.service.serviceName]),
},
statistic: 'sum',
...props,
});
}
}
exports.CrashyTaskMetrics = CrashyTaskMetrics;
_a = JSII_RTTI_SYMBOL_1;
CrashyTaskMetrics[_a] = { fqn: "@wheatstalk/cdk-crashy-task-metrics.CrashyTaskMetrics", version: "0.0.107" };
function renderEventPattern(service) {
return {
source: ['aws.ecs'],
detailType: ['ECS Task State Change'],
detail: {
lastStatus: ['STOPPED'],
group: [cdk.Fn.join(':', ['service', service.serviceName])],
stoppedReason: [{
'anything-but': {
prefix: 'Scaling activity',
},
}],
},
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jhc2h5LXRhc2stbWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jcmFzaHktdGFzay1tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkJBQTZCO0FBQzdCLDhDQUE4QztBQUU5Qyw4Q0FBOEM7QUFDOUMsOERBQThEO0FBQzlELHdDQUF3QztBQUN4Qyw4Q0FBOEM7QUFDOUMsMENBQTBDO0FBQzFDLHFDQUFxQzs7Ozs7O0FBZXJDLE1BQWEsaUJBQWtCLFNBQVEsR0FBRyxDQUFDLFNBQVM7Ozs7SUFLbEQsWUFBWSxLQUFvQixFQUFFLEVBQVUsRUFBRSxLQUE2Qjs7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixXQUFXO1FBQ1gsSUFBSSxDQUFDLGVBQWUsU0FBRyxLQUFLLENBQUMsZUFBZSxtQ0FBSSx5QkFBeUIsQ0FBQztRQUMxRSxJQUFJLENBQUMsVUFBVSxTQUFHLEtBQUssQ0FBQyxVQUFVLG1DQUFJLGFBQWEsQ0FBQztRQUNwRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFFN0IsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ3ZFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLGlDQUFpQztZQUMxQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3BFLGFBQWEsRUFBRTtnQkFDYixJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7b0JBQ3RCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUs7b0JBQ3hCLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDaEIsT0FBTyxFQUFFLENBQUMsMEJBQTBCLENBQUM7aUJBQ3RDLENBQUM7YUFDSDtZQUNELFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU87U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDbkMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDL0MsT0FBTyxFQUFFLENBQUMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLGlCQUFpQixFQUFFO29CQUM3RCxLQUFLLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7d0JBQ3ZDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZTt3QkFDckMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO3dCQUMzQix1QkFBdUIsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7cUJBQ3pELENBQUM7aUJBQ0gsQ0FBQyxDQUFDO1NBQ0osQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBR0QsaUJBQWlCLENBQUMsUUFBMEIsRUFBRTtRQUM1QyxPQUFPLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDL0IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLGFBQWEsRUFBRTtnQkFDYixVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVTtnQkFDM0MsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQy9EO1lBQ0QsU0FBUyxFQUFFLEtBQUs7WUFDaEIsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFuREgsOENBb0RDOzs7QUFFRCxTQUFTLGtCQUFrQixDQUFDLE9BQXFCO0lBQy9DLE9BQU87UUFDTCxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbkIsVUFBVSxFQUFFLENBQUMsdUJBQXVCLENBQUM7UUFDckMsTUFBTSxFQUFFO1lBQ04sVUFBVSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3ZCLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUMzRCxhQUFhLEVBQUUsQ0FBQztvQkFDZCxjQUFjLEVBQUU7d0JBQ2QsTUFBTSxFQUFFLGtCQUFrQjtxQkFDM0I7aUJBQ0YsQ0FBQztTQUNIO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgY3cgZnJvbSAnQGF3cy1jZGsvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gJ0Bhd3MtY2RrL2F3cy1lY3MnO1xuaW1wb3J0ICogYXMgZXZlbnRzIGZyb20gJ0Bhd3MtY2RrL2F3cy1ldmVudHMnO1xuaW1wb3J0ICogYXMgZXZlbnRzX3RhcmdldHMgZnJvbSAnQGF3cy1jZGsvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdAYXdzLWNkay9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdAYXdzLWNkay9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnQGF3cy1jZGsvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ0Bhd3MtY2RrL2NvcmUnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuZXhwb3J0IGludGVyZmFjZSBDcmFzaHlUYXNrTWV0cmljc1Byb3BzIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IHNlcnZpY2U6IGVjcy5GYXJnYXRlU2VydmljZSB8IGVjcy5FYzJTZXJ2aWNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBtZXRyaWNOYW1lc3BhY2U/OiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICByZWFkb25seSBtZXRyaWNOYW1lPzogc3RyaW5nO1xufVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBjbGFzcyBDcmFzaHlUYXNrTWV0cmljcyBleHRlbmRzIGNkay5Db25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldHJpY05hbWVzcGFjZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1ldHJpY05hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlOiBlY3MuRmFyZ2F0ZVNlcnZpY2UgfCBlY3MuRWMyU2VydmljZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY2RrLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENyYXNoeVRhc2tNZXRyaWNzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gRGVmYXVsdHNcbiAgICB0aGlzLm1ldHJpY05hbWVzcGFjZSA9IHByb3BzLm1ldHJpY05hbWVzcGFjZSA/PyAnY2RrLWNyYXNoeS10YXNrLW1ldHJpY3MnO1xuICAgIHRoaXMubWV0cmljTmFtZSA9IHByb3BzLm1ldHJpY05hbWUgPz8gJ1Rhc2tDcmFzaGVzJztcbiAgICB0aGlzLnNlcnZpY2UgPSBwcm9wcy5zZXJ2aWNlO1xuXG4gICAgY29uc3QgcHV0TWV0cmljRnVuY3Rpb24gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsICdQdXRNZXRyaWNGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgaGFuZGxlcjogJ3B1dC1tZXRyaWMucHV0VGFza0NyYXNoZWRNZXRyaWMnLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdmdW5jdGlvbnMnKSksXG4gICAgICBpbml0aWFsUG9saWN5OiBbXG4gICAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICBhY3Rpb25zOiBbJ2Nsb3Vkd2F0Y2g6UHV0TWV0cmljRGF0YSddLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgICBsb2dSZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfREFZLFxuICAgIH0pO1xuXG4gICAgbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdUYXNrQ3Jhc2hlZCcsIHtcbiAgICAgIGV2ZW50UGF0dGVybjogcmVuZGVyRXZlbnRQYXR0ZXJuKHByb3BzLnNlcnZpY2UpLFxuICAgICAgdGFyZ2V0czogW25ldyBldmVudHNfdGFyZ2V0cy5MYW1iZGFGdW5jdGlvbihwdXRNZXRyaWNGdW5jdGlvbiwge1xuICAgICAgICBldmVudDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHtcbiAgICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IHRoaXMubWV0cmljTmFtZXNwYWNlLFxuICAgICAgICAgIG1ldHJpY05hbWU6IHRoaXMubWV0cmljTmFtZSxcbiAgICAgICAgICBlY3NUYXNrU3RhdGVDaGFuZ2VFdmVudDogZXZlbnRzLkV2ZW50RmllbGQuZnJvbVBhdGgoJyQnKSxcbiAgICAgICAgfSksXG4gICAgICB9KV0sXG4gICAgfSk7XG4gIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIG1ldHJpY1Rhc2tDcmFzaGVzKHByb3BzOiBjdy5NZXRyaWNPcHRpb25zID0ge30pOiBjdy5NZXRyaWMge1xuICAgIHJldHVybiBuZXcgY3cuTWV0cmljKHtcbiAgICAgIG5hbWVzcGFjZTogdGhpcy5tZXRyaWNOYW1lc3BhY2UsXG4gICAgICBtZXRyaWNOYW1lOiB0aGlzLm1ldHJpY05hbWUsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIGNsdXN0ZXJBcm46IHRoaXMuc2VydmljZS5jbHVzdGVyLmNsdXN0ZXJBcm4sXG4gICAgICAgIGdyb3VwOiBjZGsuRm4uam9pbignOicsIFsnc2VydmljZScsIHRoaXMuc2VydmljZS5zZXJ2aWNlTmFtZV0pLFxuICAgICAgfSxcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW5kZXJFdmVudFBhdHRlcm4oc2VydmljZTogZWNzLklTZXJ2aWNlKSB7XG4gIHJldHVybiB7XG4gICAgc291cmNlOiBbJ2F3cy5lY3MnXSxcbiAgICBkZXRhaWxUeXBlOiBbJ0VDUyBUYXNrIFN0YXRlIENoYW5nZSddLFxuICAgIGRldGFpbDoge1xuICAgICAgbGFzdFN0YXR1czogWydTVE9QUEVEJ10sXG4gICAgICBncm91cDogW2Nkay5Gbi5qb2luKCc6JywgWydzZXJ2aWNlJywgc2VydmljZS5zZXJ2aWNlTmFtZV0pXSxcbiAgICAgIHN0b3BwZWRSZWFzb246IFt7XG4gICAgICAgICdhbnl0aGluZy1idXQnOiB7XG4gICAgICAgICAgcHJlZml4OiAnU2NhbGluZyBhY3Rpdml0eScsXG4gICAgICAgIH0sXG4gICAgICB9XSxcbiAgICB9LFxuICB9O1xufSJdfQ==