Último punto de cada dispositivo - Amazon Timestream

Para obtener capacidades similares a las de Amazon Timestream, considere Amazon Timestream LiveAnalytics para InfluxDB. Ofrece una ingesta de datos simplificada y tiempos de respuesta a las consultas en milisegundos de un solo dígito para realizar análisis en tiempo real. Obtenga más información aquí.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Último punto de cada dispositivo

Es posible que su aplicación requiera que lea la última medición que emitió un dispositivo. Puede haber casos de uso más generales para obtener la última medición de un dispositivo antes de una fecha/hora determinada o la primera medición de un dispositivo después de una fecha/hora determinada. Si tiene millones de dispositivos y muchos años de datos, es posible que esta búsqueda requiera escanear grandes cantidades de datos.

A continuación, encontrará un ejemplo de cómo puede utilizar las consultas programadas para optimizar la búsqueda del último punto emitido por un dispositivo. También puede utilizar el mismo patrón para optimizar la consulta del primer punto si la aplicación lo necesita.

Cálculo desde la tabla de origen

A continuación, se muestra un ejemplo de consulta para encontrar la última medición emitida por los servicios en una implementación específica (por ejemplo, los servidores de un microservicio determinado dentro de una región, celda, silo y availability_zone determinados). En la aplicación de ejemplo, esta consulta devolverá la última medición de cientos de servidores. Además, tenga en cuenta que esta consulta tiene un predicado de tiempo ilimitado y busca cualquier dato anterior a una marca de tiempo determinada.

nota

Para obtener información sobre las funciones de max y max_by, consulte Funciones de agregación.

SELECT instance_name, MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure FROM "raw_data"."devops" WHERE time < from_milliseconds(1636685271872) AND measure_name = 'events' AND region = 'us-east-1' AND cell = 'us-east-1-cell-10' AND silo = 'us-east-1-cell-10-silo-3' AND availability_zone = 'us-east-1-1' AND microservice_name = 'hercules' GROUP BY region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version ORDER BY instance_name, time DESC

Tabla derivada para calcular de manera previa con una granularidad diaria

Puede convertir el caso de uso anterior en un cálculo programado. Si los requisitos de la aplicación son tales que tal vez necesite obtener estos valores para toda su flota en varias regiones, celdas, silos, zonas de disponibilidad y microservicios, puede utilizar un cálculo programado para calcular previamente los valores de toda la flota. Esa es la potencia de las consultas programadas sin servidor de Timestream para LiveAnalytics, que permite que estas consultas se escalen según los requisitos de escalado de la aplicación.

A continuación, se muestra una consulta para calcular de manera previa el último punto en todos los servidores de un día determinado. Tenga en cuenta que la consulta solo tiene un predicado de tiempo y no un predicado sobre las dimensiones. El predicado de tiempo limita la consulta al día anterior a la hora en que se activa el cálculo en función de la expresión de programación especificada.

SELECT region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version, MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1d) - 1d AND bin(@scheduled_runtime, 1d) AND measure_name = 'events' GROUP BY region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version

A continuación, se muestra una configuración para el cálculo programado mediante la consulta anterior, que ejecuta esa consulta todos los días a la 01:00 (tiempo universal coordinado) para calcular la suma del día anterior. La expresión de programación cron(0 1 * * ? *) controla este comportamiento y se ejecuta una hora después del final del día para tener en cuenta que los datos llegan con un día de retraso.

{ "Name": "PT1DPerInstanceLastpoint", "QueryString": "SELECT region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version, MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1d) - 1d AND bin(@scheduled_runtime, 1d) AND measure_name = 'events' GROUP BY region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version", "ScheduleConfiguration": { "ScheduleExpression": "cron(0 1 * * ? *)" }, "NotificationConfiguration": { "SnsConfiguration": { "TopicArn": "******" } }, "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName": "derived", "TableName": "per_timeseries_lastpoint_pt1d", "TimeColumn": "time", "DimensionMappings": [ { "Name": "region", "DimensionValueType": "VARCHAR" }, { "Name": "cell", "DimensionValueType": "VARCHAR" }, { "Name": "silo", "DimensionValueType": "VARCHAR" }, { "Name": "availability_zone", "DimensionValueType": "VARCHAR" }, { "Name": "microservice_name", "DimensionValueType": "VARCHAR" }, { "Name": "instance_name", "DimensionValueType": "VARCHAR" }, { "Name": "process_name", "DimensionValueType": "VARCHAR" }, { "Name": "jdk_version", "DimensionValueType": "VARCHAR" } ], "MultiMeasureMappings": { "TargetMultiMeasureName": "last_measure", "MultiMeasureAttributeMappings": [ { "SourceColumn": "last_measure", "MeasureValueType": "DOUBLE" } ] } } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } }, "ScheduledQueryExecutionRoleArn": "******" }

