

Amazon Timestream for LiveAnalytics に類似した機能をご希望の場合は Amazon Timestream for InfluxDB をご検討ください。リアルタイム分析に適した、シンプルなデータインジェストと 1 桁ミリ秒のクエリ応答時間を特徴としています。詳細については、[こちら](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 集計ダッシュボードをスケジュールされたクエリに変換する
<a name="scheduledqueries-example1"></a>

5 つのマイクロサービスごと、およびサービスがデプロイされている 6 つのリージョンごとに、フリート全体の統計 (フリート内のホスト数など) を計算するとします。以下のスナップショットは、メトリクスを発行するサーバーが 50 万台あり、大きなリージョン (us-east-1 など) ではサーバーが 20 万台を超えていることを示しています。

数百ギガバイトのデータにわたって個別のインスタンス名を計算するこれらの集計を計算すると、データのスキャンコストに加えて、数十秒のクエリレイテンシーが発生する可能性があります。

![\[Instance counts for microservices: apollo and zeus 150k, hercules 100k, athena and demeter 50k each.\]](http://docs.aws.amazon.com/ja_jp/timestream/latest/developerguide/images/sched_query_ex1_img1.png)


**元のダッシュボードクエリ**

ダッシュボードパネルに表示される集計は、以下のクエリを使用して未加工データから計算されます。このクエリでは、個別カウントや複数の集計関数など、複数の 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
)
```

**スケジュールされたクエリへの変換**

上のクエリは、次のように、スケジュールされたクエリに変換できます。まず、リージョン、セル、サイロ、アベイラビリティーゾーン、マイクロサービス内の特定のデプロイに含まれる個別のホスト名を計算します。次に、ホストを合計して、1 時間ごとのマイクロサービスあたりのホスト数を計算します。スケジュールされたクエリでサポートされている `@scheduled_runtime` パラメータを使用すると、クエリが呼び出されたときに過去 1 時間の再計算を実行できます。内部クエリの `WHERE` 句の `bin(@scheduled_runtime, 1h)` により、クエリが 1 時間の途中でスケジュールされていても、1 時間分のデータを取得できます。

クエリは毎時の集計を計算しますが、スケジュールされた計算の設定に示されているように、派生テーブルの更新をより短い間隔で取得できるよう、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\$1count\$1pt1h" に保存されている事前計算されたデータを使用してこのパネルをレンダリングするために使用されるクエリです。このクエリの構造は、ダッシュボードで未加工データに使用されたクエリと非常に似ていますが、このクエリが集計している個別カウントを既に計算している派生テーブルを使用している点が異なります。

![\[Instance count by microservice showing values for apollo, athena, demeter, hercules, and zeus.\]](http://docs.aws.amazon.com/ja_jp/timestream/latest/developerguide/images/sched_query_ex1_img2.png)


```
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
)
```