cdk-monitoring-constructs
Version:
[](https://badge.fury.io/js/cdk-monitoring-constructs) [](https://m
150 lines • 22.4 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DynamoTableMetricFactory = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
const common_1 = require("../../common");
const DynamoDbNamespace = "AWS/DynamoDB";
const ProvisionedLabel = "Provisioned";
const ConsumedLabel = "Consumed";
const ReadThrottleEventsLabel = "Read";
const WriteThrottleEventsLabel = "Write";
class DynamoTableMetricFactory extends common_1.BaseMetricFactory {
constructor(metricFactory, props) {
super(metricFactory, props);
this.table = props.table;
}
metricProvisionedReadCapacityUnits() {
return this.metricFactory.adaptMetric(this.table.metric("ProvisionedReadCapacityUnits", {
label: ProvisionedLabel,
statistic: common_1.MetricStatistic.AVERAGE,
region: this.region,
account: this.account,
}));
}
metricProvisionedWriteCapacityUnits() {
return this.metricFactory.adaptMetric(this.table.metric("ProvisionedWriteCapacityUnits", {
label: ProvisionedLabel,
statistic: common_1.MetricStatistic.AVERAGE,
region: this.region,
account: this.account,
}));
}
metricConsumedReadCapacityUnits() {
return this.metricFactory.createMetricMath("consumed_rcu_sum/PERIOD(consumed_rcu_sum)", {
consumed_rcu_sum: this.table.metricConsumedReadCapacityUnits({
statistic: common_1.MetricStatistic.SUM,
region: this.region,
account: this.account,
}),
}, ConsumedLabel, undefined, undefined, this.region, this.account);
}
metricConsumedWriteCapacityUnits() {
return this.metricFactory.createMetricMath("consumed_wcu_sum/PERIOD(consumed_wcu_sum)", {
consumed_wcu_sum: this.table.metricConsumedWriteCapacityUnits({
statistic: common_1.MetricStatistic.SUM,
region: this.region,
account: this.account,
}),
}, ConsumedLabel, undefined, undefined, this.region, this.account);
}
metricReadCapacityUtilizationPercentage() {
return this.metricFactory.createMetricMath("100*(consumed_read_cap/provisioned_read_cap)", {
consumed_read_cap: this.metricConsumedReadCapacityUnits(),
provisioned_read_cap: this.metricProvisionedReadCapacityUnits(),
}, "Utilization", undefined, undefined, this.region, this.account);
}
metricWriteCapacityUtilizationPercentage() {
return this.metricFactory.createMetricMath("100*(consumed_write_cap/provisioned_write_cap)", {
consumed_write_cap: this.metricConsumedWriteCapacityUnits(),
provisioned_write_cap: this.metricProvisionedWriteCapacityUnits(),
}, "Utilization", undefined, undefined, this.region, this.account);
}
metricSearchAverageSuccessfulRequestLatencyInMillis() {
// searches for all used operations
return this.metricFactory.createMetricSearch('MetricName="SuccessfulRequestLatency"', {
TableName: this.table.tableName,
Operation: undefined,
}, common_1.MetricStatistic.AVERAGE, DynamoDbNamespace, undefined, undefined, this.region, this.account);
}
metricAverageSuccessfulRequestLatencyInMillis(operation) {
return this.metricFactory.adaptMetric(this.table.metric("SuccessfulRequestLatency", {
statistic: common_1.MetricStatistic.AVERAGE,
label: operation,
dimensionsMap: {
TableName: this.table.tableName,
Operation: operation,
},
region: this.region,
account: this.account,
}));
}
metricThrottledReadRequestCount() {
const readThrottles = this.metricFactory.adaptMetric(this.table.metric("ReadThrottleEvents", {
statistic: common_1.MetricStatistic.SUM,
label: ReadThrottleEventsLabel,
region: this.region,
account: this.account,
}));
return this.metricFactory.createMetricMath("FILL(readThrottles,0)", { readThrottles }, ReadThrottleEventsLabel);
}
metricThrottledWriteRequestCount() {
const writeThrottles = this.metricFactory.adaptMetric(this.table.metric("WriteThrottleEvents", {
statistic: common_1.MetricStatistic.SUM,
label: WriteThrottleEventsLabel,
region: this.region,
account: this.account,
}));
return this.metricFactory.createMetricMath("FILL(writeThrottles,0)", { writeThrottles }, WriteThrottleEventsLabel);
}
/**
* This represents the number of requests that resulted in a 500 (server error) error code.
* It summarizes across the basic CRUD operations:
* GetItem, BatchGetItem, Scan, Query, GetRecords, PutItem, DeleteItem, UpdateItem, BatchWriteItem
*
* It’s usually equal to zero.
*/
metricSystemErrorsCount() {
const crudOperations = [
aws_dynamodb_1.Operation.GET_ITEM,
aws_dynamodb_1.Operation.BATCH_GET_ITEM,
aws_dynamodb_1.Operation.SCAN,
aws_dynamodb_1.Operation.QUERY,
aws_dynamodb_1.Operation.GET_RECORDS,
aws_dynamodb_1.Operation.PUT_ITEM,
aws_dynamodb_1.Operation.DELETE_ITEM,
aws_dynamodb_1.Operation.UPDATE_ITEM,
aws_dynamodb_1.Operation.BATCH_WRITE_ITEM,
];
const usingMetrics = {};
crudOperations.forEach((operation) => {
const metric = this.table.metric("SystemErrors", {
dimensionsMap: {
TableName: this.table.tableName,
Operation: operation,
},
statistic: common_1.MetricStatistic.SUM,
region: this.region,
account: this.account,
});
const metricId = "systemError" + operation;
usingMetrics[metricId] = this.metricFactory.adaptMetric(metric);
});
return this.metricFactory.createMetricMath(
// the metric is not emitted until error happens
Object.keys(usingMetrics).join("+"), usingMetrics, "System Errors");
}
metricTimeToLiveDeletedItemCount() {
return this.metricFactory.adaptMetric(this.table.metric("TimeToLiveDeletedItemCount", {
label: "TTL Deleted Item Count",
statistic: common_1.MetricStatistic.MAX,
region: this.region,
account: this.account,
}));
}
}
exports.DynamoTableMetricFactory = DynamoTableMetricFactory;
_a = JSII_RTTI_SYMBOL_1;
DynamoTableMetricFactory[_a] = { fqn: "cdk-monitoring-constructs.DynamoTableMetricFactory", version: "9.7.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHluYW1vVGFibGVNZXRyaWNGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiRHluYW1vVGFibGVNZXRyaWNGYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsMkRBQTBFO0FBRTFFLHlDQUtzQjtBQUV0QixNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztBQUN6QyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFDakMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUM7QUFDdkMsTUFBTSx3QkFBd0IsR0FBRyxPQUFPLENBQUM7QUFlekMsTUFBYSx3QkFBeUIsU0FBUSwwQkFBZ0Q7SUFHNUYsWUFDRSxhQUE0QixFQUM1QixLQUFvQztRQUVwQyxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRTVCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBRUQsa0NBQWtDO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLDhCQUE4QixFQUFFO1lBQ2hELEtBQUssRUFBRSxnQkFBZ0I7WUFDdkIsU0FBUyxFQUFFLHdCQUFlLENBQUMsT0FBTztZQUNsQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELG1DQUFtQztRQUNqQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUNuQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsRUFBRTtZQUNqRCxLQUFLLEVBQUUsZ0JBQWdCO1lBQ3ZCLFNBQVMsRUFBRSx3QkFBZSxDQUFDLE9BQU87WUFDbEMsTUFBTSxFQUFFLElBQUksQ0FB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QixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7O0FBM05ILDREQTROQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElNZXRyaWMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7IEJpbGxpbmdNb2RlLCBJVGFibGUsIE9wZXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcblxuaW1wb3J0IHtcbiAgQmFzZU1ldHJpY0ZhY3RvcnksXG4gIEJhc2VNZXRyaWNGYWN0b3J5UHJvcHMsXG4gIE1ldHJpY0ZhY3RvcnksXG4gIE1ldHJpY1N0YXRpc3RpYyxcbn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBEeW5hbW9EYk5hbWVzcGFjZSA9IFwiQVdTL0R5bmFtb0RCXCI7XG5jb25zdCBQcm92aXNpb25lZExhYmVsID0gXCJQcm92aXNpb25lZFwiO1xuY29uc3QgQ29uc3VtZWRMYWJlbCA9IFwiQ29uc3VtZWRcIjtcbmNvbnN0IFJlYWRUaHJvdHRsZUV2ZW50c0xhYmVsID0gXCJSZWFkXCI7XG5jb25zdCBXcml0ZVRocm90dGxlRXZlbnRzTGFiZWwgPSBcIldyaXRlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHluYW1vVGFibGVNZXRyaWNGYWN0b3J5UHJvcHMgZXh0ZW5kcyBCYXNlTWV0cmljRmFjdG9yeVByb3BzIHtcbiAgLyoqXG4gICAqIHRhYmxlIHRvIG1vbml0b3JcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlOiBJVGFibGU7XG4gIC8qKlxuICAgKiB0YWJsZSBiaWxsaW5nIG1vZGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBiZXN0IGVmZm9ydCBhdXRvLWRldGVjdGlvbiBvciBQUk9WSVNJT05FRCBhcyBhIGZhbGxiYWNrXG4gICAqL1xuICByZWFkb25seSBiaWxsaW5nTW9kZT86IEJpbGxpbmdNb2RlO1xufVxuXG5leHBvcnQgY2xhc3MgRHluYW1vVGFibGVNZXRyaWNGYWN0b3J5IGV4dGVuZHMgQmFzZU1ldHJpY0ZhY3Rvcnk8RHluYW1vVGFibGVNZXRyaWNGYWN0b3J5UHJvcHM+IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRhYmxlOiBJVGFibGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbWV0cmljRmFjdG9yeTogTWV0cmljRmFjdG9yeSxcbiAgICBwcm9wczogRHluYW1vVGFibGVNZXRyaWNGYWN0b3J5UHJvcHMsXG4gICkge1xuICAgIHN1cGVyKG1ldHJpY0ZhY3RvcnksIHByb3BzKTtcblxuICAgIHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcbiAgfVxuXG4gIG1ldHJpY1Byb3Zpc2lvbmVkUmVhZENhcGFjaXR5VW5pdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRmFjdG9yeS5hZGFwdE1ldHJpYyhcbiAgICAgIHRoaXMudGFibGUubWV0cmljKFwiUHJvdmlzaW9uZWRSZWFkQ2FwYWNpdHlVbml0c1wiLCB7XG4gICAgICAgIGxhYmVsOiBQcm92aXNpb25lZExhYmVsLFxuICAgICAgICBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYy5BVkVSQUdFLFxuICAgICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbWV0cmljUHJvdmlzaW9uZWRXcml0ZUNhcGFjaXR5VW5pdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRmFjdG9yeS5hZGFwdE1ldHJpYyhcbiAgICAgIHRoaXMudGFibGUubWV0cmljKFwiUHJvdmlzaW9uZWRXcml0ZUNhcGFjaXR5VW5pdHNcIiwge1xuICAgICAgICBsYWJlbDogUHJvdmlzaW9uZWRMYWJlbCxcbiAgICAgICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSxcbiAgICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbixcbiAgICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIG1ldHJpY0NvbnN1bWVkUmVhZENhcGFjaXR5VW5pdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRmFjdG9yeS5jcmVhdGVNZXRyaWNNYXRoKFxuICAgICAgXCJjb25zdW1lZF9yY3Vfc3VtL1BFUklPRChjb25zdW1lZF9yY3Vfc3VtKVwiLFxuICAgICAge1xuICAgICAgICBjb25zdW1lZF9yY3Vfc3VtOiB0aGlzLnRhYmxlLm1ldHJpY0NvbnN1bWVkUmVhZENhcGFjaXR5VW5pdHMoe1xuICAgICAgICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLlNVTSxcbiAgICAgICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgQ29uc3VtZWRMYWJlbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMucmVnaW9uLFxuICAgICAgdGhpcy5hY2NvdW50LFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNDb25zdW1lZFdyaXRlQ2FwYWNpdHlVbml0cygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGYWN0b3J5LmNyZWF0ZU1ldHJpY01hdGgoXG4gICAgICBcImNvbnN1bWVkX3djdV9zdW0vUEVSSU9EKGNvbnN1bWVkX3djdV9zdW0pXCIsXG4gICAgICB7XG4gICAgICAgIGNvbnN1bWVkX3djdV9zdW06IHRoaXMudGFibGUubWV0cmljQ29uc3VtZWRXcml0ZUNhcGFjaXR5VW5pdHMoe1xuICAgICAgICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLlNVTSxcbiAgICAgICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAgQ29uc3VtZWRMYWJlbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMucmVnaW9uLFxuICAgICAgdGhpcy5hY2NvdW50LFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNSZWFkQ2FwYWNpdHlVdGlsaXphdGlvblBlcmNlbnRhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRmFjdG9yeS5jcmVhdGVNZXRyaWNNYXRoKFxuICAgICAgXCIxMDAqKGNvbnN1bWVkX3JlYWRfY2FwL3Byb3Zpc2lvbmVkX3JlYWRfY2FwKVwiLFxuICAgICAge1xuICAgICAgICBjb25zdW1lZF9yZWFkX2NhcDogdGhpcy5tZXRyaWNDb25zdW1lZFJlYWRDYXBhY2l0eVVuaXRzKCksXG4gICAgICAgIHByb3Zpc2lvbmVkX3JlYWRfY2FwOiB0aGlzLm1ldHJpY1Byb3Zpc2lvbmVkUmVhZENhcGFjaXR5VW5pdHMoKSxcbiAgICAgIH0sXG4gICAgICBcIlV0aWxpemF0aW9uXCIsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0aGlzLnJlZ2lvbixcbiAgICAgIHRoaXMuYWNjb3VudCxcbiAgICApO1xuICB9XG5cbiAgbWV0cmljV3JpdGVDYXBhY2l0eVV0aWxpemF0aW9uUGVyY2VudGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGYWN0b3J5LmNyZWF0ZU1ldHJpY01hdGgoXG4gICAgICBcIjEwMCooY29uc3VtZWRfd3JpdGVfY2FwL3Byb3Zpc2lvbmVkX3dyaXRlX2NhcClcIixcbiAgICAgIHtcbiAgICAgICAgY29uc3VtZWRfd3JpdGVfY2FwOiB0aGlzLm1ldHJpY0NvbnN1bWVkV3JpdGVDYXBhY2l0eVVuaXRzKCksXG4gICAgICAgIHByb3Zpc2lvbmVkX3dyaXRlX2NhcDogdGhpcy5tZXRyaWNQcm92aXNpb25lZFdyaXRlQ2FwYWNpdHlVbml0cygpLFxuICAgICAgfSxcbiAgICAgIFwiVXRpbGl6YXRpb25cIixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRoaXMucmVnaW9uLFxuICAgICAgdGhpcy5hY2NvdW50LFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNTZWFyY2hBdmVyYWdlU3VjY2Vzc2Z1bFJlcXVlc3RMYXRlbmN5SW5NaWxsaXMoKSB7XG4gICAgLy8gc2VhcmNoZXMgZm9yIGFsbCB1c2VkIG9wZXJhdGlvbnNcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGYWN0b3J5LmNyZWF0ZU1ldHJpY1NlYXJjaChcbiAgICAgICdNZXRyaWNOYW1lPVwiU3VjY2Vzc2Z1bFJlcXVlc3RMYXRlbmN5XCInLFxuICAgICAge1xuICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgICBPcGVyYXRpb246IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHN0cmluZyxcbiAgICAgIH0sXG4gICAgICBNZXRyaWNTdGF0aXN0aWMuQVZFUkFHRSxcbiAgICAgIER5bmFtb0RiTmFtZXNwYWNlLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5yZWdpb24sXG4gICAgICB0aGlzLmFjY291bnQsXG4gICAgKTtcbiAgfVxuXG4gIG1ldHJpY0F2ZXJhZ2VTdWNjZXNzZnVsUmVxdWVzdExhdGVuY3lJbk1pbGxpcyhvcGVyYXRpb246IE9wZXJhdGlvbikge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuYWRhcHRNZXRyaWMoXG4gICAgICB0aGlzLnRhYmxlLm1ldHJpYyhcIlN1Y2Nlc3NmdWxSZXF1ZXN0TGF0ZW5jeVwiLCB7XG4gICAgICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLkFWRVJBR0UsXG4gICAgICAgIGxhYmVsOiBvcGVyYXRpb24sXG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgICAgIE9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICB9LFxuICAgICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbWV0cmljVGhyb3R0bGVkUmVhZFJlcXVlc3RDb3VudCgpIHtcbiAgICBjb25zdCByZWFkVGhyb3R0bGVzID0gdGhpcy5tZXRyaWNGYWN0b3J5LmFkYXB0TWV0cmljKFxuICAgICAgdGhpcy50YWJsZS5tZXRyaWMoXCJSZWFkVGhyb3R0bGVFdmVudHNcIiwge1xuICAgICAgICBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYy5TVU0sXG4gICAgICAgIGxhYmVsOiBSZWFkVGhyb3R0bGVFdmVudHNMYWJlbCxcbiAgICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbixcbiAgICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljTWF0aChcbiAgICAgIFwiRklMTChyZWFkVGhyb3R0bGVzLDApXCIsXG4gICAgICB7IHJlYWRUaHJvdHRsZXMgfSxcbiAgICAgIFJlYWRUaHJvdHRsZUV2ZW50c0xhYmVsLFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNUaHJvdHRsZWRXcml0ZVJlcXVlc3RDb3VudCgpIHtcbiAgICBjb25zdCB3cml0ZVRocm90dGxlcyA9IHRoaXMubWV0cmljRmFjdG9yeS5hZGFwdE1ldHJpYyhcbiAgICAgIHRoaXMudGFibGUubWV0cmljKFwiV3JpdGVUaHJvdHRsZUV2ZW50c1wiLCB7XG4gICAgICAgIHN0YXRpc3RpYzogTWV0cmljU3RhdGlzdGljLlNVTSxcbiAgICAgICAgbGFiZWw6IFdyaXRlVGhyb3R0bGVFdmVudHNMYWJlbCxcbiAgICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbixcbiAgICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljTWF0aChcbiAgICAgIFwiRklMTCh3cml0ZVRocm90dGxlcywwKVwiLFxuICAgICAgeyB3cml0ZVRocm90dGxlcyB9LFxuICAgICAgV3JpdGVUaHJvdHRsZUV2ZW50c0xhYmVsLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgdGhhdCByZXN1bHRlZCBpbiBhIDUwMCAoc2VydmVyIGVycm9yKSBlcnJvciBjb2RlLlxuICAgKiBJdCBzdW1tYXJpemVzIGFjcm9zcyB0aGUgYmFzaWMgQ1JVRCBvcGVyYXRpb25zOlxuICAgKiBHZXRJdGVtLCBCYXRjaEdldEl0ZW0sIFNjYW4sIFF1ZXJ5LCBHZXRSZWNvcmRzLCBQdXRJdGVtLCBEZWxldGVJdGVtLCBVcGRhdGVJdGVtLCBCYXRjaFdyaXRlSXRlbVxuICAgKlxuICAgKiBJdOKAmXMgdXN1YWxseSBlcXVhbCB0byB6ZXJvLlxuICAgKi9cbiAgbWV0cmljU3lzdGVtRXJyb3JzQ291bnQoKSB7XG4gICAgY29uc3QgY3J1ZE9wZXJhdGlvbnMgPSBbXG4gICAgICBPcGVyYXRpb24uR0VUX0lURU0sXG4gICAgICBPcGVyYXRpb24uQkFUQ0hfR0VUX0lURU0sXG4gICAgICBPcGVyYXRpb24uU0NBTixcbiAgICAgIE9wZXJhdGlvbi5RVUVSWSxcbiAgICAgIE9wZXJhdGlvbi5HRVRfUkVDT1JEUyxcbiAgICAgIE9wZXJhdGlvbi5QVVRfSVRFTSxcbiAgICAgIE9wZXJhdGlvbi5ERUxFVEVfSVRFTSxcbiAgICAgIE9wZXJhdGlvbi5VUERBVEVfSVRFTSxcbiAgICAgIE9wZXJhdGlvbi5CQVRDSF9XUklURV9JVEVNLFxuICAgIF07XG4gICAgY29uc3QgdXNpbmdNZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCBJTWV0cmljPiA9IHt9O1xuXG4gICAgY3J1ZE9wZXJhdGlvbnMuZm9yRWFjaCgob3BlcmF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLnRhYmxlLm1ldHJpYyhcIlN5c3RlbUVycm9yc1wiLCB7XG4gICAgICAgIGRpbWVuc2lvbnNNYXA6IHtcbiAgICAgICAgICBUYWJsZU5hbWU6IHRoaXMudGFibGUudGFibGVOYW1lLFxuICAgICAgICAgIE9wZXJhdGlvbjogb3BlcmF0aW9uLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0aXN0aWM6IE1ldHJpY1N0YXRpc3RpYy5TVU0sXG4gICAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtZXRyaWNJZCA9IFwic3lzdGVtRXJyb3JcIiArIG9wZXJhdGlvbjtcbiAgICAgIHVzaW5nTWV0cmljc1ttZXRyaWNJZF0gPSB0aGlzLm1ldHJpY0ZhY3RvcnkuYWRhcHRNZXRyaWMobWV0cmljKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZhY3RvcnkuY3JlYXRlTWV0cmljTWF0aChcbiAgICAgIC8vIHRoZSBtZXRyaWMgaXMgbm90IGVtaXR0ZWQgdW50aWwgZXJyb3IgaGFwcGVuc1xuICAgICAgT2JqZWN0LmtleXModXNpbmdNZXRyaWNzKS5qb2luKFwiK1wiKSxcbiAgICAgIHVzaW5nTWV0cmljcyxcbiAgICAgIFwiU3lzdGVtIEVycm9yc1wiLFxuICAgICk7XG4gIH1cblxuICBtZXRyaWNUaW1lVG9MaXZlRGVsZXRlZEl0ZW1Db3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGYWN0b3J5LmFkYXB0TWV0cmljKFxuICAgICAgdGhpcy50YWJsZS5tZXRyaWMoXCJUaW1lVG9MaXZlRGVsZXRlZEl0ZW1Db3VudFwiLCB7XG4gICAgICAgIGxhYmVsOiBcIlRUTCBEZWxldGVkIEl0ZW0gQ291bnRcIixcbiAgICAgICAgc3RhdGlzdGljOiBNZXRyaWNTdGF0aXN0aWMuTUFYLFxuICAgICAgICByZWdpb246IHRoaXMucmVnaW9uLFxuICAgICAgICBhY2NvdW50OiB0aGlzLmFjY291bnQsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=