-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
storage.go
95 lines (78 loc) · 2.7 KB
/
storage.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package storage // import "go.opentelemetry.io/collector/extension/experimental/storage"
import (
"context"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/extension"
)
// Extension is the interface that storage extensions must implement
type Extension interface {
extension.Extension
// GetClient will create a client for use by the specified component.
// Each component can have multiple storages (e.g. one for each signal),
// which can be identified using storageName parameter.
// The component can use the client to manage state
GetClient(ctx context.Context, kind component.Kind, id component.ID, storageName string) (Client, error)
}
// Client is the interface that storage clients must implement
// All methods should return error only if a problem occurred.
// This mirrors the behavior of a golang map:
// - Set doesn't error if a key already exists - it just overwrites the value.
// - Get doesn't error if a key is not found - it just returns nil.
// - Delete doesn't error if the key doesn't exist - it just no-ops.
//
// Similarly:
// - Batch doesn't error if any of the above happens for either retrieved or updated keys
//
// This also provides a way to differentiate data operations
//
// [overwrite | not-found | no-op] from "real" problems
type Client interface {
// Get will retrieve data from storage that corresponds to the
// specified key. It should return (nil, nil) if not found
Get(ctx context.Context, key string) ([]byte, error)
// Set will store data. The data can be retrieved by the same
// component after a process restart, using the same key
Set(ctx context.Context, key string, value []byte) error
// Delete will delete data associated with the specified key
Delete(ctx context.Context, key string) error
// Batch handles specified operations in batch. Get operation results are put in-place
Batch(ctx context.Context, ops ...Operation) error
// Close will release any resources held by the client
Close(ctx context.Context) error
}
type opType int
const (
Get opType = iota
Set
Delete
)
type operation struct {
// Key specifies key which is going to be get/set/deleted
Key string
// Value specifies value that is going to be set or holds result of get operation
Value []byte
// Type describes the operation type
Type opType
}
type Operation *operation
func SetOperation(key string, value []byte) Operation {
return &operation{
Key: key,
Value: value,
Type: Set,
}
}
func GetOperation(key string) Operation {
return &operation{
Key: key,
Type: Get,
}
}
func DeleteOperation(key string) Operation {
return &operation{
Key: key,
Type: Delete,
}
}