Go

GreptimeDB 提供了用于高吞吐量数据写入的 ingester 库。 它使用 gRPC 协议,支持自动生成表结构,无需在写入数据前创建表。 更多信息请参考 自动生成表结构

GreptimeDB 提供的 Go Ingest SDK 是一个轻量级、并发安全的库,使用起来非常简单。

快速开始 Demo

你可以通过快速开始 Demo 来了解如何使用 GreptimeDB Go SDK。

安装

使用下方的命令安装 Go Ingest SDK:

  1. go get -u github.com/GreptimeTeam/[email protected]

引入到代码中:

  1. import (
  2. greptime "github.com/GreptimeTeam/greptimedb-ingester-go"
  3. "github.com/GreptimeTeam/greptimedb-ingester-go/table"
  4. "github.com/GreptimeTeam/greptimedb-ingester-go/table/types"
  5. )

连接数据库

如果你在启动 GreptimeDB 时设置了 --user-provider, 则需要提供用户名和密码才能连接到 GreptimeDB。 以下示例显示了使用 SDK 连接到 GreptimeDB 时如何设置用户名和密码。

  1. cfg := greptime.NewConfig("127.0.0.1").
  2. // 将数据库名称更改为你的数据库名称
  3. WithDatabase("public").
  4. // 默认端口 4001
  5. // WithPort(4001).
  6. // 如果服务配置了 TLS ,设置 TLS 选项来启用安全连接
  7. // WithInsecure(false).
  8. // 设置鉴权信息
  9. // 如果数据库不需要鉴权,移除 WithAuth 方法即可
  10. WithAuth("username", "password")
  11. cli, _ := greptime.NewClient(cfg)

数据模型

表中的每条行数据包含三种类型的列:TagTimestampField。更多信息请参考 数据模型。 列值的类型可以是 StringFloatIntTimestamp 等。更多信息请参考 数据类型

低层级 API

GreptimeDB 的低层级 API 通过向具有预定义模式的 table 对象添加 row 来写入数据。

创建行数据

以下代码片段首先构建了一个名为 cpu_metric 的表,其中包括 hostcpu_usercpu_systs 列。 随后,它向表中插入了一行数据。

该表包含三种类型的列:

  • Taghost 列,值类型为 String
  • Fieldcpu_usercpu_sys 列,值类型为 Float
  • Timestampts 列,值类型为 Timestamp
  1. // 为 CPU 指标构建表结构
  2. cpuMetric, err := table.New("cpu_metric")
  3. if err != nil {
  4. // 处理错误
  5. }
  6. // 添加一个 'Tag' 列,用于主机标识符
  7. cpuMetric.AddTagColumn("host", types.STRING)
  8. // 添加一个 'Timestamp' 列,用于记录数据收集的时间
  9. cpuMetric.AddTimestampColumn("ts", types.TIMESTAMP_MILLISECOND)
  10. // 添加 'Field' 列,用于测量用户和系统 CPU 使用率
  11. cpuMetric.AddFieldColumn("cpu_user", types.FLOAT)
  12. cpuMetric.AddFieldColumn("cpu_sys", types.FLOAT)
  13. // 插入示例数据
  14. // 注意:参数必须按照定义的表结构中的列的顺序排列:host, ts, cpu_user, cpu_sys
  15. err = cpuMetric.AddRow("127.0.0.1", time.Now(), 0.1, 0.12)
  16. err = cpuMetric.AddRow("127.0.0.1", time.Now(), 0.11, 0.13)
  17. if err != nil {
  18. // 处理错误
  19. }

为了提高写入数据的效率,你可以一次创建多行数据以便写入到 GreptimeDB。

  1. cpuMetric, err := table.New("cpu_metric")
  2. if err != nil {
  3. // 处理错误
  4. }
  5. cpuMetric.AddTagColumn("host", types.STRING)
  6. cpuMetric.AddTimestampColumn("ts", types.TIMESTAMP_MILLISECOND)
  7. cpuMetric.AddFieldColumn("cpu_user", types.FLOAT)
  8. cpuMetric.AddFieldColumn("cpu_sys", types.FLOAT)
  9. err = cpuMetric.AddRow("127.0.0.1", time.Now(), 0.1, 0.12)
  10. if err != nil {
  11. // 处理错误
  12. }
  13. memMetric, err := table.New("mem_metric")
  14. if err != nil {
  15. // 处理错误
  16. }
  17. memMetric.AddTagColumn("host", types.STRING)
  18. memMetric.AddTimestampColumn("ts", types.TIMESTAMP_MILLISECOND)
  19. memMetric.AddFieldColumn("mem_usage", types.FLOAT)
  20. err = memMetric.AddRow("127.0.0.1", time.Now(), 112)
  21. if err != nil {
  22. // 处理错误
  23. }

插入数据

下方示例展示了如何向 GreptimeDB 的表中插入行数据。

  1. resp, err := cli.Write(context.Background(), cpuMetric, memMetric)
  2. if err != nil {
  3. // 处理错误
  4. }
  5. log.Printf("affected rows: %d\n", resp.GetAffectedRows().GetValue())

流式插入

当你需要插入大量数据时,例如导入历史数据,流式插入是非常有用的。

  1. err := cli.StreamWrite(context.Background(), cpuMetric, memMetric)
  2. if err != nil {
  3. // 处理错误
  4. }

在所有数据写入完毕后关闭流式写入。 一般情况下,连续写入数据时不需要关闭流式写入。

  1. affected, err := cli.CloseStream(ctx)

高层级 API

SDK 的高层级 API 使用 ORM 风格的对象写入数据, 它允许你以更面向对象的方式创建、插入和更新数据,为开发者提供了更友好的体验。 然而,高层级 API 不如低层级 API 高效。 这是因为 ORM 风格的对象在转换对象时可能会消耗更多的资源和时间。

创建行数据

  1. type CpuMetric struct {
  2. Host string `greptime:"tag;column:host;type:string"`
  3. CpuUser float64 `greptime:"field;column:cpu_user;type:float64"`
  4. CpuSys float64 `greptime:"field;column:cpu_sys;type:float64"`
  5. Ts time.Time `greptime:"timestamp;column:ts;type:timestamp;precision:millisecond"`
  6. }
  7. func (CpuMetric) TableName() string {
  8. return "cpu_metric"
  9. }
  10. cpuMetrics := []CpuMetric{
  11. {
  12. Host: "127.0.0.1",
  13. CpuUser: 0.10,
  14. CpuSys: 0.12,
  15. Ts: time.Now(),
  16. }
  17. }

插入数据

  1. resp, err := cli.WriteObject(context.Background(), cpuMetrics)
  2. log.Printf("affected rows: %d\n", resp.GetAffectedRows().GetValue())

流式插入

当你需要插入大量数据时,例如导入历史数据,流式插入是非常有用的。

  1. err := streamClient.StreamWriteObject(context.Background(), cpuMetrics, memMetrics)

在所有数据写入完毕后关闭流式写入。 一般情况下,连续写入数据时不需要关闭流式写入。

  1. affected, err := cli.CloseStream(ctx)

Ingester 库参考