github.com/GuanceCloud/cliutils@v1.1.21/pipeline/README.md (about)

     1  # 文本处理器 定义
     2  
     3  以下是 文本处理器 定义。随着不同语法的逐步支持,该文档会做不同程度的调整和增删。
     4  
     5  全局约束如下:
     6  
     7  - 非关键字(如指标名、标签名等)大小写敏感,**关键字及函数名大小写不敏感**
     8  
     9  - 以 `#` 为行注释字符,不支持行内注释
    10  
    11  - 支持的操作符:
    12  
    13  	- `+`  - 加法
    14  	- `-`  - 减法
    15  	- `*`  - 乘法
    16  	- `/`  - 除法
    17  	- `%`  - 取模
    18  	- `=` - 等于
    19  	- `!=` - 不等于
    20  	- `<=` - 大于等于
    21  	- `<` - 小于
    22  	- `>=` - 大于等于
    23  	- `>` -  大于
    24  	- `^` - 指数运算
    25  	- `&&` - 逻辑与
    26  	- `||` - 逻辑或
    27  
    28  
    29  - 标识符:标识符有几种形式,便于兼容各种变量命名形式
    30  
    31  	- 正常变量名中只能出现 `[_a-zA-Z0-9]` 这些字符,且首字符不能是数字。如 `_abc, _abc123, _123ab`
    32  	- 其它形式的变量名处理方式:
    33  		- `this+is-a*xx/yy^zz?variable`,`by` 需写成 `` `this+is-a*xx/yy^zz?variable` ``,`` `by` ``,前者变量中带运算符,后者的 `by` 是 DQL 关键字
    34  		- `这是一个中文或其它非英文字符变量` 需写成 `` `这是一个中文或其它非英文字符变量` ``
    35  		- 变量中就带了一个反引号,`` this`is-a-vairalbe `` 需写成 `` `identifier("this`is-a-vairalbe")` `` 来修饰
    36  
    37  - 字符串值可用双引号和单引号: `"this is a string"` 和 `'this is a string'` 是等价的
    38  
    39  - 数据类型:支持浮点(`123.4`, `5.67E3`)、整形(`123`, `-1`)、字符串(`'张三'`, `"hello world"`)、Boolean(`true`, `false`)四种类型
    40  
    41  
    42  ## sdk使用
    43  
    44  用法:
    45  - 加载函数处理脚本
    46  ```
    47  // scriptName 为存放于 datakit 安装目录下的 pipeline 目录下的脚本的文件名 (xxx.p)
    48  // 或由 gitrepos,remote 加载的脚本的脚本名 (xxx.p)
    49  // pipeline script 由 pipeline 的 scriptstore 模块统一管理, 在 datakit 启动后将加载指定目录,
    50  // 如 datakit 安装目录下的 pipeline, remote, gitrepos 下的 pipeline 脚本
    51  p := NewPipeline(scriptName)
    52  ```
    53  
    54  - 文本处理
    55  ```
    56  // 支持 []byte string 两种数据类型
    57  // Run() RunByte() 非线程安全
    58  
    59  ret, err := p.Run("abc", source)
    60  
    61  // encode 值可为 "gbk", "gb18030", "utf-8", 其他值均按 utf-8 编码处理
    62  ret, err := p.RunByte([]byte("abc"), encode, source)
    63  
    64  // ret 的数据结构为,建议通过 Result 结构体提供的一系列方法进行操作
    65  /*
    66  	type Result struct {
    67  		Output *parser.Output
    68  
    69  		TS time.Time
    70  
    71  		Err string
    72  	}
    73  */
    74  ```
    75  
    76  - 检测脚本变更并更新 Pipeline 实例
    77  ```
    78  // 该函数可以通过 scriptstore 模块检测相应的脚本是否发生了更新,并更新该 Pipeline 实例
    79  // 需要注意的是,该操作并非线程安全,即调用此函数时不可执行 Run 和 RunByte 方法。
    80  err := p.UpdateScriptInfo()
    81  ```
    82  
    83  ## 脚本函数
    84  
    85  支持的处理函数
    86  
    87  函数: grok([grok_parttern], [json_path])
    88  
    89  参数:
    90  - `grok_parttern`: grok表达式 (必选参数)
    91  - `json_path`: 待处理数据的json_path (选填参数)
    92  
    93  说明: 将对应json_path的字符串执行Grok,并成为json_data子结构
    94  
    95  示例:
    96  ```
    97  json_data = `{"content": "127.0.0.1 - - [23/Apr/2014:22:58:32 +0200] "GET /index.php HTTP/1.1" 404 207", "app": "dev"}`
    98  grok("%{COMMONAPACHELOG}", content);
    99  ```
   100  
   101  函数: rename(json_path], [new_key])
   102  
   103  参数:
   104  - `json_path`: 待改名的json_path (必选参数)
   105  - `new_key`: 新的key name  (必选参数)
   106  
   107  说明: 将结构中的原有key改名为新的new_key, 并成为json_data子结构
   108  
   109  示例:
   110  ```
   111  json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}`
   112  rename(a.second, bb);
   113  ```
   114  
   115  函数: lowercase([json_path], [new_key])
   116  
   117  参数:
   118  - `json_path`: 待处理数据的json_path (必选参数)
   119  - `new_key`: 新的key name  (必选参数)
   120  
   121  说明: 将对应处理数据转化为小写,插入到new_key下,  并成为json_data子结构
   122  
   123  示例:
   124  ```
   125  json_data = `{"a":{"first":2.3,"second":2,"thrid":"ABC","forth":true},"age":47}`
   126  lowercase(a.thrid, bb);
   127  ```
   128  
   129  函数: uppercase([json_path], [new_key])
   130  
   131  参数:
   132  - `json_path`: 待处理数据的json_path (必选参数)
   133  - `new_key`: 新的key name  (必选参数)
   134  
   135  说明: 将对应处理数据转化为大写,插入到new_key下,  并成为json_data子结构
   136  
   137  示例:
   138  ```
   139  json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}`
   140  uppercase(a.thrid, bb);
   141  ```
   142  
   143  函数: nullif([json_path], [range])
   144  
   145  参数:
   146  - `json_path`: 待处理数据的json_path (必选参数)
   147  - `new_key`: 新的key name  (必选参数)
   148  
   149  说明: 将对应处理数据转化为大写,插入到new_key下,  并成为json_data子结构
   150  
   151  示例:
   152  ```
   153  json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}`
   154  nullif(a.second, bb);
   155  ```
   156  
   157  函数: user_agent([json_path], [new_key])
   158  
   159  参数:
   160  - `json_path`: 待处理数据的json_path (必选参数)
   161  - `new_key`: 新的key name  (必选参数)
   162  
   163  说明: 提取user-agent中的信息,插入到new_key下,  并成为json_data子结构
   164  
   165  示例:
   166  ```
   167  json_data = `{"userAgent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.106 Chrome/15.0.874.106 Safari/535.2"}`
   168  user_agent(userAgent, user_agent);
   169  ```
   170  
   171  函数: urldecode([json_path], [new_key])
   172  
   173  参数:
   174  - `json_path`: 待处理数据的json_path (必选参数)
   175  - `new_key`: 新的key name  (必选参数)
   176  
   177  说明: 将对应字符串执行urldecode,插入到new_key下,  并成为json_data子结构
   178  
   179  示例:
   180  ```
   181  json_data = `{"url":"http://www.example.org/default.html?ct=32&op=92&item=98"}`
   182  urldecode(url, url_dic);
   183  ```
   184  
   185  函数: geoip([json_path], [new_key])
   186  
   187  参数:
   188  - `json_path`: 待处理数据的json_path (必选参数)
   189  - `new_key`: 新的key name  (必选参数)
   190  
   191  说明: 将对应IP字符串获取响应地理信息,插入到new_key下,  并成为json_data子结构
   192  
   193  示例:
   194  ```
   195  json_data = `{"ip":"172.168.0.3"}`
   196  geoip(ip, ip_addr);
   197  ```
   198  
   199  函数: datetime([json_path], [datetime_parttern],[new_key])
   200  
   201  参数:
   202  - `json_path`: 待处理数据的json_path (必选参数)
   203  - `datetime_parttern`: 时间格式化字符串(格式化标准,待完善) (必选参数)
   204  - `new_key`: 新的key name  (必选参数)
   205  
   206  说明: 将对应日期字段格式化为新的日期显示方式,插入到new_key下,  并成为json_data子结构
   207  
   208  示例:
   209  ```
   210  json_data = `{"date":"23/Apr/2014:22:58:32 +0200"}`
   211  datetime(date, "yyyy-mm-dd HH:MM:SS");
   212  ```
   213  
   214  函数: expr([json_path], [expr], [new_key])
   215  
   216  参数:
   217  - `json_path`: 待处理数据的json_path (必选参数)
   218  - `expr`: 计算表达式 (必选参数)
   219  - `new_key`: 新的key name  (必选参数)
   220  
   221  说明: 将对应字段进行计算后,插入到new_key下,  并成为json_data子结构
   222  
   223  示例:
   224  ```
   225  json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}`
   226  expr(a.second*10+(2+3)*5, bb);
   227  ```
   228  
   229  函数: stringf([new_key], [format_pattern], [json_path]....)
   230  
   231  参数:
   232  - `json_path`: 待处理数据的json_path (必选参数)
   233  - `format_pattern`: 格式化字符串 (必选参数)
   234  - `new_key`:   新的key name      (必选参数)
   235  
   236  说明: 通过printf格式自定义字符串
   237  
   238  示例:
   239  ```
   240  json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}`
   241  stringf(bb, "%d %s %v", a.second, a.thrid, a.forth);
   242  ```
   243  
   244  函数: cast([json_path], [type],[new_key])
   245  
   246  参数:
   247  - `json_path`: 待处理数据的json_path (必选参数)
   248  - `type`: 转化的类型, 以下枚举值int, bool, str, float (必选参数)
   249  - `new_key`:   新的key name  (必选参数)
   250  
   251  说明: 将对应的字段进行类型转化,插入到new_key下,  并成为json_data子结构
   252  
   253  示例:
   254  ```
   255  json_data = `{"a":{"first":2.3,"second":2,"thrid":"abc","forth":true},"age":47}`
   256  cast(bb, a.second, "float");
   257  ```
   258  
   259  函数: group([json_path], [range], [new_key])
   260  
   261  参数:
   262  - `json_path`: 待处理数据的json_path (必选参数)
   263  - `range`: 指定范围 (必选参数)
   264  - `new_key`:   新的key name  (必选参数)
   265  
   266  说明: 将对应的字段进行按条件分组赋值
   267  
   268  示例:
   269  ```
   270  json_data = `{"age":10, "name": "张三"}`
   271  group(age, [0-16], children);
   272  ```
   273  
   274  
   275  函数: group_in([json_path], [set], [new_key])
   276  
   277  参数:
   278  - `json_path`: 待处理数据的json_path (必选参数)
   279  - `set`: 指定集合 (必选参数)
   280  - `new_key`:   新的key name  (必选参数)
   281  
   282  说明: 将对应的字段进行按条件分组赋值
   283  
   284  示例:
   285  ```
   286  json_data = `{"age":10, "name": "张三"}`
   287  group_in(name, ["张三"], zhangsan);
   288  ```