forked from kudarap/opentelemetry-logs-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
exporter.go
112 lines (89 loc) · 2.36 KB
/
exporter.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
Copyright Agoda Services Co.,Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package otlplogs
import (
"context"
"errors"
"github.com/dbdoyc/opentelemetry-logs-go/exporters/otlp/otlplogs/internal/logstransform"
logssdk "github.com/dbdoyc/opentelemetry-logs-go/sdk/logs"
"sync"
)
var (
errAlreadyStarted = errors.New("already started")
)
type Exporter struct {
client Client
mu sync.RWMutex
started bool
startOnce sync.Once
stopOnce sync.Once
}
// Start establishes a connection to the receiving endpoint.
func (e *Exporter) Start(ctx context.Context) error {
var err = errAlreadyStarted
e.startOnce.Do(func() {
e.mu.Lock()
e.started = true
e.mu.Unlock()
err = e.client.Start(ctx)
})
return err
}
func (e *Exporter) Shutdown(ctx context.Context) error {
e.mu.RLock()
started := e.started
e.mu.RUnlock()
if !started {
return nil
}
var err error
e.stopOnce.Do(func() {
err = e.client.Stop(ctx)
e.mu.Lock()
e.started = false
e.mu.Unlock()
})
return err
}
// Export exports a batch of logs.
func (e *Exporter) Export(ctx context.Context, ll []logssdk.ReadableLogRecord) error {
protoLogs := logstransform.Logs(ll)
if len(protoLogs) == 0 {
return nil
}
err := e.client.UploadLogs(ctx, protoLogs)
if err != nil {
return err
}
return nil
}
// New creates new exporter with client
// Deprecated: Use NewExporter instead. Will be removed in v0.1.0
func New(ctx context.Context, client Client) (*Exporter, error) {
return NewExporter(ctx, WithClient(client))
}
// NewExporter creates new Exporter
func NewExporter(ctx context.Context, options ...ExporterOption) (*Exporter, error) {
// Create new client using env variables
config := NewExporterConfig(options...)
for _, opt := range options {
config = opt.apply(config)
}
exp := &Exporter{
client: config.client,
}
if err := exp.Start(ctx); err != nil {
return nil, err
}
return exp, nil
}