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

496 lines 99.1 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.LambdaFunctionMonitoring = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch"); const LambdaFunctionEnhancedMetricFactory_1 = require("./LambdaFunctionEnhancedMetricFactory"); const LambdaFunctionMetricFactory_1 = require("./LambdaFunctionMetricFactory"); const common_1 = require("../../common"); const dashboard_1 = require("../../dashboard"); class LambdaFunctionMonitoring extends common_1.Monitoring { constructor(scope, props) { super(scope, props); this.namingStrategy = new dashboard_1.MonitoringNamingStrategy({ ...props, namedConstruct: props.lambdaFunction, fallbackConstructName: this.resolveFunctionName(props.lambdaFunction), }); this.title = this.namingStrategy.resolveHumanReadableName(); this.functionUrl = scope .createAwsConsoleUrlFactory() .getLambdaFunctionUrl(props.lambdaFunction.functionName); this.alarmFactory = this.createAlarmFactory(this.namingStrategy.resolveAlarmFriendlyName()); this.errorAlarmFactory = new common_1.ErrorAlarmFactory(this.alarmFactory); this.latencyAlarmFactory = new common_1.LatencyAlarmFactory(this.alarmFactory); this.tpsAlarmFactory = new common_1.TpsAlarmFactory(this.alarmFactory); this.taskHealthAlarmFactory = new common_1.TaskHealthAlarmFactory(this.alarmFactory); this.ageAlarmFactory = new common_1.AgeAlarmFactory(this.alarmFactory); this.usageAlarmFactory = new common_1.UsageAlarmFactory(this.alarmFactory); this.latencyAnnotations = []; this.errorCountAnnotations = []; this.errorRateAnnotations = []; this.invocationCountAnnotations = []; this.invocationRateAnnotations = []; this.tpsAnnotations = []; this.cpuTotalTimeAnnotations = []; this.memoryUsageAnnotations = []; this.maxIteratorAgeAnnotations = []; this.maxOffsetLagAnnotations = []; this.initDurationAnnotations = []; this.metricFactory = new LambdaFunctionMetricFactory_1.LambdaFunctionMetricFactory(scope.createMetricFactory(), props); this.tpsMetric = this.metricFactory.metricInvocationRate(common_1.RateComputationMethod.PER_SECOND); this.p50LatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.P50); this.p90LatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.P90); this.p99LatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.P99); this.maxLatencyMetric = this.metricFactory.metricLatencyInMillis(common_1.LatencyType.MAX); this.faultCountMetric = this.metricFactory.metricFaultCount(); this.faultRateMetric = this.metricFactory.metricFaultRate(); this.invocationCountMetric = this.metricFactory.metricInvocationCount(); this.throttlesCountMetric = this.metricFactory.metricThrottlesCount(); this.throttlesRateMetric = this.metricFactory.metricThrottlesRate(); this.concurrentExecutionsCountMetric = this.metricFactory.metricConcurrentExecutions(); this.provisionedConcurrencySpilloverInvocationsCountMetric = this.metricFactory.metricProvisionedConcurrencySpilloverInvocations(); this.provisionedConcurrencySpilloverInvocationsRateMetric = this.metricFactory.metricProvisionedConcurrencySpilloverRate(); this.isIterator = props.isIterator ?? true; this.maxIteratorAgeMetric = this.metricFactory.metricMaxIteratorAgeInMillis(); this.isOffsetLag = props.isOffsetLag ?? false; this.maxOffsetLagMetric = this.metricFactory.metricMaxOffsetLagInNumberOfRecords(); this.lambdaInsightsEnabled = props.lambdaInsightsEnabled ?? false; if (props.lambdaInsightsEnabled) { this.enhancedMetricFactory = new LambdaFunctionEnhancedMetricFactory_1.LambdaFunctionEnhancedMetricFactory(scope.createMetricFactory(), props); this.enhancedMonitoringMaxCpuTotalTimeMetric = this.enhancedMetricFactory.enhancedMetricMaxCpuTotalTime(); this.enhancedMonitoringP90CpuTotalTimeMetric = this.enhancedMetricFactory.enhancedMetricP90CpuTotalTime(); this.enhancedMonitoringAvgCpuTotalTimeMetric = this.enhancedMetricFactory.enhancedMetricAvgCpuTotalTime(); this.enhancedMonitoringMaxMemoryUtilizationMetric = this.enhancedMetricFactory.enhancedMetricMaxMemoryUtilization(); this.enhancedMonitoringP90MemoryUtilizationMetric = this.enhancedMetricFactory.enhancedMetricP90MemoryUtilization(); this.enhancedMonitoringAvgMemoryUtilizationMetric = this.enhancedMetricFactory.enhancedMetricAvgMemoryUtilization(); this.enhancedMonitoringMaxInitDurationMetric = this.enhancedMetricFactory.enhancedMetricMaxInitDuration(); this.enhancedMonitoringP90InitDurationMetric = this.enhancedMetricFactory.enhancedMetricP90InitDuration(); this.enhancedMonitoringAvgInitDurationMetric = this.enhancedMetricFactory.enhancedMetricAvgInitDuration(); this.enhancedMetricFunctionCostMetric = this.enhancedMetricFactory.enhancedMetricFunctionCost(); for (const disambiguator in props.addEnhancedMonitoringMaxCpuTotalTimeAlarm) { const alarmProps = props.addEnhancedMonitoringMaxCpuTotalTimeAlarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addDurationAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringMaxCpuTotalTimeMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ common_1.LatencyType.P100, alarmProps, disambiguator); this.cpuTotalTimeAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringP90CpuTotalTimeAlarm) { const alarmProps = props.addEnhancedMonitoringP90CpuTotalTimeAlarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addDurationAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringP90CpuTotalTimeMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ common_1.LatencyType.P90, alarmProps, disambiguator); this.cpuTotalTimeAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringAvgCpuTotalTimeAlarm) { const alarmProps = props.addEnhancedMonitoringAvgCpuTotalTimeAlarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addDurationAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringAvgCpuTotalTimeMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ common_1.LatencyType.AVERAGE, alarmProps, disambiguator); this.cpuTotalTimeAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringMaxMemoryUtilizationAlarm) { const alarmProps = props.addEnhancedMonitoringMaxMemoryUtilizationAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMaxMemoryUsagePercentAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringMaxMemoryUtilizationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ alarmProps, disambiguator); this.memoryUsageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringP90MemoryUtilizationAlarm) { const alarmProps = props.addEnhancedMonitoringP90MemoryUtilizationAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMemoryUsagePercentAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringP90MemoryUtilizationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ alarmProps, common_1.UsageType.P90, disambiguator); this.memoryUsageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringAvgMemoryUtilizationAlarm) { const alarmProps = props.addEnhancedMonitoringAvgMemoryUtilizationAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMemoryUsagePercentAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringAvgMemoryUtilizationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ alarmProps, common_1.UsageType.AVERAGE, disambiguator); this.memoryUsageAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringMaxInitDurationAlarm) { const alarmProps = props.addEnhancedMonitoringMaxInitDurationAlarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addCustomDurationAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringMaxInitDurationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ common_1.LatencyType.MAX, alarmProps, "InitDuration", disambiguator); this.initDurationAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringP90InitDurationAlarm) { const alarmProps = props.addEnhancedMonitoringP90InitDurationAlarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addCustomDurationAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringP90InitDurationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ common_1.LatencyType.P90, alarmProps, "InitDuration", disambiguator); this.initDurationAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addEnhancedMonitoringAvgInitDurationAlarm) { const alarmProps = props.addEnhancedMonitoringAvgInitDurationAlarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addCustomDurationAlarm( /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringAvgInitDurationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ common_1.LatencyType.AVERAGE, alarmProps, "InitDuration", disambiguator); this.initDurationAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } } for (const disambiguator in props.addLatencyP50Alarm) { const alarmProps = props.addLatencyP50Alarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.p50LatencyMetric, common_1.LatencyType.P50, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator); this.latencyAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addLatencyP90Alarm) { const alarmProps = props.addLatencyP90Alarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.p90LatencyMetric, common_1.LatencyType.P90, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator); this.latencyAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addLatencyP99Alarm) { const alarmProps = props.addLatencyP99Alarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.p99LatencyMetric, common_1.LatencyType.P99, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator); this.latencyAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addMaxLatencyAlarm) { const alarmProps = props.addMaxLatencyAlarm[disambiguator]; const createdAlarm = this.latencyAlarmFactory.addLatencyAlarm(this.maxLatencyMetric, common_1.LatencyType.MAX, this.convertToLatencyThreshold(alarmProps, props.lambdaFunction), disambiguator); this.latencyAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addFaultCountAlarm) { const alarmProps = props.addFaultCountAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(this.faultCountMetric, common_1.ErrorType.FAULT, alarmProps, disambiguator); this.errorCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addFaultRateAlarm) { const alarmProps = props.addFaultRateAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorRateAlarm(this.faultRateMetric, common_1.ErrorType.FAULT, alarmProps, disambiguator); this.errorRateAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addLowTpsAlarm) { const alarmProps = props.addLowTpsAlarm[disambiguator]; const createdAlarm = this.tpsAlarmFactory.addMinTpsAlarm(this.tpsMetric, alarmProps, disambiguator); this.tpsAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addHighTpsAlarm) { const alarmProps = props.addHighTpsAlarm[disambiguator]; const createdAlarm = this.tpsAlarmFactory.addMaxTpsAlarm(this.tpsMetric, alarmProps, disambiguator); this.tpsAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addThrottlesCountAlarm) { const alarmProps = props.addThrottlesCountAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorCountAlarm(this.throttlesCountMetric, common_1.ErrorType.THROTTLED, alarmProps, disambiguator); this.invocationCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addThrottlesRateAlarm) { const alarmProps = props.addThrottlesRateAlarm[disambiguator]; const createdAlarm = this.errorAlarmFactory.addErrorRateAlarm(this.throttlesRateMetric, common_1.ErrorType.THROTTLED, alarmProps, disambiguator); this.invocationRateAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addMinInvocationsCountAlarm) { const alarmProps = props.addMinInvocationsCountAlarm[disambiguator]; const createdAlarm = this.usageAlarmFactory.addMinUsageCountAlarm(this.invocationCountMetric, alarmProps, disambiguator); this.invocationCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addConcurrentExecutionsCountAlarm) { const alarmProps = props.addConcurrentExecutionsCountAlarm[disambiguator]; const createdAlarm = this.taskHealthAlarmFactory.addRunningTaskCountAlarm(this.concurrentExecutionsCountMetric, alarmProps, disambiguator); this.invocationCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addProvisionedConcurrencySpilloverInvocationsCountAlarm) { const alarmProps = props.addProvisionedConcurrencySpilloverInvocationsCountAlarm[disambiguator]; const createdAlarm = this.taskHealthAlarmFactory.addRunningTaskCountAlarm(this.provisionedConcurrencySpilloverInvocationsCountMetric, alarmProps, disambiguator); this.invocationCountAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addProvisionedConcurrencySpilloverInvocationsRateAlarm) { const alarmProps = props.addProvisionedConcurrencySpilloverInvocationsRateAlarm[disambiguator]; const createdAlarm = this.taskHealthAlarmFactory.addRunningTaskRateAlarm(this.provisionedConcurrencySpilloverInvocationsRateMetric, alarmProps, disambiguator); this.invocationRateAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addMaxIteratorAgeAlarm) { if (!this.isIterator) { throw new Error("addMaxIteratorAgeAlarm is not applicable if isIterator is not true"); } const alarmProps = props.addMaxIteratorAgeAlarm[disambiguator]; const createdAlarm = this.ageAlarmFactory.addIteratorMaxAgeAlarm(this.maxIteratorAgeMetric, alarmProps, disambiguator); this.maxIteratorAgeAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } for (const disambiguator in props.addMaxOffsetLagAlarm) { if (!this.isOffsetLag) { throw new Error("addMaxOffsetLagAlarm is not applicable if isOffsetLag is not true"); } const alarmProps = props.addMaxOffsetLagAlarm[disambiguator]; const createdAlarm = this.ageAlarmFactory.addMaxOffsetLagAlarm(this.maxOffsetLagMetric, alarmProps, disambiguator); this.maxOffsetLagAnnotations.push(createdAlarm.annotation); this.addAlarm(createdAlarm); } props.useCreatedAlarms?.consume(this.createdAlarms()); } convertToLatencyThreshold(latencyProps, lambdaFunction) { if ("maxLatency" in latencyProps) { return latencyProps; } const { maxLatencyPercentageOfTimeout, ...rest } = latencyProps; const timeout = lambdaFunction.timeout ?? aws_cdk_lib_1.Duration.seconds(3); return { ...rest, maxLatency: aws_cdk_lib_1.Duration.millis(Math.floor((timeout.toMilliseconds() * maxLatencyPercentageOfTimeout) / 100)), }; } summaryWidgets() { return [ this.createTitleWidget(), this.createTpsWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight), this.createLatencyWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight), this.createErrorRateWidget(common_1.ThirdWidth, common_1.DefaultSummaryWidgetHeight), ]; } widgets() { const widgets = [ this.createTitleWidget(), new aws_cloudwatch_1.Row(this.createTpsWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLatencyWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createErrorRateWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createRateWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight)), ]; let secondRowWidgetWidth; if (this.isIterator && this.isOffsetLag) { secondRowWidgetWidth = common_1.QuarterWidth; } else if (this.isIterator || this.isOffsetLag) { secondRowWidgetWidth = common_1.ThirdWidth; } else { secondRowWidgetWidth = common_1.HalfWidth; } const secondRow = new aws_cloudwatch_1.Row(this.createInvocationWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight), this.createErrorCountWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight)); if (this.isIterator) { secondRow.addWidget(this.createIteratorAgeWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight)); } if (this.isOffsetLag) { secondRow.addWidget(this.createOffsetLagWidget(secondRowWidgetWidth, common_1.DefaultGraphWidgetHeight)); } widgets.push(secondRow); if (this.lambdaInsightsEnabled) { widgets.push(new aws_cloudwatch_1.Row(this.createLambdaInsightsCpuWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLambdaInsightsMemoryWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLambdaInsightsInitDurationWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight), this.createLambdaInsightsFunctionCostWidget(common_1.QuarterWidth, common_1.DefaultGraphWidgetHeight))); } return widgets; } createTitleWidget() { return new dashboard_1.MonitoringHeaderWidget({ family: "Lambda Function", title: this.title, goToLinkUrl: this.functionUrl, }); } createTpsWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "TPS", left: [this.tpsMetric], leftYAxis: common_1.RateAxisFromZero, leftAnnotations: this.tpsAnnotations, }); } createLatencyWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Latency", left: [ this.p50LatencyMetric, this.p90LatencyMetric, this.p99LatencyMetric, ], leftYAxis: common_1.TimeAxisMillisFromZero, leftAnnotations: this.latencyAnnotations, }); } createErrorCountWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Errors", left: [this.faultCountMetric], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.errorCountAnnotations, }); } createErrorRateWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Errors (rate)", left: [this.faultRateMetric], leftYAxis: common_1.RateAxisFromZero, leftAnnotations: this.errorRateAnnotations, }); } createRateWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Rates", left: [ this.throttlesRateMetric, this.provisionedConcurrencySpilloverInvocationsRateMetric, ], leftYAxis: common_1.RateAxisFromZero, leftAnnotations: this.invocationRateAnnotations, }); } createInvocationWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Invocations", left: [ this.invocationCountMetric, this.throttlesCountMetric, this.concurrentExecutionsCountMetric, this.provisionedConcurrencySpilloverInvocationsCountMetric, ], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.invocationCountAnnotations, }); } createIteratorAgeWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Iterator", left: [this.maxIteratorAgeMetric], leftYAxis: common_1.TimeAxisMillisFromZero, leftAnnotations: this.maxIteratorAgeAnnotations, }); } createOffsetLagWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "OffsetLag", left: [this.maxOffsetLagMetric], leftYAxis: common_1.CountAxisFromZero, leftAnnotations: this.maxOffsetLagAnnotations, }); } createLambdaInsightsCpuWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "CPU Total Time", left: [ /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringMaxCpuTotalTimeMetric, this.enhancedMonitoringP90CpuTotalTimeMetric, this.enhancedMonitoringAvgCpuTotalTimeMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ ], leftYAxis: common_1.TimeAxisMillisFromZero, leftAnnotations: this.cpuTotalTimeAnnotations, }); } createLambdaInsightsMemoryWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Memory Utilization", left: [ /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringMaxMemoryUtilizationMetric, this.enhancedMonitoringP90MemoryUtilizationMetric, this.enhancedMonitoringAvgMemoryUtilizationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ ], leftYAxis: common_1.PercentageAxisFromZeroToHundred, leftAnnotations: this.memoryUsageAnnotations, }); } createLambdaInsightsInitDurationWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Init Duration", left: [ /* eslint-disable @typescript-eslint/no-non-null-assertion */ this.enhancedMonitoringMaxInitDurationMetric, this.enhancedMonitoringP90InitDurationMetric, this.enhancedMonitoringAvgInitDurationMetric, /* eslint-enable @typescript-eslint/no-non-null-assertion */ ], leftYAxis: common_1.TimeAxisMillisFromZero, leftAnnotations: this.initDurationAnnotations, }); } createLambdaInsightsFunctionCostWidget(width, height) { return new aws_cloudwatch_1.GraphWidget({ width, height, title: "Function Cost", /* eslint-disable @typescript-eslint/no-non-null-assertion */ left: [this.enhancedMetricFunctionCostMetric], /* eslint-enable @typescript-eslint/no-non-null-assertion */ leftYAxis: common_1.MegabyteMillisecondAxisFromZero, }); } resolveFunctionName(lambdaFunction) { // try to take the name (if specified) instead of token return lambdaFunction.node.defaultChild?.functionName; } } exports.LambdaFunctionMonitoring = LambdaFunctionMonitoring; _a = JSII_RTTI_SYMBOL_1; LambdaFunctionMonitoring[_a] = { fqn: "cdk-monitoring-constructs.LambdaFunctionMonitoring", version: "10.0.0" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTGFtYmRhRnVuY3Rpb25Nb25pdG9yaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXVDO0FBQ3ZDLCtEQUtvQztBQUdwQywrRkFBNEY7QUFDNUYsK0VBR3VDO0FBQ3ZDLHlDQXVDc0I7QUFDdEIsK0NBR3lCO0FBNkd6QixNQUFhLHdCQUF5QixTQUFRLG1CQUFVO0lBMER0RCxZQUFZLEtBQXNCLEVBQUUsS0FBb0M7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVwQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksb0NBQXdCLENBQUM7WUFDakQsR0FBRyxLQUFLO1lBQ1IsY0FBYyxFQUFFLEtBQUssQ0FBQyxjQUFjO1lBQ3BDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1NBQ3RFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSzthQUNyQiwwQkFBMEIsRUFBRTthQUM1QixvQkFBb0IsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLHdCQUF3QixFQUFFLENBQy9DLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSwwQkFBaUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksNEJBQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxlQUFlLEdBQUcs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