[PYTHON] Essayez d'exécuter Amazon Timestream

introduction

Amazon Timestream, une base de données de séries chronologiques entièrement gérée, a été rendue publique le 30 septembre, alors touchons-y. Je connais la base de données des séries chronologiques depuis longtemps, mais je ne l'ai jamais utilisée, donc j'ai hâte d'y être.

C'est trop nouveau et ni CloudFormation ni Terraform ne sont encore pris en charge, donc cette fois je vais l'essayer depuis la console. Au fait, il n'est pas encore disponible dans la région de Tokyo, alors pointons la console vers la région disponible.

Essayez de créer une base de données

Eh bien, je n'étais pas sûr quand j'ai essayé de le faire moi-même, donc dans un tel cas [Tutoriel](https://aws.amazon.com/jp/blogs/news/store-and-access-time-series-data- Ce serait une pratique courante de le faire en regardant à n'importe quelle échelle avec amazon-timestream-now-general-available /).

Appuyez sur le bouton "Créer une base de données" sur l'écran suivant de Timestream.

キャプチャ1.png

Ensuite, définissez le nom de la base de données sur l'écran de création de base de données ouvert.

キャプチャ2.png

Si vous laissez les paramètres KMS vides, ils créeront la clé pour vous. Définissez la balise comme vous le souhaitez et appuyez sur le bouton "Créer une base de données".

キャプチャ3.png

Création terminée!

キャプチャ4.png

Essayez de faire une table

Maintenant, appuyons sur le lien du nom de table créé dans ↑. Il y a un bouton «Créer une table» sur l'écran des détails de la base de données, alors appuyez dessus.

Ensuite, définissez le nom de la table sur l'écran de création de table ouvert.

キャプチャ5.png

Le paramètre de stockage des données est un essai cette fois, c'est donc un manuel.

キャプチャ6.png

Définissez la balise comme vous le souhaitez et appuyez sur le bouton "Créer un tableau".

キャプチャ7.png

La création de la table est terminée!

キャプチャ8.png

Enregistrer les données

Ce n'est pas amusant de faire comme le tutoriel, alors enregistrons Sortie de données par Locust.

Les données à enregistrer sont les suivantes.

Timestamp,User Count,Type,Name,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%,Total Request Count,Total Failure Count,Total Median Response Time,Total Average Response Time,Total Min Response Time,Total Max Response Time,Total Average Content Size
1603535373,20,GET,/xxxxx/,1.000000,0.000000,5,6,6,6,8,9,9,9,9,9,9,16,0,4.11685699998543,5.413748562499876,4.11685699998543,9.385663000045952,14265.0

Créez une commande dans le Python suivant et chargez-la. Vous n'êtes peut-être pas familier avec les dimensions, mais en bref, vous pouvez les considérer comme des informations d'attribut pour la classification. Cette fois, nous avons défini les ressources et méthodes HTTP comme des attributs.

import sys
import csv
import time
import boto3
import psutil

from botocore.config import Config

FILENAME = sys.argv[1]

DATABASE_NAME = "xxxxx-test-timestream"
TABLE_NAME = "xxxxx-test-table"

def write_records(records):
    try:
        result = write_client.write_records(DatabaseName=DATABASE_NAME,
                                            TableName=TABLE_NAME,
                                            Records=records,
                                            CommonAttributes={})
        status = result['ResponseMetadata']['HTTPStatusCode']
        print("Processed %d records.WriteRecords Status: %s" %
              (len(records), status))
    except Exception as err:
        print("Error:", err)

if __name__ == '__main__':

    session = boto3.Session()
    write_client = session.client('timestream-write', config=Config(
        read_timeout=20, max_pool_connections=5000, retries={'max_attempts': 10}))
    query_client = session.client('timestream-query')

    with open(FILENAME) as f:
        reader = csv.reader(f, quoting=csv.QUOTE_NONE)

        for csv_record in reader:
            if csv_record[0] == 'Timestamp' or csv_record[3] == 'Aggregated':
                continue

            ts_records = []

            ts_columns = [
                { 'MeasureName': 'Requests/s',                  'MeasureValue': csv_record[4] },
                { 'MeasureName': '95Percentile Response Time',  'MeasureValue': csv_record[10] },
                { 'MeasureName': 'Total Median Response Time',  'MeasureValue': csv_record[18] },
                { 'MeasureName': 'Total Average Response Time', 'MeasureValue': csv_record[19] },
            ]

            for ts_column in ts_columns:
                ts_records.append ({
                    'Time': str(int(csv_record[0]) * 1000),
                    'Dimensions': [ {'Name': 'resource', 'Value': csv_record[3]}, {'Name': 'method', 'Value': csv_record[2]} ],
                    'MeasureName': ts_column['MeasureName'],
                    'MeasureValue': ts_column['MeasureValue'],
                    'MeasureValueType': 'DOUBLE'
                })

            write_records(ts_records)

Cependant, comme il s'agit d'une fonctionnalité qui vient d'être rendue publique, certaines personnes peuvent avoir une version plus ancienne de boto3.

$ pip list -o

Alors, vérifions si boto3 est le dernier.

Package               Version  Latest     Type
--------------------- -------- ---------- -----
boto3                 1.13.26  1.16.4     wheel

Mettre à jour avec pip avec `` -U```.

$ pip install -U boto3

Aussi, utilisez aws configure pour pointer la région par défaut vers la région où la base de données a été créée avec ↑.

Si psutil n'est pas inclus, installez-le comme suit.

$ yum install python3-devel
$ pip3 install psutil

Je pense que cela sera corrigé bientôt, mais à partir du 25 octobre 2020, le nom de la commande est erroné dans le blog officiel de ↑, donc si vous croyez au blog et à pip3, vous ne pourrez pas l'installer et vous vous sentirez triste.

Au fait, était-il possible de charger les données en toute sécurité?

Émettre une requête

Si vous sélectionnez "Editeur de requête" dans le menu de gauche, l'écran suivant sera affiché, alors exécutons SQL tout en réduisant les attributs au texte. Je veux connaître le temps de réponse moyen des requêtes GET dans / xxxxx /!

image.png

Quand je l'ai exécuté, seules les informations que je voulais ont été extraites!

キャプチャ10.png

Pour obtenir cela sous forme de données brutes, récupérez-le à nouveau avec CLI ou boto3. C'est assez gênant car un page nator est nécessaire. En premier lieu, il est facile d'utiliser des pandas pour une petite quantité, mais dans la scène d'utilisation réelle, les informations collectées avec un certain sens sur des milliers de serveurs, etc. sont rapidement récupérées, donc avec la quantité d'informations qui peuvent être formatées localement avec des pandas Il ne devrait pas y en avoir. Le fait qu'il puisse être surveillé en temps réel en combinaison avec Grafana est la vraie valeur.

Recommended Posts

Essayez d'exécuter Amazon Timestream
Essayez d'exécuter Pyston 0.1
Essayez d'exécuter CNN avec ChainerRL
Essayez d'exécuter Python avec Try Jupyter
Essayez d'exécuter tensorflow sur Docker + anaconda
Essayez d'installer OpenAM sur Amazon Linux
Essayez d'exécuter Jupyter avec VS Code
Essayez d'exécuter Jupyter Notebook sur Mac
Essayez d'utiliser Amazon DynamoDB à partir de Python
Essayez d'exécuter le jugement d'image PlaidML sur Mac
Essayez d'exécuter le simulateur 3D de Kobuki sur ROS