Skip to content

Commit 19cbe35

Browse files
WalkerWang731albertteohalbertteoh
authored
[es] Add index rollover mode that can choose day and hour (#2965)
* add index rollover for ES storage Signed-off-by: WalkerWang731 <[email protected]> * update that separate rollover of spans and services for the es index Signed-off-by: WalkerWang731 <[email protected]> * fix the GetOperation issue and change IndexDateLayoutDependencies to defaultIndexRolloverFrequency Signed-off-by: WalkerWang731 <[email protected]> * update explain for the es.index-rollover-frequency Signed-off-by: WalkerWang731 <[email protected]> * make fmt Signed-off-by: albertteoh <[email protected]> * Fix minor formatting issues in table tests Signed-off-by: Albert Teoh <[email protected]> Co-authored-by: Albert <[email protected]> Co-authored-by: albertteoh <[email protected]>
1 parent d43af83 commit 19cbe35

File tree

8 files changed

+344
-185
lines changed

8 files changed

+344
-185
lines changed

pkg/es/config/config.go

+65-31
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,37 @@ import (
4444

4545
// Configuration describes the configuration properties needed to connect to an ElasticSearch cluster
4646
type Configuration struct {
47-
Servers []string `mapstructure:"server_urls"`
48-
RemoteReadClusters []string `mapstructure:"remote_read_clusters"`
49-
Username string `mapstructure:"username"`
50-
Password string `mapstructure:"password" json:"-"`
51-
TokenFilePath string `mapstructure:"token_file"`
52-
AllowTokenFromContext bool `mapstructure:"-"`
53-
Sniffer bool `mapstructure:"sniffer"` // https://github.com/olivere/elastic/wiki/Sniffing
54-
SnifferTLSEnabled bool `mapstructure:"sniffer_tls_enabled"`
55-
MaxDocCount int `mapstructure:"-"` // Defines maximum number of results to fetch from storage per query
56-
MaxSpanAge time.Duration `yaml:"max_span_age" mapstructure:"-"` // configures the maximum lookback on span reads
57-
NumShards int64 `yaml:"shards" mapstructure:"num_shards"`
58-
NumReplicas int64 `yaml:"replicas" mapstructure:"num_replicas"`
59-
Timeout time.Duration `validate:"min=500" mapstructure:"-"`
60-
BulkSize int `mapstructure:"-"`
61-
BulkWorkers int `mapstructure:"-"`
62-
BulkActions int `mapstructure:"-"`
63-
BulkFlushInterval time.Duration `mapstructure:"-"`
64-
IndexPrefix string `mapstructure:"index_prefix"`
65-
IndexDateLayout string `mapstructure:"index_date_layout"`
66-
Tags TagsAsFields `mapstructure:"tags_as_fields"`
67-
Enabled bool `mapstructure:"-"`
68-
TLS tlscfg.Options `mapstructure:"tls"`
69-
UseReadWriteAliases bool `mapstructure:"use_aliases"`
70-
CreateIndexTemplates bool `mapstructure:"create_mappings"`
71-
UseILM bool `mapstructure:"use_ilm"`
72-
Version uint `mapstructure:"version"`
73-
LogLevel string `mapstructure:"log_level"`
47+
Servers []string `mapstructure:"server_urls"`
48+
RemoteReadClusters []string `mapstructure:"remote_read_clusters"`
49+
Username string `mapstructure:"username"`
50+
Password string `mapstructure:"password" json:"-"`
51+
TokenFilePath string `mapstructure:"token_file"`
52+
AllowTokenFromContext bool `mapstructure:"-"`
53+
Sniffer bool `mapstructure:"sniffer"` // https://github.com/olivere/elastic/wiki/Sniffing
54+
SnifferTLSEnabled bool `mapstructure:"sniffer_tls_enabled"`
55+
MaxDocCount int `mapstructure:"-"` // Defines maximum number of results to fetch from storage per query
56+
MaxSpanAge time.Duration `yaml:"max_span_age" mapstructure:"-"` // configures the maximum lookback on span reads
57+
NumShards int64 `yaml:"shards" mapstructure:"num_shards"`
58+
NumReplicas int64 `yaml:"replicas" mapstructure:"num_replicas"`
59+
Timeout time.Duration `validate:"min=500" mapstructure:"-"`
60+
BulkSize int `mapstructure:"-"`
61+
BulkWorkers int `mapstructure:"-"`
62+
BulkActions int `mapstructure:"-"`
63+
BulkFlushInterval time.Duration `mapstructure:"-"`
64+
IndexPrefix string `mapstructure:"index_prefix"`
65+
IndexDateLayoutSpans string `mapstructure:"-"`
66+
IndexDateLayoutServices string `mapstructure:"-"`
67+
IndexDateLayoutDependencies string `mapstructure:"-"`
68+
IndexRolloverFrequencySpans string `mapstructure:"-"`
69+
IndexRolloverFrequencyServices string `mapstructure:"-"`
70+
Tags TagsAsFields `mapstructure:"tags_as_fields"`
71+
Enabled bool `mapstructure:"-"`
72+
TLS tlscfg.Options `mapstructure:"tls"`
73+
UseReadWriteAliases bool `mapstructure:"use_aliases"`
74+
CreateIndexTemplates bool `mapstructure:"create_mappings"`
75+
UseILM bool `mapstructure:"use_ilm"`
76+
Version uint `mapstructure:"version"`
77+
LogLevel string `mapstructure:"log_level"`
7478
}
7579

7680
// TagsAsFields holds configuration for tag schema.
@@ -96,7 +100,11 @@ type ClientBuilder interface {
96100
GetMaxSpanAge() time.Duration
97101
GetMaxDocCount() int
98102
GetIndexPrefix() string
99-
GetIndexDateLayout() string
103+
GetIndexDateLayoutSpans() string
104+
GetIndexDateLayoutServices() string
105+
GetIndexDateLayoutDependencies() string
106+
GetIndexRolloverFrequencySpansDuration() time.Duration
107+
GetIndexRolloverFrequencyServicesDuration() time.Duration
100108
GetTagsFilePath() string
101109
GetAllTagsAsFields() bool
102110
GetTagDotReplacement() string
@@ -281,9 +289,35 @@ func (c *Configuration) GetIndexPrefix() string {
281289
return c.IndexPrefix
282290
}
283291

284-
// GetIndexDateLayout returns index date layout
285-
func (c *Configuration) GetIndexDateLayout() string {
286-
return c.IndexDateLayout
292+
// GetIndexDateLayoutSpans returns jaeger-span index date layout
293+
func (c *Configuration) GetIndexDateLayoutSpans() string {
294+
return c.IndexDateLayoutSpans
295+
}
296+
297+
// GetIndexDateLayoutServices returns jaeger-service index date layout
298+
func (c *Configuration) GetIndexDateLayoutServices() string {
299+
return c.IndexDateLayoutServices
300+
}
301+
302+
// GetIndexDateLayoutDependencies returns jaeger-dependencies index date layout
303+
func (c *Configuration) GetIndexDateLayoutDependencies() string {
304+
return c.IndexDateLayoutDependencies
305+
}
306+
307+
// GetIndexRolloverFrequencySpansDuration returns jaeger-span index rollover frequency duration
308+
func (c *Configuration) GetIndexRolloverFrequencySpansDuration() time.Duration {
309+
if c.IndexRolloverFrequencySpans == "hour" {
310+
return -1 * time.Hour
311+
}
312+
return -24 * time.Hour
313+
}
314+
315+
// GetIndexRolloverFrequencyServicesDuration returns jaeger-service index rollover frequency duration
316+
func (c *Configuration) GetIndexRolloverFrequencyServicesDuration() time.Duration {
317+
if c.IndexRolloverFrequencyServices == "hour" {
318+
return -1 * time.Hour
319+
}
320+
return -24 * time.Hour
287321
}
288322

289323
// GetTagsFilePath returns a path to file containing tag keys

plugin/storage/es/factory.go

+26-22
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func (f *Factory) CreateSpanWriter() (spanstore.Writer, error) {
110110
// CreateDependencyReader implements storage.Factory
111111
func (f *Factory) CreateDependencyReader() (dependencystore.Reader, error) {
112112
reader := esDepStore.NewDependencyStore(f.primaryClient, f.logger, f.primaryConfig.GetIndexPrefix(),
113-
f.primaryConfig.GetIndexDateLayout(), f.primaryConfig.GetMaxDocCount())
113+
f.primaryConfig.GetIndexDateLayoutDependencies(), f.primaryConfig.GetMaxDocCount())
114114
return reader, nil
115115
}
116116

@@ -141,17 +141,20 @@ func createSpanReader(
141141
return nil, fmt.Errorf("--es.use-ilm must always be used in conjunction with --es.use-aliases to ensure ES writers and readers refer to the single index mapping")
142142
}
143143
return esSpanStore.NewSpanReader(esSpanStore.SpanReaderParams{
144-
Client: client,
145-
Logger: logger,
146-
MetricsFactory: mFactory,
147-
MaxDocCount: cfg.GetMaxDocCount(),
148-
MaxSpanAge: cfg.GetMaxSpanAge(),
149-
IndexPrefix: cfg.GetIndexPrefix(),
150-
IndexDateLayout: cfg.GetIndexDateLayout(),
151-
TagDotReplacement: cfg.GetTagDotReplacement(),
152-
UseReadWriteAliases: cfg.GetUseReadWriteAliases(),
153-
Archive: archive,
154-
RemoteReadClusters: cfg.GetRemoteReadClusters(),
144+
Client: client,
145+
Logger: logger,
146+
MetricsFactory: mFactory,
147+
MaxDocCount: cfg.GetMaxDocCount(),
148+
MaxSpanAge: cfg.GetMaxSpanAge(),
149+
IndexPrefix: cfg.GetIndexPrefix(),
150+
SpanIndexDateLayout: cfg.GetIndexDateLayoutSpans(),
151+
ServiceIndexDateLayout: cfg.GetIndexDateLayoutServices(),
152+
SpanIndexRolloverFrequency: cfg.GetIndexRolloverFrequencySpansDuration(),
153+
ServiceIndexRolloverFrequency: cfg.GetIndexRolloverFrequencyServicesDuration(),
154+
TagDotReplacement: cfg.GetTagDotReplacement(),
155+
UseReadWriteAliases: cfg.GetUseReadWriteAliases(),
156+
Archive: archive,
157+
RemoteReadClusters: cfg.GetRemoteReadClusters(),
155158
}), nil
156159
}
157160

@@ -186,16 +189,17 @@ func createSpanWriter(
186189
return nil, err
187190
}
188191
writer := esSpanStore.NewSpanWriter(esSpanStore.SpanWriterParams{
189-
Client: client,
190-
Logger: logger,
191-
MetricsFactory: mFactory,
192-
IndexPrefix: cfg.GetIndexPrefix(),
193-
IndexDateLayout: cfg.GetIndexDateLayout(),
194-
AllTagsAsFields: cfg.GetAllTagsAsFields(),
195-
TagKeysAsFields: tags,
196-
TagDotReplacement: cfg.GetTagDotReplacement(),
197-
Archive: archive,
198-
UseReadWriteAliases: cfg.GetUseReadWriteAliases(),
192+
Client: client,
193+
Logger: logger,
194+
MetricsFactory: mFactory,
195+
IndexPrefix: cfg.GetIndexPrefix(),
196+
SpanIndexDateLayout: cfg.GetIndexDateLayoutSpans(),
197+
ServiceIndexDateLayout: cfg.GetIndexDateLayoutServices(),
198+
AllTagsAsFields: cfg.GetAllTagsAsFields(),
199+
TagKeysAsFields: tags,
200+
TagDotReplacement: cfg.GetTagDotReplacement(),
201+
Archive: archive,
202+
UseReadWriteAliases: cfg.GetUseReadWriteAliases(),
199203
})
200204
if cfg.IsCreateIndexTemplates() {
201205
err := writer.CreateTemplates(spanMapping, serviceMapping, cfg.GetIndexPrefix())

plugin/storage/es/options.go

+61-34
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package es
1717

1818
import (
1919
"flag"
20-
"fmt"
2120
"strings"
2221
"time"
2322

@@ -29,42 +28,46 @@ import (
2928
)
3029

3130
const (
32-
suffixUsername = ".username"
33-
suffixPassword = ".password"
34-
suffixSniffer = ".sniffer"
35-
suffixSnifferTLSEnabled = ".sniffer-tls-enabled"
36-
suffixTokenPath = ".token-file"
37-
suffixServerURLs = ".server-urls"
38-
suffixRemoteReadClusters = ".remote-read-clusters"
39-
suffixMaxSpanAge = ".max-span-age"
40-
suffixNumShards = ".num-shards"
41-
suffixNumReplicas = ".num-replicas"
42-
suffixBulkSize = ".bulk.size"
43-
suffixBulkWorkers = ".bulk.workers"
44-
suffixBulkActions = ".bulk.actions"
45-
suffixBulkFlushInterval = ".bulk.flush-interval"
46-
suffixTimeout = ".timeout"
47-
suffixIndexPrefix = ".index-prefix"
48-
suffixIndexDateSeparator = ".index-date-separator"
49-
suffixTagsAsFields = ".tags-as-fields"
50-
suffixTagsAsFieldsAll = suffixTagsAsFields + ".all"
51-
suffixTagsAsFieldsInclude = suffixTagsAsFields + ".include"
52-
suffixTagsFile = suffixTagsAsFields + ".config-file"
53-
suffixTagDeDotChar = suffixTagsAsFields + ".dot-replacement"
54-
suffixReadAlias = ".use-aliases"
55-
suffixUseILM = ".use-ilm"
56-
suffixCreateIndexTemplate = ".create-index-templates"
57-
suffixEnabled = ".enabled"
58-
suffixVersion = ".version"
59-
suffixMaxDocCount = ".max-doc-count"
60-
suffixLogLevel = ".log-level"
31+
suffixUsername = ".username"
32+
suffixPassword = ".password"
33+
suffixSniffer = ".sniffer"
34+
suffixSnifferTLSEnabled = ".sniffer-tls-enabled"
35+
suffixTokenPath = ".token-file"
36+
suffixServerURLs = ".server-urls"
37+
suffixRemoteReadClusters = ".remote-read-clusters"
38+
suffixMaxSpanAge = ".max-span-age"
39+
suffixNumShards = ".num-shards"
40+
suffixNumReplicas = ".num-replicas"
41+
suffixBulkSize = ".bulk.size"
42+
suffixBulkWorkers = ".bulk.workers"
43+
suffixBulkActions = ".bulk.actions"
44+
suffixBulkFlushInterval = ".bulk.flush-interval"
45+
suffixTimeout = ".timeout"
46+
suffixIndexPrefix = ".index-prefix"
47+
suffixIndexDateSeparator = ".index-date-separator"
48+
suffixIndexRolloverFrequencySpans = ".index-rollover-frequency-spans"
49+
suffixIndexRolloverFrequencyServices = ".index-rollover-frequency-services"
50+
suffixTagsAsFields = ".tags-as-fields"
51+
suffixTagsAsFieldsAll = suffixTagsAsFields + ".all"
52+
suffixTagsAsFieldsInclude = suffixTagsAsFields + ".include"
53+
suffixTagsFile = suffixTagsAsFields + ".config-file"
54+
suffixTagDeDotChar = suffixTagsAsFields + ".dot-replacement"
55+
suffixReadAlias = ".use-aliases"
56+
suffixUseILM = ".use-ilm"
57+
suffixCreateIndexTemplate = ".create-index-templates"
58+
suffixEnabled = ".enabled"
59+
suffixVersion = ".version"
60+
suffixMaxDocCount = ".max-doc-count"
61+
suffixLogLevel = ".log-level"
6162
// default number of documents to return from a query (elasticsearch allowed limit)
6263
// see search.max_buckets and index.max_result_window
6364
defaultMaxDocCount = 10_000
6465
defaultServerURL = "http://127.0.0.1:9200"
6566
defaultRemoteReadClusters = ""
6667
// default separator for Elasticsearch index date layout.
6768
defaultIndexDateSeparator = "-"
69+
70+
defaultIndexRolloverFrequency = "day"
6871
)
6972

7073
// TODO this should be moved next to config.Configuration struct (maybe ./flags package)
@@ -205,7 +208,17 @@ func addFlags(flagSet *flag.FlagSet, nsConfig *namespaceConfig) {
205208
flagSet.String(
206209
nsConfig.namespace+suffixIndexDateSeparator,
207210
defaultIndexDateSeparator,
208-
"Optional date separator of Jaeger indices. For example \".\" creates \"jaeger-span-2020.11.20 \".")
211+
"Optional date separator of Jaeger indices. For example \".\" creates \"jaeger-span-2020.11.20\".")
212+
flagSet.String(
213+
nsConfig.namespace+suffixIndexRolloverFrequencySpans,
214+
defaultIndexRolloverFrequency,
215+
"Rotates jaeger-span indices over the given period. For example \"day\" creates \"jaeger-span-yyyy-MM-dd\" every day after UTC 12AM. Valid options: [hour, day]. "+
216+
"This does not delete old indices. For details on complete index management solutions supported by Jaeger, refer to: https://www.jaegertracing.io/docs/deployment/#elasticsearch-rollover")
217+
flagSet.String(
218+
nsConfig.namespace+suffixIndexRolloverFrequencyServices,
219+
defaultIndexRolloverFrequency,
220+
"Rotates jaeger-service indices over the given period. For example \"day\" creates \"jaeger-service-yyyy-MM-dd\" every day after UTC 12AM. Valid options: [hour, day]. "+
221+
"This does not delete old indices. For details on complete index management solutions supported by Jaeger, refer to: https://www.jaegertracing.io/docs/deployment/#elasticsearch-rollover")
209222
flagSet.Bool(
210223
nsConfig.namespace+suffixTagsAsFieldsAll,
211224
nsConfig.Tags.AllAsFields,
@@ -295,7 +308,6 @@ func initFromViper(cfg *namespaceConfig, v *viper.Viper) {
295308
cfg.BulkFlushInterval = v.GetDuration(cfg.namespace + suffixBulkFlushInterval)
296309
cfg.Timeout = v.GetDuration(cfg.namespace + suffixTimeout)
297310
cfg.IndexPrefix = v.GetString(cfg.namespace + suffixIndexPrefix)
298-
cfg.IndexDateLayout = initDateLayout(v.GetString(cfg.namespace + suffixIndexDateSeparator))
299311
cfg.Tags.AllAsFields = v.GetBool(cfg.namespace + suffixTagsAsFieldsAll)
300312
cfg.Tags.Include = v.GetString(cfg.namespace + suffixTagsAsFieldsInclude)
301313
cfg.Tags.File = v.GetString(cfg.namespace + suffixTagsFile)
@@ -317,6 +329,16 @@ func initFromViper(cfg *namespaceConfig, v *viper.Viper) {
317329
if len(remoteReadClusters) > 0 {
318330
cfg.RemoteReadClusters = strings.Split(remoteReadClusters, ",")
319331
}
332+
333+
cfg.IndexRolloverFrequencySpans = strings.ToLower(v.GetString(cfg.namespace + suffixIndexRolloverFrequencySpans))
334+
cfg.IndexRolloverFrequencyServices = strings.ToLower(v.GetString(cfg.namespace + suffixIndexRolloverFrequencyServices))
335+
336+
separator := v.GetString(cfg.namespace + suffixIndexDateSeparator)
337+
cfg.IndexDateLayoutSpans = initDateLayout(cfg.IndexRolloverFrequencySpans, separator)
338+
cfg.IndexDateLayoutServices = initDateLayout(cfg.IndexRolloverFrequencyServices, separator)
339+
340+
// Dependencies calculation should be daily, and this index size is very small
341+
cfg.IndexDateLayoutDependencies = initDateLayout(defaultIndexRolloverFrequency, separator)
320342
}
321343

322344
// GetPrimary returns primary configuration.
@@ -343,6 +365,11 @@ func stripWhiteSpace(str string) string {
343365
return strings.Replace(str, " ", "", -1)
344366
}
345367

346-
func initDateLayout(separator string) string {
347-
return fmt.Sprintf("2006%s01%s02", separator, separator)
368+
func initDateLayout(rolloverFreq, sep string) string {
369+
// default to daily format
370+
indexLayout := "2006" + sep + "01" + sep + "02"
371+
if rolloverFreq == "hour" {
372+
indexLayout = indexLayout + sep + "15"
373+
}
374+
return indexLayout
348375
}

0 commit comments

Comments
 (0)