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  }