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

107 lines 17.5 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.RdsClusterMetricFactory = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const common_1 = require("../../common"); const RdsNamespace = "AWS/RDS"; class RdsClusterMetricFactory extends common_1.BaseMetricFactory { constructor(metricFactory, props) { super(metricFactory, props); this.cluster = props.cluster; this.clusterIdentifier = RdsClusterMetricFactory.resolveDbClusterIdentifier(props); this.dimensionsMap = { DBClusterIdentifier: this.clusterIdentifier }; } static resolveDbClusterIdentifier(props) { if (props.clusterIdentifier !== undefined && props.cluster === undefined) { return props.clusterIdentifier; } else if (props.clusterIdentifier === undefined && props.cluster !== undefined) { return props.cluster.clusterIdentifier; } else if (props.cluster !== undefined && props.cluster !== undefined) { throw Error("Only one of `clusterIdentifier` and `cluster` is supported"); } else { throw Error("At least one of `clusterIdentifier` or `cluster` is required"); } } isServerlessCluster(obj) { return obj.clusterArn !== undefined; } metricTotalConnectionCount() { return this.metric("DatabaseConnections", common_1.MetricStatistic.AVERAGE, "Connections"); } metricFreeStorageInBytes() { return this.metric("FreeLocalStorage", common_1.MetricStatistic.MIN, "Free"); } metricUsedStorageInBytes() { return this.metric("VolumeBytesUsed", common_1.MetricStatistic.MAX, "Used"); } metricDiskSpaceUsageInPercent() { return this.metricFactory.createMetricMath("100 * (used/(used+free))", { used: this.metricUsedStorageInBytes(), free: this.metricFreeStorageInBytes(), }, "Disk Usage"); } metricAverageCpuUsageInPercent() { return this.metric("CPUUtilization", common_1.MetricStatistic.AVERAGE, "CPU Usage"); } metricSelectLatencyInMillis(latencyType) { const label = (0, common_1.getLatencyTypeLabel)(latencyType); return this.metric("SelectLatency", (0, common_1.getLatencyTypeStatistic)(latencyType), `Select ${label}`); } metricInsertLatencyInMillis(latencyType) { const label = (0, common_1.getLatencyTypeLabel)(latencyType); return this.metric("InsertLatency", (0, common_1.getLatencyTypeStatistic)(latencyType), `Insert ${label}`); } metricUpdateLatencyInMillis(latencyType) { const label = (0, common_1.getLatencyTypeLabel)(latencyType); return this.metric("UpdateLatency", (0, common_1.getLatencyTypeStatistic)(latencyType), `Update ${label}`); } metricDeleteLatencyInMillis(latencyType) { const label = (0, common_1.getLatencyTypeLabel)(latencyType); return this.metric("DeleteLatency", (0, common_1.getLatencyTypeStatistic)(latencyType), `Delete ${label}`); } metricCommitLatencyInMillis(latencyType) { const label = (0, common_1.getLatencyTypeLabel)(latencyType); return this.metric("CommitLatency", (0, common_1.getLatencyTypeStatistic)(latencyType), `Commit ${label}`); } // Backward compatibility methods metricSelectLatencyP90InMillis() { return this.metricSelectLatencyInMillis(common_1.LatencyType.P90); } metricInsertLatencyP90InMillis() { return this.metricInsertLatencyInMillis(common_1.LatencyType.P90); } metricUpdateLatencyP90InMillis() { return this.metricUpdateLatencyInMillis(common_1.LatencyType.P90); } metricDeleteLatencyP90InMillis() { return this.metricDeleteLatencyInMillis(common_1.LatencyType.P90); } metricCommitLatencyP90InMillis() { return this.metricCommitLatencyInMillis(common_1.LatencyType.P90); } metricReadIOPS() { return this.metric("ReadIOPS", common_1.MetricStatistic.AVERAGE, "Read IOPS"); } metricWriteIOPS() { return this.metric("WriteIOPS", common_1.MetricStatistic.AVERAGE, "Write IOPS"); } metricServerlessDatabaseCapacity() { if (!this.isServerlessCluster(this.cluster)) { throw Error("Cluster is not of type `ServerlessCluster`. Metric is not applicable"); } return this.metric("ServerlessDatabaseCapacity", common_1.MetricStatistic.AVERAGE, "Serverless Database Capacity"); } metric(metricName, statistic, label) { return this.metricFactory.createMetric(metricName, statistic, label, this.dimensionsMap, undefined, RdsNamespace, undefined, this.region, this.account); } } exports.RdsClusterMetricFactory = RdsClusterMetricFactory; _a = JSII_RTTI_SYMBOL_1; RdsClusterMetricFactory[_a] = { fqn: "cdk-monitoring-constructs.RdsClusterMetricFactory", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmRzQ2x1c3Rlck1ldHJpY0ZhY3RvcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJSZHNDbHVzdGVyTWV0cmljRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLHlDQVFzQjtBQUV0QixNQUFNLFlBQVksR0FBRyxTQUFTLENBQUM7QUFjL0IsTUFBYSx1QkFBd0IsU0FBUSwwQkFBaUI7SUFLNUQsWUFDRSxhQUE0QixFQUM1QixLQUFtQztRQUVuQyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTVCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCO1lBQ3BCLHVCQUF1QixDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBRU8sTUFBTSxDQUFDLDBCQUEwQixDQUN2QyxLQUFtQztRQUVuQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6RSxPQUFPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQztRQUNqQyxDQUFDO2FBQU0sSUFDTCxLQUFLLENBQUMsaUJBQWlCLEtBQUssU0FBUztZQUNyQyxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFDM0IsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUN6QyxDQUFDO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RFLE1BQU0sS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDNUUsQ0FBQzthQUFNLENBQUM7WUFDTixN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QztJQUNKLENBQUM7O0FBOUtILDBEQStLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpbWVuc2lvbnNNYXAgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7IElEYXRhYmFzZUNsdXN0ZXIsIFNlcnZlcmxlc3NDbHVzdGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1yZHNcIjtcblxuaW1wb3J0IHtcbiAgQmFzZU1ldHJpY0ZhY3RvcnksXG4gIEJhc2VNZXRyaWNGYWN0b3J5UHJvcHMsXG4gIGdldExhdGVuY3lUeXBlTGFiZWwsXG4gIGdldExhdGVuY3lUeXBlU3RhdGlzdGljLFxuICBMYXRlbmN5VHlwZSxcbiAgTWV0cmljRmFjdG9yeSxcbiAgTWV0cmljU3RhdGlzdGljLFxufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJkc05hbWVzcGFjZSA9IFwiQVdTL1JEU1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJkc0NsdXN0ZXJNZXRyaWNGYWN0b3J5UHJvcHMgZXh0ZW5kcyBCYXNlTWV0cmljRmFjdG9yeVByb3BzIHtcbiAgLyoqXG4gICAqIGRhdGFiYXNlIGNsdXN0ZXIgaWRlbnRpZmllciAoZWl0aGVyIHRoaXMgb3IgYGNsdXN0ZXJgIG5lZWQgdG8gYmUgc3BlY2lmaWVkKVxuICAgKiBAZGVwcmVjYXRlZCBwbGVhc2UgdXNlIGBjbHVzdGVyYCBpbnN0ZWFkXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVySWRlbnRpZmllcj86IHN0cmluZztcbiAgLyoqXG4gICAqIGRhdGFiYXNlIGNsdXN0ZXIgKGVpdGhlciB0aGlzIG9yIGBjbHVzdGVySWRlbnRpZmllcmAgbmVlZCB0byBiZSBzcGVjaWZpZWQpXG4gICAqL1xuICByZWFkb25seSBjbHVzdGVyPzogSURhdGFiYXNlQ2x1c3RlciB8IFNlcnZlcmxlc3NDbHVzdGVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmRzQ2x1c3Rlck1ldHJpY0ZhY3RvcnkgZXh0ZW5kcyBCYXNlTWV0cmljRmFjdG9yeSB7XG4gIHJlYWRvbmx5IGNsdXN0ZXJJZGVudGlmaWVyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNsdXN0ZXI/OiBJRGF0YWJhc2VDbHVzdGVyIHwgU2VydmVybGVzc0NsdXN0ZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBkaW1lbnNpb25zTWFwOiBEaW1lbnNpb25zTWFwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1ldHJpY0ZhY3Rvcnk6IE1ldHJpY0ZhY3RvcnksXG4gICAgcHJvcHM6IFJkc0NsdXN0ZXJNZXRyaWNGYWN0b3J5UHJvcHMsXG4gICkge1xuICAgIHN1cGVyKG1ldHJpY0ZhY3RvcnksIHByb3BzKTtcblxuICAgIHRoaXMuY2x1c3RlciA9IHByb3BzLmNsdXN0ZXI7XG4gICAgdGhpcy5jbHVzdGVySWRlbnRpZmllciA9XG4gICAgICBSZHNDbHVzdGVyTWV0cmljRmFjdG9yeS5yZXNvbHZlRGJDbHVzdGVySWRlbnRpZmllcihwcm9wcyk7XG4gICAgdGhpcy5kaW1lbnNpb25zTWFwID0geyBEQkNsdXN0ZXJJZGVudGlmaWVyOiB0aGlzLmNsdXN0ZXJJZGVudGlmaWVyIH07XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyByZXNvbHZlRGJDbHVzdGVySWRlbnRpZmllcihcbiAgICBwcm9wczogUmRzQ2x1c3Rlck1ldHJpY0ZhY3RvcnlQcm9wcyxcbiAgKTogc3RyaW5nIHtcbiAgICBpZiAocHJvcHMuY2x1c3RlcklkZW50aWZpZXIgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5jbHVzdGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBwcm9wcy5jbHVzdGVySWRlbnRpZmllcjtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgcHJvcHMuY2x1c3RlcklkZW50aWZpZXIgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgcHJvcHMuY2x1c3RlciAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gcHJvcHMuY2x1c3Rlci5jbHVzdGVySWRlbnRpZmllcjtcbiAgICB9IGVsc2UgaWYgKHByb3BzLmNsdXN0ZXIgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5jbHVzdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKFwiT25seSBvbmUgb2YgYGNsdXN0ZXJJZGVudGlmaWVyYCBhbmQgYGNsdXN0ZXJgIGlzIHN1cHBvcnRlZFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFwiQXQgbGVhc3Qgb25lIG9mIGBjbHVzdGVySWRlbnRpZmllcmAgb3IgYGNsdXN0ZXJgIGlzIHJlcXVpcmVkXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNTZXJ2ZXJsZXNzQ2x1c3RlcihvYmo6IGFueSk6IG9iaiBpcyBTZXJ2ZXJsZXNzQ2x1c3RlciB7XG4gICAgcmV0dXJuIChvYmogYXMgYW55KS5jbHVzdGVyQXJuICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBtZXRyaWNUb3RhbENvbm5lY3Rpb25Db3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXG4gICAgICBcIkRhdGFiYXNlQ29ubmVjdGlvbnNcIixcbiAgICAgIE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFLFxuICAgICAgXCJDb25uZWN0aW9uc1wiLFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNGcmVlU3RvcmFnZUluQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiRnJlZUxvY2FsU3RvcmFnZVwiLCBNZXRyaWNTdGF0aXN0aWMuTUlOLCBcIkZyZWVcIik7XG4gIH1cblxuICBtZXRyaWNVc2VkU3RvcmFnZUluQnl0ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiVm9sdW1lQnl0ZXNVc2VkXCIsIE1ldHJpY1N0YXRpc3RpYy5NQVgsIFwiVXNlZFwiKTtcbiAgfVxuXG4gIG1ldHJpY0Rpc2tTcGFjZVVzYWdlSW5QZXJjZW50KCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljTWF0aChcbiAgICAgIFwiMTAwICogKHVzZWQvKHVzZWQrZnJlZSkpXCIsXG4gICAgICB7XG4gICAgICAgIHVzZWQ6IHRoaXMubWV0cmljVXNlZFN0b3JhZ2VJbkJ5dGVzKCksXG4gICAgICAgIGZyZWU6IHRoaXMubWV0cmljRnJlZVN0b3JhZ2VJbkJ5dGVzKCksXG4gICAgICB9LFxuICAgICAgXCJEaXNrIFVzYWdlXCIsXG4gICAgKTtcbiAgfVxuXG4gIG1ldHJpY0F2ZXJhZ2VDcHVVc2FnZUluUGVyY2VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXCJDUFVVdGlsaXphdGlvblwiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSwgXCJDUFUgVXNhZ2VcIik7XG4gIH1cblxuICBtZXRyaWNTZWxlY3RMYXRlbmN5SW5NaWxsaXMobGF0ZW5jeVR5cGU6IExhdGVuY3lUeXBlKSB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRMYXRlbmN5VHlwZUxhYmVsKGxhdGVuY3lUeXBlKTtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXG4gICAgICBcIlNlbGVjdExhdGVuY3lcIixcbiAgICAgIGdldExhdGVuY3lUeXBlU3RhdGlzdGljKGxhdGVuY3lUeXBlKSxcbiAgICAgIGBTZWxlY3QgJHtsYWJlbH1gLFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNJbnNlcnRMYXRlbmN5SW5NaWxsaXMobGF0ZW5jeVR5cGU6IExhdGVuY3lUeXBlKSB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRMYXRlbmN5VHlwZUxhYmVsKGxhdGVuY3lUeXBlKTtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXG4gICAgICBcIkluc2VydExhdGVuY3lcIixcbiAgICAgIGdldExhdGVuY3lUeXBlU3RhdGlzdGljKGxhdGVuY3lUeXBlKSxcbiAgICAgIGBJbnNlcnQgJHtsYWJlbH1gLFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNVcGRhdGVMYXRlbmN5SW5NaWxsaXMobGF0ZW5jeVR5cGU6IExhdGVuY3lUeXBlKSB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRMYXRlbmN5VHlwZUxhYmVsKGxhdGVuY3lUeXBlKTtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXG4gICAgICBcIlVwZGF0ZUxhdGVuY3lcIixcbiAgICAgIGdldExhdGVuY3lUeXBlU3RhdGlzdGljKGxhdGVuY3lUeXBlKSxcbiAgICAgIGBVcGRhdGUgJHtsYWJlbH1gLFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNEZWxldGVMYXRlbmN5SW5NaWxsaXMobGF0ZW5jeVR5cGU6IExhdGVuY3lUeXBlKSB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRMYXRlbmN5VHlwZUxhYmVsKGxhdGVuY3lUeXBlKTtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXG4gICAgICBcIkRlbGV0ZUxhdGVuY3lcIixcbiAgICAgIGdldExhdGVuY3lUeXBlU3RhdGlzdGljKGxhdGVuY3lUeXBlKSxcbiAgICAgIGBEZWxldGUgJHtsYWJlbH1gLFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNDb21taXRMYXRlbmN5SW5NaWxsaXMobGF0ZW5jeVR5cGU6IExhdGVuY3lUeXBlKSB7XG4gICAgY29uc3QgbGFiZWwgPSBnZXRMYXRlbmN5VHlwZUxhYmVsKGxhdGVuY3lUeXBlKTtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXG4gICAgICBcIkNvbW1pdExhdGVuY3lcIixcbiAgICAgIGdldExhdGVuY3lUeXBlU3RhdGlzdGljKGxhdGVuY3lUeXBlKSxcbiAgICAgIGBDb21taXQgJHtsYWJlbH1gLFxuICAgICk7XG4gIH1cblxuICAvLyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1ldGhvZHNcbiAgbWV0cmljU2VsZWN0TGF0ZW5jeVA5MEluTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY1NlbGVjdExhdGVuY3lJbk1pbGxpcyhMYXRlbmN5VHlwZS5QOTApO1xuICB9XG5cbiAgbWV0cmljSW5zZXJ0TGF0ZW5jeVA5MEluTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0luc2VydExhdGVuY3lJbk1pbGxpcyhMYXRlbmN5VHlwZS5QOTApO1xuICB9XG5cbiAgbWV0cmljVXBkYXRlTGF0ZW5jeVA5MEluTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY1VwZGF0ZUxhdGVuY3lJbk1pbGxpcyhMYXRlbmN5VHlwZS5QOTApO1xuICB9XG5cbiAgbWV0cmljRGVsZXRlTGF0ZW5jeVA5MEluTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0RlbGV0ZUxhdGVuY3lJbk1pbGxpcyhMYXRlbmN5VHlwZS5QOTApO1xuICB9XG5cbiAgbWV0cmljQ29tbWl0TGF0ZW5jeVA5MEluTWlsbGlzKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0NvbW1pdExhdGVuY3lJbk1pbGxpcyhMYXRlbmN5VHlwZS5QOTApO1xuICB9XG5cbiAgbWV0cmljUmVhZElPUFMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKFwiUmVhZElPUFNcIiwgTWV0cmljU3RhdGlzdGljLkFWRVJBR0UsIFwiUmVhZCBJT1BTXCIpO1xuICB9XG5cbiAgbWV0cmljV3JpdGVJT1BTKCkge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcIldyaXRlSU9QU1wiLCBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSwgXCJXcml0ZSBJT1BTXCIpO1xuICB9XG4gIG1ldHJpY1NlcnZlcmxlc3NEYXRhYmFzZUNhcGFjaXR5KCkge1xuICAgIGlmICghdGhpcy5pc1NlcnZlcmxlc3NDbHVzdGVyKHRoaXMuY2x1c3RlcikpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcIkNsdXN0ZXIgaXMgbm90IG9mIHR5cGUgYFNlcnZlcmxlc3NDbHVzdGVyYC4gTWV0cmljIGlzIG5vdCBhcHBsaWNhYmxlXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ldHJpYyhcbiAgICAgIFwiU2VydmVybGVzc0RhdGFiYXNlQ2FwYWNpdHlcIixcbiAgICAgIE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFLFxuICAgICAgXCJTZXJ2ZXJsZXNzIERhdGFiYXNlIENhcGFjaXR5XCIsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbWV0cmljKFxuICAgIG1ldHJpY05hbWU6IHN0cmluZyxcbiAgICBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICApIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGYWN0b3J5LmNyZWF0ZU1ldHJpYyhcbiAgICAgIG1ldHJpY05hbWUsXG4gICAgICBzdGF0aXN0aWMsXG4gICAgICBsYWJlbCxcbiAgICAgIHRoaXMuZGltZW5zaW9uc01hcCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIFJkc05hbWVzcGFjZSxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMucmVnaW9uLFxuICAgICAgdGhpcy5hY2NvdW50LFxuICAgICk7XG4gIH1cbn1cbiJdfQ==