使用 Amazon Athena 查询 Amazon S3 日志中的互联网测量数据 - Amazon CloudWatch
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon Athena 查询 Amazon S3 日志中的互联网测量数据

您可以使用 Amazon Athena,来查询和查看 Amazon CloudWatch 网络监测仪发布到 Amazon S3 存储桶的互联网测量数据。网络监测仪中有一个选项,选择此选项后可将应用程序的互联网测量数据发布到 S3 存储桶,以了解所监测城市-网络 [客户端位置和 ASN,后者通常是互联网服务提供商(ISP)] 的互联网流量。无论您是否选择将测量数据发布到 S3,Internet Monitor 每五分钟都会自动将每个监测仪的前 500 个(按流量计)城市网络的互联网测量数据发布到 CloudWatch Logs。

本章包括如何在 Athena 中为位于 S3 日志文件中的互联网测量数据创建表的步骤,然后提供示例查询以查看测量数据的不同视图。例如,您可以按延迟影响查询受影响的前 10 个城市网络。

使用 Amazon Athena 在 Internet Monitor 中创建互联网测量数据表

要开始将 Athena 与您的网络监测仪 S3 日志文件结合使用,您首先需要为互联网测量数据创建一个表。

按照此过程中的步骤在 Athena 中根据 S3 日志文件创建表。然后,您可以在表上运行 Athena 查询,例如这些示例互联网测量数据查询,以获取有关测量数据的信息。

创建 Athena 表

  1. https://console.amazonaws.cn/athena/ 打开 Athena 控制台。

  2. 在 Athena 查询编辑器中,输入查询语句以生成一个包含 Internet Monitor 互联网测量数据的表。将 LOCATION 参数的值替换为存储 Internet Monitor 互联网测量数据的 S3 存储桶的位置。

    CREATE EXTERNAL TABLE internet_measurements ( version INT, timestamp INT, clientlocation STRING, servicelocation STRING, percentageoftotaltraffic DOUBLE, bytesin INT, bytesout INT, clientconnectioncount INT, internethealth STRING, trafficinsights STRING ) PARTITIONED BY (year STRING, month STRING, day STRING) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://bucket_name/bucket_prefix/AWSLogs/account_id/internetmonitor/AWS_Region/' TBLPROPERTIES ('skip.header.line.count' = '1');
  3. 输入一条语句来创建一个分区以读取数据。例如,以下示例查询创建了指定日期和位置的单个分区:

    ALTER TABLE internet_measurements ADD PARTITION (year = 'YYYY', month = 'MM', day = 'dd') LOCATION 's3://bucket_name/bucket_prefix/AWSLogs/account_id/internetmonitor/AWS_Region/YYYY/MM/DD';
  4. 选择运行

互联网测量数据的 Athena 语句示例

下面是用于生成表的语句示例:

CREATE EXTERNAL TABLE internet_measurements ( version INT, timestamp INT, clientlocation STRING, servicelocation STRING, percentageoftotaltraffic DOUBLE, bytesin INT, bytesout INT, clientconnectioncount INT, internethealth STRING, trafficinsights STRING ) PARTITIONED BY (year STRING, month STRING, day STRING) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' LOCATION 's3://internet-measurements/TestMonitor/AWSLogs/1111222233332/internetmonitor/us-east-2/' TBLPROPERTIES ('skip.header.line.count' = '1');

以下是用于创建分区以读取数据的语句示例:

ALTER TABLE internet_measurements ADD PARTITION (year = '2023', month = '04', day = '07') LOCATION 's3://internet-measurements/TestMonitor/AWSLogs/1111222233332/internetmonitor/us-east-2/2023/04/07/'

用于 Internet Monitor 中互联网测量数据的 Amazon Athena 查询示例

本节包含查询示例,您可以在 Amazon Athena 中使用这些查询来获取有关发布到 Amazon S3 的应用程序互联网测量数据的信息。

查询前 10 个(按流量的总百分比计)受影响的客户端位置和 ASN

运行此 Athena 查询,返回受影响的前 10 个(按流量的总百分比计)城市网络(即客户端位置和 ASN,通常是互联网服务提供商)。

SELECT json_extract_scalar(clientLocation, '$.city') as city, json_extract_scalar(clientLocation, '$.networkname') as networkName, sum(percentageoftotaltraffic) as percentageoftotaltraffic FROM internet_measurements GROUP BY json_extract_scalar(clientLocation, '$.city'), json_extract_scalar(clientLocation, '$.networkname') ORDER BY percentageoftotaltraffic desc limit 10

查询受影响的前 10 个(按可用性计)客户端位置和 ASN

运行此 Athena 查询,返回受影响的前 10 个(按流量的总百分比计)城市网络(即客户端位置和 ASN,通常是互联网服务提供商)。

SELECT json_extract_scalar(clientLocation, '$.city') as city, json_extract_scalar(clientLocation, '$.networkname') as networkName, sum( cast( json_extract_scalar( internetHealth, '$.availability.percentageoftotaltrafficimpacted' ) as double ) ) as percentageOfTotalTrafficImpacted FROM internet_measurements GROUP BY json_extract_scalar(clientLocation, '$.city'), json_extract_scalar(clientLocation, '$.networkname') ORDER BY percentageOfTotalTrafficImpacted desc limit 10

查询受影响的前 10 个(按延迟计)客户端位置和 ASN

运行此 Athena 查询,返回受影响的前 10 个(按延迟影响计)城市网络(即客户端位置和 ASN,通常是互联网服务提供商)。

SELECT json_extract_scalar(clientLocation, '$.city') as city, json_extract_scalar(clientLocation, '$.networkname') as networkName, sum( cast( json_extract_scalar( internetHealth, '$.performance.percentageoftotaltrafficimpacted' ) as double ) ) as percentageOfTotalTrafficImpacted FROM internet_measurements GROUP BY json_extract_scalar(clientLocation, '$.city'), json_extract_scalar(clientLocation, '$.networkname') ORDER BY percentageOfTotalTrafficImpacted desc limit 10

查询您的客户端位置和 ASN 的流量亮点

运行此 Athena 查询以返回流量亮点,包括可用性分数、性能分数以及城市网络(即客户端位置和 ASN,通常是互联网服务提供商)的首字节时间。

SELECT json_extract_scalar(clientLocation, '$.city') as city, json_extract_scalar(clientLocation, '$.subdivision') as subdivision, json_extract_scalar(clientLocation, '$.country') as country, avg(cast(json_extract_scalar(internetHealth, '$.availability.experiencescore') as double)) as availabilityScore, avg(cast(json_extract_scalar(internetHealth, '$.performance.experiencescore') as double)) performanceScore, avg(cast(json_extract_scalar(trafficinsights, '$.timetofirstbyte.currentexperience.value') as double)) as averageTTFB, sum(bytesIn) as bytesIn, sum(bytesOut) as bytesOut, sum(bytesIn + bytesOut) as totalBytes FROM internet_measurements where json_extract_scalar(clientLocation, '$.city') != 'N/A' GROUP BY json_extract_scalar(clientLocation, '$.city'), json_extract_scalar(clientLocation, '$.subdivision'), json_extract_scalar(clientLocation, '$.country') ORDER BY totalBytes desc limit 100

有关使用 Athena 的更多信息,请参阅 Amazon Athena 用户指南