UNPKG

cdk-monitoring-constructs

Version:

[![NPM version](https://badge.fury.io/js/cdk-monitoring-constructs.svg)](https://badge.fury.io/js/cdk-monitoring-constructs) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.cdklabs/cdkmonitoringconstructs/badge.svg)](https://m

159 lines 23.7 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.EC2MetricFactory = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const common_1 = require("../../common"); const EC2Namespace = "AWS/EC2"; /** * Creates a single metric for the whole ASG. */ class AutoScalingGroupStrategy { constructor(autoScalingGroup) { this.autoScalingGroup = autoScalingGroup; } createMetrics(metricFactory, metricName, statistic, region, account, label) { return [ metricFactory.createMetric(metricName, statistic, label, resolveDimensions(this.autoScalingGroup, undefined), undefined, EC2Namespace, undefined, region, account), ]; } } /** * Creates multiple metrics (one for each instance) with an optional ASG filter. */ class SelectedInstancesStrategy { constructor(instanceIds, autoScalingGroup) { this.instanceIds = instanceIds; this.autoScalingGroup = autoScalingGroup; } createMetrics(metricFactory, metricName, statistic, region, account, label) { return this.instanceIds.map((instanceId) => { return metricFactory.createMetric(metricName, statistic, `${label ?? metricName} (${instanceId})`, resolveDimensions(this.autoScalingGroup, instanceId), undefined, EC2Namespace, undefined, region, account); }); } } /** * Creates a single metric search expression for all instances. */ class AllInstancesStrategy { createMetrics(metricFactory, metricName, statistic, region, account, label) { return [ metricFactory.createMetricSearch(`MetricName="${metricName}"`, { InstanceId: undefined }, statistic, EC2Namespace, label, undefined, region, account), ]; } } function resolveDimensions(autoScalingGroup, instanceId) { const dimensions = {}; if (autoScalingGroup) { dimensions.AutoScalingGroupName = autoScalingGroup.autoScalingGroupName; } if (instanceId) { dimensions.InstanceId = instanceId; } return dimensions; } function resolveStrategy(props) { if (props.instanceIds) { // instance filter + optional ASG return new SelectedInstancesStrategy(props.instanceIds, props.autoScalingGroup); } else if (props.autoScalingGroup) { // ASG only return new AutoScalingGroupStrategy(props.autoScalingGroup); } else { // all instances return new AllInstancesStrategy(); } } class EC2MetricFactory extends common_1.BaseMetricFactory { constructor(metricFactory, props) { super(metricFactory, props); this.strategy = resolveStrategy(props); } /** * The percentage of allocated EC2 compute units that are currently in use on the instance. * This metric identifies the processing power required to run an application on a selected instance. * Depending on the instance type, tools in your operating system can show a lower percentage than * CloudWatch when the instance is not allocated a full processor core. */ metricAverageCpuUtilisationPercent() { return this.metric("CPUUtilization", common_1.MetricStatistic.AVERAGE); } /** * Bytes read from all instance store volumes available to the instance. * This metric is used to determine the volume of the data the application reads from the hard disk of the instance. * This can be used to determine the speed of the application. */ metricAverageDiskReadBytes() { return this.createDiskMetrics("ReadBytes", common_1.MetricStatistic.AVERAGE); } /** * Bytes written to all instance store volumes available to the instance. * This metric is used to determine the volume of the data the application writes onto the hard disk of the instance. * This can be used to determine the speed of the application. */ metricAverageDiskWriteBytes() { return this.createDiskMetrics("WriteBytes", common_1.MetricStatistic.AVERAGE); } /** * Completed read operations from all instance store volumes available to the instance in a specified period of time. */ metricAverageDiskReadOps() { return this.createDiskMetrics("ReadOps", common_1.MetricStatistic.AVERAGE); } /** * Completed write operations to all instance store volumes available to the instance in a specified period of time. */ metricAverageDiskWriteOps() { return this.createDiskMetrics("WriteOps", common_1.MetricStatistic.AVERAGE); } /** * The number of bytes received on all network interfaces by the instance. * This metric identifies the volume of incoming network traffic to a single instance. */ metricAverageNetworkInRateBytes() { return this.metric("NetworkIn", common_1.MetricStatistic.AVERAGE); } /** * The number of bytes sent out on all network interfaces by the instance. * This metric identifies the volume of outgoing network traffic from a single instance. */ metricAverageNetworkOutRateBytes() { return this.metric("NetworkOut", common_1.MetricStatistic.AVERAGE); } /** * The number of bytes received on all network interfaces by the instance. * This metric identifies the volume of incoming network traffic to a single instance. */ metricSumNetworkInRateBytes() { return this.metric("NetworkIn", common_1.MetricStatistic.SUM, "Total NetworkIn"); } /** * The number of bytes sent out on all network interfaces by the instance. * This metric identifies the volume of outgoing network traffic from a single instance. */ metricSumNetworkOutRateBytes() { return this.metric("NetworkOut", common_1.MetricStatistic.SUM, "Total NetworkOut"); } createDiskMetrics(metricName, statistic) { const classicMetrics = this.strategy.createMetrics(this.metricFactory, `Disk${metricName}`, statistic); const ebsMetrics = this.strategy.createMetrics(this.metricFactory, `EBS${metricName}`, statistic); return classicMetrics.map((classic, i) => { const ebs = ebsMetrics[i]; const usingMetrics = {}; const classicId = `${metricName.toLowerCase()}_classic_${i}`; const ebsId = `${metricName.toLowerCase()}_ebs_${i}`; usingMetrics[classicId] = classic; usingMetrics[ebsId] = ebs; return this.metricFactory.createMetricMath(`AVG(REMOVE_EMPTY([${classicId}, ${ebsId}]))`, usingMetrics, `Disk${metricName}`); }); } metric(metricName, statistic, label) { return this.strategy.createMetrics(this.metricFactory, metricName, statistic, undefined, undefined, label); } } exports.EC2MetricFactory = EC2MetricFactory; _a = JSII_RTTI_SYMBOL_1; EC2MetricFactory[_a] = { fqn: "cdk-monitoring-constructs.EC2MetricFactory", version: "9.15.2" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUMyTWV0cmljRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVDMk1ldHJpY0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSx5Q0FNc0I7QUFFdEIsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBYS9COztHQUVHO0FBQ0gsTUFBTSx3QkFBd0I7SUFHNUIsWUFBWSxnQkFBbUM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxhQUFhLENBQ1gsYUFBNEIsRUFDNUIsVUFBa0IsRUFDbEIsU0FBMEIsRUFDMUIsTUFBZSxFQUNmLE9BQWdCLEVBQ2hCLEtBQWM7UUFFZCxPQUFPO1lBQ0wsYUFBYSxDQUFDLFlBQVksQ0FDeEIsVUFBVSxFQUNWLFNBQVMsRUFDVCxLQUFLLEVBQ0wsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxFQUNuRCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFDVCxNQUFNLEVBQ04sT0FBTyxDQUNSO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSx5QkFBeUI7SUFJN0IsWUFBWSxXQUFxQixFQUFFLGdCQUFvQztRQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0MsQ0FBQztJQUVELGFBQWEsQ0FDWCxhQUE0QixFQUM1QixVQUFrQixFQUNsQixTQUEwQixFQUMxQixNQUFlLEVBQ2YsT0FBZ0IsRUFDaEIsS0FBYztRQUVkLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN6QyxPQUFPLGFBQWEsQ0FBQyxZQUFZLENBQy9CLFVBQVUsRUFDVixTQUFTLEVBQ1QsR0FBRyxLQUFLLElBQUksVUFBVSxLQUFLLFVBQVUsR0FBRyxF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R0FBRyxHQUFHLENBQUM7WUFDMUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUN4QyxxQkFBcUIsU0FBUyxLQUFLLEtBQUssS0FBSyxFQUM3QyxZQUFZLEVBQ1osT0FBTyxVQUFVLEVBQUUsQ0FDcEIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FDWixVQUFrQixFQUNsQixTQUEwQixFQUMxQixLQUFjO1FBRWQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FDaEMsSUFBSSxDQUFDLGFBQWEsRUFDbEIsVUFBVSxFQUNWLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULEtBQUssQ0FDTixDQUFDO0lBQ0osQ0FBQzs7QUEzSEgsNENBNEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUF1dG9TY2FsaW5nR3JvdXAgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWF1dG9zY2FsaW5nXCI7XG5pbXBvcnQgeyBEaW1lbnNpb25zTWFwLCBJTWV0cmljIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5cbmltcG9ydCB7XG4gIEJhc2VNZXRyaWNGYWN0b3J5LFxuICBCYXNlTWV0cmljRmFjdG9yeVByb3BzLFxuICBNZXRyaWNGYWN0b3J5LFxuICBNZXRyaWNTdGF0aXN0aWMsXG4gIE1ldHJpY1dpdGhBbGFybVN1cHBvcnQsXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuY29uc3QgRUMyTmFtZXNwYWNlID0gXCJBV1MvRUMyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneSB7XG4gIGNyZWF0ZU1ldHJpY3MoXG4gICAgbWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSxcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMsXG4gICAgcmVnaW9uPzogc3RyaW5nLFxuICAgIGFjY291bnQ/OiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICk6IE1ldHJpY1dpdGhBbGFybVN1cHBvcnRbXTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIG1ldHJpYyBmb3IgdGhlIHdob2xlIEFTRy5cbiAqL1xuY2xhc3MgQXV0b1NjYWxpbmdHcm91cFN0cmF0ZWd5IGltcGxlbWVudHMgSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneSB7XG4gIHByb3RlY3RlZCBhdXRvU2NhbGluZ0dyb3VwOiBJQXV0b1NjYWxpbmdHcm91cDtcblxuICBjb25zdHJ1Y3RvcihhdXRvU2NhbGluZ0dyb3VwOiBJQXV0b1NjYWxpbmdHcm91cCkge1xuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IGF1dG9TY2FsaW5nR3JvdXA7XG4gIH1cblxuICBjcmVhdGVNZXRyaWNzKFxuICAgIG1ldHJpY0ZhY3Rvcnk6IE1ldHJpY0ZhY3RvcnksXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLFxuICAgIHJlZ2lvbj86IHN0cmluZyxcbiAgICBhY2NvdW50Pzogc3RyaW5nLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gW1xuICAgICAgbWV0cmljRmFjdG9yeS5jcmVhdGVNZXRyaWMoXG4gICAgICAgIG1ldHJpY05hbWUsXG4gICAgICAgIHN0YXRpc3RpYyxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHJlc29sdmVEaW1lbnNpb25zKHRoaXMuYXV0b1NjYWxpbmdHcm91cCwgdW5kZWZpbmVkKSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBFQzJOYW1lc3BhY2UsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBhY2NvdW50LFxuICAgICAgKSxcbiAgICBdO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBtdWx0aXBsZSBtZXRyaWNzIChvbmUgZm9yIGVhY2ggaW5zdGFuY2UpIHdpdGggYW4gb3B0aW9uYWwgQVNHIGZpbHRlci5cbiAqL1xuY2xhc3MgU2VsZWN0ZWRJbnN0YW5jZXNTdHJhdGVneSBpbXBsZW1lbnRzIElFQzJNZXRyaWNGYWN0b3J5U3RyYXRlZ3kge1xuICBwcm90ZWN0ZWQgaW5zdGFuY2VJZHM6IHN0cmluZ1tdO1xuICBwcm90ZWN0ZWQgYXV0b1NjYWxpbmdHcm91cD86IElBdXRvU2NhbGluZ0dyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlSWRzOiBzdHJpbmdbXSwgYXV0b1NjYWxpbmdHcm91cD86IElBdXRvU2NhbGluZ0dyb3VwKSB7XG4gICAgdGhpcy5pbnN0YW5jZUlkcyA9IGluc3RhbmNlSWRzO1xuICAgIHRoaXMuYXV0b1NjYWxpbmdHcm91cCA9IGF1dG9TY2FsaW5nR3JvdXA7XG4gIH1cblxuICBjcmVhdGVNZXRyaWNzKFxuICAgIG1ldHJpY0ZhY3Rvcnk6IE1ldHJpY0ZhY3RvcnksXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLFxuICAgIHJlZ2lvbj86IHN0cmluZyxcbiAgICBhY2NvdW50Pzogc3RyaW5nLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZUlkcy5tYXAoKGluc3RhbmNlSWQpID0+IHtcbiAgICAgIHJldHVybiBtZXRyaWNGYWN0b3J5LmNyZWF0ZU1ldHJpYyhcbiAgICAgICAgbWV0cmljTmFtZSxcbiAgICAgICAgc3RhdGlzdGljLFxuICAgICAgICBgJHtsYWJlbCA/PyBtZXRyaWNOYW1lfSAoJHtpbnN0YW5jZUlkfSlgLFxuICAgICAgICByZXNvbHZlRGltZW5zaW9ucyh0aGlzLmF1dG9TY2FsaW5nR3JvdXAsIGluc3RhbmNlSWQpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIEVDMk5hbWVzcGFjZSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIGFjY291bnQsXG4gICAgICApO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNpbmdsZSBtZXRyaWMgc2VhcmNoIGV4cHJlc3Npb24gZm9yIGFsbCBpbnN0YW5jZXMuXG4gKi9cbmNsYXNzIEFsbEluc3RhbmNlc1N0cmF0ZWd5IGltcGxlbWVudHMgSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneSB7XG4gIGNyZWF0ZU1ldHJpY3MoXG4gICAgbWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSxcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMsXG4gICAgcmVnaW9uPzogc3RyaW5nLFxuICAgIGFjY291bnQ/OiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICkge1xuICAgIHJldHVybiBbXG4gICAgICBtZXRyaWNGYWN0b3J5LmNyZWF0ZU1ldHJpY1NlYXJjaChcbiAgICAgICAgYE1ldHJpY05hbWU9XCIke21ldHJpY05hbWV9XCJgLFxuICAgICAgICB7IEluc3RhbmNlSWQ6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHN0cmluZyB9LFxuICAgICAgICBzdGF0aXN0aWMsXG4gICAgICAgIEVDMk5hbWVzcGFjZSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgcmVnaW9uLFxuICAgICAgICBhY2NvdW50LFxuICAgICAgKSxcbiAgICBdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaW1lbnNpb25zKFxuICBhdXRvU2NhbGluZ0dyb3VwPzogSUF1dG9TY2FsaW5nR3JvdXAsXG4gIGluc3RhbmNlSWQ/OiBzdHJpbmcsXG4pOiBEaW1lbnNpb25zTWFwIHtcbiAgY29uc3QgZGltZW5zaW9uczogRGltZW5zaW9uc01hcCA9IHt9O1xuICBpZiAoYXV0b1NjYWxpbmdHcm91cCkge1xuICAgIGRpbWVuc2lvbnMuQXV0b1NjYWxpbmdHcm91cE5hbWUgPSBhdXRvU2NhbGluZ0dyb3VwLmF1dG9TY2FsaW5nR3JvdXBOYW1lO1xuICB9XG4gIGlmIChpbnN0YW5jZUlkKSB7XG4gICAgZGltZW5zaW9ucy5JbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcbiAgfVxuICByZXR1cm4gZGltZW5zaW9ucztcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVN0cmF0ZWd5KFxuICBwcm9wczogRUMyTWV0cmljRmFjdG9yeVByb3BzLFxuKTogSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneSB7XG4gIGlmIChwcm9wcy5pbnN0YW5jZUlkcykge1xuICAgIC8vIGluc3RhbmNlIGZpbHRlciArIG9wdGlvbmFsIEFTR1xuICAgIHJldHVybiBuZXcgU2VsZWN0ZWRJbnN0YW5jZXNTdHJhdGVneShcbiAgICAgIHByb3BzLmluc3RhbmNlSWRzLFxuICAgICAgcHJvcHMuYXV0b1NjYWxpbmdHcm91cCxcbiAgICApO1xuICB9IGVsc2UgaWYgKHByb3BzLmF1dG9TY2FsaW5nR3JvdXApIHtcbiAgICAvLyBBU0cgb25seVxuICAgIHJldHVybiBuZXcgQXV0b1NjYWxpbmdHcm91cFN0cmF0ZWd5KHByb3BzLmF1dG9TY2FsaW5nR3JvdXApO1xuICB9IGVsc2Uge1xuICAgIC8vIGFsbCBpbnN0YW5jZXNcbiAgICByZXR1cm4gbmV3IEFsbEluc3RhbmNlc1N0cmF0ZWd5KCk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFQzJNZXRyaWNGYWN0b3J5UHJvcHMgZXh0ZW5kcyBCYXNlTWV0cmljRmFjdG9yeVByb3BzIHtcbiAgLyoqXG4gICAqIEF1dG8tU2NhbGluZyBHcm91cCB0byBtb25pdG9yLlxuICAgKiBAZGVmYXVsdCAtIG5vIEF1dG8tU2NhbGluZyBHcm91cCBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGF1dG9TY2FsaW5nR3JvdXA/OiBJQXV0b1NjYWxpbmdHcm91cDtcbiAgLyoqXG4gICAqIFNlbGVjdGVkIElEcyBvZiBFQzIgaW5zdGFuY2VzIHRvIG1vbml0b3IuXG4gICAqIEBkZWZhdWx0IC0gbm8gaW5zdGFuY2UgZmlsdGVyXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZUlkcz86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY2xhc3MgRUMyTWV0cmljRmFjdG9yeSBleHRlbmRzIEJhc2VNZXRyaWNGYWN0b3J5PEVDMk1ldHJpY0ZhY3RvcnlQcm9wcz4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyYXRlZ3k6IElFQzJNZXRyaWNGYWN0b3J5U3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3IobWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSwgcHJvcHM6IEVDMk1ldHJpY0ZhY3RvcnlQcm9wcykge1xuICAgIHN1cGVyKG1ldHJpY0ZhY3RvcnksIHByb3BzKTtcblxuICAgIHRoaXMuc3RyYXRlZ3kgPSByZXNvbHZlU3RyYXRlZ3kocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJjZW50YWdlIG9mIGFsbG9jYXRlZCBFQzIgY29tcHV0ZSB1bml0cyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdXNlIG9uIHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgcHJvY2Vzc2luZyBwb3dlciByZXF1aXJlZCB0byBydW4gYW4gYXBwbGljYXRpb24gb24gYSBzZWxlY3RlZCBpbnN0YW5jZS5cbiAgICogRGVwZW5kaW5nIG9uIHRoZSBpbnN0YW5jZSB0eXBlLCB0b29scyBpbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gY2FuIHNob3cgYSBsb3dlciBwZXJjZW50YWdlIHRoYW5cbiAgICogQ2xvdWRXYXRjaCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBub3QgYWxsb2NhdGVkIGEgZnVsbCBwcm9jZXNzb3IgY29yZS5cbiAgICovXG4gIG1ldHJpY0F2ZXJhZ2VDcHVVdGlsaXNhdGlvblBlcmNlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ1BVVXRpbGl6YXRpb25cIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ5dGVzIHJlYWQgZnJvbSBhbGwgaW5zdGFuY2Ugc3RvcmUgdm9sdW1lcyBhdmFpbGFibGUgdG8gdGhlIGluc3RhbmNlLlxuICAgKiBUaGlzIG1ldHJpYyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdm9sdW1lIG9mIHRoZSBkYXRhIHRoZSBhcHBsaWNhdGlvbiByZWFkcyBmcm9tIHRoZSBoYXJkIGRpc2sgb2YgdGhlIGluc3RhbmNlLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgc3BlZWQgb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgbWV0cmljQXZlcmFnZURpc2tSZWFkQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRGlza01ldHJpY3MoXCJSZWFkQnl0ZXNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ5dGVzIHdyaXR0ZW4gdG8gYWxsIGluc3RhbmNlIHN0b3JlIHZvbHVtZXMgYXZhaWxhYmxlIHRvIHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZvbHVtZSBvZiB0aGUgZGF0YSB0aGUgYXBwbGljYXRpb24gd3JpdGVzIG9udG8gdGhlIGhhcmQgZGlzayBvZiB0aGUgaW5zdGFuY2UuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzcGVlZCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlRGlza1dyaXRlQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRGlza01ldHJpY3MoXCJXcml0ZUJ5dGVzXCIsIE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZWQgcmVhZCBvcGVyYXRpb25zIGZyb20gYWxsIGluc3RhbmNlIHN0b3JlIHZvbHVtZXMgYXZhaWxhYmxlIHRvIHRoZSBpbnN0YW5jZSBpbiBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZS5cbiAgICovXG4gIG1ldHJpY0F2ZXJhZ2VEaXNrUmVhZE9wcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVEaXNrTWV0cmljcyhcIlJlYWRPcHNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlZCB3cml0ZSBvcGVyYXRpb25zIHRvIGFsbCBpbnN0YW5jZSBzdG9yZSB2b2x1bWVzIGF2YWlsYWJsZSB0byB0aGUgaW5zdGFuY2UgaW4gYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUuXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlRGlza1dyaXRlT3BzKCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZURpc2tNZXRyaWNzKFwiV3JpdGVPcHNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gYWxsIG5ldHdvcmsgaW50ZXJmYWNlcyBieSB0aGUgaW5zdGFuY2UuXG4gICAqIFRoaXMgbWV0cmljIGlkZW50aWZpZXMgdGhlIHZvbHVtZSBvZiBpbmNvbWluZyBuZXR3b3JrIHRyYWZmaWMgdG8gYSBzaW5nbGUgaW5zdGFuY2UuXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlTmV0d29ya0luUmF0ZUJ5dGVzKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIk5ldHdvcmtJblwiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyBzZW50IG91dCBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgdm9sdW1lIG9mIG91dGdvaW5nIG5ldHdvcmsgdHJhZmZpYyBmcm9tIGEgc2luZ2xlIGluc3RhbmNlLlxuICAgKi9cbiAgbWV0cmljQXZlcmFnZU5ldHdvcmtPdXRSYXRlQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiTmV0d29ya091dFwiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgdm9sdW1lIG9mIGluY29taW5nIG5ldHdvcmsgdHJhZmZpYyB0byBhIHNpbmdsZSBpbnN0YW5jZS5cbiAgICovXG4gIG1ldHJpY1N1bU5ldHdvcmtJblJhdGVCeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrSW5cIiwgTWV0cmljU3RhdGlzdGljLlNVTSwgXCJUb3RhbCBOZXR3b3JrSW5cIik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyBzZW50IG91dCBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgdm9sdW1lIG9mIG91dGdvaW5nIG5ldHdvcmsgdHJhZmZpYyBmcm9tIGEgc2luZ2xlIGluc3RhbmNlLlxuICAgKi9cbiAgbWV0cmljU3VtTmV0d29ya091dFJhdGVCeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrT3V0XCIsIE1ldHJpY1N0YXRpc3RpYy5TVU0sIFwiVG90YWwgTmV0d29ya091dFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGlza01ldHJpY3MobWV0cmljTmFtZTogc3RyaW5nLCBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYykge1xuICAgIGNvbnN0IGNsYXNzaWNNZXRyaWNzID0gdGhpcy5zdHJhdGVneS5jcmVhdGVNZXRyaWNzKFxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5LFxuICAgICAgYERpc2ske21ldHJpY05hbWV9YCxcbiAgICAgIHN0YXRpc3RpYyxcbiAgICApO1xuICAgIGNvbnN0IGVic01ldHJpY3MgPSB0aGlzLnN0cmF0ZWd5LmNyZWF0ZU1ldHJpY3MoXG4gICAgICB0aGlzLm1ldHJpY0ZhY3RvcnksXG4gICAgICBgRUJTJHttZXRyaWNOYW1lfWAsXG4gICAgICBzdGF0aXN0aWMsXG4gICAgKTtcblxuICAgIHJldHVybiBjbGFzc2ljTWV0cmljcy5tYXAoKGNsYXNzaWMsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVicyA9IGVic01ldHJpY3NbaV07XG4gICAgICBjb25zdCB1c2luZ01ldHJpY3M6IFJlY29yZDxzdHJpbmcsIElNZXRyaWM+ID0ge307XG4gICAgICBjb25zdCBjbGFzc2ljSWQgPSBgJHttZXRyaWNOYW1lLnRvTG93ZXJDYXNlKCl9X2NsYXNzaWNfJHtpfWA7XG4gICAgICBjb25zdCBlYnNJZCA9IGAke21ldHJpY05hbWUudG9Mb3dlckNhc2UoKX1fZWJzXyR7aX1gO1xuICAgICAgdXNpbmdNZXRyaWNzW2NsYXNzaWNJZF0gPSBjbGFzc2ljO1xuICAgICAgdXNpbmdNZXRyaWNzW2Vic0lkXSA9IGVicztcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljTWF0aChcbiAgICAgICAgYEFWRyhSRU1PVkVfRU1QVFkoWyR7Y2xhc3NpY0lkfSwgJHtlYnNJZH1dKSlgLFxuICAgICAgICB1c2luZ01ldHJpY3MsXG4gICAgICAgIGBEaXNrJHttZXRyaWNOYW1lfWAsXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXRyaWMoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5zdHJhdGVneS5jcmVhdGVNZXRyaWNzKFxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5LFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIHN0YXRpc3RpYyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==