百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

云舟观测:Arkit数据解析插件详解

off999 2025-01-21 20:36 37 浏览 0 评论

1. 概述

在云舟观测产品中,Arkit作为统一监控Agent,是整个产品的基石,它支持采集多种操作系统(如Linux和Windows)上的系统指标和进程信息,同时还能读取多种数据源,包括原始文件、消息队列和网络数据等,并将这些数据发送到各种目标存储系统中。此外,Arkit提供了丰富的数据解析配置选项,能够灵活地满足不同场景下的数据解析需求。无论是简单的日志解析,还是复杂的结构化数据处理,Arkit都能轻松应对,确保数据的准确性和完整性,为后续的数据分析和监控提供了坚实的基础。


2. 数据采集与解析

Arkit目前支持包括文件在内的多种数据源,以及上百种监控指标的采集,同时内置了多种解析方式,支持在Arkit本地进行一些数据解析:通过在采集端进行的边缘计算,利用节点的算力对数据进行加工变换。这样一方面可以减少数据冗余,降低发送数据的网络及存储消耗;另一方面也是对数据进行不同形式的扩展和预处理,降低后续处理环节的复杂度——这一部分也是本文将要介绍的重点内容。最后,采集到的数据支持支持发送到多种目标端。

在数据采集模块读取到原始数据后,既可以将原始数据直接发送给数据目标,也可以配置数据解析模块,将采集到的数据进行各种处理。例如:

● 数据格式解析(CSV解析,JSON解析、Grok解析,Nginx日志解析)等

● 自定义插件解析:允许用户通过自定义插件的方式完成日志解析(插件下发并热更新使用,无需重启Arkit)

在自定义插件解析中,云舟观测提供了WEB端代码编辑器以及模板代码样例,用户可以使用golang开发自己的插件,并将插件代码提交到后台进行编译,通过后插件创建成功;然后可以使用“测试”功能,输入测试文本数据验证插件对数据的解析是否正确;在创建采集任务配置解析方式时,可以选择"自定义插件"类型,并使用之前创建成功的插件。

3. 插件功能

Arkit本身是用go语言开发的,因此的插件选型时也需要选择基于go语言的动态代码实现方案。go语言作为一门强类型、静态编译的语言,有着极佳的性能,但是也相应的缺少了一些灵活性。为了实现一些需要灵活处理的、插件类的业务需求,调研了golang插件开发的一些方案:

首先是嵌入一些相应的脚本引擎,分别可以动态执行lua、js和python等脚本语言,并获取执行结果继续使用。但是这类方案有个致命的缺点:代码执行效率远远低于原生go代码,在需要进行海量日志采集和处理的流程中,解析效率低,进而影响采集发送效率是个严重的问题。

其次是golang原生plugin功能,也是Arkit最终采用的方案,下面将会重点介绍。为了配合插件的使用,并为用户提供自行编写、修改、分发插件的入口,云舟观测和Arkit插件模块的大致架构如下图所示:


3.1 Plugin的起源

Go Plugin 机制是在 Go 1.8 版本引入的一项重要特性。它的设计目标是为 Go 程序提供一种动态加载代码的能力,使得程序可以在运行时动态扩展功能而无需重新编译整个程序。这个特性的诞生主要基于以下几个需求:

● 微服务架构下的动态扩展需求

● 插件化架构的实现需求

● 热更新/热部署的需求

● 第三方功能模块的动态集成需求

Go Plugin 机制为 Go 程序提供了高效的动态加载能力,其核心优势包括:零拷贝的内存映射设计、· 高效的符号解析机制、优化的类型检查系统、· 接近原生的调用性能。

3.2 第一个demo插件代码示例:

```go
// plugin-impl.go

package main

import "fmt"

func Hello() string {
    return "Hello from golang plugin"
}

// 插件必须有 main 包和 main 函数
func main() {}
```

编译插件:

```bash
go build -buildmode=plugin -o plugin.so plugin-impl.go
```

使用插件:

```go
// main.go

package main

import (
    "fmt"
    "plugin"
)

func main() {
    // 加载插件
    p, err := plugin.Open("plugin.so")
    if err != nil {
        panic(err)
    }
    // 查找符号
    symbol, err := p.Lookup("Hello")
    if err != nil {
        panic(err)
    }
    // 类型断言
    hello := symbol.(func() string)
    fmt.Println(hello())
}
```

