このトピックでは、Java Database Connectivity (JDBC) を使用して Simple Log Service に接続する方法について説明します。また、MySQL プロトコルと SQL 構文を使用してログをクエリおよび分析する方法についても説明します。
背景情報
MySQL は一般的なリレーショナルデータベースサービスです。多くのソフトウェア製品が、MySQL プロトコルと SQL 構文を使用して MySQL データを取得できます。JDBC を使用して Simple Log Service に接続するには、SQL 構文に精通している必要があります。Simple Log Service では、MySQL プロトコルに基づいてログをクエリおよび分析できます。標準の MySQL クライアントを使用して Simple Log Service に接続できます。その後、標準の SQL 構文を使用してログをクエリおよび分析できます。MySQL クライアント、JDBC、MySQL Connector などのクライアントが MySQL プロトコルをサポートしています。
ユースケース:
DataV、Tableau、Grafana などの可視化ツールを使用して、MySQL プロトコル経由で Simple Log Service に接続します。
Java または Python プログラムで Simple Log Service のデータをクエリ、分析、または使用する場合、JDBC または MySQL Connector を使用して Simple Log Service に接続できます。
次の表は、Simple Log Service と MySQL データベースの比較を示しています。
Simple Log Service | MySQL データベース |
プロジェクト | データベース |
ログストア | テーブル |
インデックス | テーブル列 |
Simple Log Service では、SQL クエリはページネーションをサポートしていません。
制限事項
Simple Log Service は JDBC 5.1.49 のみをサポートしています。
Java で JDBC、Python で MySQL Connector などのドライバーを使用して Simple Log Service にアクセスする場合は、Simple Log Service の内部エンドポイントのみを使用する必要があります。内部エンドポイントは、Alibaba Cloud のクラシックネットワークまたは仮想プライベートクラウド (VPC) 経由でアクセスできます。詳細については、「エンドポイント」をご参照ください。別のエンドポイントを使用すると、次のエラーが発生します:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure,Caused by: java.net.ConnectException: Connection timed out: connect。
前提条件
Resource Access Management (RAM) ユーザーが作成され、必要な権限が RAM ユーザーに付与されていること。詳細については、「RAM ユーザーを作成し、RAM ユーザーに権限を付与する」をご参照ください。
ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が設定されていること。詳細については、「Linux、macOS、および Windows で環境変数を設定する」をご参照ください。
重要Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作に対する権限を持っています。API 操作を呼び出したり、日常的な O&M を実行したりするには、RAM ユーザーの AccessKey ペアを使用することをお勧めします。
プロジェクトコードに AccessKey ID や AccessKey シークレットを保存しないことをお勧めします。保存すると、AccessKey ペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。
必要なフィールドにフィールドインデックスが設定され、フィールドに対して分析の有効化がオンになっていること。詳細については、「インデックスを作成する」をご参照ください。
サンプルログ
バイクシェアサービスの各ログには、ユーザーに関する情報が含まれています。情報には、年齢、性別、バッテリー使用量、自転車 ID、操作レイテンシ、緯度、ロックタイプ、経度、操作タイプ、操作結果、ロック解除タイプが含まれます。ログは、シンガポールリージョンにある trip-demo プロジェクトの ebike ログストアに保存されます。
サンプルログ:
Time :10-12 14:26:44
__source__: 192.168.0.0
__topic__: v1
age: 55
battery: 118497.673842
bikeid: 36
gender: male
latency: 17
latitude: 30.2931185245
lock_type: smart_lock
longitude: 120.052840484
op: unlock
op_result: ok
open_lock: bluetooth
userid: 292JDBC ベースのクエリと分析
Maven プロジェクトを作成し、プロジェクトの pom.xml ファイルに次の JDBC 依存関係を追加します。サンプルコード:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency>JDBC を使用してログをクエリする Java プログラムを作成します。次のサンプルコードは、JDBC を使用してログをクエリする Java プログラムを作成する方法を示しています。
重要WHERE 句に
__date__または__time__フィールドを含めて、クエリの時間範囲を制限する必要があります。__date__フィールドのデータ型はタイムスタンプです。__time__フィールドのデータ型は bigint です。例:__date__ > '2017-08-07 00:00:00' and __date__ < '2017-08-08 00:00:00'__time__ > 1502691923 and __time__ < 1502692923
JDBC 接続形式:
jdbc:mysql://{project}.{endpoint}:10005/{project}。{project}および{endpoint}の詳細については、「パラメータの説明」をご参照ください。
/** * Created by xxx on 2017/6/19. */ import com.mysql.jdbc.*; import java.sql.*; import java.sql.Connection; import java.sql.Statement; /** * Created by xxx on 2017/6/15. */ public class CollectTest { public static void main(String args[]){ // Simple Log Service のプロジェクト名と内部エンドポイント。名前とエンドポイントを実際の値に置き換えます。 final String endpoint = "ap-southeast-1-intranet.log.aliyuncs.com"; // JDBC ベースのアクセスに使用されるポート。デフォルトポートは 10005 です。 final String port = "10005"; // Simple Log Service プロジェクトの名前。 final String project = "trip-demo"; // Simple Log Service ログストアの名前。 final String logstore = "ebike"; // この例では、AccessKey ID と AccessKey シークレットは環境変数から取得されます。 final String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"); final String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"); Connection conn = null; Statement stmt = null; try { // ステップ 1: JDBC ドライバーを読み込みます。 Class.forName("com.mysql.jdbc.Driver"); // ステップ 2: 接続文字列を作成します。 conn = DriverManager.getConnection("jdbc:mysql://"+endpoint+":"+port+"/"+project+"?useSSL=false",accessKeyId,accessKey); // ステップ 3: ステートメントを作成します。 stmt = conn.createStatement(); // ステップ 4: 2017 年 10 月 11 日に生成され、op フィールドが unlock に設定されているログの数をクエリするクエリ文を指定します。 String sql = "select count(1) as pv,avg(latency) as avg_latency from "+logstore+" " + "where __date__ >= '2017-10-11 00:00:00' " + " and __date__ < '2017-10-12 00:00:00'" + " and op ='unlock'"; // ステップ 5: クエリ文を実行します。 ResultSet rs = stmt.executeQuery(sql); // ステップ 6: クエリと分析の結果を抽出します。 while(rs.next()){ // 列名で取得します System.out.print("pv:"); // 結果に pv を表示します。 System.out.print(rs.getLong("pv")); System.out.print(" ; avg_latency:"); // 結果に avg_latency を表示します。 System.out.println(rs.getDouble("avg_latency")); System.out.println(); } rs.close(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } finally { if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
パラメータ | 説明 | 必須 | 例 |
project | ターゲットプロジェクト名。 | はい | trip-demo |
endpoint | Simple Log Service の内部エンドポイント。 | はい | ap-southeast-1-intranet.log.aliyuncs.com |
port | JDBC ベースのアクセスに使用されるポート。値は 10005 に固定されています。 | はい | 10005 |
accessId | ユーザーを識別するために使用される AccessKey ID。 | はい | LT*******************KX |
accessKey | 署名文字列の暗号化と検証に使用される AccessKey シークレット。 | はい | - |