201 lines
5.2 KiB
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")
|
|
}
|
|
}
|