3.3 内部实现机制

Go Plugin 的实现主要涉及以下几个关键部分:

1. 符号表管理

● 插件编译时会生成导出符号表

● 运行时通过符号表查找和解析函数/变量

● 使用 ELF(Linux)/Mach-O(macOS) 格式存储符号信息

2. 内存管理

● 插件代码被加载到独立的内存空间

● 通过内存映射实现代码共享

● 支持垃圾回收

3. 类型系统

● 插件和主程序必须使用相同的 Go 版本编译

● 类型信息在运行时进行匹配

● 保证类型安全

3.4 核心数据结构

```go
// plugin 包内部的关键结构

type Plugin struct {
    pluginpath string // 插件文件路径
    syms       map[string]interface{} // 符号表
    loaded     bool // 是否已加载
}

// 动态链接信息
type _dl_info struct {
    dli_fname    *byte   // 文件名
    dli_fbase    *byte   // 基地址
    dli_sname    *byte   // 符号名
    dli_saddr    *byte   // 符号地址
}
```

3.5 Plugin的性能优势

Go Plugin 具有优异的性能,这得益于以下几个方面:

  1. 零拷贝设计:Plugin 使用内存映射技术,将插件代码直接映射到进程地址空间,这样做的好处是:避免了数据拷贝开销、减少了内存占用、提高了代码加载速度。
```go
// 简化的内存映射实现

func mmap(file *os.File, size int) ([]byte, error) {
    return syscall.Mmap(
        int(file.Fd()),
        0,
        size,
        syscall.PROT_READ|syscall.PROT_EXEC,
        syscall.MAP_SHARED,
    )
}
```

2. 符号解析优化:Plugin 采用了高效的符号解析机制

● 延迟加载:只有在实际使用时才解析符号、避免了不必要的符号解析开销

● 符号缓存:已解析的符号会被缓存、重复使用时直接从缓存获取

● 哈希表实现:使用哈希表存储符号信息,查找复杂度为 O(1)

3. 类型校验优化:Plugin 的类型校验也做了性能优化,优化措施包括:类型信息缓存、延迟检查、批量验证。

```go
// 类型信息缓存

var typeCache = sync.Map{}

func lookupType(name string) (reflect.Type, bool) {
    if t, ok := typeCache.Load(name); ok {
        return t.(reflect.Type), true
    }
    return nil, false
}
```

4. 性能测试数据:以下是一个简单的性能测试对比,可以看到:Plugin 调用的性能损耗仅比直接调用多 26%。

```go
func BenchmarkPluginCall(b *testing.B) {
    p, _ := plugin.Open("plugin.so")
    fn, _ := p.Lookup("Hello")
    hello := fn.(func() string)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        hello()
    }
}

func BenchmarkDirectCall(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Hello()
    }
}
```
```shell
BenchmarkPluginCall-8    10000000    158 ns/op

BenchmarkDirectCall-8    10000000    125 ns/op
```

4. Arkit自定义插件实践

如果内置插件不能满足数据的解析需求,云舟观测还提供了自定义插件,用户可以使用go编写插件,实现灵活的数据解析和转换需求。

● 接口定义:

```go
type PluginParser interface {
    Parse(string, map[string]string) map[string]interface{}
}

type pluginImp struct{}

var Plugin pluginImp
```

● Parse方法:用户可以自行实现Parse方法对原始数据进行解析。Parse方法的输入为单行原始数据,输出支持两种类型:单行处理后的日志 以及 处理后的json格式(KV)数据。

示例1:输出单行日志——向日志行中添加主机名称

