From 8afae3807a7341ee365d8657acc4f7df8dc921fd Mon Sep 17 00:00:00 2001 From: direnakkoc Date: Mon, 28 Nov 2022 16:20:12 +0000 Subject: [PATCH] Use different y-axes for metrics of different units - Tidy up the branch --- README.md | 15 ++++++- core/config-schema.js | 1 + core/dashboard.js | 10 ++--- core/default-config.js | 4 +- core/tests/dashboard.test.js | 38 ++++++++++++++++-- docs/appsyncAPI.png | Bin 0 -> 26920 bytes docs/appsyncRealTimeSubscriptions.png | Bin 0 -> 29604 bytes .../serverless-v2.yml | 5 +++ .../serverless.yml | 7 +++- 9 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 docs/appsyncAPI.png create mode 100644 docs/appsyncRealTimeSubscriptions.png diff --git a/README.md b/README.md index 598d5220..8f5c50b7 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Automatic, best-practice CloudWatch **Dashboards** and **Alarms** for your SAM, CloudFormation, CDK and Serverless Framework applications. -SLIC Watch supports: _AWS Lambda, API Gateway, DynamoDB, Kinesis Data Streams, SQS Queues, Step Functions, ECS (Fargate or EC2), SNS, EventBridge and Application Load Balancer._ +SLIC Watch supports: _AWS Lambda, API Gateway, DynamoDB, Kinesis Data Streams, SQS Queues, Step Functions, ECS (Fargate or EC2), SNS, EventBridge, Application Load Balancer and AppSync._ Supported tools include: * ⚡️ **Serverless Framework** v2 and v3 via the [_SLIC Watch Serverless Plugin_](#getting-started-with-serverless-framework) @@ -33,6 +33,7 @@ Supported tools include: - [SNS](#sns) - [EventBridge](#eventbridge) - [Application Load Balancer](#application-load-balancer) + - [AppSync](#appsync) - [Configuration](#configuration) - [Top-level configuration](#top-level-configuration) - [Function-level configuration](#function-level-configuration) @@ -303,6 +304,18 @@ Application Load Balancer dashboard widgets show: |**UnHealthy Host Count**|**Lambda User Error**|**Lambda Internal Error**| |![UnHealthyHostCount](https://raw.githubusercontent.com/fourtheorem/slic-watch/main/docs/unHealthyHostCount.png) |![LambdaUserError](https://raw.githubusercontent.com/fourtheorem/slic-watch/main/docs/lambdaUserError.png)| | +### AppSync +AppSync alarms are created for: +1. 5XX Error +2. Latency + +AppSync dashboard widgets show: + +|5XX Error, Latency, 4XX Error, Request| +|--| +|![API Widget](https://raw.githubusercontent.com/fourtheorem/slic-watch/main/docs/appsyncAPI.png)| +|**Connect Server Error**, **Disconnect Server Error**, **Subscribe Server Error**, **Unsubscribe Server Error**,**PublishDataMessageServerError**| +|![Real-time Subscriptions Widget](https://raw.githubusercontent.com/fourtheorem/slic-watch/main/docs/appsyncRealTimeSubscriptions.png)| ## Configuration Configuration is entirely optional - SLIC Watch provides defaults that work out of the box. diff --git a/core/config-schema.js b/core/config-schema.js index 875080b3..85356667 100644 --- a/core/config-schema.js +++ b/core/config-schema.js @@ -115,6 +115,7 @@ const commonWidgetProperties = { width: { type: ['integer', 'null'], minimum: 1, maximum: 24 }, height: { type: ['integer', 'null'], minimum: 1, maximum: 1000 }, metricPeriod: { type: ['integer', 'null'], minimum: 60, multipleOf: 60 }, + yAxis: { type: ['string', 'null'], enum: ['left', 'right'] }, Statistic: { type: 'array', items: { diff --git a/core/dashboard.js b/core/dashboard.js index 535f8556..85c54e87 100644 --- a/core/dashboard.js +++ b/core/dashboard.js @@ -146,17 +146,16 @@ module.exports = function dashboard (dashboardConfig, functionDashboardConfigs, */ function createMetricWidget (title, metricDefs, config) { const metrics = metricDefs.map( - ({ namespace, metric, dimensions, stat }) => [ + ({ namespace, metric, dimensions, stat, yAxis }) => [ namespace, metric, ...Object.entries(dimensions).reduce( (acc, [name, value]) => [...acc, name, value], [] ), - { stat } + { stat, yAxis } ] ) - return { type: 'metric', properties: { @@ -654,7 +653,7 @@ module.exports = function dashboard (dashboardConfig, functionDashboardConfigs, function createAppSyncWidgets (appSyncResources) { const appSyncWidgets = [] const metricGroups = { - CloudWatch: ['5XXError', '4XXError', 'Latency', 'Requests'], + API: ['5XXError', '4XXError', 'Latency', 'Requests'], 'Real-time Subscriptions': ['ConnectServerError', 'DisconnectServerError', 'SubscribeServerError', 'UnsubscribeServerError', 'PublishDataMessageServerError'] } const metricConfigs = getConfiguredMetrics(appSyncDashConfig) @@ -672,7 +671,8 @@ module.exports = function dashboard (dashboardConfig, functionDashboardConfigs, namespace: 'AWS/AppSync', metric, dimensions: { GraphQLAPIId: graphQLAPIId }, - stat + stat, + yAxis: metricConfig.yAxis }) } } diff --git a/core/default-config.js b/core/default-config.js index 7e566832..dbd062f0 100644 --- a/core/default-config.js +++ b/core/default-config.js @@ -207,6 +207,7 @@ const defaultConfig = { metricPeriod: 300, width: 8, height: 6, + yAxis: 'left', Lambda: { // Metrics per Lambda Function Errors: { @@ -362,7 +363,8 @@ const defaultConfig = { Statistic: ['Sum'] }, Latency: { - Statistic: ['Average'] + Statistic: ['Average'], + yAxis: 'right' }, Requests: { Statistic: ['Maximum'] diff --git a/core/tests/dashboard.test.js b/core/tests/dashboard.test.js index 08178bf1..aed156ed 100644 --- a/core/tests/dashboard.test.js +++ b/core/tests/dashboard.test.js @@ -325,6 +325,38 @@ test('A dashboard includes metrics for ALB', (t) => { ) t.same(actualTitles, expectedTitles) t.end() + + test('No widgets are created if all AppSync 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) { + for (const metricConfig of Object.values(dashConfig.widgets[service])) { + metricConfig.enabled = false + } + } + const dash = dashboard(dashConfig, emptyFuncConfigs, context) + const cfTemplate = createTestCloudFormationTemplate(appSyncCfTemplate) + dash.addDashboard(cfTemplate) + const dashResources = cfTemplate.getResourcesByType('AWS::CloudWatch::Dashboard') + t.same(dashResources, {}) + t.end() + }) + + test('No widgets are created if all Application Load Balancer 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) { + for (const metricConfig of Object.values(dashConfig.widgets[service])) { + metricConfig.enabled = false + } + } + const dash = dashboard(dashConfig, emptyFuncConfigs, context) + const cfTemplate = createTestCloudFormationTemplate(albCfTemplate) + dash.addDashboard(cfTemplate) + const dashResources = cfTemplate.getResourcesByType('AWS::CloudWatch::Dashboard') + t.same(dashResources, {}) + t.end() + }) }) t.test('target groups with no Lambda targets are excluded from metrics', (t) => { @@ -393,7 +425,7 @@ test('A dashboard includes metrics for ALB', (t) => { } t.same(namespaces, new Set(['AWS/AppSync'])) const expectedTitles = new Set([ - 'AppSync CloudWatch awesome-appsync', + 'AppSync API awesome-appsync', 'AppSync Real-time Subscriptions awesome-appsync' ]) // eslint-disable-next-line no-template-curly-in-string @@ -458,7 +490,7 @@ test('DynamoDB widgets are created without GSIs', (t) => { }) test('No dashboard is created if all widgets are disabled', (t) => { - const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget'] + 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 @@ -472,7 +504,7 @@ test('No dashboard is created if all widgets are disabled', (t) => { }) test('No dashboard is created if all metrics are disabled', (t) => { - const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget'] + const services = ['Lambda', 'ApiGateway', 'States', 'DynamoDB', 'SQS', 'Kinesis', 'ECS', 'SNS', 'Events', 'ApplicationELB', 'ApplicationELBTarget', 'AppSync'] const dashConfig = cloneDeep(defaultConfig.dashboard) for (const service of services) { for (const metricConfig of Object.values(dashConfig.widgets[service])) { diff --git a/docs/appsyncAPI.png b/docs/appsyncAPI.png new file mode 100644 index 0000000000000000000000000000000000000000..858e69c1f3eea13401693fff123af65e1d84a47e GIT binary patch literal 26920 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 Clwn~2 literal 0 HcmV?d00001 diff --git a/serverless-test-project-appsync/serverless-v2.yml b/serverless-test-project-appsync/serverless-v2.yml index 31fb3d39..a326e539 100644 --- a/serverless-test-project-appsync/serverless-v2.yml +++ b/serverless-test-project-appsync/serverless-v2.yml @@ -53,6 +53,7 @@ resources: Value: books-table #cognito users pool + CognitoUserPool: Type: AWS::Cognito::UserPool Properties: @@ -86,6 +87,7 @@ resources: PreventUserExistenceErrors: ENABLED #Cognito users pool Admin group + CognitoAdminGroup: Type: AWS::Cognito::UserPoolGroup Properties: @@ -95,6 +97,7 @@ resources: Description: "Admin users belong to this group" #Cognito Admin IAM role + CognitoAdminIAMrole: Type: AWS::IAM::Role Properties: @@ -121,6 +124,7 @@ resources: RoleName: "bookstore-admin-role" #Cognito users pool Customer group + CognitoCustomerGroup: Type: AWS::Cognito::UserPoolGroup Properties: @@ -130,6 +134,7 @@ resources: Description: "Customer belongs to this group" #Cognito Customer IAM role + CognitoUserIAMrole: Type: AWS::IAM::Role Properties: diff --git a/serverless-test-project-appsync/serverless.yml b/serverless-test-project-appsync/serverless.yml index bcc3eee6..09ba201a 100644 --- a/serverless-test-project-appsync/serverless.yml +++ b/serverless-test-project-appsync/serverless.yml @@ -21,7 +21,7 @@ custom: appSync: - ${file(serverless.appsync-api.yml)} slicWatch: - # topicArn: ${env:ALARM_TOPIC} + topicArn: ${env:ALARM_TOPIC} alarms: Lambda: Invocations: @@ -64,6 +64,7 @@ resources: Value: books-table #cognito users pool + CognitoUserPool: Type: AWS::Cognito::UserPool Properties: @@ -97,6 +98,7 @@ resources: PreventUserExistenceErrors: ENABLED #Cognito users pool Admin group + CognitoAdminGroup: Type: AWS::Cognito::UserPoolGroup Properties: @@ -106,6 +108,7 @@ resources: Description: "Admin users belong to this group" #Cognito Admin IAM role + CognitoAdminIAMrole: Type: AWS::IAM::Role Properties: @@ -132,6 +135,7 @@ resources: RoleName: "bookstore-admin-role" #Cognito users pool Customer group + CognitoCustomerGroup: Type: AWS::Cognito::UserPoolGroup Properties: @@ -141,6 +145,7 @@ resources: Description: "Customer belongs to this group" #Cognito Customer IAM role + CognitoUserIAMrole: Type: AWS::IAM::Role Properties: