通过C++ SDK使用SQL独享版

本文介绍通过C++ SDK使用SQL独享版的代码示例。

前提条件

  • 已创建RAM用户并完成授权。具体操作,请参见创建RAM用户并完成授权

  • 已配置环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET。具体操作,请参见在Linux、macOS和Windows系统配置环境变量

    重要
    • 阿里云账号的AccessKey拥有所有API的访问权限,建议您使用RAM用户的AccessKey进行API访问或日常运维。

    • 强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

  • 已安装最新版本的C++ SDK。具体操作,请参见Aliyun Log C++ SDK

背景信息

日志服务提供SQL独享版,用于增强SQL分析能力,支持千亿行数据的计算。更多信息,请参见开启SQL独享版

日志服务提供ExecuteLogStoreSql接口和ExecuteProjectSql接口,帮助您更简单的使用SQL独享版。

  • ExecuteLogStoreSql接口:在指定Logstore中使用SQL独享版。该接口支持的查询和分析语法兼容标准的SQL92语法,格式为查询语句|分析语句,其中分析语句采用标准的SQL92语法。

  • ExecuteProjectSql接口:在指定Project中使用SQL独享版。该接口支持的查询和分析语法为标准的SQL92语法,即您的过滤条件和查询时间要写在SQL分析语句的WHERE语句中。

说明

如果您执行分析操作时,需要先过滤一部分数据再分析,建议您使用查询语句|分析语句语法,效率更高,即推荐使用ExecuteLogStoreSql接口。

代码示例

代码示例如下,更多信息,请参见Aliyun Log C++ SDK

#include <cstdlib>

// 日志服务的服务接入点。此处以杭州为例,其它地域请根据实际情况填写。
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");
// Project名称。
std::string project = "your_project_name";
// Logstore名称。
std::string logStore = "your_logstore";

// 创建日志服务Client。
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独享版后,执行SQL分析所花费的CPU时间,单位为秒。SQL独享版按照CPU时间计费,更多信息,请参见计费项。
              << "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;
}

// 在指定的Project内执行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独享版后,执行SQL分析所花费的CPU时间,单位为秒。SQL独享版按照CPU时间计费,更多信息,请参见计费项。
              << "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接口使用SQL独享版,格式为LogStoreSqlResponse logsResponse = client.ExecuteLogStoreSql(project, logStore, from, to, query, powerSql),各个参数说明如下表所示。

    参数名称

    类型

    是否必选

    示例

    说明

    project

    String

    不涉及

    Project名称。

    在创建Client时,已定义project,此处无需配置。

    logStore

    String

    不涉及

    Logstore名称。

    在创建Client时,已定义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(*)"

    日志服务查询和分析语句,格式为查询语句|分析语句。更多信息,请参见基础语法

    日志服务默认返回100行结果,您也可以使用LIMIT子句指定返回结果的行数。更多信息,请参见LIMIT子句

    powerSql

    Boolean

    true

    是否使用SQL独享版。更多信息,请参见开启SQL独享版

    • true:使用SQL独享版。

    • false(默认值):使用SQL普通版。

  • ExecuteProjectSql接口

    调用ExecuteProjectSql接口使用SQL独享版,格式为ProjectSqlResponse logsResponse = client.ExecuteProjectSql(project, query, powerSql),各个参数说明如下表所示。

    参数名称

    类型

    是否必选

    示例

    说明

    project

    String

    不涉及

    Project名称。

    在创建Client时,已定义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语句,即您的过滤条件和查询时间要写在SQL分析语句的WHERE语句中。

    日志服务默认返回100行结果,您也可以使用LIMIT子句指定返回结果的行数。更多信息,请参见LIMIT子句

    powerSql

    Boolean

    true

    是否使用SQL独享版。更多信息,请参见开启SQL独享版

    • true:使用SQL独享版。

    • false(默认值):使用SQL普通版。