Skip to content

Commit

Permalink
chore: prune unused types
Browse files Browse the repository at this point in the history
  • Loading branch information
eoinsha committed Dec 5, 2023
1 parent 9ea9ea6 commit c3a7db7
Show file tree
Hide file tree
Showing 8 changed files with 48 additions and 69 deletions.
5 changes: 0 additions & 5 deletions core/alarms/alarm-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,6 @@ export interface SlicWatchMergedConfig extends AlarmProperties {

export type InputOutput = SlicWatchAlarmConfig | SlicWatchMergedConfig

export interface ReturnAlarm {
resourceName: string
resource: Resource
}

export interface AlarmActionsConfig {
actionsEnabled?: boolean
okActions?: string[]
Expand Down
24 changes: 12 additions & 12 deletions core/alarms/lambda.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ export interface SlicWatchLambdaAlarmsConfig<T extends InputOutput> extends Slic
IteratorAge: T
}

export type FunctionAlarmProperties<T extends InputOutput> = Record<string, SlicWatchLambdaAlarmsConfig<T>>

const lambdaMetrics = ['Errors', 'ThrottlesPc', 'DurationPc', 'Invocations']

/**
Expand All @@ -30,22 +28,24 @@ const lambdaMetrics = ['Errors', 'ThrottlesPc', 'DurationPc', 'Invocations']
*
* TODO - Fix the lambdaAlarmConfig type
*/
export default function createLambdaAlarms (lambdaAlarmConfig: SlicWatchLambdaAlarmsConfig<SlicWatchMergedConfig>, alarmActionsConfig: AlarmActionsConfig, compiledTemplate: Template) {
export default function createLambdaAlarms (
lambdaAlarmConfig: SlicWatchLambdaAlarmsConfig<SlicWatchMergedConfig>, alarmActionsConfig: AlarmActionsConfig, compiledTemplate: Template
) {
const resources = {}
const lambdaResources = getResourcesByType('AWS::Lambda::Function', compiledTemplate)

const mergedConfigPerFunction: Record<string, SlicWatchLambdaAlarmsConfig<SlicWatchMergedConfig>> = {}
for (const [funcLogicalId, funcResource] of Object.entries(lambdaResources)) {
const resourceConfig = cascade(funcResource?.Metadata?.slicWatch?.alarms ?? {}) as SlicWatchLambdaAlarmsConfig<SlicWatchMergedConfig>
const config: SlicWatchLambdaAlarmsConfig<SlicWatchMergedConfig> = Object.assign(lambdaAlarmConfig, resourceConfig)
mergedConfigPerFunction[funcLogicalId] = config
const mergedConfig: SlicWatchLambdaAlarmsConfig<SlicWatchMergedConfig> = Object.assign(lambdaAlarmConfig, resourceConfig)
mergedConfigPerFunction[funcLogicalId] = mergedConfig

for (const metric of lambdaMetrics) {
if (config.enabled === false || config[metric].enabled === false) {
if (mergedConfig.enabled === false || mergedConfig[metric].enabled === false) {
continue
}
if (metric === 'ThrottlesPc') {
const properties = config.ThrottlesPc
const properties = mergedConfig.ThrottlesPc
properties.Metrics = [
{
Id: 'throttles_pc',
Expand Down Expand Up @@ -82,32 +82,32 @@ export default function createLambdaAlarms (lambdaAlarmConfig: SlicWatchLambdaAl
]
}
if (metric === 'DurationPc') {
const properties = config.DurationPc
const properties = mergedConfig.DurationPc
const funcTimeout: number = funcResource.Properties?.Timeout ?? 3
const threshold: Value<number> = properties.Threshold as number
const alarmDescription = Fn.Sub(`Max duration for \${${funcLogicalId}} breaches ${properties.Threshold}% of timeout (${funcTimeout})`, {})
properties.AlarmDescription = alarmDescription
properties.Threshold = (threshold * funcTimeout * 1000) / 100
}
if (metric === 'Errors') {
const properties = config.Errors
const properties = mergedConfig.Errors
const alarmDescription = Fn.Sub(`Error count for \${${funcLogicalId}} breaches ${properties.Threshold}`, {})
properties.AlarmDescription = alarmDescription
}

if (metric === 'ThrottlesPc') {
const properties = config.ThrottlesPc
const properties = mergedConfig.ThrottlesPc
const alarmDescription = Fn.Sub(`Throttles % for \${${funcLogicalId}} breaches ${properties.Threshold}`, {})
properties.AlarmDescription = alarmDescription
}

if (metric === 'Invocations') {
const properties = config.Invocations
const properties = mergedConfig.Invocations
const alarmDescription = Fn.Sub(`Total invocations for \${${funcLogicalId}} breaches ${properties.Threshold}`, {})
properties.AlarmDescription = alarmDescription
}

Object.assign(resources, createLambdaCfAlarm(config[metric], metric, funcLogicalId, compiledTemplate, alarmActionsConfig))
Object.assign(resources, createLambdaCfAlarm(mergedConfig[metric], metric, funcLogicalId, compiledTemplate, alarmActionsConfig))
}
}
for (const funcLogicalId of Object.keys(getEventSourceMappingFunctions(compiledTemplate))) {
Expand Down
17 changes: 0 additions & 17 deletions core/dashboards/dashboard-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,6 @@ export interface WidgetWithSize extends Omit<Widget, 'width' | 'height'> {
height: number
}

export interface MetricProperties {
metrics: any[][]
title: string
view: string
region: string
period?: number
yAxis?: YAxisPos
}

export interface CreateMetricWidget {
type: string
properties: MetricProperties
width: number
height: number
yAxis?: YAxisPos
}

export interface WidgetMetricProperties {
enabled: boolean
metricPeriod: number
Expand Down
40 changes: 20 additions & 20 deletions core/dashboards/dashboard.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type Template from 'cloudform-types/types/template'
import * as cwd from 'cloudwatch-dashboard-types'
import { type Dashboard, type WidgetMetric, type Statistic, type YAxisPosition } from 'cloudwatch-dashboard-types'

import { cascade } from '../inputs/cascading-config'
import { getResourcesByType, getEventSourceMappingFunctions, addResource } from '../cf-template'
Expand Down Expand Up @@ -94,7 +94,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
])

if (positionedWidgets.length > 0) {
const dash: cwd.Dashboard = { start: timeRange?.start, end: timeRange?.end, widgets: positionedWidgets }
const dash: Dashboard = { start: timeRange?.start, end: timeRange?.end, widgets: positionedWidgets }
const dashboardResource = {
Type: 'AWS::CloudWatch::Dashboard',
Properties: {
Expand All @@ -115,23 +115,23 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
* @param {Object} config Cascaded widget/metric configuration
*/
function createMetricWidget (title: string, metricDefs: MetricDefs[], config: WidgetMetricProperties): WidgetWithSize {
const metrics: cwd.WidgetMetric[] = metricDefs.map(
const metrics: WidgetMetric[] = metricDefs.map(
({ namespace, metric, dimensions, stat, yAxis }) => [
namespace,
metric,
...Object.entries(dimensions).reduce(
(acc: string[], [name, value]) => [...acc, name, value],
[]
),
{ stat: stat as cwd.Statistic, yAxis: yAxis as cwd.YAxisPosition }
{ stat: stat as Statistic, yAxis: yAxis as YAxisPosition }
]
)
return {
type: cwd.WidgetType.Metric,
type: 'metric',
properties: {
metrics,
title,
view: cwd.MetricViewType.TimeSeries,
view: 'timeSeries',
region: '${AWS::Region}',
period: config.metricPeriod
},
Expand Down Expand Up @@ -160,7 +160,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
if (Object.keys(functionResources).length > 0) {
for (const [metric, metricConfig] of Object.entries(getConfiguredMetrics(lambdaDashConfig))) {
if (metric !== 'IteratorAge' as any) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
const metricDefs: MetricDefs[] = []
for (const funcLogicalId of Object.keys(functionResources)) {
const funcConfig = configPerFunctionResource[funcLogicalId]
Expand All @@ -170,7 +170,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
namespace: 'AWS/Lambda',
metric,
dimensions: { FunctionName: `\${${funcLogicalId}}` },
stat: stat as cwd.Statistic
stat: stat as Statistic
})
}
}
Expand All @@ -188,7 +188,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
for (const funcLogicalId of eventSourceMappingFunctionResourceNames) {
// Add IteratorAge alarm if the Lambda function has an EventSourceMapping trigger
const funcConfig = configPerFunctionResource[funcLogicalId]
const functionMetricConfig = funcConfig[metric] ?? {}
const functionMetricConfig = funcConfig[metric]
if (functionMetricConfig.enabled !== false) {
const stats: string[] = []
metricConfig?.Statistic?.forEach(a => stats.push(a))
Expand All @@ -198,7 +198,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
namespace: 'AWS/Lambda',
metric: 'IteratorAge',
dimensions: { FunctionName: `\${${funcLogicalId}}` },
stat: stat as cwd.Statistic
stat: stat as Statistic
})),
metricConfig as Widgets
)
Expand Down Expand Up @@ -239,7 +239,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
const widgetMetrics: MetricDefs[] = []
for (const [metric, metricConfig] of Object.entries(getConfiguredMetrics(apiGwDashConfig))) {
if (metricConfig.enabled) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/ApiGateway',
metric,
Expand Down Expand Up @@ -275,7 +275,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
const widgetMetrics: MetricDefs[] = []
for (const [metric, metricConfig] of Object.entries(getConfiguredMetrics(sfDashConfig))) {
if (metricConfig.enabled) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/States',
metric,
Expand Down Expand Up @@ -310,7 +310,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
const widgetMetrics: MetricDefs[] = []
for (const [metric, metricConfig] of Object.entries(getConfiguredMetrics(dynamoDbDashConfig))) {
if (metricConfig.enabled) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/DynamoDB',
metric,
Expand All @@ -330,7 +330,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
}
for (const gsi of res.Properties?.GlobalSecondaryIndexes ?? []) {
const gsiName: string = gsi.IndexName
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/DynamoDB',
metric,
Expand Down Expand Up @@ -493,7 +493,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
const widgetMetrics: MetricDefs[] = []
for (const [metric, metricConfig] of Object.entries(getConfiguredMetrics(snsDashConfig))) {
if (metricConfig.enabled) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/SNS',
metric,
Expand Down Expand Up @@ -528,7 +528,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
const widgetMetrics: MetricDefs[] = []
for (const [metric, metricConfig] of Object.entries(getConfiguredMetrics(ruleDashConfig))) {
if (metricConfig.enabled) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/Events',
metric,
Expand Down Expand Up @@ -564,7 +564,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
const widgetMetrics: MetricDefs[] = []
for (const [metric, metricConfig] of Object.entries(getConfiguredMetrics(albDashConfig))) {
if (metricConfig.enabled) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/ApplicationELB',
metric,
Expand Down Expand Up @@ -606,7 +606,7 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
if (metricConfig.enabled &&
(targetGroupResource.Properties?.TargetType === 'lambda' || !['LambdaUserError', 'LambdaInternalError'].includes(metric))
) {
for (const stat of metricConfig?.Statistic ?? []) {
for (const stat of metricConfig.Statistic) {
widgetMetrics.push({
namespace: 'AWS/ApplicationELB',
metric,
Expand Down Expand Up @@ -660,8 +660,8 @@ export default function addDashboard (dashboardConfig: SlicWatchInputDashboardCo
namespace: 'AWS/AppSync',
metric,
dimensions: { GraphQLAPIId: graphQLAPIId },
stat: stat as cwd.Statistic,
yAxis: metricConfig.yAxis as cwd.YAxisPosition
stat: stat as Statistic,
yAxis: metricConfig.yAxis as YAxisPosition
})
}
}
Expand Down
11 changes: 6 additions & 5 deletions core/dashboards/tests/dashboard.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import defaultConfig from '../../inputs/default-config'

import { createTestCloudFormationTemplate, defaultCfTemplate, albCfTemplate, appSyncCfTemplate } from '../../tests/testing-utils'
import { type ResourceType, getResourcesByType } from '../../cf-template'
import { type Widgets } from '../dashboard-types'

const lambdaMetrics = ['Errors', 'Duration', 'IteratorAge', 'Invocations', 'ConcurrentExecutions', 'Throttles']

Expand Down Expand Up @@ -312,7 +313,7 @@ test('A dashboard includes metrics for ALB', (t) => {
const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget', 'AppSync']
const dashConfig = _.cloneDeep(defaultConfig.dashboard)
for (const service of services) {
dashConfig.widgets[service].enabled = false
(dashConfig.widgets as Widgets)[service].enabled = false
}
const compiledTemplate = createTestCloudFormationTemplate((appSyncCfTemplate))
addDashboard(dashConfig, compiledTemplate)
Expand All @@ -325,7 +326,7 @@ test('A dashboard includes metrics for ALB', (t) => {
const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget', 'AppSync']
const dashConfig = _.cloneDeep(defaultConfig.dashboard)
for (const service of services) {
dashConfig.widgets[service].enabled = false
(dashConfig.widgets as Widgets)[service].enabled = false
}
const compiledTemplate = createTestCloudFormationTemplate((albCfTemplate))
addDashboard(dashConfig, compiledTemplate)
Expand Down Expand Up @@ -414,7 +415,7 @@ test('A dashboard includes metrics for ALB', (t) => {
const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget', 'AppSync']
const dashConfig = _.cloneDeep(defaultConfig.dashboard)
for (const service of services) {
dashConfig.widgets[service].enabled = false
(dashConfig.widgets as Widgets)[service].enabled = false
}
const compiledTemplate = createTestCloudFormationTemplate((appSyncCfTemplate))
addDashboard(dashConfig, compiledTemplate)
Expand Down Expand Up @@ -463,7 +464,7 @@ test('No dashboard is created if all widgets are disabled', (t) => {
const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget', 'AppSync']
const dashConfig = _.cloneDeep(defaultConfig.dashboard)
for (const service of services) {
dashConfig.widgets[service].enabled = false
(dashConfig.widgets as Widgets)[service].enabled = false
}
const compiledTemplate = createTestCloudFormationTemplate()
addDashboard(dashConfig, compiledTemplate)
Expand All @@ -476,7 +477,7 @@ test('No dashboard is created if all metrics are disabled', (t) => {
const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget', 'AppSync']
const dashConfig = _.cloneDeep(defaultConfig.dashboard)
for (const service of services) {
dashConfig.widgets[service].enabled = false
(dashConfig.widgets as Widgets)[service].enabled = false
}
const compiledTemplate = createTestCloudFormationTemplate()
addDashboard(dashConfig, compiledTemplate)
Expand Down
2 changes: 1 addition & 1 deletion core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"yaml": "^1.10.2"
},
"devDependencies": {
"cloudwatch-dashboard-types": "^1.0.0-rc1",
"cloudwatch-dashboard-types": "^1.0.1-rc2",
"ts-node": "^10.9.1"
}
}
16 changes: 8 additions & 8 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"resolveJsonModule": true,
"target": "ESNext",
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
"esModuleInterop": true,
},
"ts-node": {
"swc": true,
Expand Down

0 comments on commit c3a7db7

Please sign in to comment.