constructor()

in source/lib/database/database_construct.ts [32:330]


  constructor(scope: cdk.Construct, id: string, props: DatabaseProps) {
    super(scope, id);

    /**
     * Create AWS Glue database
     */
    const devopsMetricsGlueDB = new glue.Database(this, 'AWSDevopsMetricsGlueDatabase', {
      databaseName: 'aws_devops_metrics_db_' + props.solutionId.toLowerCase()
    });

    this.metricsGlueDBName = devopsMetricsGlueDB.databaseName;

    /**
     * Create AWS Glue table for CloudWatch Events
     */
    const devopsMetricsGlueTable =  new glue.Table(this, 'AWSDevopsMetricsGlueTable', {
      description: 'AWS DevOps Monitoring Dashboard Solution - AWS DevOps Metrics Glue table',
      database: devopsMetricsGlueDB,
      tableName: 'aws_devops_metrics_table',
      bucket: props.metricsBucket,
      s3Prefix: 'DevopsEvents/',
      storedAsSubDirectories: true,
      dataFormat: glue.DataFormat.PARQUET,
      columns: [{
        name: 'version',
        type: glue.Schema.STRING
      },
      {
        name: 'id',
        type: glue.Schema.STRING
      },
      {
        name: 'detail_type',
        type: glue.Schema.STRING
      },
      {
        name: 'source',
        type: glue.Schema.STRING
      },
      {
        name: 'account',
        type: glue.Schema.STRING
      },
      {
        name: 'time',
        type: glue.Schema.TIMESTAMP
      },
      {
        name: 'region',
        type: glue.Schema.STRING
      },
      {
        name: 'resources',
        type: glue.Schema.array(glue.Schema.STRING),
        comment: 'array<string>'
      },
      {
        name: 'detail',
        type: glue.Schema.struct([
        {
          name: 'eventName',
          type: glue.Schema.STRING
        },
        {
          name: 'repositoryName',
          type: glue.Schema.STRING
        },
        {
          name: 'branchName',
          type: glue.Schema.STRING
        },
        {
          name: 'authorName',
          type: glue.Schema.STRING
        },
        {
          name: 'commitId',
          type: glue.Schema.STRING
        },
        {
          name: 'canaryAlarmName',
          type: glue.Schema.STRING
        },
        {
          name: 'canaryAlarmAppName',
          type: glue.Schema.STRING
        },
        {
          name: 'canaryAlarmRepoName',
          type: glue.Schema.STRING
        },
        {
          name: 'canaryAlarmCurrState',
          type: glue.Schema.STRING
        },
        {
          name: 'canaryAlarmPrevState',
          type: glue.Schema.STRING
        },
        {
          name: 'canaryAlarmCurrStateTimeStamp',
          type: glue.Schema.TIMESTAMP
        },
        {
          name: 'canaryAlarmPrevStateTimeStamp',
          type: glue.Schema.TIMESTAMP
        },
        {
          name: 'recoveryDurationMinutes',
          type: glue.Schema.INTEGER
        },
        {
          name: 'deploymentState',
          type: glue.Schema.STRING
        },
        {
          name: 'deploymentId',
          type: glue.Schema.STRING
        },
        {
          name: 'deploymentApplication',
          type: glue.Schema.STRING
        },
        {
          name: 'pipelineName',
          type: glue.Schema.STRING
        },
        {
          name: 'executionId',
          type: glue.Schema.STRING
        },
        {
          name: 'stage',
          type: glue.Schema.STRING
        },
        {
          name: 'action',
          type: glue.Schema.STRING
        },
        {
          name: 'state',
          type: glue.Schema.STRING
        },
        {
          name: 'externalExecutionId',
          type: glue.Schema.STRING
        },
        {
          name: 'actionCategory',
          type: glue.Schema.STRING
        },
        {
          name: 'actionOwner',
          type: glue.Schema.STRING
        },
        {
          name: 'actionProvider',
          type: glue.Schema.STRING
        }]
        ),
        comment: "struct<nested_column:datatype>"
      }],
      partitionKeys: [{
        name: 'created_at',
        type: glue.Schema.TIMESTAMP
      }],
    });

    this.metricsGlueTableName = devopsMetricsGlueTable.tableName;

    let glue_cfn_table_ref = devopsMetricsGlueTable.node.findChild('Table') as glue.CfnTable;

    glue_cfn_table_ref.addPropertyOverride("TableInput", {
    Parameters: {
      "EXTERNAL": "TRUE"
    }
    })

    /**
     * Create AWS Glue table for CloudWatch Metrics for CodeBuild
     */
    const codeBuildMetricsGlueTable =  new glue.Table(this, 'CodeBuildMetricsGlueTable', {
      description: 'AWS DevOps Monitoring Dashboard Solution - AWS CodeBuild Metrics Glue table',
      database: devopsMetricsGlueDB,
      tableName: 'aws_codebuild_metrics_table',
      bucket: props.metricsBucket,
      s3Prefix: 'CodeBuildEvents/',
      storedAsSubDirectories: true,
      dataFormat: glue.DataFormat.PARQUET,
      columns: [{
        name: 'metric_stream_name',
        type: glue.Schema.STRING
      },
      {
        name: 'account_id',
        type: glue.Schema.STRING
      },
      {
        name: 'region',
        type: glue.Schema.STRING
      },
      {
        name: 'namespace',
        type: glue.Schema.STRING
      },
      {
        name: 'metric_name',
        type: glue.Schema.STRING
      },
      {
        name: 'dimensions',
        type: glue.Schema.struct([
          {
            name: 'ProjectName',
            type: glue.Schema.STRING
          },
          {
            name: 'BuildId',
            type: glue.Schema.STRING
          },
          {
            name: 'BuildNumber',
            type: glue.Schema.INTEGER
          }
        ])
      },
      {
        name: 'timestamp',
        type: glue.Schema.BIG_INT
      },
      {
        name: 'value',
        type: glue.Schema.struct([
          {
            name: 'count',
            type: glue.Schema.DOUBLE
          },
          {
            name: 'sum',
            type: glue.Schema.DOUBLE
          },
          {
            name: 'max',
            type: glue.Schema.DOUBLE
          },
          {
            name: 'min',
            type: glue.Schema.DOUBLE
          }
        ]),
        comment: "struct<nested_column:datatype>"
      },
      {
        name: 'unit',
        type: glue.Schema.STRING
      }],
      partitionKeys: [{
        name: 'created_at',
        type: glue.Schema.TIMESTAMP
      }],
    });

   this.codeBuildMetricsGlueTableName = codeBuildMetricsGlueTable.tableName;

   let glue_cfn_codebuild_table_ref = codeBuildMetricsGlueTable.node.findChild('Table') as glue.CfnTable;

   glue_cfn_codebuild_table_ref.addPropertyOverride("TableInput", {
    Parameters: {
      "EXTERNAL": "TRUE"
    }
   })


   /**
    * Create Athena work group
    */
    const workgroupName = 'AWSDevOpsDashboardWG-' + props.uuid
    const devopsMetricsAthenaWorkGroup = new athena.CfnWorkGroup(this, "AWSDevOpsDashboardAthenaWorkGroup", {
      name: workgroupName,
      description: 'AWS DevOps Monitoring Dashboard Solution Athena Work Group',
      state: 'ENABLED',
      recursiveDeleteOption: true,
      workGroupConfiguration:{
        publishCloudWatchMetricsEnabled: true,
        resultConfiguration: {
          outputLocation: 's3://' + props.metricsBucketName + '/athena_query_output/',
          encryptionConfiguration: {
            encryptionOption: 'SSE_S3'
          }
        },
        engineVersion : {
          selectedEngineVersion: "Athena engine version 2"
        }
      }
    })

    this.metricsAthenaWGName = devopsMetricsAthenaWorkGroup.name;

  }