このトピックでは、Simple Log Service の C++ SDK を使用して専用 SQL 機能を利用する方法について説明します。
前提条件
RAM ユーザーを作成し、必要な権限を付与します。詳細については、「RAM ユーザーの作成と権限付与」をご参照ください。
`ALIBABA_CLOUD_ACCESS_KEY_ID` および `ALIBABA_CLOUD_ACCESS_KEY_SECRET` 環境変数を設定します。詳細については、「Linux、macOS、Windows で環境変数を設定する」をご参照ください。
重要Alibaba Cloud アカウントの AccessKey ペアは、すべての API 操作にアクセスできます。API 呼び出しや日常の運用保守には、RAM ユーザーの AccessKey ペアを使用することを推奨します。
セキュリティリスクを防ぐため、AccessKey ID と AccessKey Secret をプロジェクトコードにハードコーディングしないでください。AccessKey ペアが漏洩すると、アカウント内のすべてのリソースのセキュリティが侵害される可能性があります。
最新バージョンの Simple Log Service C++ SDK がインストールされていること。詳細については、「Alibaba Cloud Simple Log Service SDK for C++」をご参照ください。
背景情報
Simple Log Service は、SQL 分析機能を強化するために専用 SQL 機能を提供します。この機能を使用して、数千億行のデータを処理できます。詳細については、「専用 SQL の有効化」をご参照ください。
Simple Log Service は、ExecuteLogStoreSql および ExecuteProjectSql 操作を提供します。これらの操作を呼び出すことで、専用 SQL 機能を効率的に使用できます。
ExecuteLogStoreSql 操作:指定された Logstore で専用 SQL クエリを実行します。この操作は、標準 SQL-92 と互換性のあるクエリ・分析構文をサポートします。フォーマットは
検索文|分析文で、分析文は標準 SQL-92 構文に従います。ExecuteProjectSql 操作:指定されたプロジェクトで専用 SQL 機能を使用します。この操作は SQL-92 構文をサポートします。SQL ステートメントの WHERE 句でフィルター条件と時間範囲を指定する必要があります。
分析前にデータをフィルタリングするには、パフォーマンス向上のため、ExecuteLogStoreSql 操作で 検索文|分析文 構文を使用してください。
サンプルコード
次のサンプルコードは、専用 SQL 機能の使用方法を示しています。詳細については、「Alibaba Cloud Simple Log Service SDK for C++」をご参照ください。
#include <cstdlib>
// Simple Log Service のエンドポイント。この例では、中国 (杭州) を使用します。実際のエンドポイントに置き換えてください。
std::string endpoint = "cn-hangzhou.log.aliyuncs.com";
// この例では、環境変数から AccessKey ID と AccessKey Secret を取得します。
string accessId = (string)getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
string accessKey = (string)getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// プロジェクト名。
std::string project = "your_project_name";
// Logstore 名。
std::string logStore = "your_logstore";
// Simple Log Service クライアントを作成します。
LOGClient client(endpoint, accessId, accessKey);
// 指定された Logstore で SQL 分析を実行します。
try
{
std::string sql = "* | select count(1)";
int from = time(NULL) - 600;
int to = from + 600;
LogStoreSqlResponse logsResponse = client.ExecuteLogStoreSql(project, logStore,
1627268185,1627269085,"* | SELECT count(*)",true);
// 分析結果の統計情報を出力します。
std::cout << "Returned sql result:" << std::endl
<< "count:" << logsResponse.result.logline << std::endl // 結果の行数。
<< "processed rows:" << logsResponse.processedRows << std::endl // 処理されたログ行数。
<< "elapsed milli:" << logsResponse.elapsedMilli << std::endl // SQL 分析の実行時間。
<< "cpu sec:" << logsResponse.cpuSec << std::endl // 専用 SQL 分析の CPU 時間 (秒)。専用 SQL はこの値に基づいて課金されます。詳細については、課金項目をご参照ください。
<< "cpu core:" << logsResponse.cpuCore << std::endl; // 専用 SQL を有効にした SQL 分析で使用された CPU コア数。
for (std::vector<LogItem>::const_iterator itr = logsResponse.result.logdatas.begin();
itr != logsResponse.result.logdatas.end(); ++itr)
{
const LogItem &item = *itr;
for (std::vector<std::pair<std::string, std::string>>::const_iterator itr_data = item.data.begin();
itr_data != item.data.end(); ++itr_data)
{
std::cout << itr_data->first << ":" << itr_data->second;
}
}
}
catch (LOGException &e)
{
std::cout << "error code :" << e.GetErrorCode() << std::endl;
std::cout << "error message :" << e.GetMessage() << std::endl;
throw e;
}
// 指定されたプロジェクトで SQL 分析を実行します。
try
{
int now = time(NULL);
std::string sql = "select count(1) as cnt from xxx where __time__ > " + to_string(now);
ProjectSqlResponse 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);
// 分析結果の統計情報を出力します。
std::cout << "Returned sql result:" << std::endl
<< "count:" << logsResponse.result.logline << std::endl // 結果の行数。
<< "processed rows:" << logsResponse.processedRows << std::endl // 処理されたログ行数。
<< "elapsed milli:" << logsResponse.elapsedMilli << std::endl // SQL 分析の実行時間。
<< "cpu sec:" << logsResponse.cpuSec << std::endl // 専用 SQL 分析の CPU 時間 (秒)。専用 SQL はこの値に基づいて課金されます。詳細については、課金項目をご参照ください。
<< "cpu core:" << logsResponse.cpuCore << std::endl; // 専用 SQL を有効にした SQL 分析で使用された CPU コア数。
for (std::vector<LogItem>::const_iterator itr = logsResponse.result.logdatas.begin(); itr != logsResponse.result.logdatas.end(); ++itr)
{
const LogItem &item = *itr;
for (std::vector<std::pair<std::string, std::string>>::const_iterator itr_data = item.data.begin();
itr_data != item.data.end(); ++itr_data)
{
std::cout << itr_data->first << ":" << itr_data->second;
}
}
}
catch (LOGException &e)
{
std::cout << "error code :" << e.GetErrorCode() << std::endl;
std::cout << "error message :" << e.GetMessage() << std::endl;
throw e;
}ExecuteLogStoreSql 操作
ExecuteLogStoreSql 操作は、
LogStoreSqlResponse logsResponse = client.ExecuteLogStoreSql(project, logStore, from, to, query, powerSql)の形式で呼び出します。パラメーターは次の表のとおりです。パラメーター
タイプ
必須
例
説明
project
String
はい
N/A
プロジェクト名。
Simple Log Service クライアントの作成時に project パラメーターの値を指定するため、ここで再度パラメーターを設定する必要はありません。
logStore
String
はい
N/A
Logstore 名。
Simple Log Service クライアントの作成時に logStore パラメーターの値を指定するため、ここで再度パラメーターを設定する必要はありません。
from
Long
はい
1627268185
クエリ対象の時間範囲の開始時刻。値は UNIX 時間形式のタイムスタンプです。1970年1月1日 00:00:00 (UTC) からの経過秒数を表します。
to
Long
はい
1627269085
クエリ対象の時間範囲の終了時刻。値は UNIX 時間形式のタイムスタンプです。1970年1月1日 00:00:00 (UTC) からの経過秒数を表します。
query
String
はい
"* | SELECT count(*)"Simple Log Service のクエリ・分析ステートメント。フォーマットは
検索文|分析文です。詳細については、「基本構文」をご参照ください。デフォルトでは、Simple Log Service は 100 行のデータを返します。LIMIT 句を使用して、返すデータ行数を指定できます。詳細については、「LIMIT 句」をご参照ください。
powerSql
Boolean
いいえ
true
専用 SQL を使用するかどうかを指定します。詳細については、「専用 SQL の有効化」をご参照ください。有効な値:
true:専用 SQL を使用します。
false (デフォルト):標準 SQL を使用します。
ExecuteProjectSql 操作
ExecuteProjectSql 操作は、
ProjectSqlResponse logsResponse = client.ExecuteProjectSql(project, query, powerSql)の形式で呼び出します。パラメーターは次の表のとおりです。パラメーター
タイプ
必須
例
説明
project
String
はい
N/A
プロジェクト名。
Simple Log Service クライアントの作成時に project パラメーターの値を指定するため、ここで再度パラメーターを設定する必要はありません。
query
String
はい
"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"SQL ステートメント。WHERE 句でフィルター条件と時間範囲を指定する必要があります。
デフォルトでは、Simple Log Service は 100 行のデータを返します。LIMIT 句を使用して、返すデータ行数を指定できます。詳細については、「LIMIT 句」をご参照ください。
powerSql
Boolean
いいえ
true
専用 SQL を使用するかどうかを指定します。詳細については、「専用 SQL の有効化」をご参照ください。有効な値:
true:専用 SQL を使用します。
false (デフォルト):標準 SQL を使用します。