From cab29523f4259d44b84d86e543fd8c128734dcc7 Mon Sep 17 00:00:00 2001 From: Andrei Markin Date: Mon, 14 Sep 2026 12:47:26 +0400 Subject: [PATCH] feat(go-sdk): add support for Fetch method --- .pre-commit-config.yaml | 16 +++++++++++++++ sdk/go/garf/garf.go | 39 +++++++++++++++++++++++++++++++++++++ sdk/go/garf/garf.pb.go | 7 ++++--- sdk/go/garf/garf_grpc.pb.go | 1 + sdk/go/go.mod | 7 ++++--- sdk/go/go.sum | 14 +++++++++---- sdk/go/main.go | 31 +++++++++++++++++++++++++++-- 7 files changed, 103 insertions(+), 12 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e7d23c3d..45bf5262 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -109,3 +109,19 @@ repos: language: system pass_filenames: false always_run: true + + # Go + - id: go-format + exclude: ^sdk/go/garf/.*\.pb\.go$ + name: go-format + entry: gofmt -w ./sdk/go/ + language: system + pass_filenames: false + files: ^sdk/go/.*\.go$ + - id: go-imports + exclude: ^sdk/go/garf/.*\.pb\.go$ + name: go-imports + entry: goimports -w ./sdk/go/ + language: system + pass_filenames: false + files: ^sdk/go/.*\.go$ diff --git a/sdk/go/garf/garf.go b/sdk/go/garf/garf.go index c2fd1e8f..c38155a9 100644 --- a/sdk/go/garf/garf.go +++ b/sdk/go/garf/garf.go @@ -148,6 +148,45 @@ func (g *Garf) ListExecutors() []string { return executors } +func (g *Garf) Fetch(title, query string) *FetchResponse { + ctx, span := tracer.Start(context.Background(), "fetch") + defer span.End() + + c, conn := g.init(ctx) + defer conn.Close() + + fetcherParameters := map[string]any{ + "n_rows": 10, + } + fetcherParameterStruct, err := structpb.NewStruct(fetcherParameters) + if err != nil { + log.Fatalf("Failed to create fetcher parameters: %v", err) + } + + request := FetchRequest{ + Source: "fake", + Title: title, + Query: query, + Context: &FetchContext{ + FetcherParameters: fetcherParameterStruct, + }, + } + + r, err := c.Fetch(ctx, &request) + span.SetAttributes( + attribute.String("query.title", request.Title), + attribute.String("query.text", request.Query), + attribute.String("query.source", request.Source), + ) + if err != nil { + logger.ErrorContext(ctx, "Failed execution", "title", title) + } + versionAttr := attribute.Int("garf.results", len(r.Rows)) + span.SetAttributes(versionAttr) + logger.InfoContext(ctx, "Executed query", "title", request.Title, "result", r) + return r + +} func (g *Garf) Execute(title, query, writer string) []string { ctx, span := tracer.Start(context.Background(), "execute") defer span.End() diff --git a/sdk/go/garf/garf.pb.go b/sdk/go/garf/garf.pb.go index 24a70106..d3e9b68e 100644 --- a/sdk/go/garf/garf.pb.go +++ b/sdk/go/garf/garf.pb.go @@ -7,13 +7,14 @@ package garf import ( + reflect "reflect" + sync "sync" + unsafe "unsafe" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" structpb "google.golang.org/protobuf/types/known/structpb" - reflect "reflect" - sync "sync" - unsafe "unsafe" ) const ( diff --git a/sdk/go/garf/garf_grpc.pb.go b/sdk/go/garf/garf_grpc.pb.go index 6f3ff001..02855d56 100644 --- a/sdk/go/garf/garf_grpc.pb.go +++ b/sdk/go/garf/garf_grpc.pb.go @@ -8,6 +8,7 @@ package garf import ( context "context" + grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" diff --git a/sdk/go/go.mod b/sdk/go/go.mod index 787aa555..148b3eab 100644 --- a/sdk/go/go.mod +++ b/sdk/go/go.mod @@ -3,10 +3,11 @@ module github.com/google/garf/sdk/go go 1.25.0 require ( + buf.build/go/protoyaml v0.7.0 + github.com/jedib0t/go-pretty/v6 v6.8.3 go.opentelemetry.io/contrib/bridges/otelslog v0.20.1 go.opentelemetry.io/contrib/exporters/autoexport v0.71.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 go.opentelemetry.io/otel v1.46.0 go.opentelemetry.io/otel/log v0.22.0 go.opentelemetry.io/otel/sdk v1.46.0 @@ -19,24 +20,24 @@ require ( require ( buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.6-20250425153114-8976f5be98c1.1 // indirect buf.build/go/protovalidate v0.11.0 // indirect - buf.build/go/protoyaml v0.7.0 // indirect cel.dev/expr v0.25.2 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/felixge/httpsnoop v1.1.0 // indirect github.com/go-logr/logr v1.4.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/google/cel-go v0.25.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/prometheus/client_golang v1.24.1 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.70.1 // indirect github.com/prometheus/otlptranslator v1.0.0 // indirect github.com/prometheus/procfs v0.21.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/bridges/prometheus v0.71.0 // indirect diff --git a/sdk/go/go.sum b/sdk/go/go.sum index 3d7aa735..2d34ec44 100644 --- a/sdk/go/go.sum +++ b/sdk/go/go.sum @@ -16,8 +16,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/felixge/httpsnoop v1.1.0 h1:3YtUj32ZZkqZtt3sZZsClsymw/QDuVfpNhoA31zeORc= -github.com/felixge/httpsnoop v1.1.0/go.mod h1:Zqxgdd+1Rkcz8euOqdr7lqgCRJztwr5hp9vDSi5UZCE= +github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= +github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8= github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -33,10 +33,14 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0 h1:/Tnpcb2E0Pz/tN9s3bfEY2Q8ePCEX9iuS+cneUwncnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.30.0/go.mod h1:zOBXOsUaBSjKgmH4OGzV1esUpR3oUSCPYVd2cUBjKYY= +github.com/jedib0t/go-pretty/v6 v6.8.3 h1:yVSk5aemoYHCvcrtqyXklwqcgHQIQzmy/oUzFlmffSQ= +github.com/jedib0t/go-pretty/v6 v6.8.3/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk= github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -50,6 +54,9 @@ github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEo github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= github.com/prometheus/procfs v0.21.1 h1:GljZCt+zSTS+NZq88cyQ1LjZ+RCHp3uVuabBWA5+OJI= github.com/prometheus/procfs v0.21.1/go.mod h1:aB55Cww9pdSJVHk0hUf0inxWyyjPogFIjmHKYgMKmtY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -70,8 +77,6 @@ go.opentelemetry.io/contrib/exporters/autoexport v0.71.0 h1:VCsJbp0YLyPtx2tu5Vgv go.opentelemetry.io/contrib/exporters/autoexport v0.71.0/go.mod h1:qxZqn7e10f6ajmMCkg/47rMS7qQYfaOl2nj/4aytHUQ= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0 h1:oECp5f+hN7nkwjU/8BxQ/q23bGPb8FIrD839owX222E= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.70.0/go.mod h1:DqEFwLumhzMBDQv9PcWbyoDxHI/4lAk6CM4nJBH39sc= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0 h1:LMuyCAyfalSjDyjdC65nK6N0zoTT63+E/u95X0JovZI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.70.0/go.mod h1:085m8qbm4hgc8rZWGDEa4vmyyo2c3nPxUslYUKUIU04= go.opentelemetry.io/otel v1.46.0 h1:FHt5/CDyVxi/8IM1CH7VE/rRgq3kLHa2mSTVMO8AWyc= go.opentelemetry.io/otel v1.46.0/go.mod h1:Gj3SEScelsNC45tp4nSxRYlS+f5iez7W8XPMCt905kE= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.22.0 h1:Bu39F5tzJct+f2IZbB8989fwyTps3c8e7EsUQsz+vs8= @@ -140,4 +145,5 @@ google.golang.org/protobuf v1.36.12 h1:pJOKDDOyeXErUroCihFAd5LQuwXBSpVnKGrj5o/fw google.golang.org/protobuf v1.36.12/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/sdk/go/main.go b/sdk/go/main.go index cc66178c..b3aa1fa7 100644 --- a/sdk/go/main.go +++ b/sdk/go/main.go @@ -20,6 +20,8 @@ import ( "log" "os" + "github.com/jedib0t/go-pretty/v6/table" + "buf.build/go/protoyaml" "github.com/google/garf/sdk/go/garf" "github.com/google/garf/sdk/go/telemetry" @@ -43,6 +45,7 @@ func run() (error error) { g := garf.New(garfEndpoint) runHelperFunctions(g) + fetchQueryInline(g) executeQueryInline(g) executeQueryFromFile(g) executeQueryBatchInline(g) @@ -66,6 +69,30 @@ func runHelperFunctions(g garf.Garf) { fmt.Println(executors) } +func fetchQueryInline(g garf.Garf) error { + results := g.Fetch("test", + "SELECT metric.int AS field, metric.float AS field2 FROM fake", + ) + t := table.NewWriter() + t.SetOutputMirror(os.Stdout) + columns := results.Columns + headerRow := make(table.Row, len(columns)) + for i, c := range columns { + headerRow[i] = c + } + t.AppendHeader(headerRow) + for _, v := range results.Rows { + row := make(table.Row, len(v.Fields)) + rowMap := v.AsMap() + for i, c := range columns { + row[i] = rowMap[c] + } + t.AppendRow(row) + } + t.Render() + return nil +} + func executeQueryInline(g garf.Garf) error { results := g.Execute("test", "SELECT metric.int AS field FROM fake", "json") fmt.Println(results) @@ -94,9 +121,8 @@ func runWorkflowFromFile(g garf.Garf) error { workflowData, err := os.ReadFile("../../libs/executors/tests/unit/workflows/test_workflow.yaml") var workflowFile garf.Workflow options := protoyaml.UnmarshalOptions{ - AllowPartial: true, + AllowPartial: true, DiscardUnknown: true, - } if err := options.Unmarshal(workflowData, &workflowFile); err != nil { log.Fatalf("Failed to parse workflow: %v", err) @@ -160,6 +186,7 @@ func runInlineWorkflow(g garf.Garf) error { resultsWorkflow := g.ExecuteWorkflow(&workflow, &config, &executionContext) fmt.Println(resultsWorkflow) return nil + } func main() {