Skip to content

Commit a9f9fcb

Browse files
[refractor] Switch to enums for ES mappings (jaegertracing#6091)
## Which problem is this PR solving? - Resolves jaegertracing#6067 - Follows up jaegertracing#6068 ## Description of the changes - Currently in `plugin/storage/es/mappings/mapping.go` we are using bare string inorder to for the file mapping. This PR refractors this approach to use enums instead of string ## How was this change tested? - running `go test` in respective files/directories ## Checklist - [x] I have read https://github.com/jaegertracing/jaeger/blob/master/CONTRIBUTING_GUIDELINES.md - [x] I have signed all commits - [x] I have added unit tests for the new functionality - [x] I have run lint and test steps successfully - for `jaeger`: `make lint test` - for `jaeger-ui`: `yarn lint` and `yarn test` --------- Signed-off-by: Saumya Shah <[email protected]> Co-authored-by: Yuri Shkuro <[email protected]>
1 parent 32112eb commit a9f9fcb

File tree

6 files changed

+125
-55
lines changed

6 files changed

+125
-55
lines changed

cmd/es-rollover/app/init/action.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type Action struct {
2828
ILMClient client.IndexManagementLifecycleAPI
2929
}
3030

31-
func (c Action) getMapping(version uint, templateName string) (string, error) {
31+
func (c Action) getMapping(version uint, mappingType mappings.MappingType) (string, error) {
3232
c.Config.Indices.IndexPrefix = config.IndexPrefix(c.Config.Config.IndexPrefix)
3333
mappingBuilder := mappings.MappingBuilder{
3434
TemplateBuilder: es.TextTemplateBuilder{},
@@ -38,7 +38,7 @@ func (c Action) getMapping(version uint, templateName string) (string, error) {
3838
EsVersion: version,
3939
}
4040

41-
return mappingBuilder.GetMapping(templateName)
41+
return mappingBuilder.GetMapping(mappingType)
4242
}
4343

4444
// Do the init action
@@ -96,10 +96,16 @@ func createIndexIfNotExist(c client.IndexAPI, index string) error {
9696
}
9797

9898
func (c Action) init(version uint, indexopt app.IndexOption) error {
99-
mapping, err := c.getMapping(version, indexopt.Mapping)
99+
mappingType, err := mappings.MappingTypeFromString(indexopt.Mapping)
100100
if err != nil {
101101
return err
102102
}
103+
104+
mapping, err := c.getMapping(version, mappingType)
105+
if err != nil {
106+
return err
107+
}
108+
103109
err = c.IndicesClient.CreateTemplate(mapping, indexopt.TemplateName())
104110
if err != nil {
105111
return err

cmd/esmapping-generator/app/renderer/render.go

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,6 @@ import (
1212
"github.com/jaegertracing/jaeger/plugin/storage/es/mappings"
1313
)
1414

15-
var supportedMappings = map[string]struct{}{
16-
"jaeger-span": {},
17-
"jaeger-service": {},
18-
"jaeger-dependencies": {},
19-
"jaeger-sampling": {},
20-
}
21-
2215
// GetMappingAsString returns rendered index templates as string
2316
func GetMappingAsString(builder es.TemplateBuilder, opt *app.Options) (string, error) {
2417
enableILM, err := strconv.ParseBool(opt.UseILM)
@@ -43,11 +36,11 @@ func GetMappingAsString(builder es.TemplateBuilder, opt *app.Options) (string, e
4336
UseILM: enableILM,
4437
ILMPolicyName: opt.ILMPolicyName,
4538
}
46-
return mappingBuilder.GetMapping(opt.Mapping)
47-
}
4839

49-
// IsValidOption checks if passed option is a valid index template.
50-
func IsValidOption(val string) bool {
51-
_, ok := supportedMappings[val]
52-
return ok
40+
mappingType, err := mappings.MappingTypeFromString(opt.Mapping)
41+
if err != nil {
42+
return "", err
43+
}
44+
45+
return mappingBuilder.GetMapping(mappingType)
5346
}

cmd/esmapping-generator/app/renderer/render_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/jaegertracing/jaeger/cmd/esmapping-generator/app"
1616
"github.com/jaegertracing/jaeger/pkg/es/mocks"
1717
"github.com/jaegertracing/jaeger/pkg/testutils"
18+
"github.com/jaegertracing/jaeger/plugin/storage/es/mappings"
1819
)
1920

2021
func TestIsValidOption(t *testing.T) {
@@ -29,7 +30,12 @@ func TestIsValidOption(t *testing.T) {
2930
}
3031
for _, test := range tests {
3132
t.Run(test.name, func(t *testing.T) {
32-
assert.Equal(t, test.expectedValue, IsValidOption(test.arg))
33+
_, err := mappings.MappingTypeFromString(test.arg)
34+
if test.expectedValue {
35+
assert.NoError(t, err)
36+
} else {
37+
assert.Error(t, err)
38+
}
3339
})
3440
}
3541
}
@@ -53,6 +59,10 @@ func Test_getMappingAsString(t *testing.T) {
5359
name: "Parse bool error", args: app.Options{Mapping: "jaeger-span", EsVersion: 7, Shards: 5, Replicas: 1, IndexPrefix: "test", UseILM: "foo", ILMPolicyName: "jaeger-test-policy"},
5460
wantErr: errors.New("strconv.ParseBool: parsing \"foo\": invalid syntax"),
5561
},
62+
{
63+
name: "Invalid Mapping type", args: app.Options{Mapping: "invalid-mapping", EsVersion: 7, Shards: 5, Replicas: 1, IndexPrefix: "test", UseILM: "true", ILMPolicyName: "jaeger-test-policy"},
64+
wantErr: errors.New("invalid mapping type: invalid-mapping"),
65+
},
5666
}
5767
for _, tt := range tests {
5868
t.Run(tt.name, func(t *testing.T) {

cmd/esmapping-generator/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/jaegertracing/jaeger/cmd/esmapping-generator/app/renderer"
1515
"github.com/jaegertracing/jaeger/pkg/es"
1616
"github.com/jaegertracing/jaeger/pkg/version"
17+
"github.com/jaegertracing/jaeger/plugin/storage/es/mappings"
1718
)
1819

1920
func main() {
@@ -24,7 +25,7 @@ func main() {
2425
Short: "Jaeger esmapping-generator prints rendered mappings as string",
2526
Long: `Jaeger esmapping-generator renders passed templates with provided values and prints rendered output to stdout`,
2627
Run: func(_ *cobra.Command, _ /* args */ []string) {
27-
if !renderer.IsValidOption(options.Mapping) {
28+
if _, err := mappings.MappingTypeFromString(options.Mapping); err != nil {
2829
logger.Fatal("please pass either 'jaeger-service' or 'jaeger-span' as argument")
2930
}
3031

plugin/storage/es/mappings/mapping.go

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package mappings
66
import (
77
"bytes"
88
"embed"
9-
"strings"
9+
"fmt"
1010

1111
"github.com/jaegertracing/jaeger/pkg/es"
1212
"github.com/jaegertracing/jaeger/pkg/es/config"
@@ -17,6 +17,16 @@ import (
1717
//go:embed *.json
1818
var MAPPINGS embed.FS
1919

20+
// MappingType represents the type of Elasticsearch mapping
21+
type MappingType int
22+
23+
const (
24+
SpanMapping MappingType = iota
25+
ServiceMapping
26+
DependenciesMapping
27+
SamplingMapping
28+
)
29+
2030
// MappingBuilder holds common parameters required to render an elasticsearch index template
2131
type MappingBuilder struct {
2232
TemplateBuilder es.TemplateBuilder
@@ -36,25 +46,25 @@ type templateParams struct {
3646
Priority int64
3747
}
3848

39-
func (mb MappingBuilder) getMappingTemplateOptions(mapping string) templateParams {
49+
func (mb MappingBuilder) getMappingTemplateOptions(mappingType MappingType) templateParams {
4050
mappingOpts := templateParams{}
4151
mappingOpts.UseILM = mb.UseILM
4252
mappingOpts.ILMPolicyName = mb.ILMPolicyName
4353

44-
switch {
45-
case strings.Contains(mapping, "span"):
54+
switch mappingType {
55+
case SpanMapping:
4656
mappingOpts.Shards = mb.Indices.Spans.Shards
4757
mappingOpts.Replicas = mb.Indices.Spans.Replicas
4858
mappingOpts.Priority = mb.Indices.Spans.Priority
49-
case strings.Contains(mapping, "service"):
59+
case ServiceMapping:
5060
mappingOpts.Shards = mb.Indices.Services.Shards
5161
mappingOpts.Replicas = mb.Indices.Services.Replicas
5262
mappingOpts.Priority = mb.Indices.Services.Priority
53-
case strings.Contains(mapping, "dependencies"):
63+
case DependenciesMapping:
5464
mappingOpts.Shards = mb.Indices.Dependencies.Shards
5565
mappingOpts.Replicas = mb.Indices.Dependencies.Replicas
5666
mappingOpts.Priority = mb.Indices.Dependencies.Priority
57-
case strings.Contains(mapping, "sampling"):
67+
case SamplingMapping:
5868
mappingOpts.Shards = mb.Indices.Sampling.Shards
5969
mappingOpts.Replicas = mb.Indices.Sampling.Replicas
6070
mappingOpts.Priority = mb.Indices.Sampling.Priority
@@ -63,24 +73,50 @@ func (mb MappingBuilder) getMappingTemplateOptions(mapping string) templateParam
6373
return mappingOpts
6474
}
6575

66-
// GetMapping returns the rendered mapping based on elasticsearch version
67-
func (mb *MappingBuilder) GetMapping(mapping string) (string, error) {
68-
templateOpts := mb.getMappingTemplateOptions(mapping)
69-
if mb.EsVersion == 8 {
70-
return mb.renderMapping(mapping+"-8.json", templateOpts)
71-
} else if mb.EsVersion == 7 {
72-
return mb.renderMapping(mapping+"-7.json", templateOpts)
76+
func (mt MappingType) String() string {
77+
switch mt {
78+
case SpanMapping:
79+
return "jaeger-span"
80+
case ServiceMapping:
81+
return "jaeger-service"
82+
case DependenciesMapping:
83+
return "jaeger-dependencies"
84+
case SamplingMapping:
85+
return "jaeger-sampling"
86+
default:
87+
return "unknown"
88+
}
89+
}
90+
91+
// MappingTypeFromString converts a string to a MappingType
92+
func MappingTypeFromString(val string) (MappingType, error) {
93+
switch val {
94+
case "jaeger-span":
95+
return SpanMapping, nil
96+
case "jaeger-service":
97+
return ServiceMapping, nil
98+
case "jaeger-dependencies":
99+
return DependenciesMapping, nil
100+
case "jaeger-sampling":
101+
return SamplingMapping, nil
102+
default:
103+
return -1, fmt.Errorf("invalid mapping type: %s", val)
73104
}
74-
return mb.renderMapping(mapping+"-6.json", templateOpts)
105+
}
106+
107+
// GetMapping returns the rendered mapping based on elasticsearch version
108+
func (mb *MappingBuilder) GetMapping(mappingType MappingType) (string, error) {
109+
templateOpts := mb.getMappingTemplateOptions(mappingType)
110+
return mb.renderMapping(fmt.Sprintf("%s-%d.json", mappingType.String(), mb.EsVersion), templateOpts)
75111
}
76112

77113
// GetSpanServiceMappings returns span and service mappings
78114
func (mb *MappingBuilder) GetSpanServiceMappings() (spanMapping string, serviceMapping string, err error) {
79-
spanMapping, err = mb.GetMapping("jaeger-span")
115+
spanMapping, err = mb.GetMapping(SpanMapping)
80116
if err != nil {
81117
return "", "", err
82118
}
83-
serviceMapping, err = mb.GetMapping("jaeger-service")
119+
serviceMapping, err = mb.GetMapping(ServiceMapping)
84120
if err != nil {
85121
return "", "", err
86122
}
@@ -89,12 +125,12 @@ func (mb *MappingBuilder) GetSpanServiceMappings() (spanMapping string, serviceM
89125

90126
// GetDependenciesMappings returns dependencies mappings
91127
func (mb *MappingBuilder) GetDependenciesMappings() (string, error) {
92-
return mb.GetMapping("jaeger-dependencies")
128+
return mb.GetMapping(DependenciesMapping)
93129
}
94130

95131
// GetSamplingMappings returns sampling mappings
96132
func (mb *MappingBuilder) GetSamplingMappings() (string, error) {
97-
return mb.GetMapping("jaeger-sampling")
133+
return mb.GetMapping(SamplingMapping)
98134
}
99135

100136
func loadMapping(name string) string {

plugin/storage/es/mappings/mapping_test.go

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,24 @@ import (
2626
var FIXTURES embed.FS
2727

2828
func TestMappingBuilderGetMapping(t *testing.T) {
29-
const (
30-
jaegerSpan = "jaeger-span"
31-
jaegerService = "jaeger-service"
32-
jaegerDependencies = "jaeger-dependencies"
33-
)
3429
tests := []struct {
35-
mapping string
30+
mapping MappingType
3631
esVersion uint
3732
}{
38-
{mapping: jaegerSpan, esVersion: 8},
39-
{mapping: jaegerSpan, esVersion: 7},
40-
{mapping: jaegerSpan, esVersion: 6},
41-
{mapping: jaegerService, esVersion: 8},
42-
{mapping: jaegerService, esVersion: 7},
43-
{mapping: jaegerService, esVersion: 6},
44-
{mapping: jaegerDependencies, esVersion: 8},
45-
{mapping: jaegerDependencies, esVersion: 7},
46-
{mapping: jaegerDependencies, esVersion: 6},
33+
{mapping: SpanMapping, esVersion: 8},
34+
{mapping: SpanMapping, esVersion: 7},
35+
{mapping: SpanMapping, esVersion: 6},
36+
{mapping: ServiceMapping, esVersion: 8},
37+
{mapping: ServiceMapping, esVersion: 7},
38+
{mapping: ServiceMapping, esVersion: 6},
39+
{mapping: DependenciesMapping, esVersion: 8},
40+
{mapping: DependenciesMapping, esVersion: 7},
41+
{mapping: DependenciesMapping, esVersion: 6},
4742
}
4843
for _, tt := range tests {
49-
t.Run(tt.mapping, func(t *testing.T) {
44+
templateName := tt.mapping.String()
45+
46+
t.Run(templateName, func(t *testing.T) {
5047
defaultOpts := func(p int64) config.IndexOptions {
5148
return config.IndexOptions{
5249
Shards: 3,
@@ -75,14 +72,41 @@ func TestMappingBuilderGetMapping(t *testing.T) {
7572
require.NoError(t, err)
7673
var wantbytes []byte
7774
fileSuffix := fmt.Sprintf("-%d", tt.esVersion)
78-
wantbytes, err = FIXTURES.ReadFile("fixtures/" + tt.mapping + fileSuffix + ".json")
75+
wantbytes, err = FIXTURES.ReadFile("fixtures/" + templateName + fileSuffix + ".json")
7976
require.NoError(t, err)
8077
want := string(wantbytes)
8178
assert.Equal(t, want, got)
8279
})
8380
}
8481
}
8582

83+
func TestMappingTypeFromString(t *testing.T) {
84+
tests := []struct {
85+
input string
86+
expected MappingType
87+
hasError bool
88+
}{
89+
{"jaeger-span", SpanMapping, false},
90+
{"jaeger-service", ServiceMapping, false},
91+
{"jaeger-dependencies", DependenciesMapping, false},
92+
{"jaeger-sampling", SamplingMapping, false},
93+
{"invalid", MappingType(-1), true},
94+
}
95+
96+
for _, tt := range tests {
97+
t.Run(tt.input, func(t *testing.T) {
98+
result, err := MappingTypeFromString(tt.input)
99+
if tt.hasError {
100+
require.Error(t, err)
101+
assert.Equal(t, "unknown", result.String())
102+
} else {
103+
require.NoError(t, err)
104+
assert.Equal(t, tt.expected, result)
105+
}
106+
})
107+
}
108+
}
109+
86110
func TestMappingBuilderLoadMapping(t *testing.T) {
87111
tests := []struct {
88112
name string
@@ -167,7 +191,7 @@ func TestMappingBuilderFixMapping(t *testing.T) {
167191
UseILM: true,
168192
ILMPolicyName: "jaeger-test-policy",
169193
}
170-
_, err := mappingBuilder.renderMapping("test", mappingBuilder.getMappingTemplateOptions("test"))
194+
_, err := mappingBuilder.renderMapping("test", mappingBuilder.getMappingTemplateOptions(SpanMapping))
171195
if test.err != "" {
172196
require.EqualError(t, err, test.err)
173197
} else {

0 commit comments

Comments
 (0)