-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplugin.go
More file actions
132 lines (116 loc) · 2.62 KB
/
plugin.go
File metadata and controls
132 lines (116 loc) · 2.62 KB
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"context"
"fmt"
"strings"
"time"
"github.com/go-logr/logr"
)
// Type represents the type of OutputClient
type Type int
const (
// NOOP type represents a no-operation client type
NOOP Type = iota
// STDOUT type represents a standard output client type
STDOUT
// OTLPGRPC type represents an OTLP gRPC client type
OTLPGRPC
// OTLPHTTP type represents an OTLP HTTP client type
OTLPHTTP
// UNKNOWN type represents an unknown client type
UNKNOWN
)
// ClientTypeFromString converts a string representation of client type to Type. It returns NOOP for unknown types.
func ClientTypeFromString(clientType string) Type {
switch strings.ToUpper(clientType) {
case "NOOP":
return NOOP
case "STDOUT":
return STDOUT
case "OTLPGRPC", "OTLP_GRPC":
return OTLPGRPC
case "OTLPHTTP", "OTLP_HTTP":
return OTLPHTTP
default:
return NOOP
}
}
// String returns the string representation of the client Type
func (t Type) String() string {
switch t {
case NOOP:
return "noop"
case STDOUT:
return "stdout"
case OTLPGRPC:
return "otlp_grpc"
case OTLPHTTP:
return "otlp_http"
case UNKNOWN:
return "unknown"
default:
return ""
}
}
type OutputEntry struct {
Timestamp time.Time
Record map[string]any
}
type OutputPlugin interface {
SendRecord(log OutputEntry) error
Close()
}
type Plugin struct {
id string
ctx context.Context
cancel context.CancelFunc
logger logr.Logger
cfg *Config
client OutputClient
}
func NewPlugin(id string, logger logr.Logger, cfg *Config) (OutputPlugin, error) {
ctx, cancel := context.WithCancel(context.Background())
clientType := ClientTypeFromString(cfg.PluginConfig.ClientType)
var ncf NewClientFunc
switch clientType {
// case OTLPGRPC:
// newClientFunc = NewOTLPGRPCClient
// case OTLPHTTP:
// newClientFunc = NewOTLPHTTPClient
case STDOUT:
ncf = NewStdoutClient
case NOOP:
ncf = NewNoopClient
default:
cancel()
return nil, fmt.Errorf("unknown client type: %v", clientType)
}
// Create a single context for the entire plugin lifecycle
client, err := ncf(ctx, *cfg, logger)
if err != nil {
cancel()
return nil, fmt.Errorf("can't create client")
}
return &Plugin{
id: id,
ctx: ctx,
cancel: cancel,
logger: logger,
cfg: cfg,
client: client,
}, nil
}
func (p *Plugin) SendRecord(log OutputEntry) error {
record := log.Record
if len(record) == 0 {
p.logger.Info("no record left after removing keys")
return nil
}
return p.client.Handle(log)
}
func (p *Plugin) Close() {
// Cancel the plugin context first to signal all operations to stop
p.cancel()
p.client.StopWait()
p.logger.Info("logging plugin stopped")
}