Skip to content

Commit 29002af

Browse files
committed
feat: integrate opentelemetry in opengemini-client-go
Signed-off-by: chenhuan <xiangyuyu_2024@qq.com>
1 parent 4704451 commit 29002af

File tree

9 files changed

+585
-34
lines changed

9 files changed

+585
-34
lines changed

examples/trace/trace.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
// Copyright 2024 openGemini Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package main
16+
17+
import (
18+
"context"
19+
"errors"
20+
"fmt"
21+
"time"
22+
23+
"github.com/openGemini/opengemini-client-go/opengemini"
24+
"go.opentelemetry.io/otel"
25+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
26+
"go.opentelemetry.io/otel/propagation"
27+
"go.opentelemetry.io/otel/sdk/resource"
28+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
29+
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
30+
)
31+
32+
// setupOTelSDK bootstraps the OpenTelemetry pipeline.
33+
// If it does not return an error, make sure to call shutdown for proper cleanup.
34+
func setupOTelSDK(ctx context.Context) (shutdown func(context.Context) error, err error) {
35+
var shutdownFuncs []func(context.Context) error
36+
37+
// shutdown calls cleanup functions registered via shutdownFuncs.
38+
// The errors from the calls are joined.
39+
// Each registered cleanup will be invoked once.
40+
shutdown = func(ctx context.Context) error {
41+
var err error
42+
for _, fn := range shutdownFuncs {
43+
err = errors.Join(err, fn(ctx))
44+
}
45+
shutdownFuncs = nil
46+
return err
47+
}
48+
49+
// handleErr calls shutdown for cleanup and makes sure that all errors are returned.
50+
handleErr := func(inErr error) {
51+
err = errors.Join(inErr, shutdown(ctx))
52+
}
53+
54+
// Set up propagator.
55+
prop := newPropagator()
56+
otel.SetTextMapPropagator(prop)
57+
58+
// Set up trace provider.
59+
tracerProvider, err := newTracerProvider()
60+
if err != nil {
61+
handleErr(err)
62+
return
63+
}
64+
shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown)
65+
otel.SetTracerProvider(tracerProvider)
66+
67+
return
68+
}
69+
70+
func newPropagator() propagation.TextMapPropagator {
71+
return propagation.NewCompositeTextMapPropagator(
72+
propagation.TraceContext{},
73+
propagation.Baggage{},
74+
)
75+
}
76+
77+
func newTracerProvider() (*sdktrace.TracerProvider, error) {
78+
// test: export to jaeger
79+
traceExporter, err := otlptracehttp.New(context.Background(),
80+
otlptracehttp.WithEndpoint("127.0.0.1:4318"),
81+
otlptracehttp.WithInsecure())
82+
if err != nil {
83+
return nil, err
84+
}
85+
86+
tracerProvider := sdktrace.NewTracerProvider(
87+
sdktrace.WithResource(resource.NewWithAttributes("", semconv.ServiceName("opengemini-client-go"))),
88+
sdktrace.WithBatcher(traceExporter,
89+
// Default is 5s. Set to 1s for demonstrative purposes.
90+
sdktrace.WithBatchTimeout(time.Second)),
91+
)
92+
return tracerProvider, nil
93+
}
94+
95+
func main() {
96+
var ctx = context.Background()
97+
shutdown, err := setupOTelSDK(ctx)
98+
if err != nil {
99+
return
100+
}
101+
//Handle shutdown properly so nothing leaks.
102+
defer func() {
103+
err = errors.Join(err, shutdown(ctx))
104+
}()
105+
106+
// create an openGemini client
107+
config := &opengemini.Config{
108+
Addresses: []opengemini.Address{{
109+
Host: "127.0.0.1",
110+
Port: 8086,
111+
}},
112+
}
113+
client, err := opengemini.NewClient(config)
114+
if err != nil {
115+
fmt.Println(err)
116+
return
117+
}
118+
119+
// set otel interceptor
120+
client.Interceptors(opengemini.NewOtelInterceptor())
121+
122+
err = client.CreateDatabase("db0")
123+
if err != nil {
124+
// do something
125+
}
126+
}

go.mod

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
module github.com/openGemini/opengemini-client-go
22

3-
go 1.22
3+
go 1.23.0
4+
5+
toolchain go1.24.3
46

