Grafana适配OBS开源验证任务心得

举报
SSK9 发表于 2024/12/10 20:15:45 2024/12/10
【摘要】 Grafana适配OBS开源开发任务 从计划书开始开始从计划书了解到任务内容,这次的任务是开发Grafana插件:OBS数据源插件。Grafana最主要两个方面功能:数据可视化指标监控从OBS的对象存储特性来看,它需要配合其他数据存储引擎存储和读取数据。可以将OBS数据存储到关系型数据,例如:桶的信息存放到GaussDB数据库读取。可以将OBS的指标数据存放到时序型数据库,例如:桶的存量信...

Grafana适配OBS开源开发任务

从计划书开始开始

从计划书了解到任务内容,这次的任务是开发Grafana插件:OBS数据源插件。

Grafana最主要两个方面功能:

  1. 数据可视化
  2. 指标监控

从OBS的对象存储特性来看,它需要配合其他数据存储引擎存储和读取数据。

  1. 可以将OBS数据存储到关系型数据,例如:桶的信息存放到GaussDB数据库读取。
  2. 可以将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 支持的查询语言:

  1. Influxql (V1版本)
  2. Influx (V1、V2版本)
  3. SQL (V3版本)

GeminiDB Influx兼容Influxql查询语言。

Grafana

Grafana是一款开源数据可视化工具,在数据可视化工具中具有很高的热度。

特点

  1. 可视化:快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
  2. 报警:可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
  3. 通知:警报更改状态时,它会发出通知。接收电子邮件通知。
  4. 动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
  5. 混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
  6. 注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
  7. 过滤器:过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。

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协议通信。

传入参数

  1. addr:GeminiDB influx的集群或单击地址。
  2. username: GeminiDB influx用户名。
  3. 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查询语句的代码。

总结

开发任务到此完成。

未完待续。。。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。