gotidb/examples/file_engine_example.go

201 lines
5.2 KiB
Go

package main
import (
"context"
"fmt"
"os"
"time"
"git.pyer.club/kingecg/gotidb/pkg/engine"
_ "git.pyer.club/kingecg/gotidb/pkg/engine/file" // 导入文件引擎以注册
)
func main() {
// 创建临时目录
tempDir, err := os.MkdirTemp("", "gotidb_example")
if err != nil {
fmt.Printf("Failed to create temp dir: %v\n", err)
return
}
defer os.RemoveAll(tempDir)
// 创建引擎配置
config := &engine.FileEngineConfig{
DataDir: tempDir,
SegmentSize: 1024 * 1024, // 1MB
MaxSegments: 10,
WriteBufferSize: 1000,
IndexCacheSize: 1024 * 1024, // 1MB
UseCompression: false,
CompressionLevel: 0,
CompactThreshold: 0.7,
MaxOpenFiles: 100,
SyncWrites: true,
RetentionPeriod: 24 * time.Hour,
}
// 创建引擎
e, err := engine.NewEngine(engine.EngineConfig{
Type: "file",
FileConfig: config,
})
if err != nil {
fmt.Printf("Failed to create file engine: %v\n", err)
return
}
// 打开引擎
if err := e.Open(); err != nil {
fmt.Printf("Failed to open engine: %v\n", err)
return
}
defer e.Close()
// 创建上下文
ctx := context.Background()
// 写入测试数据
fmt.Println("Writing data points...")
points := []engine.DataPoint{
{
Timestamp: time.Now().UnixNano(),
Value: 1.0,
Labels: map[string]string{
"host": "server1",
"region": "us-west",
"app": "web",
},
},
{
Timestamp: time.Now().Add(time.Second).UnixNano(),
Value: 2.0,
Labels: map[string]string{
"host": "server1",
"region": "us-west",
"app": "web",
},
},
{
Timestamp: time.Now().Add(2 * time.Second).UnixNano(),
Value: 3.0,
Labels: map[string]string{
"host": "server2",
"region": "us-east",
"app": "api",
},
},
{
Timestamp: time.Now().Add(3 * time.Second).UnixNano(),
Value: 4.0,
Labels: map[string]string{
"host": "server2",
"region": "us-east",
"app": "api",
},
},
}
// 写入数据
if err := e.Write(ctx, points); err != nil {
fmt.Printf("Failed to write points: %v\n", err)
return
}
// 查询原始数据
fmt.Println("\nQuerying raw data for server1...")
rawQuery := engine.Query{
Type: engine.QueryTypeRaw,
StartTime: time.Now().Add(-time.Minute).UnixNano(),
EndTime: time.Now().Add(time.Minute).UnixNano(),
Tags: map[string]string{
"host": "server1",
},
Limit: 10,
}
rawResult, err := e.Query(ctx, rawQuery)
if err != nil {
fmt.Printf("Failed to query raw data: %v\n", err)
return
}
// 打印原始查询结果
fmt.Printf("Raw query returned %d series\n", len(rawResult))
for i, series := range rawResult {
fmt.Printf("Series %d (ID: %s):\n", i+1, series.SeriesID)
fmt.Printf(" Labels: %v\n", series.Points[0].Labels)
fmt.Printf(" Points: %d\n", len(series.Points))
for j, point := range series.Points {
fmt.Printf(" Point %d: timestamp=%s, value=%f\n",
j+1,
time.Unix(0, point.Timestamp).Format(time.RFC3339Nano),
point.Value)
}
}
// 查询最新数据
fmt.Println("\nQuerying latest data for each host...")
latestQuery := engine.Query{
Type: engine.QueryTypeLatest,
StartTime: time.Now().Add(-time.Minute).UnixNano(),
EndTime: time.Now().Add(time.Minute).UnixNano(),
Tags: map[string]string{}, // 空标签查询所有序列
}
latestResult, err := e.Query(ctx, latestQuery)
if err != nil {
fmt.Printf("Failed to query latest data: %v\n", err)
return
}
// 打印最新查询结果
fmt.Printf("Latest query returned %d series\n", len(latestResult))
for i, series := range latestResult {
fmt.Printf("Series %d (ID: %s):\n", i+1, series.SeriesID)
fmt.Printf(" Labels: %v\n", series.Points[0].Labels)
for _, point := range series.Points {
fmt.Printf(" Latest point: timestamp=%s, value=%f\n",
time.Unix(0, point.Timestamp).Format(time.RFC3339Nano),
point.Value)
}
}
// 查询聚合数据
fmt.Println("\nQuerying aggregate data (average) for each region...")
aggQuery := engine.Query{
Type: engine.QueryTypeAggregate,
StartTime: time.Now().Add(-time.Minute).UnixNano(),
EndTime: time.Now().Add(time.Minute).UnixNano(),
AggregateType: engine.AggregateTypeAvg,
Tags: map[string]string{}, // 空标签查询所有序列
}
aggResult, err := e.Query(ctx, aggQuery)
if err != nil {
fmt.Printf("Failed to query aggregate data: %v\n", err)
return
}
// 打印聚合查询结果
fmt.Printf("Aggregate query returned %d series\n", len(aggResult))
for i, series := range aggResult {
fmt.Printf("Series %d (ID: %s):\n", i+1, series.SeriesID)
fmt.Printf(" Labels: %v\n", series.Points[0].Labels)
for _, point := range series.Points {
fmt.Printf(" Average value: %f\n", point.Value)
}
}
// 获取引擎统计信息
stats := e.Stats()
fmt.Println("\nEngine statistics:")
fmt.Printf(" Points count: %d\n", stats.PointsCount)
fmt.Printf(" Segments count: %d\n", stats.SegmentsCount)
fmt.Printf(" Last write time: %s\n", stats.LastWriteTime.Format(time.RFC3339))
if !stats.LastCompactionTime.IsZero() {
fmt.Printf(" Last compaction time: %s\n", stats.LastCompactionTime.Format(time.RFC3339))
} else {
fmt.Printf(" Last compaction time: Never\n")
}
}