LogHub Shipper for Tablestore(以下简称传送服务)将您在日志服务中的数据经简单清洗、转换后写入您在表格存储中的表。传送服务由表格存储官方提供,以Docker镜像的方式发布于阿里云容器Hub,并经由容器服务运行于您的云服务器上。

服务简介

在日志服务中,日志数据以JSON形式进行存储,并以日志组作为写入与读取的基本单位。这种情况下,无法根据特定条件(例如某个App12个小时的日志数据)对日志做快速的查询和分析。

日志数据传送服务是将日志服务中的日志数据经过结构化转换后,实时写入表格存储中的数据表,以提供准确的、高性能的实时在线服务。

数据示例

假设在日志服务中有如下格式的日志数据:

{"__time__":1453809242,"__topic__":"","__source__":"47.100.XX.XX","ip":"47.100.XX.XX","time":"26/Jan/2016:19:54:02 +0800","url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0U***45A&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1","status":"200","user-agent":"aliyun-sdk-java"}

将其写入到表格存储中主键为iptime的数据表中,格式如下:

iptimesourcestatususer-agenturl
47.100.XX.XX26/Jan/2016:19:54:02 +080047.100.XX.XX200aliyun-sdk-javaPOST /PutData…

在表格存储中可以对某个IP根据时间对历史数据进行精确检索。

日志数据传送服务中提供灵活的数据映射规则,用户可以配置日志数据中的字段与数据表中的属性列的对应关系以及简单的数据转换。

基础概念

相关产品的概念

使用传输服务前您需要理解相关产品的概念,详细信息请参见下表。

产品基本概念
日志服务
表格存储
云服务器按量付费、包年包月
容器服务节点、应用、服务、容器

建议同一个传送服务的容器数不要超过其日志库的分区数。

访问控制RAM用户

建议传送服务所用的RAM用户仅包含读取日志库的权限和写入表格存储的权限。

数据表

目标表用于存储经清洗、转换后的用户日志数据。

数据表注意事项如下:

  • 用户需要自行创建目标表,传送服务不会主动建表。
  • 在日志服务和表格存储皆可用的条件下,从一条日志进入日志服务到它被写入表格存储的延迟在百毫秒级。
  • 传送服务在表格存储不可用的情况下会主动等待一段时间(不超过500毫秒)重试。
  • 传送服务会定期记录持久化断点。
  • 如果传送服务本身不可用,例如升级,则恢复服务后会从最近一个断点继续消费日志。
  • 建议同一个日志库的不同日志对应目标表的不同行。在重试的情况下,这样做可以使目标表最终一致。
  • 传送服务使用表格存储的UpdateRow操作写入数据,所以多个传送服务可以共用同一个目标表。这种情况下,建议这些传送服务写入的属性列不要重叠。

状态表

传送服务依赖用户在表格存储中创建的状态表反馈一些信息给用户。

状态表注意事项如下:

  • 多个传送服务可以共用同一个状态表。
  • 在没有出错的情况下,每个传送服务容器每隔5分钟在状态表添加一条记录。
  • 在出错的情况下(非表格存储不可用),传送服务容器立即在状态表添加一条记录。
  • 建议状态表设置天级别TTL,只保留最近的数据。

状态表有四列主键:

  • project_logstore:String类型。用户的日志服务的项目和日志库,以字符竖线(|)分隔。
  • shard:Integer类型。用户日志服务的Shard号。
  • target_table:String类型。用户在表格存储的目标表表名。
  • timestamp:Integer类型。状态表这条记录添加的时间点。UNIX时间,单位为毫秒。

除此以外,还有以下若干属性列来记录本周期的数据导入情况。对于状态表上任意具体的一行来说,每个属性列都有可能不存在。

  • shipper_id:String类型。传送服务容器的ID,目前实现成其容器的主机名。
  • error_code:String类型。表格存储定义的错误码,如果无错误则该属性列不存在。
  • error_message:String类型。表格存储返回的具体出错信息,如果无错误则该属性列不存在。
  • failed_sample:String类型。出错的日志,组织成JSON字符串(JSON String)。
  • __time__:Integer类型。该传送服务容器最近一次更新状态表以来,成功写入表格存储的日志的__time__字段的最大值。
  • row_count:Integer类型。该传送服务容器最近一次更新状态表以来,成功写入表格存储的日志条数。
  • cu_count:Integer类型。该传送服务容器最近一次更新状态表以来,消耗的写服务能力单元
  • skip_count:Integer类型。该传送服务容器最近一次更新状态表以来,清洗掉的日志条数。
  • skip_sample:String类型。该传送服务容器最近一次更新状态表被丢弃掉的日志之一,组织成JSON字符串(JSON String)。容器本身的日志会记录每一条丢弃掉的日志,以及其被丢弃的理由。

配置

传送服务在创建的时候需要为容器提供一些环境变量:

  • access_key_id、access_key_secret:传送服务所用的阿里云账号的AccessKey IDAccessKey Secret。
  • loghub:传送服务所需日志服务的配置,一个JSON object。包括:
    • endpoint
    • logstore
    • consumer_group
  • tablestore:传送服务所需的表格存储配置,一个JSON object。包括:
    • endpoint:服务地址。
    • instance:实例名。
    • target_table:数据表名称。必须为该实例下已有的表。
    • status_table:状态表名称。必须为该实例下已有的表。
  • exclusive_columns:属性列黑名单,一个JSON array,其中元素为JSON String。

    如果有该项设置,则其中字段不会被作为属性列写入目标表。例如目标表主键A,exclusive_columns设置为[“B”, “C”],某条日志含有A、B、D三个字段,则目标表会出现一行,主键为A,属性列为D;C不在日志中而不被写入;B虽在日志中但被exclusive_columns排除,也不被写入。

  • transform:简单变换,一个JSON object,其中的key为写入目标表的列名(可以是主键列),而value为传送服务定义的简单变换表达式:
    • 日志字段直接是一个表达式。
    • 无符号整数是一个表达式。
    • 被一对双引号包围起来的字符串是一个表达式。字符串中可以使用\"以及\\\\转义。
    • ( func arg... )也是一个表达式,括号前后可以有0个或多个空白(包括空格和tab)。func和其参数之间以及各参数之间有至少一个空白,每个参数都必须是表达式。目前支持如下函数:
      • ->int表示将字符串转换成整数。有两个参数,第一个参数为进制,支持2-36进制;第二个参数为待转换的字符串,字母(大小写无关)代表高于十进制下的10-35。
      • ->bool表示将字符串转换成Boolean型。有一个参数,为待转换的字符串,"true"对应true,"false"对应false,其余字符串皆出错。
      • crc32表示计算字符串的crc32,输出为Integer型。有一个参数,为待计算的字符串。

如果日志缺失或转换的过程出错则视为key对应的列缺失。如果出错,容器的日志将会记录详细的错误信息。

传送服务的清洗规则只有一条:如果主键列缺失,则该条日志被清洗。