AWSTemplateFormatVersion: "2010-09-09" Description: "This is the template for creating a solution to analyze Amazon Connect ContactEvent logs using Amazon Athena & Amazon Quicksight as described in the blog" Parameters: ProjectName: Type: "String" Default: "test123" Description: Enter an all-lowercase single-word name which is between 3 and 42 chars long. An S3 bucket will be created with this name to store all collected data. MinLength : 3 MaxLength : 42 AllowedPattern : "^[a-z0-9]*$" Resources: DataDestinationBucket: Type: "AWS::S3::Bucket" DeletionPolicy: Retain Properties: BucketName: !Sub "${ProjectName}" GlueDatabase: Type: "AWS::Glue::Database" DependsOn: DataDestinationBucket DeletionPolicy: Retain Properties: DatabaseInput: Name: !Sub "${ProjectName}" CatalogId: !Ref "AWS::AccountId" WaitHandle: DependsOn: GlueDatabase Type: "AWS::CloudFormation::WaitConditionHandle" DbAndBucketWaitCondition: Type: "AWS::CloudFormation::WaitCondition" Properties: Handle: !Ref WaitHandle Timeout: "1" Count: 0 EventBridgePolicyForContactEvent: Type: "AWS::IAM::ManagedPolicy" DependsOn: DbAndBucketWaitCondition Properties: ManagedPolicyName: !Sub "${ProjectName}-EB-ContactEvent" Path: "/service-role/" PolicyDocument: !Sub | { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "firehose:PutRecord", "firehose:PutRecordBatch" ], "Resource": [ "${KinesisFirehoseDeliveryStreamForContactEvent.Arn}" ] } ] } EventBridgeRoleForContactEvent: Type: "AWS::IAM::Role" DependsOn: EventBridgePolicyForContactEvent Properties: Path: "/service-role/" RoleName: !Sub "${ProjectName}-EB-ContactEvent" AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"events.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}" MaxSessionDuration: 3600 ManagedPolicyArns: - !Ref EventBridgePolicyForContactEvent EventsRuleForContactEvent: Type: "AWS::Events::Rule" Properties: Name: !Sub "${ProjectName}_ContactEvent" EventPattern: !Sub | { "source": ["aws.connect"], "detail-type": ["Amazon Connect Contact Event"] } State: "ENABLED" Targets: - Arn: !GetAtt KinesisFirehoseDeliveryStreamForContactEvent.Arn Id: "Id4a10c2a7-48a3-418f-a525-ecb1272e51c4" InputPath: "$.detail" RoleArn: !GetAtt EventBridgeRoleForContactEvent.Arn EventBusName: "default" KinesisFirehoseServicePolicyForContactEvent: Type: "AWS::IAM::ManagedPolicy" DependsOn: GlueTableForContactEvent Properties: ManagedPolicyName: !Sub "${ProjectName}-KFH-ContactEvent" Path: "/service-role/" PolicyDocument: !Sub | { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Action": [ "glue:GetTable", "glue:GetTableVersion", "glue:GetTableVersions" ], "Resource": [ "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog", "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/${ProjectName}", "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/${ProjectName}/connect_ce" ] }, { "Sid": "", "Effect": "Allow", "Action": [ "s3:AbortMultipartUpload", "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::${ProjectName}", "arn:aws:s3:::${ProjectName}/*" ] }, { "Sid": "", "Effect": "Allow", "Action": [ "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/kinesisfirehose/${ProjectName}-ContactEvent:log-stream:*" ] } ] } KinesisFirehoseServiceRoleForContactEvent: Type: "AWS::IAM::Role" Properties: Path: "/service-role/" RoleName: !Sub "${ProjectName}-KFH-ContactEvent" AssumeRolePolicyDocument: !Sub | { "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{"Service":"firehose.amazonaws.com"}, "Action":"sts:AssumeRole" } ] } MaxSessionDuration: 3600 ManagedPolicyArns: - !Ref KinesisFirehoseServicePolicyForContactEvent KinesisFirehoseDeliveryStreamForContactEvent: Type: "AWS::KinesisFirehose::DeliveryStream" DependsOn: - GlueTableForContactEvent Properties: DeliveryStreamName: !Sub "${ProjectName}-ContactEvent" DeliveryStreamType: "DirectPut" ExtendedS3DestinationConfiguration: BucketARN: !Sub "arn:aws:s3:::${ProjectName}" BufferingHints: SizeInMBs: 128 IntervalInSeconds: 60 CloudWatchLoggingOptions: Enabled: true LogGroupName: !Sub "/aws/kinesisfirehose/${ProjectName}-ContactEvent" LogStreamName: "DestinationDelivery" CompressionFormat: "UNCOMPRESSED" DataFormatConversionConfiguration: SchemaConfiguration: RoleARN: !GetAtt KinesisFirehoseServiceRoleForContactEvent.Arn DatabaseName: !Sub "${ProjectName}" TableName: "connect_ce" Region: !Ref AWS::Region VersionId: "LATEST" InputFormatConfiguration: Deserializer: OpenXJsonSerDe: {} OutputFormatConfiguration: Serializer: ParquetSerDe: {} Enabled: true EncryptionConfiguration: NoEncryptionConfig: "NoEncryption" Prefix: "contactevent-base/year=!{timestamp:YYYY}/month=!{timestamp:MM}/day=!{timestamp:dd}/" ErrorOutputPrefix: "contactevent-erroroutputbase/!{timestamp:yyy/MM/dd}/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyy/MM/dd}/" RoleARN: !GetAtt KinesisFirehoseServiceRoleForContactEvent.Arn GlueTableForContactEvent: Type: "AWS::Glue::Table" DependsOn: "DbAndBucketWaitCondition" Properties: DatabaseName: !Sub "${ProjectName}" CatalogId: !Ref "AWS::AccountId" TableInput: Owner: "hadoop" TableType: "EXTERNAL_TABLE" Parameters: EXTERNAL: "TRUE" "parquet.compression": "SNAPPY" "projection.year.type": "integer" "projection.year.range": "2022,2024" "projection.month.type": "integer" "projection.month.range": "01,12" "projection.month.digits": "2" "projection.day.type": "integer" "projection.day.range": "01,31" "projection.day.digits": "2" "projection.enabled": "true" transient_lastDdlTime: "1628198798" StorageDescriptor: Columns: - Name: "contactid" Type: "string" - Name: "initialcontactid" Type: "string" - Name: "previouscontactid" Type: "string" - Name: "eventtype" Type: "string" - Name: "channel" Type: "string" - Name: "instancearn" Type: "string" - Name: "initiationmethod" Type: "string" - Name: "initiationtimestamp" Type: "string" - Name: "connectedtosystemtimestamp" Type: "string" - Name: "disconnecttimestamp" Type: "string" - Name: "scheduledtimestamp" Type: "string" - Name: "queueinfo" Type: "struct" - Name: "agentinfo" Type: "struct" - Name: "campaign" Type: "struct" - Name: "answeringmachinedetectionstatus" Type: "string" - Name: "customervoiceactivity" Type: "struct" Location: !Sub "s3://${ProjectName}/contactevent-base" InputFormat: "org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat" OutputFormat: "org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat" Compressed: false NumberOfBuckets: -1 SerdeInfo: SerializationLibrary: "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe" Parameters: "serialization.format": "1" Parameters: {} SkewedInfo: SkewedColumnValueLocationMaps: {} StoredAsSubDirectories: false PartitionKeys: - Name: "year" Type: "int" - Name: "month" Type: "int" - Name: "day" Type: "int" Retention: 0 Name: "connect_ce" GlueViewForContactEventDenormalized: Type: "AWS::Glue::Table" DependsOn: "GlueTableForContactEvent" Properties: DatabaseName: !Sub "${ProjectName}" CatalogId: !Ref "AWS::AccountId" TableInput: ViewOriginalText: !Join - '' - - '/* Presto View: ' - Fn::Base64: Fn::Sub: | {"originalSql":"SELECT\n contactid\n, initialcontactid\n, previouscontactid\n, eventtype\n, channel\n, instancearn\n, initiationmethod\n, initiationtimestamp\n, connectedtosystemtimestamp\n, disconnecttimestamp\n, scheduledtimestamp\n, queueinfo.queuetype\n, queueinfo.queuearn\n, queueinfo.enqueuetimestamp\n, agentinfo.agentarn\n, agentinfo.routingprofilearn\n, agentinfo.connectedtoagenttimestamp\n, campaign.campaignid\n, customervoiceactivity.greetingstarttimestamp\n, customervoiceactivity.greetingendtimestamp\nFROM\n connect_ce\n","catalog":"awsdatacatalog","schema":"${ProjectName}","columns":[{"name":"contactid","type":"varchar"},{"name":"initialcontactid","type":"varchar"},{"name":"previouscontactid","type":"varchar"},{"name":"eventtype","type":"varchar"},{"name":"channel","type":"varchar"},{"name":"instancearn","type":"varchar"},{"name":"initiationmethod","type":"varchar"},{"name":"initiationtimestamp","type":"varchar"},{"name":"connectedtosystemtimestamp","type":"varchar"},{"name":"disconnecttimestamp","type":"varchar"},{"name":"scheduledtimestamp","type":"varchar"},{"name":"queuetype","type":"varchar"},{"name":"queuearn","type":"varchar"},{"name":"enqueuetimestamp","type":"varchar"},{"name":"agentarn","type":"varchar"},{"name":"routingprofilearn","type":"varchar"},{"name":"connectedtoagenttimestamp","type":"varchar"},{"name":"campaignid","type":"varchar"},{"name":"greetingstarttimestamp","type":"varchar"},{"name":"greetingendtimestamp","type":"varchar"}]} - ' */' ViewOriginalText: "/* Presto View: eyJvcmlnaW5hbFNxbCI6IlNFTEVDVFxuICBjb250YWN0aWRcbiwgaW5pdGlhbGNvbnRhY3RpZFxuLCBwcmV2aW91c2NvbnRhY3RpZFxuLCBldmVudHR5cGVcbiwgY2hhbm5lbFxuLCBpbnN0YW5jZWFyblxuLCBpbml0aWF0aW9ubWV0aG9kXG4sIGluaXRpYXRpb250aW1lc3RhbXBcbiwgY29ubmVjdGVkdG9zeXN0ZW10aW1lc3RhbXBcbiwgZGlzY29ubmVjdHRpbWVzdGFtcFxuLCBzY2hlZHVsZWR0aW1lc3RhbXBcbiwgcXVldWVpbmZvLnF1ZXVldHlwZVxuLCBxdWV1ZWluZm8ucXVldWVhcm5cbiwgcXVldWVpbmZvLmVucXVldWV0aW1lc3RhbXBcbiwgYWdlbnRpbmZvLmFnZW50YXJuXG4sIGFnZW50aW5mby5yb3V0aW5ncHJvZmlsZWFyblxuLCBhZ2VudGluZm8uY29ubmVjdGVkdG9hZ2VudHRpbWVzdGFtcFxuLCBjYW1wYWlnbi5jYW1wYWlnbmlkXG4sIGN1c3RvbWVydm9pY2VhY3Rpdml0eS5ncmVldGluZ3N0YXJ0dGltZXN0YW1wXG4sIGN1c3RvbWVydm9pY2VhY3Rpdml0eS5ncmVldGluZ2VuZHRpbWVzdGFtcFxuRlJPTVxuICBjb25uZWN0X2NlXG4iLCJjYXRhbG9nIjoiYXdzZGF0YWNhdGFsb2ciLCJzY2hlbWEiOiJodm9jcmVwb3J0aW5ncGR4IiwiY29sdW1ucyI6W3sibmFtZSI6ImNvbnRhY3RpZCIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoiaW5pdGlhbGNvbnRhY3RpZCIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoicHJldmlvdXNjb250YWN0aWQiLCJ0eXBlIjoidmFyY2hhciJ9LHsibmFtZSI6ImV2ZW50dHlwZSIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoiY2hhbm5lbCIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoiaW5zdGFuY2Vhcm4iLCJ0eXBlIjoidmFyY2hhciJ9LHsibmFtZSI6ImluaXRpYXRpb25tZXRob2QiLCJ0eXBlIjoidmFyY2hhciJ9LHsibmFtZSI6ImluaXRpYXRpb250aW1lc3RhbXAiLCJ0eXBlIjoidmFyY2hhciJ9LHsibmFtZSI6ImNvbm5lY3RlZHRvc3lzdGVtdGltZXN0YW1wIiwidHlwZSI6InZhcmNoYXIifSx7Im5hbWUiOiJkaXNjb25uZWN0dGltZXN0YW1wIiwidHlwZSI6InZhcmNoYXIifSx7Im5hbWUiOiJzY2hlZHVsZWR0aW1lc3RhbXAiLCJ0eXBlIjoidmFyY2hhciJ9LHsibmFtZSI6InF1ZXVldHlwZSIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoicXVldWVhcm4iLCJ0eXBlIjoidmFyY2hhciJ9LHsibmFtZSI6ImVucXVldWV0aW1lc3RhbXAiLCJ0eXBlIjoidmFyY2hhciJ9LHsibmFtZSI6ImFnZW50YXJuIiwidHlwZSI6InZhcmNoYXIifSx7Im5hbWUiOiJyb3V0aW5ncHJvZmlsZWFybiIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoiY29ubmVjdGVkdG9hZ2VudHRpbWVzdGFtcCIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoiY2FtcGFpZ25pZCIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoiZ3JlZXRpbmdzdGFydHRpbWVzdGFtcCIsInR5cGUiOiJ2YXJjaGFyIn0seyJuYW1lIjoiZ3JlZXRpbmdlbmR0aW1lc3RhbXAiLCJ0eXBlIjoidmFyY2hhciJ9XX0= */" TableType: "VIRTUAL_VIEW" Parameters: comment: "Presto View" presto_view: "true" ViewExpandedText: "/* Presto View */" StorageDescriptor: Columns: - Name: "contactid" Type: "string" - Name: "initialcontactid" Type: "string" - Name: "previouscontactid" Type: "string" - Name: "eventtype" Type: "string" - Name: "channel" Type: "string" - Name: "instancearn" Type: "string" - Name: "initiationmethod" Type: "string" - Name: "initiationtimestamp" Type: "string" - Name: "connectedtosystemtimestamp" Type: "string" - Name: "disconnecttimestamp" Type: "string" - Name: "scheduledtimestamp" Type: "string" - Name: "queuetype" Type: "string" - Name: "queuearn" Type: "string" - Name: "enqueuetimestamp" Type: "string" - Name: "agentarn" Type: "string" - Name: "routingprofilearn" Type: "string" - Name: "connectedtoagenttimestamp" Type: "string" - Name: "campaignid" Type: "string" - Name: "greetingstarttimestamp" Type: "string" - Name: "greetingendtimestamp" Type: "string" Location: "" Compressed: false NumberOfBuckets: 0 SerdeInfo: {} StoredAsSubDirectories: false Retention: 0 Name: "connect_ce_flat" GlueViewForContactEventHvocLatency: Type: "AWS::Glue::Table" DependsOn: "GlueTableForContactEvent" Properties: DatabaseName: !Sub "${ProjectName}" CatalogId: !Ref "AWS::AccountId" TableInput: ViewOriginalText: !Join - '' - - '/* Presto View: ' - Fn::Base64: Fn::Sub: | {"originalSql":"SELECT\n contactid\n, initialcontactid\n, previouscontactid\n, eventtype\n, channel\n, instancearn\n, initiationmethod\n, CAST(\"from_iso8601_timestamp\"(initiationtimestamp) AS timestamp) initiationtimestamp\n, CAST(\"from_iso8601_timestamp\"(connectedtosystemtimestamp) AS timestamp) connectedtosystemtimestamp\n, CAST(\"from_iso8601_timestamp\"(disconnecttimestamp) AS timestamp) disconnecttimestamp\n, CAST(\"from_iso8601_timestamp\"(scheduledtimestamp) AS timestamp) scheduledtimestamp\n, queueinfo.queuetype\n, queueinfo.queuearn\n, CAST(\"from_iso8601_timestamp\"(queueinfo.enqueuetimestamp) AS timestamp) enqueuetimestamp\n, agentinfo.agentarn\n, agentinfo.routingprofilearn\n, CAST(\"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp) AS timestamp) connectedtoagenttimestamp\n, campaign.campaignid\n, CAST(\"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp) AS timestamp) greetingstarttimestamp\n, CAST(\"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp) AS timestamp) greetingendtimestamp\n, answeringmachinedetectionstatus\n, (\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) latencyfromendofgreetingtoagent\n, (\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) latencyfromstartofgreetingtoagent\n, (CASE WHEN ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) < 2) THEN '<2s' WHEN (((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) >= 2) AND ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) <= 4)) THEN '2-4s' WHEN (((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) > 4) AND ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) <= 8)) THEN '4-8s' WHEN ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingendtimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) > 8) THEN '>8s' ELSE 'null' END) greetingendtoagentlatencygroup\n, (CASE WHEN ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) < 2) THEN '<2s' WHEN (((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) >= 2) AND ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) <= 4)) THEN '2-4s' WHEN (((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) > 4) AND ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) <= 8)) THEN '4-8s' WHEN ((\"date_diff\"('millisecond', \"from_iso8601_timestamp\"(customervoiceactivity.greetingstarttimestamp), \"from_iso8601_timestamp\"(agentinfo.connectedtoagenttimestamp)) / 1E3) > 8) THEN '>8s' ELSE 'null' END) greetingstarttoagentlatencygroup\n, (CASE WHEN (agentinfo.connectedtoagenttimestamp IS NOT NULL) THEN 'Agent Connected' WHEN (answeringmachinedetectionstatus = 'HUMAN_ANSWERED') THEN 'Customer hang up' ELSE answeringmachinedetectionstatus END) agentstatus\n, (CASE WHEN (agentinfo.connectedtoagenttimestamp IS NOT NULL) THEN 'Agent Connected' ELSE 'Agent Not Connected' END) agentstatussummary\nFROM\n connect_ce\nWHERE ((eventtype = 'DISCONNECTED') AND (initiationmethod = 'API'))\n","catalog":"awsdatacatalog","schema":"${ProjectName}","columns":[{"name":"contactid","type":"varchar"},{"name":"initialcontactid","type":"varchar"},{"name":"previouscontactid","type":"varchar"},{"name":"eventtype","type":"varchar"},{"name":"channel","type":"varchar"},{"name":"instancearn","type":"varchar"},{"name":"initiationmethod","type":"varchar"},{"name":"initiationtimestamp","type":"timestamp"},{"name":"connectedtosystemtimestamp","type":"timestamp"},{"name":"disconnecttimestamp","type":"timestamp"},{"name":"scheduledtimestamp","type":"timestamp"},{"name":"queuetype","type":"varchar"},{"name":"queuearn","type":"varchar"},{"name":"enqueuetimestamp","type":"timestamp"},{"name":"agentarn","type":"varchar"},{"name":"routingprofilearn","type":"varchar"},{"name":"connectedtoagenttimestamp","type":"timestamp"},{"name":"campaignid","type":"varchar"},{"name":"greetingstarttimestamp","type":"timestamp"},{"name":"greetingendtimestamp","type":"timestamp"},{"name":"answeringmachinedetectionstatus","type":"varchar"},{"name":"latencyfromendofgreetingtoagent","type":"double"},{"name":"latencyfromstartofgreetingtoagent","type":"double"},{"name":"greetingendtoagentlatencygroup","type":"varchar(4)"},{"name":"greetingstarttoagentlatencygroup","type":"varchar(4)"},{"name":"agentstatus","type":"varchar"},{"name":"agentstatussummary","type":"varchar(19)"}]} - ' */' TableType: "VIRTUAL_VIEW" Parameters: comment: "Presto View" presto_view: "true" ViewExpandedText: "/* Presto View */" StorageDescriptor: Columns: - Name: "contactid" Type: "string" - Name: "initialcontactid" Type: "string" - Name: "previouscontactid" Type: "string" - Name: "eventtype" Type: "string" - Name: "channel" Type: "string" - Name: "instancearn" Type: "string" - Name: "initiationmethod" Type: "string" - Name: "initiationtimestamp" Type: "timestamp" - Name: "connectedtosystemtimestamp" Type: "timestamp" - Name: "disconnecttimestamp" Type: "timestamp" - Name: "scheduledtimestamp" Type: "timestamp" - Name: "queuetype" Type: "string" - Name: "queuearn" Type: "string" - Name: "enqueuetimestamp" Type: "timestamp" - Name: "agentarn" Type: "string" - Name: "routingprofilearn" Type: "string" - Name: "connectedtoagenttimestamp" Type: "timestamp" - Name: "campaignid" Type: "string" - Name: "greetingstarttimestamp" Type: "timestamp" - Name: "greetingendtimestamp" Type: "timestamp" - Name: "answeringmachinedetectionstatus" Type: "string" - Name: "latencyfromendofgreetingtoagent" Type: "double" - Name: "latencyfromstartofgreetingtoagent" Type: "double" - Name: "greetingendtoagentlatencygroup" Type: "varchar(4)" - Name: "greetingstarttoagentlatencygroup" Type: "varchar(4)" - Name: "agentstatus" Type: "string" - Name: "agentstatussummary" Type: "varchar(19)" Location: "" Compressed: false NumberOfBuckets: 0 SerdeInfo: {} StoredAsSubDirectories: false Retention: 0 Name: "connect_ce_hvoclatency"