@@ -8,8 +8,11 @@ import (
8
8
"context"
9
9
"errors"
10
10
"fmt"
11
+ "time"
11
12
13
+ "github.com/cespare/xxhash"
12
14
"github.com/elastic/go-docappender/v2"
15
+ "github.com/elastic/go-freelru"
13
16
"go.opentelemetry.io/collector/client"
14
17
"go.opentelemetry.io/collector/component"
15
18
"go.opentelemetry.io/collector/exporter"
@@ -22,10 +25,26 @@ import (
22
25
23
26
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/datapoints"
24
27
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/elasticsearch"
28
+ "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/lru"
25
29
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/pool"
26
30
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter/internal/serializer/otelserializer"
27
31
)
28
32
33
+ const (
34
+ KiB = 1024
35
+ MiB = 1024 * KiB
36
+
37
+ knownExecutablesCacheSize = 128 * KiB
38
+ knownFramesCacheSize = 128 * KiB
39
+ knownTracesCacheSize = 128 * KiB
40
+
41
+ minILMRolloverTime = 3 * time .Hour
42
+ )
43
+
44
+ var stringHashFn = func (s string ) uint32 {
45
+ return uint32 (xxhash .Sum64String (s ))
46
+ }
47
+
29
48
type elasticsearchExporter struct {
30
49
set exporter.Settings
31
50
config * Config
@@ -36,16 +55,41 @@ type elasticsearchExporter struct {
36
55
allowedMappingModes map [string ]MappingMode
37
56
bulkIndexers bulkIndexers
38
57
bufferPool * pool.BufferPool
58
+
59
+ // Data cache for profiles
60
+ knownTraces * lru.LRUSet [string ]
61
+ knownFrames * lru.LRUSet [string ]
62
+ knownExecutables * lru.LRUSet [string ]
39
63
}
40
64
41
65
func newExporter (
42
66
cfg * Config ,
43
67
set exporter.Settings ,
44
68
index string ,
45
69
dynamicIndex bool ,
46
- ) * elasticsearchExporter {
70
+ ) ( * elasticsearchExporter , error ) {
47
71
allowedMappingModes := cfg .allowedMappingModes ()
48
72
defaultMappingMode := allowedMappingModes [canonicalMappingModeName (cfg .Mapping .Mode )]
73
+
74
+ // Create LRUs with MinILMRolloverTime as lifetime to avoid losing data by ILM roll-over.
75
+ knownTraces , err := freelru .New [string , lru.Void ](knownTracesCacheSize , stringHashFn )
76
+ if err != nil {
77
+ return nil , fmt .Errorf ("failed to create traces LRU: %w" , err )
78
+ }
79
+ knownTraces .SetLifetime (minILMRolloverTime )
80
+
81
+ knownFrames , err := freelru .New [string , lru.Void ](knownFramesCacheSize , stringHashFn )
82
+ if err != nil {
83
+ return nil , fmt .Errorf ("failed to create frames LRU: %w" , err )
84
+ }
85
+ knownFrames .SetLifetime (minILMRolloverTime )
86
+
87
+ knownExecutables , err := freelru .New [string , lru.Void ](knownExecutablesCacheSize , stringHashFn )
88
+ if err != nil {
89
+ return nil , fmt .Errorf ("failed to create executables LRU: %w" , err )
90
+ }
91
+ knownExecutables .SetLifetime (minILMRolloverTime )
92
+
49
93
return & elasticsearchExporter {
50
94
set : set ,
51
95
config : cfg ,
@@ -55,7 +99,11 @@ func newExporter(
55
99
allowedMappingModes : allowedMappingModes ,
56
100
defaultMappingMode : defaultMappingMode ,
57
101
bufferPool : pool .NewBufferPool (),
58
- }
102
+
103
+ knownTraces : lru .NewLRUSet (knownTraces ),
104
+ knownFrames : lru .NewLRUSet (knownFrames ),
105
+ knownExecutables : lru .NewLRUSet (knownExecutables ),
106
+ }, nil
59
107
}
60
108
61
109
func (e * elasticsearchExporter ) Start (ctx context.Context , host component.Host ) error {
@@ -579,19 +627,34 @@ func (e *elasticsearchExporter) pushProfileRecord(
579
627
profile pprofile.Profile ,
580
628
defaultSession , eventsSession , stackTracesSession , stackFramesSession , executablesSession bulkIndexerSession ,
581
629
) error {
582
- return encoder .encodeProfile (ec , profile , func (buf * bytes.Buffer , docID , index string ) error {
583
- switch index {
584
- case otelserializer .StackTraceIndex :
585
- return stackTracesSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
586
- case otelserializer .StackFrameIndex :
587
- return stackFramesSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
588
- case otelserializer .AllEventsIndex :
589
- return eventsSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
590
- case otelserializer .ExecutablesIndex :
591
- return executablesSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionUpdate )
592
- default :
593
- return defaultSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
594
- }
630
+ return e .knownTraces .WithLock (func (tracesSet lru.LockedLRUSet [string ]) error {
631
+ return e .knownFrames .WithLock (func (framesSet lru.LockedLRUSet [string ]) error {
632
+ return e .knownExecutables .WithLock (func (executablesSet lru.LockedLRUSet [string ]) error {
633
+ return encoder .encodeProfile (ec , profile , func (buf * bytes.Buffer , docID , index string ) error {
634
+ switch index {
635
+ case otelserializer .StackTraceIndex :
636
+ if ! tracesSet .CheckAndAdd (docID ) {
637
+ return stackTracesSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
638
+ }
639
+ return nil
640
+ case otelserializer .StackFrameIndex :
641
+ if ! framesSet .CheckAndAdd (docID ) {
642
+ return stackFramesSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
643
+ }
644
+ return nil
645
+ case otelserializer .AllEventsIndex :
646
+ return eventsSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
647
+ case otelserializer .ExecutablesIndex :
648
+ if ! executablesSet .CheckAndAdd (docID ) {
649
+ return executablesSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionUpdate )
650
+ }
651
+ return nil
652
+ default :
653
+ return defaultSession .Add (ctx , index , docID , "" , buf , nil , docappender .ActionCreate )
654
+ }
655
+ })
656
+ })
657
+ })
595
658
})
596
659
}
597
660
0 commit comments