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.8 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: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRUMyTWV0cmljRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkVDMk1ldHJpY0ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSx5Q0FNc0I7QUFFdEIsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBYS9COztHQUVHO0FBQ0gsTUFBTSx3QkFBd0I7SUFHNUIsWUFBWSxnQkFBbUM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzNDLENBQUM7SUFFRCxhQUFhLENBQ1gsYUFBNEIsRUFDNUIsVUFBa0IsRUFDbEIsU0FBMEIsRUFDMUIsTUFBZSxFQUNmLE9BQWdCLEVBQ2hCLEtBQWM7UUFFZCxPQUFPO1lBQ0wsYUFBYSxDQUFDLFlBQVksQ0FDeEIsVUFBVSxFQUNWLFNBQVMsRUFDVCxLQUFLLEVBQ0wsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxFQUNuRCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFNBQVMsRUFDVCxNQUFNLEVBQ04sT0FBTyxDQUNSO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSx5QkFBeUI7SUFJN0IsWUFBWSxXQUFxQixFQUFFLGdCQUFvQztRQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0MsQ0FBQztJQUVELGFBQWEsQ0FDWCxhQUE0QixFQUM1QixVQUFrQixFQUNsQixTQUEwQixFQUMxQixNQUFlLEVBQ2YsT0FBZ0IsRUFDaEIsS0FBYztRQUVkLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN6QyxPQUFPLGFBQWEsQ0FBQyxZQUFZLENBQy9CLFVBQVUsRUFDVixTQUFTLEVBQ1QsR0FBRyxLQUFLLElBQUksVUFBVSxLQUFLLFVBQVUsR0FBRyxF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QUFTLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDbEMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQ3hDLHFCQUFxQixTQUFTLEtBQUssS0FBSyxLQUFLLEVBQzdDLFlBQVksRUFDWixPQUFPLFVBQVUsRUFBRSxDQUNwQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUNaLFVBQWtCLEVBQ2xCLFNBQTBCLEVBQzFCLEtBQWM7UUFFZCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUNoQyxJQUFJLENBQUMsYUFBYSxFQUNsQixVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxDQUNOLENBQUM7SUFDSixDQUFDOztBQTNISCw0Q0E0SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQXV0b1NjYWxpbmdHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXV0b3NjYWxpbmdcIjtcbmltcG9ydCB7IERpbWVuc2lvbnNNYXAsIElNZXRyaWMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcblxuaW1wb3J0IHtcbiAgQmFzZU1ldHJpY0ZhY3RvcnksXG4gIEJhc2VNZXRyaWNGYWN0b3J5UHJvcHMsXG4gIE1ldHJpY0ZhY3RvcnksXG4gIE1ldHJpY1N0YXRpc3RpYyxcbiAgTWV0cmljV2l0aEFsYXJtU3VwcG9ydCxcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBFQzJOYW1lc3BhY2UgPSBcIkFXUy9FQzJcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJRUMyTWV0cmljRmFjdG9yeVN0cmF0ZWd5IHtcbiAgY3JlYXRlTWV0cmljcyhcbiAgICBtZXRyaWNGYWN0b3J5OiBNZXRyaWNGYWN0b3J5LFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYyxcbiAgICByZWdpb24/OiBzdHJpbmcsXG4gICAgYWNjb3VudD86IHN0cmluZyxcbiAgICBsYWJlbD86IHN0cmluZyxcbiAgKTogTWV0cmljV2l0aEFsYXJtU3VwcG9ydFtdO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzaW5nbGUgbWV0cmljIGZvciB0aGUgd2hvbGUgQVNHLlxuICovXG5jbGFzcyBBdXRvU2NhbGluZ0dyb3VwU3RyYXRlZ3kgaW1wbGVtZW50cyBJRUMyTWV0cmljRmFjdG9yeVN0cmF0ZWd5IHtcbiAgcHJvdGVjdGVkIGF1dG9TY2FsaW5nR3JvdXA6IElBdXRvU2NhbGluZ0dyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKGF1dG9TY2FsaW5nR3JvdXA6IElBdXRvU2NhbGluZ0dyb3VwKSB7XG4gICAgdGhpcy5hdXRvU2NhbGluZ0dyb3VwID0gYXV0b1NjYWxpbmdHcm91cDtcbiAgfVxuXG4gIGNyZWF0ZU1ldHJpY3MoXG4gICAgbWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSxcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMsXG4gICAgcmVnaW9uPzogc3RyaW5nLFxuICAgIGFjY291bnQ/OiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICkge1xuICAgIHJldHVybiBbXG4gICAgICBtZXRyaWNGYWN0b3J5LmNyZWF0ZU1ldHJpYyhcbiAgICAgICAgbWV0cmljTmFtZSxcbiAgICAgICAgc3RhdGlzdGljLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgcmVzb2x2ZURpbWVuc2lvbnModGhpcy5hdXRvU2NhbGluZ0dyb3VwLCB1bmRlZmluZWQpLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIEVDMk5hbWVzcGFjZSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIGFjY291bnQsXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIG11bHRpcGxlIG1ldHJpY3MgKG9uZSBmb3IgZWFjaCBpbnN0YW5jZSkgd2l0aCBhbiBvcHRpb25hbCBBU0cgZmlsdGVyLlxuICovXG5jbGFzcyBTZWxlY3RlZEluc3RhbmNlc1N0cmF0ZWd5IGltcGxlbWVudHMgSUVDMk1ldHJpY0ZhY3RvcnlTdHJhdGVneSB7XG4gIHByb3RlY3RlZCBpbnN0YW5jZUlkczogc3RyaW5nW107XG4gIHByb3RlY3RlZCBhdXRvU2NhbGluZ0dyb3VwPzogSUF1dG9TY2FsaW5nR3JvdXA7XG5cbiAgY29uc3RydWN0b3IoaW5zdGFuY2VJZHM6IHN0cmluZ1tdLCBhdXRvU2NhbGluZ0dyb3VwPzogSUF1dG9TY2FsaW5nR3JvdXApIHtcbiAgICB0aGlzLmluc3RhbmNlSWRzID0gaW5zdGFuY2VJZHM7XG4gICAgdGhpcy5hdXRvU2NhbGluZ0dyb3VwID0gYXV0b1NjYWxpbmdHcm91cDtcbiAgfVxuXG4gIGNyZWF0ZU1ldHJpY3MoXG4gICAgbWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSxcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMsXG4gICAgcmVnaW9uPzogc3RyaW5nLFxuICAgIGFjY291bnQ/OiBzdHJpbmcsXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICkge1xuICAgIHJldHVybiB0aGlzLmluc3RhbmNlSWRzLm1hcCgoaW5zdGFuY2VJZCkgPT4ge1xuICAgICAgcmV0dXJuIG1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljKFxuICAgICAgICBtZXRyaWNOYW1lLFxuICAgICAgICBzdGF0aXN0aWMsXG4gICAgICAgIGAke2xhYmVsID8/IG1ldHJpY05hbWV9ICgke2luc3RhbmNlSWR9KWAsXG4gICAgICAgIHJlc29sdmVEaW1lbnNpb25zKHRoaXMuYXV0b1NjYWxpbmdHcm91cCwgaW5zdGFuY2VJZCksXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgRUMyTmFtZXNwYWNlLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgICAgYWNjb3VudCxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgc2luZ2xlIG1ldHJpYyBzZWFyY2ggZXhwcmVzc2lvbiBmb3IgYWxsIGluc3RhbmNlcy5cbiAqL1xuY2xhc3MgQWxsSW5zdGFuY2VzU3RyYXRlZ3kgaW1wbGVtZW50cyBJRUMyTWV0cmljRmFjdG9yeVN0cmF0ZWd5IHtcbiAgY3JlYXRlTWV0cmljcyhcbiAgICBtZXRyaWNGYWN0b3J5OiBNZXRyaWNGYWN0b3J5LFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYyxcbiAgICByZWdpb24/OiBzdHJpbmcsXG4gICAgYWNjb3VudD86IHN0cmluZyxcbiAgICBsYWJlbD86IHN0cmluZyxcbiAgKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIG1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljU2VhcmNoKFxuICAgICAgICBgTWV0cmljTmFtZT1cIiR7bWV0cmljTmFtZX1cImAsXG4gICAgICAgIHsgSW5zdGFuY2VJZDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgc3RyaW5nIH0sXG4gICAgICAgIHN0YXRpc3RpYyxcbiAgICAgICAgRUMyTmFtZXNwYWNlLFxuICAgICAgICBsYWJlbCxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICByZWdpb24sXG4gICAgICAgIGFjY291bnQsXG4gICAgICApLFxuICAgIF07XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZURpbWVuc2lvbnMoXG4gIGF1dG9TY2FsaW5nR3JvdXA/OiBJQXV0b1NjYWxpbmdHcm91cCxcbiAgaW5zdGFuY2VJZD86IHN0cmluZyxcbik6IERpbWVuc2lvbnNNYXAge1xuICBjb25zdCBkaW1lbnNpb25zOiBEaW1lbnNpb25zTWFwID0ge307XG4gIGlmIChhdXRvU2NhbGluZ0dyb3VwKSB7XG4gICAgZGltZW5zaW9ucy5BdXRvU2NhbGluZ0dyb3VwTmFtZSA9IGF1dG9TY2FsaW5nR3JvdXAuYXV0b1NjYWxpbmdHcm91cE5hbWU7XG4gIH1cbiAgaWYgKGluc3RhbmNlSWQpIHtcbiAgICBkaW1lbnNpb25zLkluc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xuICB9XG4gIHJldHVybiBkaW1lbnNpb25zO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlU3RyYXRlZ3koXG4gIHByb3BzOiBFQzJNZXRyaWNGYWN0b3J5UHJvcHMsXG4pOiBJRUMyTWV0cmljRmFjdG9yeVN0cmF0ZWd5IHtcbiAgaWYgKHByb3BzLmluc3RhbmNlSWRzKSB7XG4gICAgLy8gaW5zdGFuY2UgZmlsdGVyICsgb3B0aW9uYWwgQVNHXG4gICAgcmV0dXJuIG5ldyBTZWxlY3RlZEluc3RhbmNlc1N0cmF0ZWd5KFxuICAgICAgcHJvcHMuaW5zdGFuY2VJZHMsXG4gICAgICBwcm9wcy5hdXRvU2NhbGluZ0dyb3VwLFxuICAgICk7XG4gIH0gZWxzZSBpZiAocHJvcHMuYXV0b1NjYWxpbmdHcm91cCkge1xuICAgIC8vIEFTRyBvbmx5XG4gICAgcmV0dXJuIG5ldyBBdXRvU2NhbGluZ0dyb3VwU3RyYXRlZ3kocHJvcHMuYXV0b1NjYWxpbmdHcm91cCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYWxsIGluc3RhbmNlc1xuICAgIHJldHVybiBuZXcgQWxsSW5zdGFuY2VzU3RyYXRlZ3koKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVDMk1ldHJpY0ZhY3RvcnlQcm9wcyBleHRlbmRzIEJhc2VNZXRyaWNGYWN0b3J5UHJvcHMge1xuICAvKipcbiAgICogQXV0by1TY2FsaW5nIEdyb3VwIHRvIG1vbml0b3IuXG4gICAqIEBkZWZhdWx0IC0gbm8gQXV0by1TY2FsaW5nIEdyb3VwIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b1NjYWxpbmdHcm91cD86IElBdXRvU2NhbGluZ0dyb3VwO1xuICAvKipcbiAgICogU2VsZWN0ZWQgSURzIG9mIEVDMiBpbnN0YW5jZXMgdG8gbW9uaXRvci5cbiAgICogQGRlZmF1bHQgLSBubyBpbnN0YW5jZSBmaWx0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGluc3RhbmNlSWRzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBFQzJNZXRyaWNGYWN0b3J5IGV4dGVuZHMgQmFzZU1ldHJpY0ZhY3Rvcnkge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyYXRlZ3k6IElFQzJNZXRyaWNGYWN0b3J5U3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3IobWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSwgcHJvcHM6IEVDMk1ldHJpY0ZhY3RvcnlQcm9wcykge1xuICAgIHN1cGVyKG1ldHJpY0ZhY3RvcnksIHByb3BzKTtcblxuICAgIHRoaXMuc3RyYXRlZ3kgPSByZXNvbHZlU3RyYXRlZ3kocHJvcHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwZXJjZW50YWdlIG9mIGFsbG9jYXRlZCBFQzIgY29tcHV0ZSB1bml0cyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdXNlIG9uIHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgcHJvY2Vzc2luZyBwb3dlciByZXF1aXJlZCB0byBydW4gYW4gYXBwbGljYXRpb24gb24gYSBzZWxlY3RlZCBpbnN0YW5jZS5cbiAgICogRGVwZW5kaW5nIG9uIHRoZSBpbnN0YW5jZSB0eXBlLCB0b29scyBpbiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gY2FuIHNob3cgYSBsb3dlciBwZXJjZW50YWdlIHRoYW5cbiAgICogQ2xvdWRXYXRjaCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBub3QgYWxsb2NhdGVkIGEgZnVsbCBwcm9jZXNzb3IgY29yZS5cbiAgICovXG4gIG1ldHJpY0F2ZXJhZ2VDcHVVdGlsaXNhdGlvblBlcmNlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiQ1BVVXRpbGl6YXRpb25cIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ5dGVzIHJlYWQgZnJvbSBhbGwgaW5zdGFuY2Ugc3RvcmUgdm9sdW1lcyBhdmFpbGFibGUgdG8gdGhlIGluc3RhbmNlLlxuICAgKiBUaGlzIG1ldHJpYyBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdm9sdW1lIG9mIHRoZSBkYXRhIHRoZSBhcHBsaWNhdGlvbiByZWFkcyBmcm9tIHRoZSBoYXJkIGRpc2sgb2YgdGhlIGluc3RhbmNlLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgc3BlZWQgb2YgdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgbWV0cmljQXZlcmFnZURpc2tSZWFkQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRGlza01ldHJpY3MoXCJSZWFkQnl0ZXNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ5dGVzIHdyaXR0ZW4gdG8gYWxsIGluc3RhbmNlIHN0b3JlIHZvbHVtZXMgYXZhaWxhYmxlIHRvIHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZvbHVtZSBvZiB0aGUgZGF0YSB0aGUgYXBwbGljYXRpb24gd3JpdGVzIG9udG8gdGhlIGhhcmQgZGlzayBvZiB0aGUgaW5zdGFuY2UuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzcGVlZCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlRGlza1dyaXRlQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRGlza01ldHJpY3MoXCJXcml0ZUJ5dGVzXCIsIE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZWQgcmVhZCBvcGVyYXRpb25zIGZyb20gYWxsIGluc3RhbmNlIHN0b3JlIHZvbHVtZXMgYXZhaWxhYmxlIHRvIHRoZSBpbnN0YW5jZSBpbiBhIHNwZWNpZmllZCBwZXJpb2Qgb2YgdGltZS5cbiAgICovXG4gIG1ldHJpY0F2ZXJhZ2VEaXNrUmVhZE9wcygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVEaXNrTWV0cmljcyhcIlJlYWRPcHNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlZCB3cml0ZSBvcGVyYXRpb25zIHRvIGFsbCBpbnN0YW5jZSBzdG9yZSB2b2x1bWVzIGF2YWlsYWJsZSB0byB0aGUgaW5zdGFuY2UgaW4gYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUuXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlRGlza1dyaXRlT3BzKCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZURpc2tNZXRyaWNzKFwiV3JpdGVPcHNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgb24gYWxsIG5ldHdvcmsgaW50ZXJmYWNlcyBieSB0aGUgaW5zdGFuY2UuXG4gICAqIFRoaXMgbWV0cmljIGlkZW50aWZpZXMgdGhlIHZvbHVtZSBvZiBpbmNvbWluZyBuZXR3b3JrIHRyYWZmaWMgdG8gYSBzaW5nbGUgaW5zdGFuY2UuXG4gICAqL1xuICBtZXRyaWNBdmVyYWdlTmV0d29ya0luUmF0ZUJ5dGVzKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIk5ldHdvcmtJblwiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyBzZW50IG91dCBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgdm9sdW1lIG9mIG91dGdvaW5nIG5ldHdvcmsgdHJhZmZpYyBmcm9tIGEgc2luZ2xlIGluc3RhbmNlLlxuICAgKi9cbiAgbWV0cmljQXZlcmFnZU5ldHdvcmtPdXRSYXRlQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiTmV0d29ya091dFwiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgdm9sdW1lIG9mIGluY29taW5nIG5ldHdvcmsgdHJhZmZpYyB0byBhIHNpbmdsZSBpbnN0YW5jZS5cbiAgICovXG4gIG1ldHJpY1N1bU5ldHdvcmtJblJhdGVCeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrSW5cIiwgTWV0cmljU3RhdGlzdGljLlNVTSwgXCJUb3RhbCBOZXR3b3JrSW5cIik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBieXRlcyBzZW50IG91dCBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGJ5IHRoZSBpbnN0YW5jZS5cbiAgICogVGhpcyBtZXRyaWMgaWRlbnRpZmllcyB0aGUgdm9sdW1lIG9mIG91dGdvaW5nIG5ldHdvcmsgdHJhZmZpYyBmcm9tIGEgc2luZ2xlIGluc3RhbmNlLlxuICAgKi9cbiAgbWV0cmljU3VtTmV0d29ya091dFJhdGVCeXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJOZXR3b3JrT3V0XCIsIE1ldHJpY1N0YXRpc3RpYy5TVU0sIFwiVG90YWwgTmV0d29ya091dFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGlza01ldHJpY3MobWV0cmljTmFtZTogc3RyaW5nLCBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYykge1xuICAgIGNvbnN0IGNsYXNzaWNNZXRyaWNzID0gdGhpcy5zdHJhdGVneS5jcmVhdGVNZXRyaWNzKFxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5LFxuICAgICAgYERpc2ske21ldHJpY05hbWV9YCxcbiAgICAgIHN0YXRpc3RpYyxcbiAgICApO1xuICAgIGNvbnN0IGVic01ldHJpY3MgPSB0aGlzLnN0cmF0ZWd5LmNyZWF0ZU1ldHJpY3MoXG4gICAgICB0aGlzLm1ldHJpY0ZhY3RvcnksXG4gICAgICBgRUJTJHttZXRyaWNOYW1lfWAsXG4gICAgICBzdGF0aXN0aWMsXG4gICAgKTtcblxuICAgIHJldHVybiBjbGFzc2ljTWV0cmljcy5tYXAoKGNsYXNzaWMsIGkpID0+IHtcbiAgICAgIGNvbnN0IGVicyA9IGVic01ldHJpY3NbaV07XG4gICAgICBjb25zdCB1c2luZ01ldHJpY3M6IFJlY29yZDxzdHJpbmcsIElNZXRyaWM+ID0ge307XG4gICAgICBjb25zdCBjbGFzc2ljSWQgPSBgJHttZXRyaWNOYW1lLnRvTG93ZXJDYXNlKCl9X2NsYXNzaWNfJHtpfWA7XG4gICAgICBjb25zdCBlYnNJZCA9IGAke21ldHJpY05hbWUudG9Mb3dlckNhc2UoKX1fZWJzXyR7aX1gO1xuICAgICAgdXNpbmdNZXRyaWNzW2NsYXNzaWNJZF0gPSBjbGFzc2ljO1xuICAgICAgdXNpbmdNZXRyaWNzW2Vic0lkXSA9IGVicztcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljTWF0aChcbiAgICAgICAgYEFWRyhSRU1PVkVfRU1QVFkoWyR7Y2xhc3NpY0lkfSwgJHtlYnNJZH1dKSlgLFxuICAgICAgICB1c2luZ01ldHJpY3MsXG4gICAgICAgIGBEaXNrJHttZXRyaWNOYW1lfWAsXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXRyaWMoXG4gICAgbWV0cmljTmFtZTogc3RyaW5nLFxuICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLFxuICAgIGxhYmVsPzogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5zdHJhdGVneS5jcmVhdGVNZXRyaWNzKFxuICAgICAgdGhpcy5tZXRyaWNGYWN0b3J5LFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIHN0YXRpc3RpYyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==