```go
package main //请勿修改

//请勿使用golang SDK之外的package
import (
    "os"
)

//=====customization area begin, be my guest.
var hostname string

func getHostname() string {
    hostname, err := os.Hostname()
    if err != nil {
        hostname = "unknown"
    }
    return hostname
}

/*
解析器插件必须实现下面的方法
输入:
    line:   单行日志数据(不会为空)
    params: 使用插件时传入的参数,KV均为string(若使用插件时没有传入参数,可能为空)
输出: string(处理后的文本数据)
*/
func parse2String(line string, params map[string]string) string { //请勿修改本方法签名(方法名,输入参数类型,输出参数类型)
    //=====查询使用params参数 begin,例如:是否存在名为paramXKey的参数
    //if paramXValue, ok := params["paramXKey"]; ok {
    //若查询到,则可以自行使用该参数的值:paramXValue
    //}
    //=====查询使用params参数 end

    if hostname == "" {
        hostname = getHostname()
    }
    return hostname + " " + line
}
//=====customization area end, sayonara.
```

示例2:输出json格式(KV)数据——解析nginx原始日志中的所有字段:

```go
package main //请勿修改

//请勿使用golang SDK之外的package
import (
    "regexp"
    "strings"
)

//=====custom area begin, be my guest.
var regex = regexp.MustCompile(`^"([^"]*)"\s+(\d+)\s+(\d+)\s+"([^"]*)"\s+"([^"]*)"\s+"([^"]*)"\s+([\d]*)\s+([\d.]*)\s+([0-9|.|:]*)\s+([\d]+)\s+([\d.]*)云舟观测:Arkit数据解析插件详解 - 今日头条
) //日志格式 //上半部分:$remote_addr - $remote_user [$time_local] //下半部分:"$request" $status $body_bytes_sent "$http_host" "$http_referer" "$http_user_agent" $request_length $request_time $upstream_addr $upstream_response_time /* 解析器插件必须实现下面的方法 输入: line: 单行日志数据(不会为空) params: 使用插件时传入的参数,KV均为string(若使用插件时没有传入参数,可能为空) 输出: map对象(处理后的JSON数据) */ func parse2JSON(line string, params map[string]string) map[string]interface{} { //请勿修改本方法签名(方法名,输入参数类型,输出参数类型) results := make(map[string]interface{}, 1) halfArr := strings.Split(line, "] ") if len(halfArr) != 2 { results["raw"] = line return results } arr1 := strings.Fields(halfArr[0]) if len(arr1) != 5 { results["raw"] = line return results } results["remote_addr"] = arr1[0] results["remote_user"] = arr1[2] results["time_local"] = strings.ReplaceAll(arr1[3], "[", "") + " " + arr1[4] d := regex.FindStringSubmatch(halfArr[1]) if len(d) != 12 { results["raw"] = halfArr[1] return results } results["request"] = d[1] results["status"] = d[2] results["body_bytes_sent"] = d[3] results["http_host"] = d[4] results["http_referer"] = d[5] results["http_user_agent"] = d[6] results["request_length"] = d[7] results["request_time"] = d[8] results["upstream_addr"] = d[9] results["upstream_status"] = d[10] results["upstream_response_time"] = d[11] return results } //=====custom area end, sayonara. ```

5. 局限性

尽管 Go Plugin 性能优异,但也存在一些限制:

  • 平台限制:实现基于操作系统的动态链接库机制。目前仅支持 Linux,不支持 Windows
  • 版本依赖:插件和主程序必须使用相同的 Go 版本;依赖的三方库版本需要一致
  • 调试复杂性:插件代码调试相对困难;错误追踪不够直观

关于云舟观测

云舟观测是由360智汇云推出的一款一站式数据采集与监控观测产品,可以对基础设施、应用性能,以及云原生下业务指标和日志进行全面的监控和观测,构建全链路的可观测性服务,帮助用户及时发现和解决系统及应用性能问题,提高系统的稳定性和可靠性。

更多技术和产品文章,请关注

如果您对哪个产品感兴趣,欢迎留言给我们,我们会定向邀文~


360智汇云是以"汇聚数据价值,助力智能未来"为目标的企业应用开放服务平台,融合360丰富的产品、技术力量,为客户提供平台服务。目前,智汇云提供数据库、中间件、存储、大数据、人工智能、计算、网络、视联物联与通信等多种产品服务以及一站式解决方案,助力客户降本增效,累计服务业务1000+。智汇云致力于为各行各业的业务及应用提供强有力的产品、技术服务,帮助企业和业务实现更大的商业价值搜索“360智汇云”

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: