Prometheus适配GaussDB开源开发任务心得
根据计划书https://bbs.huaweicloud.com/blogs/439327,了解到我们这个Prometheus对于GaussDB的适配工作,主要就是开发一个Exporter来采集GaussDB中的系统指标数据。有一定的开发工作,但是不需要修改Prometheus,在设计上实现了Prometheus与Exporter的剥离,因此我们只需开发GaussDB Exporter即可。而无需对Prometheus源码做修改。由于从零开始开发工作量相对较大,我们可以参考PostgreSQL的Exporter和OpenGauss的一些相似的特性,再结合GaussDB做相应的拓展与修改即可。这里非常感谢PostgreSQL和OpenGauss,给与了相关的可参考性。
代码仓库
我实在gitee上先导入了PostgreSQL相关的代码仓库,然后在上面开发GaussDB Exporter。https://gitee.com/a717138552/gaussdb_exporter
开发过程
主要是参考PostgreSQL Exporterhttps://github.com/prometheus-community/postgres_exporter的实现,以及OpenGauss的一些特性https://opengauss.org/zh/。
刮削管理器 {scrape}
刮削任务管理器负责集中管理多个刮削任务(即每一个数据库节点),统一控制启停。
刮削器 {scraper}
每一个刮削器都是一个具有专用场景的程序模块,在数据库中执行SQL语句,并将返回的数据进行处理后存入缓存中。
内存缓存 {cache}
在Go语言中实现内存缓存模块,将 Exporter 和刮削器解耦,提供更稳定的 Metrics 输出性能
服务器 {server}
提供HTTP服务器,实现 Prometheus SDK 中的 Exporter 接口,通过 `Collect` 函数调用从内存缓存中调取数据生成 Metrics API 响应
scraper刮削器扩展指南 {scraper}
创建刮削器并实现 `scrape.Scraper` 接口
:::
参考代码路径:internal/scraper/xxx.go
:::
```go
type ExampleScraper struct {
}
func NewExampleScraper() *BaseInfoScraper {
return &ExampleScraper{}
}
func (g ExampleScraper) Scrape(t *scrape.TaskOLD) ([]prometheus.Metric, []error, error) {
return []prometheus.Metric{}, nil, nil
}
```
在框架中注册这个刮削器
:::
参考:internal/scraper/scraper.go
:::
```go
func Init() {
// ....
scrape.RegisterScraper("example", NewExampleScraper())
// ....
}
```
在配置文件中启用注册的刮削器,config.yaml
```yaml
tasks:
- dsn: "postgresql://name:password@host:port/postgres"
name: Test Server 1
duration: 5s
master: true
scrapers:
- example # 使用在上一步中注册的刮削器ID,即可启动已注册的刮削器
```
这里需要注意查阅GaussDB视图https://support.huaweicloud.com/productdesc-gaussdb/gaussdb_19_0030.html,与PostgreSQL和OpenGauss视图进行对比。
在开发过程中,我们使用华为云官方文档所推荐的Go驱动去连接GaussDBhttps://doc.hcs.huawei.com/db/zh-cn/gaussdb/24.1.30/devg-dist/gaussdb-12-0233.html。
开发过程中遇到的一些视图问题记录在https://gitcode.com/HuaweiCloudDeveloper/OpenSourceForHuaweiWiki/issues/19。
总结
本任务主要是根据Prometheus的功能特性来实现一个Exporter,通过这个Exporter收集并暴露指标,然后Prometheus收集并存储指标。
主要是需要注意本次开发是基于PostgreSQL Exporter,因此要同时去了解熟悉PostgreSQL和GaussDB的差异性。
通过本次开发,发现有以下几点问题:
- GaussDB相关文档更新不够及时,导致在视图那里遇到一些问题。
- Go语言方面相关的GaussDB驱动不够完善。
- 点赞
- 收藏
- 关注作者
评论(0)