Execute consultas Dedicated SQL em dados de log com o Simple Log Service SDK for C++. O Dedicated SQL processa centenas de bilhões de linhas de dados.
Pré-requisitos
Crie um usuário RAM e conceda as permissões necessárias. Para mais informações, consulte Criar um usuário RAM e conceder permissões.
-
Configure as variáveis de ambiente
ALIBABA_CLOUD_ACCESS_KEY_IDeALIBABA_CLOUD_ACCESS_KEY_SECRET. Para mais informações, consulte Configurar variáveis de ambiente no Linux, macOS e Windows.ImportanteO par AccessKey de uma conta Alibaba Cloud tem acesso a todas as operações da API. Use o par AccessKey de um usuário RAM para chamadas de API ou operações e manutenção rotineiras.
Não codifique o AccessKey ID e o AccessKey Secret diretamente no código do projeto. Pares AccessKey expostos comprometem a segurança de todos os recursos da sua conta.
Instale a versão mais recente do Simple Log Service SDK for C++. Para mais informações, consulte Alibaba Cloud Simple Log Service SDK for C++.
Contexto
O Dedicated SQL aprimora os recursos de análise SQL e processa centenas de bilhões de linhas de dados. Para mais informações, consulte Ativar o Dedicated SQL.
O Simple Log Service fornece as operações ExecuteLogStoreSql e ExecuteProjectSql para o Dedicated SQL.
ExecuteLogStoreSql: executa uma consulta Dedicated SQL em um Logstore específico. Esta operação aceita sintaxe de consulta e análise compatível com o padrão SQL-92. O formato é
search statement|analytic statement, em que a instrução analítica segue a sintaxe padrão SQL-92.ExecuteProjectSql: executa uma consulta Dedicated SQL em um projeto específico. Esta operação aceita a sintaxe SQL-92. Especifique uma condição de filtro e um intervalo de tempo na cláusula WHERE da instrução SQL.
Para filtrar dados antes da análise, use a sintaxe search statement|analytic statement com a operação ExecuteLogStoreSql para obter melhor desempenho.
Código de exemplo
O código a seguir usa o recurso Dedicated SQL. Para acessar o SDK completo, consulte Alibaba Cloud Simple Log Service SDK for C++.
#include <cstdlib>
// Simple Log Service endpoint. Replace with your actual endpoint.
std::string endpoint = "cn-hangzhou.log.aliyuncs.com";
// Retrieve the AccessKey ID and AccessKey Secret from environment variables.
string accessId = (string)getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
string accessKey = (string)getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// Project name.
std::string project = "your_project_name";
// Logstore name.
std::string logStore = "your_logstore";
// Create a Simple Log Service client.
LOGClient client(endpoint, accessId, accessKey);
// Run a SQL query in the specified Logstore.
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);
// Print the query result statistics.
std::cout << "Returned sql result:" << std::endl
<< "count:" << logsResponse.result.logline << std::endl // Number of rows in the result.
<< "processed rows:" << logsResponse.processedRows << std::endl // Number of log rows processed.
<< "elapsed milli:" << logsResponse.elapsedMilli << std::endl // SQL query execution duration.
<< "cpu sec:" << logsResponse.cpuSec << std::endl // CPU time (seconds) for Dedicated SQL. Billing is based on this value. For more information, see billable items.
<< "cpu core:" << logsResponse.cpuCore << std::endl; // Number of CPU cores used for the Dedicated SQL query.
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;
}
// Run a SQL query in the specified project.
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);
// Print the query result statistics.
std::cout << "Returned sql result:" << std::endl
<< "count:" << logsResponse.result.logline << std::endl // Number of rows in the result.
<< "processed rows:" << logsResponse.processedRows << std::endl // Number of log rows processed.
<< "elapsed milli:" << logsResponse.elapsedMilli << std::endl // SQL query execution duration.
<< "cpu sec:" << logsResponse.cpuSec << std::endl // CPU time (seconds) for Dedicated SQL. Billing is based on this value. For more information, see billable items.
<< "cpu core:" << logsResponse.cpuCore << std::endl; // Number of CPU cores used for the Dedicated SQL query.
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
Chame a operação ExecuteLogStoreSql no seguinte formato:
LogStoreSqlResponse logsResponse = client.ExecuteLogStoreSql(project, logStore, from, to, query, powerSql). A tabela a seguir descreve os parâmetros.Parâmetro
Tipo
Obrigatório
Exemplo
Descrição
project
String
Sim
N/A
Nome do projeto.
Definido ao criar o cliente. Nenhuma configuração adicional necessária.
logStore
String
Sim
N/A
Nome do Logstore.
Definido ao criar o cliente. Nenhuma configuração adicional necessária.
from
Long
Sim
1627268185
Início do intervalo de tempo da consulta. O valor é um timestamp UNIX em segundos.
to
Long
Sim
1627269085
Fim do intervalo de tempo da consulta. O valor é um timestamp UNIX em segundos.
query
String
Sim
" | SELECT count()"Instrução de consulta e análise do Simple Log Service, no formato
search statement|analytic statement. Para mais informações, consulte Sintaxe básica.Por padrão, o Simple Log Service retorna 100 linhas de dados. Para retornar mais linhas, adicione uma cláusula LIMIT. Para mais informações, consulte Cláusula LIMIT.
powerSql
Boolean
Não
true
Define se o Dedicated SQL será usado. Para mais informações, consulte Ativar o Dedicated SQL. Valores válidos:
-
true: usa o Dedicated SQL.
-
false (padrão): usa o Standard SQL.
-
-
ExecuteProjectSql
Chame a operação ExecuteProjectSql no seguinte formato:
ProjectSqlResponse logsResponse = client.ExecuteProjectSql(project, query, powerSql). A tabela a seguir descreve os parâmetros.Parâmetro
Tipo
Obrigatório
Exemplo
Descrição
project
String
Sim
N/A
Nome do projeto.
Definido ao criar o cliente. Nenhuma configuração adicional necessária.
query
String
Sim
"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"Instrução SQL-92 padrão. Especifique uma condição de filtro e um intervalo de tempo na cláusula WHERE.
Por padrão, o Simple Log Service retorna 100 linhas de dados. Para retornar mais linhas, adicione uma cláusula LIMIT. Para mais informações, consulte Cláusula LIMIT.
powerSql
Boolean
Não
true
Define se o Dedicated SQL será usado. Para mais informações, consulte Ativar o Dedicated SQL. Valores válidos:
-
true: usa o Dedicated SQL.
-
false (padrão): usa o Standard SQL.
-