数据源类型(Datatypes)
数据源类型,用于标识导入事件的数据结构,决定了数据进入YHP后在索引过程和查询过程中如何格式化数据。导入后,数据通过_datatype默认字段来记录数据格式化标识。YHP提供了少量预定义数据源类型,您可以在导入数据时,通过指定现有数据源类型或创建自定义数据源类型来格式化数据。
数据源类型管理界面
进入数据目录页面以后,通过左侧导航栏里的"数据源类型"进入数据源类型管理界面。在这里,用户可以用对数据源类型和数据源类型属性执行添加、修改、删除等操作。

内置数据源类型
内置数据源类型里对应的数据解析规则都开箱即用, 包括 "nginx access log", "apache access log", "csv", "json" , "syslog" 和 "win_event_log"。
新建数据源类型
点击“数据源类型”页面左上方的黄色按钮。可以打开新建数据源类型的模态框,在模态框中输入数据源类型名,点击确定,即可创建新数据源类型。
数据源类型命名规范最佳实践
推荐按照如下的方式命名数据源类型(datatype)
- 推荐按照 公司.产品.模块.数据格式这样的层级结构命名一个数据源类型。不同层级之间用点连接。
- 公司,产品和模块层级,如果不存在,可以省略。如果每一层的名称有多个单词构成,则每个单词之间使用一个下划线连接。
例如:
- 对于思科ASA的日志,如果是从syslog采集得到,那么数据源类型为 cisco.asa.syslog
- 如果是nginx的访问日志,数据源类型为 nginx.access_log
该最佳实践在查询的时候可以快速的将一个产品,或者一个公司下面的所有数据合并查询。 例如:
- 查找所有cisco产品的数据,可以使用 SELECT * FROM main WHERE _datatype like 'cisco.%'
删除数据源类型
点击数据源类型表格右侧的删除数据源类型按钮,即可删除该数据源类型。
操作数据源类型属性
数据源类型属性列表
数据源类型的属性名称以及每个属性的合法值参见下表。
| 属性名 | 属性值类型 | 属性的合法值 | 说明 | 
|---|---|---|---|
| ingestion_time_extraction | STRING | csv,none,json | 该属性用于配置数据索引阶段字段的抽取模式,经过抽取的字段将会存储在数据集中,并为其添加索引。目前合法值只能是 csv,json和none三者中的一个,默认值是none。
 | 
