SQL文を使用してデータを分析する場合、標準SQL機能では、1つのクエリ要求で指定された期間内にすべてのログをスキャンできません。 このシナリオでは、専用SQL機能を有効にして、コンピューティングリソースと、1回のクエリ要求で分析できるデータ量を増やすことができます。 このトピックでは、Simple Log Service SDK for Javaを使用して専用SQL機能を使用する方法について説明します。
前提条件
Simple Log Serviceが有効化されています。 詳細については、次をご参照ください: Simple Log Serviceの有効化
RAM (Resource Access Management) ユーザーが作成され、必要な権限がRAMユーザーに付与されます。 詳細については、「RAMユーザーの作成とRAMユーザーへの権限付与」をご参照ください。
ALIBABA_CLOUD_ACCESS_KEY_IDおよびALIBABA_CLOUD_ACCESS_KEY_SECRET環境変数が設定されています。 詳細については、「環境変数の設定」をご参照ください。
重要
Alibaba CloudアカウントのAccessKeyペアには、すべてのAPI操作に対する権限があります。 RAMユーザーのAccessKeyペアを使用して、API操作を呼び出したり、ルーチンのO&Mを実行したりすることを推奨します。
プロジェクトコードにAccessKey IDまたはAccessKey secretを保存しないことを推奨します。 そうしないと、AccessKeyペアが漏洩し、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。
Simple Log Service SDK for Java V0.6.68以降がインストールされています。 詳細については、「Simple Log Service SDK For Javaのインストール」をご参照ください。
背景情報
Simple Log Serviceは、専用SQL機能を提供し、SQL分析機能を強化します。 この機能を使用して、数千億のデータレコードを処理できます。 詳細については、「Dedicated SQLの有効化」をご参照ください。
使用上の注意
この例では、中国 (杭州) リージョンのパブリックSimple Log Serviceエンドポイントが使用されています。これは https://cn-hangzhou.log.aliyuncs.com
です。 プロジェクトと同じリージョンにある他のAlibaba Cloudサービスを使用してSimple Log Serviceにアクセスする場合は、内部のSimple Log Serviceエンドポイント ( https://cn-hangzhou-intranet.log.aliyuncs.com
) を使用できます。 Simple Log Serviceのサポートされているリージョンとエンドポイントの詳細については、「エンドポイント」をご参照ください。
手順1: シンプルなLog Serviceクライアントの作成
String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
String project = "aliyun-test-project";
String host = "cn-hangzhou.log.aliyuncs.com";
String logStore = "aliyun-test-logstore";
int shardId = 0;
Client client = new Client(host, accessId, accessKey);
ステップ2: 専用SQL機能の使用
Dedicated SQL機能を使用する前に、機能が有効になっているかどうかを確認してください。 詳細については、「Dedicated SQLの有効化」をご参照ください。
Simple Log Serviceは、executeLogStoreSqlおよびexecuteProjectSql操作を提供します。 操作を呼び出して、Dedicated SQL機能を効率的に使用できます。
詳細については、「Alibaba Cloud Simple Log Service SDK For Java」をご参照ください。
説明
データを分析する前にデータをフィルタリングする場合は、executeLogStoreSql操作を呼び出して、分析効率を向上させるためにSearch statement | Analytic statement
形式でクエリステートメントを指定することを推奨します。
executeLogStoreSql
executeProjectSql
この操作を呼び出して、特定のLogstoreでDedicated SQL機能を使用できます。 この操作は、標準のSQL-92構文をサポートしています。 クエリステートメントはSearchステートメント | Analyticステートメント
の形式であり、分析ステートメントは標準のSQL-92構文に従います。
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.LogContent;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.common.QueriedLog;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.response.GetLogsResponse;
import java.util.Date;
public class SlsSample {
public static void main(String args[]) throws LogException,
InterruptedException {
String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
String project = "aliyun-test-project";
String host = "cn-hangzhou.log.aliyuncs.com";
String logStore = "aliyun-test-logstore";
int shardId = 0;
Client client = new Client(host, accessId, accessKey);
try {
String sql = "* | select count(1)";
int from = (int) (new Date().getTime() / 1000 - 600);
int to = (int) (new Date().getTime() / 1000);
GetLogsResponse logsResponse = client.executeLogstoreSql(project, logStore, 1627268185, 1627269085, "* | SELECT count(*)", true);
System.out.println("Returned sql result count:" + logsResponse.GetCount());
for (QueriedLog log : logsResponse.getLogs()) {
LogItem item = log.GetLogItem();
System.out.println("time : " + item.mLogTime);
for (LogContent content : item.mContents) {
System.out.println(content.mKey + ":" + content.mValue);
}
}
System.out.println("proccesedRows:" + logsResponse.getProcessedRow());
System.out.println("elapsedMilli:" + logsResponse.getElapsedMilliSecond());
System.out.println("cpuSec:" + logsResponse.getCpuSec());
System.out.println("cpuCores:" + logsResponse.getCpuCores());
System.out.println("requestId:" + logsResponse.GetRequestId());
} catch (LogException e) {
System.out.println("error code :" + e.GetErrorCode());
System.out.println("error message :" + e.GetErrorMessage());
throw e;
}
}
}
executeLogStoreSql操作を呼び出して、Dedicated SQL機能を使用できます。 GetLogsResponse logsResponse = client.exe cuteLogstoreSql(project, logStore, from, to, query, powerSql)
形式でリクエストを作成する必要があります。 下表に、各パラメーターを説明します。
パラメーター | データ型 | 必須 | 例 | 説明 |
project | String | 課金されます | 非該当 | プロジェクトの名前。 Simple Log Serviceクライアントを作成するときは、project パラメーターの値を指定する必要があります。 したがって、パラメーターを再度設定する必要はありません。 |
logStore | String | 課金されます | 非該当 | ログストアの名前 Simple Log Serviceクライアントを作成するときは、logStore パラメーターの値を指定する必要があります。 したがって、パラメーターを再度設定する必要はありません。 |
from | Long | 課金されます | 1627268185 | 照会する期間の開始時刻です。 この値は、1970年1月1日00:00:00 UTCから経過した秒数を表すUNIXタイムスタンプです。 |
to | Long | 課金されます | 1627269085 | 照会する期間の終了時刻を設定します。 この値は、1970年1月1日00:00:00 UTCから経過した秒数を表すUNIXタイムスタンプです。 |
query | String | 課金されます | "* | SELECT count(*)" | Simple Log Service詳細については、「構文」をご参照ください。 デフォルトでは、Simple Log Serviceは100行のデータを返します。 LIMIT句を使用して、返すデータ行の数を指定できます。 詳細は、「LIMIT句」をご参照ください。 |
powerSql | ブール値 | 課金されません | true | 専用SQL機能を使用するかどうかを指定します。 詳細については、「Dedicated SQLの有効化」をご参照ください。 有効な値: |
import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.LogContent;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.common.QueriedLog;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.response.GetLogsResponse;
import java.util.Date;
public class SlsSample {
public static void main(String args[]) throws LogException,
InterruptedException {
String accessId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKey = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
String project = "aliyun-test-project";
String host = "cn-hangzhou.log.aliyuncs.com";
String logStore = "aliyun-test-logstore";
int shardId = 0;
Client client = new Client(host, accessId, accessKey);
try {
int now = (int) (new Date().getTime() / 1000);
String sql = "select count(1) as cnt from xxx where __time__ > " + now;
GetLogsResponse logsResponse = client.executeProjectSql(project, "select avg(latency),max(latency) ,count(1) as c from sample-logstore where status>200 and __time__>=1500975424 and __time__ < 1501035044 GROUP BY method ORDER BY c", true);
System.out.println("Returned sql result count:" + logsResponse.GetCount());
for (QueriedLog log : logsResponse.getLogs()) {
LogItem item = log.GetLogItem();
for (LogContent content : item.mContents) {
System.out.println(content.mKey + ":" + content.mValue);
}
}
System.out.println("proccesedRows:" + logsResponse.getProcessedRow());
System.out.println("elapsedMilli:" + logsResponse.getElapsedMilliSecond());
System.out.println("cpuSec:" + logsResponse.getCpuSec());
System.out.println("cpuCores:" + logsResponse.getCpuCores());
System.out.println("requestId:" + logsResponse.GetRequestId());
} catch (LogException e) {
System.out.println("error code :" + e.GetErrorCode());
System.out.println("error message :" + e.GetErrorMessage());
throw e;
}
}
}
専用SQL機能を使用するには、executeProjectSql操作を呼び出します。 GetLogsResponse logsResponse = client.exe cuteProjectSql(project、query、powerSql)
形式でリクエストを作成する必要があります。 下表に、各パラメーターを説明します。
パラメーター | データ型 | 必須 | 例 | 説明 |
project | String | 課金されます | 非該当 | プロジェクトの名前。 Simple Log Serviceクライアントを作成するときは、project パラメーターの値を指定する必要があります。 したがって、パラメーターを再度設定する必要はありません。 |
query | String | 課金されます | "sample-logstoreからavg(latency) 、max(latency) 、count(1) をcとして選択します。status>200 and __time __>= 1500975424 and __time__ < 1501035044 GROUP BY method ORDER BY c" | デフォルトでは、Simple Log Serviceは100行のデータを返します。 LIMIT句を使用して、返すデータ行の数を指定できます。 詳細は、「LIMIT句」をご参照ください。 説明 標準SQL文を記述するには、SQL文のWHERE句でフィルター条件とクエリ時間範囲を指定する必要があります。 WHERE 句に __time__ フィールドを含めて、クエリ時間範囲を指定できます。 |
powerSql | ブール値 | 課金されません | true | 専用SQL機能を使用するかどうかを指定します。 詳細については、「Dedicated SQLの有効化」をご参照ください。 有効な値: |