집계 대시보드를 예약된 쿼리로 변환 - Amazon Timestream

Amazon Timestream for LiveAnalytics와 유사한 기능을 원하는 경우 Amazon Timestream for InfluxDB를 고려해 보세요. 간소화된 데이터 수집과 실시간 분석을 위한 10밀리초 미만의 쿼리 응답 시간을 제공합니다. 여기에서 자세히 알아보세요.

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

집계 대시보드를 예약된 쿼리로 변환

5개의 마이크로서비스와 서비스가 배포된 6개의 리전을 기준으로 플릿의 호스트 수와 같은 플릿 전체 통계를 계산한다고 가정합니다. 아래 스냅샷에서 지표를 내보내는 서버가 500K 개이고, 더 큰 리전(예: us-east-1) 중 일부가 >20만 개 서버를 가지고 있음을 확인할 수 있습니다.

수백 기가바이트 이상의 데이터에서 고유한 인스턴스 이름을 계산하는 이러한 집계를 계산하면 데이터 스캔 비용 외에도 쿼리 지연 시간이 수십 초에 이를 수 있습니다.

Instance counts for microservices: apollo and zeus 150k, hercules 100k, athena and demeter 50k each.

원래 대시보드 쿼리

대시보드 패널에 표시된 집계는 아래 쿼리를 사용하여 원시 데이터에서 계산됩니다. 쿼리는 고유 개수 및 여러 집계 함수와 같은 여러 SQL 구문을 사용합니다.

SELECT CASE WHEN microservice_name = 'apollo' THEN num_instances ELSE NULL END AS apollo, CASE WHEN microservice_name = 'athena' THEN num_instances ELSE NULL END AS athena, CASE WHEN microservice_name = 'demeter' THEN num_instances ELSE NULL END AS demeter, CASE WHEN microservice_name = 'hercules' THEN num_instances ELSE NULL END AS hercules, CASE WHEN microservice_name = 'zeus' THEN num_instances ELSE NULL END AS zeus FROM ( SELECT microservice_name, SUM(num_instances) AS num_instances FROM ( SELECT microservice_name, COUNT(DISTINCT instance_name) as num_instances FROM "raw_data"."devops" WHERE time BETWEEN from_milliseconds(1636526171043) AND from_milliseconds(1636612571043) AND measure_name = 'metrics' GROUP BY region, cell, silo, availability_zone, microservice_name ) GROUP BY microservice_name )

예약된 쿼리로 변환

이전 쿼리는 다음과 같이 예약된 쿼리로 변환할 수 있습니다. 먼저 리전, 셀, 사일로, 가용 영역 및 마이크로서비스의 지정된 배포 내에서 고유한 호스트 이름을 계산합니다. 그런 다음 호스트를 추가하여 마이크로서비스 호스트 수당 시간당을 계산합니다. 예약된 쿼리에서 지원하는 @scheduled_runtime 파라미터를 사용하여 쿼리가 간접적으로 호출된 지난 한 시간 동안 다시 계산할 수 있습니다. 내부 쿼리의 WHERE 절에서 bin(@scheduled_runtime, 1h)를 사용하면 쿼리가 한 시간 중간에 예약되더라도 전체 시간 동안의 데이터를 얻을 수 있습니다.

쿼리는 시간당 집계를 계산하지만 예약된 계산 구성에서 볼 수 있듯이 파생 테이블에서 더 빨리 업데이트를 받을 수 있도록 30분마다 새로 고치도록 설정됩니다. 예를 들어 15분마다 집계를 다시 계산하거나 시간 경계에서 다시 계산하는 등 최신 요구 사항에 따라 조정할 수 있습니다.

SELECT microservice_name, hour, SUM(num_instances) AS num_instances FROM ( SELECT microservice_name, bin(time, 1h) AS hour, COUNT(DISTINCT instance_name) as num_instances FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1h) - 1h AND @scheduled_runtime AND measure_name = 'metrics' GROUP BY region, cell, silo, availability_zone, microservice_name, bin(time, 1h) ) GROUP BY microservice_name, hour
{ "Name": "MultiPT30mHostCountMicroservicePerHr", "QueryString": "SELECT microservice_name, hour, SUM(num_instances) AS num_instances FROM ( SELECT microservice_name, bin(time, 1h) AS hour, COUNT(DISTINCT instance_name) as num_instances FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1h) - 1h AND @scheduled_runtime AND measure_name = 'metrics' GROUP BY region, cell, silo, availability_zone, microservice_name, bin(time, 1h) ) GROUP BY microservice_name, hour", "ScheduleConfiguration": { "ScheduleExpression": "cron(0/30 * * * ? *)" }, "NotificationConfiguration": { "SnsConfiguration": { "TopicArn": "******" } }, "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName": "derived", "TableName": "host_count_pt1h", "TimeColumn": "hour", "DimensionMappings": [ { "Name": "microservice_name", "DimensionValueType": "VARCHAR" } ], "MultiMeasureMappings": { "TargetMultiMeasureName": "num_instances", "MultiMeasureAttributeMappings": [ { "SourceColumn": "num_instances", "MeasureValueType": "BIGINT" } ] } } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } }, "ScheduledQueryExecutionRoleArn": "******" }

새 대시보드에서 사전 계산된 결과 사용

이제 생성한 예약된 쿼리에서 파생 테이블을 사용하여 집계 보기 대시보드를 생성하는 방법을 확인할 수 있습니다. 대시보드 스냅샷에서 파생 테이블과 기본 테이블에서 계산된 집계도 일치하는지 확인할 수도 있습니다. 파생 테이블을 사용하여 대시보드를 생성하면 원시 데이터에서 이러한 집계를 계산하는 것보다 훨씬 빠른 로드 시간과 파생 테이블 사용 비용을 줄일 수 있습니다. 아래는 사전 계산된 데이터를 사용한 대시보드의 스냅샷이며, 테이블 “derived”.“host_count_pt1h”에 저장된 사전 계산된 데이터를 사용하여 이 패널을 렌더링하는 데 사용된 쿼리입니다. 쿼리의 구조는 원시 데이터의 대시보드에서 사용된 쿼리와 매우 유사합니다. 단,이 쿼리가 집계하는 고유 개수를 이미 계산하는 파생 테이블을 사용하는 경우는 예외입니다.

Instance count by microservice showing values for apollo, athena, demeter, hercules, and zeus.
SELECT CASE WHEN microservice_name = 'apollo' THEN num_instances ELSE NULL END AS apollo, CASE WHEN microservice_name = 'athena' THEN num_instances ELSE NULL END AS athena, CASE WHEN microservice_name = 'demeter' THEN num_instances ELSE NULL END AS demeter, CASE WHEN microservice_name = 'hercules' THEN num_instances ELSE NULL END AS hercules, CASE WHEN microservice_name = 'zeus' THEN num_instances ELSE NULL END AS zeus FROM ( SELECT microservice_name, AVG(num_instances) AS num_instances FROM ( SELECT microservice_name, bin(time, 1h), SUM(num_instances) as num_instances FROM "derived"."host_count_pt1h" WHERE time BETWEEN from_milliseconds(1636567785421) AND from_milliseconds(1636654185421) AND measure_name = 'num_instances' GROUP BY microservice_name, bin(time, 1h) ) GROUP BY microservice_name )