Agrégation et analyse de journaux (utilisation d'AWS Athena en Java)

Histoire précédente

J'envisageais de collecter et d'analyser les logs de l'application Web et de visualiser les résultats, et je réfléchissais au type de configuration que ce serait si je voulais le faire moi-même. C'est une histoire du processus d'examen à ce moment-là et du service réellement utilisé dans l'environnement AWS adopté.

Au début de la réflexion

Je pensais que Kibana suffirait ...

Au début, il fut un temps où je me demandais si la recherche élastique → Kibana suffirait ... Certes, il est possible de rechercher et d'agréger les journaux avec Elasticsearch et de les visualiser avec Kibana. Cependant, il est difficile de voir les résultats agrégés sur un autre axe, et si vous utilisez Kibana, d'autres personnes peuvent voir le journal brut, il y a donc divers problèmes, donc le plan Kibana a disparu. C'était.

Proposition de mettre le résultat agrégé en RDB

L'agrégation ne semble pas être un problème avec la recherche élastique, alors puis-je obtenir les données nécessaires de RDB lorsque je place le résultat agrégé dans RDB et que je le visualise? J'ai pensé.

Mais ... J'ai décidé d'utiliser la base de données chronologique parce que même si je mettais les résultats agrégés dans la RDB, je n'ai pas obtenu d'aussi bons résultats en termes de performances lorsque je les ai retirés pour analyse.

Résumez le flux jusqu'à présent

  1. Poussez le journal de l'application Web dans Elasticsearch
  2. Agréger avec Elasticsearch et mettre en série chronologique DB (le candidat à ce moment-là est InfluxDB)
  3. Extrayez d'InfluxDB sur l'axe que vous souhaitez analyser et tracez-le

Je me suis installé sur une telle configuration système.

Cependant, à la suite de diverses réflexions, dès la conclusion, il semble que cela coûtera de l'argent en termes d'infrastructure, alors j'ai décidé d'envisager un autre plan ...

Par conséquent, il a été proposé d'intégrer l'environnement AWS.

Envisagez la configuration en combinant les services AWS

Organisez ce que vous voulez faire

Ce que je veux faire, c'est "Je veux agréger et analyser les logs et les visualiser !!" sortie par l'application.

Services à utiliser

Si vous vérifiez le service AWS pour le moment, il semble que le flux suivant peut être effectué

  1. Placez les journaux d'application sur S3 avec fluentd
  2. Appelez Athena depuis Lambda et regroupez les journaux placés dans S3 (Lorsque Athena est exécuté, le CSV du résultat de l'agrégation est affiché)
  3. Pour l'analyse, ciblez la sortie CSV dans 2 et ré-agrégez avec Athena sur l'axe souhaité.

Le flux est simple comme ça.

Échantillon pour faire fonctionner Athena

Pour faire fonctionner Athena à partir de Java, utilisez le JDBC pour Athena fourni par AWS. Actuellement (en novembre 2018), le dernier est AthenaJDBC42-2.0.5.jar, mais [Télécharger ici](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc. html) Vous pouvez.

Code Java pour appeler Athena pour s'enregistrer auprès de Lambda dans Flow 2.


    import java.io.File;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    import java.util.Properties;
  
    public class AthenaService {  

        //Paramètres Athena Ohio
        private static final String CONNECTION_URL = "jdbc:awsathena://athena.us-east-2.amazonaws.com:443";
        private static final String S3_BUCKET = "test-bucket";

        public void execute(String dateTime) {

            Properties info = new Properties();

            info.put("UID", "XXXXXXXX");
            info.put("PWD", "XXXXXXXX");
            info.put("S3OutputLocation",
               + "s3://" + S3_BUCKET + File.separator
               + "test-dir" + File.separator);

            Class.forName("com.simba.athena.jdbc.Driver");
            Connection connection = DriverManager.getConnection(CONNECTION_URL, info);
            Statement statement = connection.createStatement();

            String query = "SELECT xxxxxxxxxxxxxxxxxxxx";
            ResultSet result = statement.executeQuery(query);

            while(result.next()) {
                System.out.println(rs.getString("Nom de la clé"));
            }

            result.close();
            statement.close();
            connection.close();
    }

Vous pouvez facilement vous connecter en définissant simplement les informations requises dans Propriétés de cette manière.

prime

Suppression des métadonnées pouvant être effectuées lors de l'exécution d'Athena

En prime, je n'ai pas besoin du fichier avec l'extension .metadata qui a été créé lorsque j'ai exécuté Athena, donc je vais le supprimer. Cliquez ici pour l'échantillon

import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;

import open.ag.kabigon.athena.Constant;
import open.ag.kabigon.s3.service.S3Base;

public class S3Handler {

        private static final String S3_BUCKET = "test-bucket";

    private AmazonS3 s3;

    public void deleteAtenaMetadate(String dateTime) {
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(
                "UID", "PWD");

        s3 = AmazonS3ClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(awsCreds))
                .withRegion(Regions.US_EAST_2)
                .build();

        //Obtenez l'objet qui existe dans le répertoire du compartiment spécifié
        ObjectListing objectList = s3.listObjects(Constant.S3_AG_BACKET, "test-dir" + File.separator);

        deleteObject(objectList);
        s3.shutdown();
    }

    private void deleteObject(ObjectListing objectList) {
        objectList.getObjectSummaries().forEach(i -> {
            //L'extension est.metadata or .Supprimer l'objet txt
            if (i.getKey().endsWith(".metadata") || i.getKey().endsWith(".txt"))
                this.s3.deleteObject(Constant.S3_AG_BACKET, i.getKey());
        });

        if (objectList.isTruncated()) {
            ObjectListing remainsObject = this.s3.listNextBatchOfObjects(objectList);
            this.deleteObject(remainsObject);
        }
    }
}

Recommended Posts

Agrégation et analyse de journaux (utilisation d'AWS Athena en Java)
Analyse morphologique en Java avec Kuromoji
Gérez d'énormes JSON avec Java Lambda
Analyse de code statique par Checkstyle avec Java + Gradle
Entraînez-vous à travailler avec des paires de substitution Unicode en Java
Crypter / décrypter avec AES256 en PHP et Java
Résolution du problème lorsque Azure Functions a cessé de fonctionner en Java
Liez le journal Docker à AWS CloudWatch et surveillez en temps réel avec VS Code
Stocker dans une carte Java 2D et tourner avec pour instruction
Analyse de sujets (LDA) en Java
Créer un SlackBot avec AWS lambda et API Gateway en Java
Agrégation de listes en Java (Collectors.groupingBy)
Générer AWS Signature V4 en Java et demander l'API
Comparez Hello, world! Avec Spring Boot avec Java, Kotlin et Groovy
Utiliser java avec MSYS et Cygwin
Installez Java et Tomcat avec Ansible
SDK AWS pour Java 1.11.x et 2.x
Exemple d'encodage et de décodage en Java
Utilisez JDBC avec Java et Scala.
Enregistrer la sortie dans un fichier en Java
Classe StringBuffer et StringBuilder en Java
Suppression d'objets AWS S3 dans Java
Sortie PDF et TIFF avec Java 8
Utilisation de Java avec AWS Lambda-Eclipse Préparation
Dossiers renommés dans AWS S3 (Java)
Comprendre equals et hashCode en Java
Essayez d'exécuter AWS X-Ray en Java
Faire une analyse de phrase en Java 8 (partie 2)
1 Implémentez une analyse de phrase simple en Java
Tweak Markdown avec Java flexmark-java
Crypter avec Java et décrypter avec C #
Création d'une analyse de phrase dans Java 8 (partie 1)
Bonjour tout le monde en Java et Gradle
Utilisation de Java avec AWS Lambda-Implementation Tips - Obtenir le nom de l'instance à partir de la réaction et de l'ID d'instance
[Rails 6] Enregistrez-vous et connectez-vous avec l'authentification Devise + SNS (plusieurs liens sont autorisés)
J'ai écrit une fonction Lambda en Java et l'ai déployée avec SAM
Utilisation de Java avec des arguments CloudWatch AWS Lambda-Implementation-Check
Différence entre final et immuable en Java
Surveillez les applications Java avec jolokia et hawtio
Utilisation de Java avec AWS Lambda-Implementation-Stop / Launch EC2
Lier le code Java et C ++ avec SWIG
Méthode de concurrence en Java avec exemple de base
Essayons WebSocket avec Java et javascript!
[Java] Lecture et écriture de fichiers avec OpenCSV
AWS Lambda (Lambda) Partie 1 avec Java pour démarrer maintenant
Lire le fichier xlsx en Java avec Selenium
Diviser une chaîne avec ". (Dot)" en Java
Essayez de gérer les bibliothèques Java avec AWS CodeArtifact
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
De Java à C et de C à Java dans Android Studio
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur
NLP4J [004] Essayez l'analyse de texte en utilisant le traitement du langage naturel et le traitement statistique de l'analyse syntaxique en Java
NLP4J [003] Essayez l'analyse de texte en utilisant le traitement du langage naturel et le traitement statistique des pièces en Java