Grafana适配OBS开源验证任务心得
Grafana适配OBS开源开发任务
从计划书开始开始
从计划书了解到任务内容,这次的任务是开发Grafana插件:OBS数据源插件。
Grafana最主要两个方面功能:
- 数据可视化
- 指标监控
从OBS的对象存储特性来看,它需要配合其他数据存储引擎存储和读取数据。
- 可以将OBS数据存储到关系型数据,例如:桶的信息存放到GaussDB数据库读取。
- 可以将OBS的指标数据存放到时序型数据库,例如:桶的存量信息或者费用信息按时间存放到GeminiDB Influx中。
从使用现有其他案例来看,OBS配合时序数据库查看指标的需求更具实用价值。
Grafana已经提供了InfluxDB的数据源插件,我们可以使用GeminiDB Influx存储指标数据,用InfluxDB数据源插件读取数据。
另外,为了更好地了解Grafana插件机制,新增了一个OBS插件,增加一些直接查询OBS的DEMO和写入GeminiDB Influx数据的DEMO,也为以后的需求快速启动。
适配分析
OBS
华为云OBS是兼容AWS S3协议的对象存储服务。
在这个任务中,OBS提供指标信息存入时序数据库中。
GeminiDB Influx
GeminiDB Influx接口是一款基于计算存储分离架构,兼容InfluxDB生态的云原生NoSQL时序数据库。在云计算平台高性能、高可用、高可靠、高安全、可弹性伸缩的基础上,提供了一键部署、快速备份恢复、计算存储独立扩容、监控告警等服务能力。广泛应用于资源监控、业务监控分析、物联网设备实时监控、工业生产监控、生产质量评估和故障回溯等。提供大并发的时序数据读写,压缩存储和类SQL查询,并且支持多维聚合计算和数据可视化分析能力。
GeminiDB Influx接口具有高写入、灵活弹性、高压缩率和高查询的特点。
GeminiDB Influx目前支持的兼容InfluxDB接口和版本:
兼容接口 | 实例类型 | 版本 |
---|---|---|
InfluxDB | 集群或单节点 | 1.7,1.8 |
influxDB 支持的查询语言:
- Influxql (V1版本)
- Influx (V1、V2版本)
- SQL (V3版本)
GeminiDB Influx兼容Influxql查询语言。
Grafana
Grafana是一款开源数据可视化工具,在数据可视化工具中具有很高的热度。
特点
- 可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
- 报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
- 通知:警报更改状态时,它会发出通知。接收电子邮件通知。
- 动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
- 混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
- 注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
- 过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。
Grafana提供了数据源插件方式支持扩展。
Grafana官方也提供了很多数据源插件:
- InfluxDB
- Prometheus
- MySQL
- PostgreSQL
- ClickHouse
- CockroachDB
- 等等等
Grafana influxDB datasource
使用InfluxDB数据源插件验证GeminiDB influx + OBS。
开发过程
开发环境
开发Grafana数据源插件对于Window用户来说不太友好,需要用到WSL2或Linux或Mac。
创建一个数据源后端插件的预设环境:
- Grafana v10.0 or later
- Docker
- Go (Version)
- Mage
- LTS version of Node.js
开发环境方案是使用Window下的虚拟机,然后使用SFTP同步代码都Linux中。
创建插件
使用@grafana/create-plugin脚手架工具创建插件,Window环境不适用
npx,阔以
npx @grafana/create-plugin@latest
npm,也阔以
npm init @grafana/plugin
pnpm,推荐
pnpm dlx @grafana/create-plugin@latest
yarn,还没成功过
yarn create @grafana/plugin
将存在的项目迁移到新版本,也可以修复一些文件丢失的问题
npx @grafana/create-plugin@latest migrate
插件项目主要结构
./ssk9-obs-datasource/
├── .config # webpack、Dockerfile等重要配置,插件生成,不建议修改
├── dist # build命令生成的文件夹
├── docker-compose.yaml # docker compose 配置文件
├── go.mod # Go包管理依赖文件
├── go.sum # Go包管理依赖变化
├── Magefile.go # Go Mage,make/rake 的工具
├── node_modules # JS项目依赖文件
├── package.json # JS项目管理依赖配置文件
├── pkg # 数据源Go代码
│ ├── main.go # main
│ ├── models
│ │ └── settings.go # 与前端交互的结构定义文件
│ └── plugin
│ └── datasource.go # 数据源逻辑文件
├── pkg
├── src # 数据源前端代码
│ ├── components
│ │ ├── ConfigEditor.tsx # 数据源配置页面代码
│ │ └── QueryEditor.tsx # 数据源查询页面代码
│ ├── datasource.ts # 数据源查询主要逻辑
│ ├── module.ts # 模块注册,注册ConfigEditor,QueryEditor
│ ├── plugin.json # 插件信息JSON文件
│ └── types.ts # 前端交互参数
└── tests # 测试相关
关键代码
为了简单,将写入GeminiDB Influx的逻辑代码写在插件里面,不建议这么做,将代理分离出来写成一个服务是更好的选择。
- 创建OBS对象
"github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
// InitOBS 初始化OBS
func InitOBS(ak, sk, endpoint string) {
obsCli, err := obs.New(ak, sk, endpoint)
if err != nil {
panic("OBS init fail")
}
client = &Client{obsCli}
}
- 获取存量信息
// GetStorageInfo | 获取存量信息
func (c *Client) GetStorageInfo(bucket string) (*obs.GetBucketStorageInfoOutput, error) {
output, err := c.cli.GetBucketStorageInfo(bucket)
if err != nil {
fmt.Printf("RequestId:%s\n", err)
return nil, err
}
return output, nil
}
- 创建InluxDB HTTP Client,InfluxDB是通过http协议通信。
传入参数
- addr:GeminiDB influx的集群或单击地址。
- username: GeminiDB influx用户名。
- password: GeminiDB influx用户密码。
V1版本使用username + password鉴权,V2以后使用token。
influxdbClientSDK "github.com/influxdata/influxdb1-client/v2"
influxdbCli, err := influxdbClientSDK.NewHTTPClient(influxdbClientSDK.HTTPConfig{
Addr: settings.URL, // GeminiDB Influx 地址
Username: settings.User, // 用户名
Password: config.Secrets.Password, // 密码
})
- 写入数据
func writeBySDK(cli influxdbClientSDK.Client, number int) error {
pt, err := influxdbClientSDK.NewPoint(
"obs_storage",
map[string]string{"bucket": "grafana"},
map[string]interface{}{"number": number},
time.Now(),
)
if err != nil {
return err
}
bp, err := influxdbClientSDK.NewBatchPoints(influxdbClientSDK.BatchPointsConfig{
RetentionPolicy: "7d_events",
Database: "test",
Precision: "ns",
})
if err != nil {
return err
}
bp.AddPoint(pt)
// 写入数据到InfluxDB
if err := cli.Write(bp); err != nil {
return err
}
return nil
}
剩下的主要是Grafana InfluxDB的对应Influxql查询语句的代码。
总结
开发任务到此完成。
未完待续。。。
- 点赞
- 收藏
- 关注作者
评论(0)