| ingestion_time_field_names | ARRAY[STRING] | 字符串数组,每个元素是一个字段的名称 | 该属性需配合 ingestion_time_extraction = csv使用。如索引阶段以csv进行抽取,但数据不包含表头(header)信息,则可以把表头信息设置在这个字段当中。 | 
| search_time_extraction | STRING | 字段抽取规则 | 该属性用于配置数据查询阶段字段的抽取模式,抽取的字段不会被存储到数据集中,查询时动态生成。合法值包括所有预定义抽取规则和自定义的字段抽取规则。 | 
| delimiter | STRING | , | 该属性只有在 ingestion_time_extraction是csv时会生效,用户指定解析事件时候的字段分隔符,例如,如果是TSV类型的文件,该字段设置为 ` | 
| timestamp_config | STRING | auto,field,current,regex | 该属性用于指定如何从事件中提取 _time时间戳字段。默认值是auto。
 | 
| timestamp_field | STRING | 索引时字段的字段名 | 指定索引时字段的字段名,这个字段中存储了事件的时间戳。该属性只有 timestamp_config = "field"的时候才生效。 | 
| timestamp_regex | STRING | 合法的正则匹配表达式 | 指定用于抽取时间戳的正则表达式,该属性只有 timestamp_config = "regex"的时候才生效. | 
| timestamp_format | STRING | 指定时间戳字符串的格式 | 炎凰数据平台会按照给定的时间戳格式来解析时间戳字符串成为epoch的时间戳。时间戳字符串的格式参考这里。但是有三个常量字符串有特殊的含义,分别是 second,millisecond和microsecond,分别表示如果一个时间戳字符串是一个整数的时候,这个整数应该被解析成从epoch开始时间的秒,毫秒还是微秒。 | 
| timestamp_timezone | STRING | 符合ISO 8601 UTC offsets的时区格式 | 默认值是东八区 +08:00。只有在设置了timestamp_format之后,才会生效。如果timestamp_format为空值,则时区的设置不生效。 | 
| firstline_format | STRING | 正则表达式RE2 | 用于多行文本合并,表示事件第一行的格式 | 
| discard_raw_message | BOOLEAN | True或者False | 是否设置 _message字段为空字符串,默认是False。例如,在导入数据库的数据的时候,因为所有字段都已经是索引字段了,没有必要再拼装_message字段,可以设置该属性为True。 | 
安全起见,时间戳抽取的范围被限制在0001-01-01T00:00:00.000000 UTC到9999-12-12T23:59:59.999999 UTC。如果配置的解析结果,超出了这个时间范围,将会使用当前时间替换解析的结果。
增加数据源类型属性
点击数据源类型表格右侧的增加属性按钮按钮,可以打开增加数据源类型属性的模态框,选择相应的属性名,属性值和类型之后即可创建新的数据源类型属性。

编辑数据源类型属性
点击数据源类型左侧的展开数据源类型按钮,展开数据源类型即可看到该数据源类型对应的数据源类型属性列表。点击属性列表表格右侧的编辑数据源类型属性按钮,即可打开编辑数据源类型属性的模态框从而更新数据源类型属性名称,属性值和类型。
数据源类型属性名称和属性值可编辑,但数据源类型的名称不可修改。
删除数据源类型属性
在数据源类型属性列表右侧,点击属性所对应的删除属性按钮,可以删除该属性。
事件时间戳 (Event Timestamp)
时间戳是平台中一个很重要的内置字段。每条事件都包含对应的内置时间戳字段_time。对于平台而言,时间戳就是一个整数,代表着从Unix Epoch开始的微秒数。
具体一个事件的时间戳是什么,是在数据导入的时候由业务逻辑来决定的,用户通过合理地配置数据源类型里和时间戳相关的属性(如下),来指定如何从原始文本当中提取事件的时间戳,以确保时间戳的抽取规则符合分析需求。
- timestamp_config
- timestamp_field
- timestamp_regex
- timestamp_format
- timestamp_timezone
本节主要提供若干个时间戳提取的例子,展示如何统一配置数据源类型的属性来设定不同的时间戳提取的规则。
样本事件
在所有的例子当中,都假设有如下的格式为json的文本事件。为了让样例有一定的复杂性,这个json当中故意设置了多个时间戳字符串。
{"id": "445", "reply_time": "1317924000",  "article": " 困觉咯。。。这组收尾", "discuss": "2", "view_time": "2011/11/18 11:08:16", "origin": "新浪微博", "person_id": "1043652517", "post_time": "2011-10-07T01:43:51.376 +08:00", "transmit": "0"}
自动提取时间戳
使用平台内置的字符串解析器从原始事件中抽取时间戳。
样例一:自动抽取
- 时间戳相关属性配置:
| 属性名 | 属性值 | 
|---|---|
| timestamp_config | auto | 
- 时间戳提取结果:
平台自动提取了对应于原始事件里view_time字段的时间戳信息。
| 原始事件信息 | 时间戳 _time | 
|---|---|
| "view_time": "2011/11/18 11:08:16" | 2011-11-18T11:08:16.000+08:00 | 
平台内部将_time的值存储为一个整数,代表着从Unix epoch开始的微秒数。展示_time的时候是以ISO 8601格式输出,默认时区是东八区,所以样例里的输出是2011-11-18T11:08:16.000+08:00。
选定现有字段作为时间戳
样例一:将事件中的view_time字段作为时间戳,view_time字符串表示的时间是北京时间。
- 时间戳相关属性配置:
| 属性名 | 属性值 | 
|---|---|
| timestamp_config | field | 
| timestamp_field | view_time | 
| timestamp_format | %Y/%m/%d %H:%M:%S | 
| timestamp_timezone | +0800 | 
由于view_time字段中不包含时区信息,这里根据实际数据的业务场景来配置时间戳的时区,将timestamp_timezone设置为东八区时间。
- 时间戳提取结果:
通过配置数据导入时候的字段解析,从解析出的字段view_time中解析时间戳。
| view_time字段 | 时间戳 _time | 
|---|---|
| "2011/11/18 11:08:16" | 2011-11-18T11:08:16.000+08:00 | 
样例二:将事件当中的post_time字段作为时间戳。post_time字符串表示的时间是北京时间。
- 时间戳相关属性配置:
| 属性名 | 属性值 | 
|---|---|
| timestamp_config | field | 
| timestamp_field | post_time | 
| timestamp_format | %FT%T %z | 
- 时间戳提取结果:
| post_time字段 | 时间戳 _time | 
|---|---|
| "2011-10-07T01:43:51.376 +08:00" | 2011-10-07T01:43:51.376+08:00 | 
post_time字段的值当中,自带了东八区的时区信息,因此可以通过指定timestamp_format解析的时候解析时区,而不需要再配置 timestamp_timezone。
样例三:将事件当中的reply_time字段作为时间戳。reply_time字段的整数,表示的是从epoch开始的秒数。
- 时间戳相关属性配置:
| 属性名 | 属性值 | 
|---|---|
| timestamp_config | field | 
| timestamp_field | reply_time | 
| timestamp_format | second | 
- 时间戳提取结果:
| reply_time字段 | 时间戳 _time | 
|---|---|
| "1317924000" | 2011-10-06T08:00:00.000+08:00 | 
上述例子中还配置了时间戳格式属性 timestamp_format 和时间戳时区 timestamp_timezone 属性,下面加以说明。
时间戳格式属性timestamp_format
timestamp_format 用于指定抽取时间戳时的格式,如果不配置,平台会尝试自动匹配格式解析。
样例一中的 view_time 字段对应了 %Y/%m/%d %H:%M:%S 的格式。
下面列举了一些常见的时间戳格式,更多的格式参考这里。
| 时间戳字符串 | 解析格式 | 
|---|---|
| 15-07-2023 14:34:56 | %d-%m-%Y %H:%M:%S | 
| 07/15/2023 12:34:56 PM | %m/%d/%Y %I:%M:%S %p | 
| 27-Sep-2023 19:45:00 UTC | %d-%b-%Y %H:%M:%S %Z | 
| 2023-07-15 12:34:56 08:00 | %Y-%m-%d %H:%M:%S %z | 
对于epoch格式的时间,timestamp_format 有second、millisecond和microsecond三个特别的属性值分别对应于秒、毫秒和微秒为单位的epoch时间。
时间戳时区属性timestamp_timezone
在时间戳解析的时候,时间戳所在的时区信息按照如下的优先级依次决定
- 如果时间戳带有时区信息,timestamp_format中指定了时区(即%Z,%z,%Oz),则使用时间戳自带的时区解析。见样例二中。如果时间戳是epoch格式的,则不需要配置时区属性,见样例三中。
- 如果时间戳中没有时区信息,但是配置了timestamp_timezone,则采用配置的时区解析。见样例一中。
- 如果时间戳中没有时区信息,并且没有配置timestamp_timezone,则采用服务器端配置的默认时区解析。默认时区可以在炎凰数据平台的系统配置当中指定,如果没有设置,采用东八区。
使用正则表达式从原始事件中抽取时间戳
利用正则表达式匹配,提取时间戳。该方法可以避免使用数据导入时候的字段解析。因为数据导入时候的字段解析需要消耗更多的索引空间,会导致数据注入速度下降。
样例一:正则匹配抽取时间戳
- 时间戳相关属性配置:
| 属性名 | 属性值 | 
|---|---|
| timestamp_config | regex | 
| timestamp_regex | (\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}) | 
| timestamp_format | %Y/%m/%d %H:%M:%S | 
| timestamp_timezone | +0800 | 
- 时间戳提取结果:
| 原始事件信息 | 时间戳 _time | 
|---|---|
| "view_time": "2011/11/18 11:08:16" | 2011-11-18T11:08:16.000+08:00 | 
样例二:更精确的正则匹配,抽取时间戳
- 时间戳相关属性配置:
| 属性名 | 属性值 | 
|---|---|
| timestamp_config | regex | 
| timestamp_regex | 'view_time": "(\d{4}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2})' | 
| timestamp_format | %Y/%m/%d %H:%M:%S | 
| timestamp_timezone | +0800 | 
- 时间戳提取结果:
| 原始事件信息 | 时间戳 _time | 
|---|---|
| "view_time": "2011/11/18 11:08:16" | 2011-11-18T11:08:16.000+08:00 | 
若原始事件中,多条字符串都能匹配到用于提取时间戳的正则表达式,也可以加上额外的信息,来精确匹配到期望的时间戳字符串。例如此例中的'view_time": "(\\d{4}\\/\\d{2}\\/\\d{2} \\d{2}:\\d{2}:\\d{2})'
样例三:正则匹配抽取时间戳,带时区信息的时间戳格式。
- 时间戳相关属性配置:
| 属性名 | 属性值 | 
|---|---|
| timestamp_config | regex | 
| timestamp_regex | 'post_time": "(\d{4}\-\d{2}\-\d{2}T\d{2}:\d{2}:\d{2}.\d{3} +08:00)' | 
| timestamp_format | %FT%T %z | 
- 时间戳提取结果:
| 原始事件信息 | 时间戳 _time | 
|---|---|
| "post_time": "2011-10-07T01:43:51.376 +08:00" | 2011-10-07T01:43:51.376+08:00 | 
timestamp_regex 属性中,如果正则表达式有捕获组(capture group),那么第一个正则表达式捕获组匹配值会被用做时间戳字符串,如果没有捕获组,则整个正则表达式的匹配值会被用作时间戳的字符串。
例如:
- _time="(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)"这个正则表达式可以用来匹配- _time="2020-11-01T01:10:10.123"或者- _time="2020-11-01T01:10:10", 由于正则表达式有两个捕获组,因此,最外层的第一个捕获组会被用于提取时间戳字符串。
- (\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?)这个正则表达式可以用来匹配- 2020-11-01T01:10:10.123或者- 2020-11-01T01:10:10,为了匹配整个时间戳区域,需要在最外层增加一个捕获组,否则第一个捕获组是- (\.\d+)?),将不能得到正确结果。