From 69a5b9e6567b0b4beeef19d3ce8007e9002854ee Mon Sep 17 00:00:00 2001 From: yingzhao Date: Wed, 25 Sep 2024 21:20:39 +0800 Subject: [PATCH] docs(datain): parser plugin content append in component taosx --- .../zh/14-reference/01-components/04-taosx.md | 91 +++++++++++++++++- .../14-reference/01-components/plugin-01.png | Bin 0 -> 27789 bytes 2 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 docs/zh/14-reference/01-components/plugin-01.png diff --git a/docs/zh/14-reference/01-components/04-taosx.md b/docs/zh/14-reference/01-components/04-taosx.md index e378c18800..86d9cf8ad6 100644 --- a/docs/zh/14-reference/01-components/04-taosx.md +++ b/docs/zh/14-reference/01-components/04-taosx.md @@ -421,7 +421,6 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | write_raw_fails | 本次运行写入 raw meta 失败的次数 | | success_blocks | 本次写入成功的数据块数 | - ### taosX 其他数据源 任务 这些数据源包括: InfluxDB,OpenTSDB,OPC UA,OPC DA,PI,CSV,MQTT,AVEVA Historian 和 Kafka。 @@ -452,3 +451,93 @@ taosX 会将监控指标上报给 taosKeeper,这些监控指标会被 taosKeep | written_blocks | 本次运行此任务写人成功的 raw block 数 | | failed_blocks | 本次运行此任务写入失败的 raw block 数 | +## taosX 数据解析插件 + +接入 kafka / mqtt 消息时,需要对原始数据进行解析,如果使用 json/regex 等模式解析器无法满足解析需求,同时 UDT 也无法满足性能要求时,可以自定义数据解析插件。 + +### 插件概述 + +taosX Parser 插件是一个要求用 C/Rust 语言开发的 C ABI 兼容动态库,该动态库要实现约定的 API 并编译为在 taosX 所在运行环境中能够正确运行的动态库,然后复制到约定位置由 taosX 在运行时加载,并在处理数据的 Parsing 阶段调用。 + +### 插件部署 + +完成插件开发后,编译环境需要和目标运行环境兼容,将编译好的插件动态库复制到插件目录下,taosX 启动后,系统首次使用插件时初始化加载插件。可以在 explorer 的 kafka 或者 mqtt 数据接入配置页面中,检查是否加载成功。如下图,如果加载成功,则在解析器选择列表中展示出来。 + +![插件示例](./plugin-01.png) + +插件目录在 `taosx.toml` 配置文件中复用 plugins 配置,追加`/parsers`作为插件安装路径,默认值在 UNIX 环境下为 `/usr/local/taos/plugins/parsers`,在 Windows 下为 `C:\TDengine\plugins\parsers`。 + +### 插件 api 说明 + +#### 1. 获取插件名称 + +获取插件名,用于前端显示。 + +**函数签名**:const char* parser_name() + +**返回值**:字符串。 + +#### 2. 获取插件版本 + +插件版本,方便问题定位。 + +**函数签名**:const char* parser_version() + +**返回值**:字符串。 + +#### 3. 配置解析器 + +将一个字符串参数解析为一个配置对象,仅插件内部使用。 + +**函数签名**:parser_resp_t parser_new(char* ctx, uint32_t len); + +char* ctx: 用户自定义配置字符串。 + +uint32_t len: 该字符串的二进制长度(不含 `\0`)。 + +**返回值**: + +``` c +struct parser_resp_t { + int e; // 0 if success. + void* p; // Success if contains. +} +``` + +当创建对象失败时,e 不为 0。 + +当创建成功时,e = 0,p 为解析器对象。 + +#### 4. 解析数据 + +**函数签名**: + +对输入 payload 进行解析,返回结果为 JSON 格式 [u8] 。返回的 JSON 将使用默认的 JSON 解析器进行完全解码(展开根数组和所有的对象)。 + +``` c +const char* parser_mutate( + void* parser, + const uint8_t* in_ptr, uint32_t in_len, + const void* uint8_t* out_ptr, uint32_t* out_len +); +``` + +`void* parser`: parser_new 生成的对象指针; + +`const uint8_t* in_ptr`:输入 Payload 的指针; + +`uint32_t in_len`: 输入 Payload 的 bytes 长度(不含 `\0`); + +`const void* uint8_t* out_ptr`:输出 JSON 字符串的指针(不含 \0)。当 out_ptr 指向为空时,表示输出为空。 + +`uint32_t * out_len`:输出 JSON 字符串长度。 + +**返回值**: 当调用成功时,返回值为 NULL。 + +#### 5. 释放解析器 + +释放解析器对象内存。 + +**函数签名**: void parser_free(void* parser); + +void* parser: parser_new 生成的对象指针。 diff --git a/docs/zh/14-reference/01-components/plugin-01.png b/docs/zh/14-reference/01-components/plugin-01.png new file mode 100644 index 0000000000000000000000000000000000000000..18bc2ca242e9a3d3b0a67e196994a8e2d3c56d5e GIT binary patch literal 27789 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�g5+@AHo1r69k~Vz;?gLx7 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 UeEexAs49T6ygIyC*8I)?06?E9b^rhX literal 0 HcmV?d00001