57
require (
68
github.com/golang/snappy v1.0.0
@@ -10,24 +12,37 @@ require (
1012
github.com/prometheus/client_golang v1.20.5
1113
github.com/stretchr/testify v1.10.0
1214
github.com/vmihailenco/msgpack/v5 v5.4.1
13-
google.golang.org/grpc v1.65.1
14-
google.golang.org/protobuf v1.35.2
15+
go.opentelemetry.io/otel v1.37.0
16+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0
17+
go.opentelemetry.io/otel/sdk v1.37.0
18+
go.opentelemetry.io/otel/trace v1.37.0
19+
google.golang.org/grpc v1.73.0
20+
google.golang.org/protobuf v1.36.6
1521
)
1622

1723
require (
1824
github.com/beorn7/perks v1.0.1 // indirect
25+
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
1926
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2027
github.com/davecgh/go-spew v1.1.1 // indirect
21-
github.com/kr/text v0.2.0 // indirect
28+
github.com/go-logr/logr v1.4.3 // indirect
29+
github.com/go-logr/stdr v1.2.2 // indirect
30+
github.com/google/uuid v1.6.0 // indirect
31+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
2232
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
2333
github.com/pmezard/go-difflib v1.0.0 // indirect
2434
github.com/prometheus/client_model v0.6.1 // indirect
2535
github.com/prometheus/common v0.55.0 // indirect
2636
github.com/prometheus/procfs v0.15.1 // indirect
2737
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
28-
golang.org/x/net v0.26.0 // indirect
29-
golang.org/x/sys v0.22.0 // indirect
30-
golang.org/x/text v0.16.0 // indirect
31-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect
38+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
39+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
40+
go.opentelemetry.io/otel/metric v1.37.0 // indirect
41+
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
42+
golang.org/x/net v0.41.0 // indirect
43+
golang.org/x/sys v0.33.0 // indirect
44+
golang.org/x/text v0.26.0 // indirect
45+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
46+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
3247
gopkg.in/yaml.v3 v3.0.1 // indirect
3348
)

go.sum

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,26 @@
11
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
22
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
3+
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
4+
github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
35
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
46
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
5-
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
67
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
78
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
10+
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
11+
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
12+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
13+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
14+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
15+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
816
github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
917
github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
10-
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
11-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
18+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
19+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
20+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
21+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
22+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
23+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
1224
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
1325
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
1426
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
@@ -33,26 +45,48 @@ github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G
3345
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
3446
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
3547
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
36-
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
37-
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
48+
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
49+
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
3850
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
3951
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
4052
github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
4153
github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
4254
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
4355
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
44-
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
45-
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
46-
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
47-
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
48-
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
49-
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
50-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8=
51-
google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
52-
google.golang.org/grpc v1.65.1 h1:toSN4j5/Xju+HVovfaY5g1YZVuJeHzQZhP8eJ0L0f1I=
53-
google.golang.org/grpc v1.65.1/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
54-
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
55-
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
56+
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
57+
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
58+
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
59+
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
60+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
61+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
62+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
63+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
64+
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
65+
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
66+
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
67+
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
68+
go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
69+
go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
70+
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
71+
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
72+
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
73+
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
74+
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
75+
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
76+
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
77+
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
78+
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
79+
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
80+
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
81+
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
82+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
83+
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
84+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
85+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
86+
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
87+
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
88+
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
89+
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
5690
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
5791
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
5892
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

opengemini/client.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"crypto/tls"
2020
"log/slog"
21+
"net/http"
2122
"strconv"
2223
"time"
2324

@@ -51,6 +52,13 @@ const (
5152
CompressMethodNone CompressMethod = "NONE"
5253
)
5354

55+
type InterceptorClosure func(ctx context.Context, response *http.Response) error
56+
57+
type Interceptor interface {
58+
Query(ctx context.Context, query *InterceptorQuery) InterceptorClosure
59+
Write(ctx context.Context, write *InterceptorWrite) InterceptorClosure
60+
}
61+
5462
// Client represents a openGemini client.
5563
type Client interface {
5664
// Ping check that status of cluster.
@@ -135,6 +143,8 @@ type Client interface {
135143

136144
// ExposeMetrics expose prometheus metrics, calling prometheus.MustRegister(metrics) to register
137145
ExposeMetrics() prometheus.Collector
146+
// Interceptors inject interceptor
147+
Interceptors(...Interceptor)
138148
}
139149

140150
// Config is used to construct a openGemini Client instance.

opengemini/client_impl.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,25 @@ type endpoint struct {
3333
}
3434

3535
type client struct {
36-
config *Config
37-
endpoints []endpoint
38-
cli *http.Client
39-
prevIdx atomic.Int32
40-
dataChanMap syncx.Map[dbRp, chan *sendBatchWithCB]
41-
metrics *metrics
42-
rpcClient *writerClient
36+
config *Config
37+
endpoints []endpoint
38+
cli *http.Client
39+
prevIdx atomic.Int32
40+
dataChanMap syncx.Map[dbRp, chan *sendBatchWithCB]
41+
metrics *metrics
42+
rpcClient *writerClient
43+
interceptors []Interceptor
4344

4445
batchContext context.Context
4546
batchContextCancel context.CancelFunc
4647

4748
logger *slog.Logger
4849
}
4950

51+
func (c *client) Interceptors(interceptor ...Interceptor) {
52+
c.interceptors = append(c.interceptors, interceptor...)
53+
}
54+
5055
func newClient(c *Config) (Client, error) {
5156
if len(c.Addresses) == 0 {
5257
return nil, ErrNoAddress

0 commit comments

Comments
 (0)