Calculado desde una tabla derivada

Una vez que haya definido la tabla derivada mediante la configuración anterior y al menos una instancia de la consulta programada haya materializado los datos en la tabla derivada, puede consultar la tabla derivada para obtener la última medición. A continuación, se muestra un ejemplo de consulta en la tabla derivada.

SELECT instance_name, MAX(time) AS time, MAX_BY(last_measure, time) AS last_measure FROM "derived"."per_timeseries_lastpoint_pt1d" WHERE time < from_milliseconds(1636746715649) AND measure_name = 'last_measure' AND region = 'us-east-1' AND cell = 'us-east-1-cell-10' AND silo = 'us-east-1-cell-10-silo-3' AND availability_zone = 'us-east-1-1' AND microservice_name = 'hercules' GROUP BY region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version ORDER BY instance_name, time DESC

Combinar la tabla de origen y derivada

Al igual que en el ejemplo anterior, los datos de la tabla derivada no tendrán las escrituras más recientes. Por lo tanto, puede volver a utilizar un patrón similar al anterior para combinar los datos de la tabla derivada con los datos más antiguos y utilizar los datos de origen para el resto. A continuación, se muestra un ejemplo de una consulta de este tipo que utiliza el enfoque similar de UNION. Como el requisito de la aplicación es encontrar la última medición antes de un periodo de tiempo, y esta hora de inicio puede ser anterior, la manera de escribir esta consulta consiste en utilizar la hora que se brinda, utilizar los datos de origen con una antigüedad máxima de un día a partir de la hora especificada y, luego, utilizar la tabla derivada en los datos más antiguos. Como puede ver en el ejemplo de consulta que aparece a continuación, el predicado de tiempo de los datos de origen está limitado. Esto garantiza un procesamiento eficiente en la tabla de origen, que tiene un volumen de datos significativamente mayor y, luego, el predicado de tiempo ilimitado se encuentra en la tabla derivada.

WITH last_point_derived AS ( SELECT instance_name, MAX(time) AS time, MAX_BY(last_measure, time) AS last_measure FROM "derived"."per_timeseries_lastpoint_pt1d" WHERE time < from_milliseconds(1636746715649) AND measure_name = 'last_measure' AND region = 'us-east-1' AND cell = 'us-east-1-cell-10' AND silo = 'us-east-1-cell-10-silo-3' AND availability_zone = 'us-east-1-1' AND microservice_name = 'hercules' GROUP BY region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version ), last_point_source AS ( SELECT instance_name, MAX(time) AS time, MAX_BY(gc_pause, time) AS last_measure FROM "raw_data"."devops" WHERE time < from_milliseconds(1636746715649) AND time > from_milliseconds(1636746715649) - 26h AND measure_name = 'events' AND region = 'us-east-1' AND cell = 'us-east-1-cell-10' AND silo = 'us-east-1-cell-10-silo-3' AND availability_zone = 'us-east-1-1' AND microservice_name = 'hercules' GROUP BY region, cell, silo, availability_zone, microservice_name, instance_name, process_name, jdk_version ) SELECT instance_name, MAX(time) AS time, MAX_BY(last_measure, time) AS last_measure FROM ( SELECT * FROM last_point_derived UNION SELECT * FROM last_point_source ) GROUP BY instance_name ORDER BY instance_name, time DESC

El anterior es solo un ejemplo de cómo se pueden estructurar las tablas derivadas. Si tiene años de datos, puede utilizar más niveles de agregaciones. Por ejemplo, puede tener agregados mensuales además de agregados diarios y puede tener agregados por hora antes que los diarios. Así, puede combinar los datos más recientes para completar la última hora, los por hora para completar el último día, los diarios para completar el último mes y los mensuales para completar los datos anteriores. La cantidad de niveles que configure frente al programa de actualización dependerán de los requisitos en cuanto a la frecuencia con la que se produzcan estas consultas y de la cantidad de usuarios que las envíen simultáneamente.