github.com/influxdata/influxdb/v2@v2.7.6/remotes/transport/middleware_kv.go (about) 1 package transport 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/binary" 7 "fmt" 8 9 "github.com/influxdata/influxdb/v2/kit/platform" 10 11 "github.com/influxdata/influxdb/v2" 12 "github.com/influxdata/influxdb/v2/kv" 13 ) 14 15 var remotesBucket = []byte("remotesv2") 16 17 func newTelemetryCollectingService(kv kv.Store, underlying RemoteConnectionService) *telemetryService { 18 return &telemetryService{ 19 kv: kv, 20 underlying: underlying, 21 } 22 } 23 24 type telemetryService struct { 25 kv kv.Store 26 underlying RemoteConnectionService 27 } 28 29 func (t telemetryService) ListRemoteConnections(ctx context.Context, filter influxdb.RemoteConnectionListFilter) (*influxdb.RemoteConnections, error) { 30 return t.underlying.ListRemoteConnections(ctx, filter) 31 } 32 33 func (t telemetryService) GetRemoteConnection(ctx context.Context, id platform.ID) (*influxdb.RemoteConnection, error) { 34 return t.underlying.GetRemoteConnection(ctx, id) 35 } 36 37 func (t telemetryService) UpdateRemoteConnection(ctx context.Context, id platform.ID, request influxdb.UpdateRemoteConnectionRequest) (*influxdb.RemoteConnection, error) { 38 return t.underlying.UpdateRemoteConnection(ctx, id, request) 39 } 40 41 func (t telemetryService) CreateRemoteConnection(ctx context.Context, request influxdb.CreateRemoteConnectionRequest) (*influxdb.RemoteConnection, error) { 42 conn, err := t.underlying.CreateRemoteConnection(ctx, request) 43 if err != nil { 44 return conn, err 45 } 46 err = t.storeRemoteMetrics(ctx, request.OrgID) 47 return conn, err 48 } 49 50 func (t telemetryService) DeleteRemoteConnection(ctx context.Context, id platform.ID) error { 51 rc, err := t.underlying.GetRemoteConnection(ctx, id) 52 if err != nil { 53 return err 54 } 55 56 err = t.underlying.DeleteRemoteConnection(ctx, id) 57 if err != nil { 58 return err 59 } 60 61 return t.storeRemoteMetrics(ctx, rc.OrgID) 62 } 63 64 func (t telemetryService) storeRemoteMetrics(ctx context.Context, orgID platform.ID) error { 65 if err := t.kv.Update(ctx, func(tx kv.Tx) error { 66 encodedID, err := orgID.Encode() 67 if err != nil { 68 return platform.ErrInvalidID 69 } 70 bucket, err := tx.Bucket(remotesBucket) 71 if err != nil { 72 return err 73 } 74 count, err := t.countRemotes(ctx, orgID) 75 if err != nil { 76 return err 77 } 78 return bucket.Put(encodedID, count) 79 }); err != nil { 80 return fmt.Errorf("updating telemetry failed: %v", err) 81 } 82 83 return nil 84 } 85 86 func (t telemetryService) countRemotes(ctx context.Context, orgID platform.ID) ([]byte, error) { 87 req := influxdb.RemoteConnectionListFilter{ 88 OrgID: orgID, 89 } 90 list, err := t.underlying.ListRemoteConnections(ctx, req) 91 if err != nil { 92 return nil, err 93 } 94 95 b := make([]byte, 0, 8) 96 buf := bytes.NewBuffer(b) 97 err = binary.Write(buf, binary.BigEndian, int64(len(list.Remotes))) 98 return buf.Bytes(), err 99 }