Skip to content

[ES] Move DB model out of v1/elasticsearch/internal/spanstore/internal #6894

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions internal/storage/elasticsearch/dbmodel/dot_replacer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Copyright (c) 2025 The Jaeger Authors.
// SPDX-License-Identifier: Apache-2.0

package dbmodel

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestDotReplacement(t *testing.T) {
converter := NewDotReplacer("#")
k := "foo.foo"
assert.Equal(t, k, converter.ReplaceDotReplacement(converter.ReplaceDot(k)))
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) 2023 The Jaeger Authors.
// Copyright (c) 2025 The Jaeger Authors.
// SPDX-License-Identifier: Apache-2.0

package dbmodel
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ package spanstore
import (
"context"

"github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch/spanstore/internal/dbmodel"
"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
)

// CoreSpanReader is a DB-Level abstraction which directly deals with database level operations
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@
// Copyright (c) 2018 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0

package dbmodel
package spanstore

import (
"strings"

"github.com/jaegertracing/jaeger-idl/model/v1"
"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
)

// NewFromDomain creates FromDomain used to convert model span to db span
Expand All @@ -28,15 +29,15 @@ type FromDomain struct {

// FromDomainEmbedProcess converts model.Span into json.Span format.
// This format includes a ParentSpanID and an embedded Process.
func (fd FromDomain) FromDomainEmbedProcess(span *model.Span) *Span {
func (fd FromDomain) FromDomainEmbedProcess(span *model.Span) *dbmodel.Span {
return fd.convertSpanEmbedProcess(span)
}

func (fd FromDomain) convertSpanInternal(span *model.Span) Span {
func (fd FromDomain) convertSpanInternal(span *model.Span) dbmodel.Span {
tags, tagsMap := fd.convertKeyValuesString(span.Tags)
return Span{
TraceID: TraceID(span.TraceID.String()),
SpanID: SpanID(span.SpanID.String()),
return dbmodel.Span{
TraceID: dbmodel.TraceID(span.TraceID.String()),
SpanID: dbmodel.SpanID(span.SpanID.String()),
Flags: uint32(span.Flags),
OperationName: span.OperationName,
StartTime: model.TimeAsEpochMicroseconds(span.StartTime),
Expand All @@ -48,35 +49,35 @@ func (fd FromDomain) convertSpanInternal(span *model.Span) Span {
}
}

func (fd FromDomain) convertSpanEmbedProcess(span *model.Span) *Span {
func (fd FromDomain) convertSpanEmbedProcess(span *model.Span) *dbmodel.Span {
s := fd.convertSpanInternal(span)
s.Process = fd.convertProcess(span.Process)
s.References = fd.convertReferences(span)
return &s
}

func (fd FromDomain) convertReferences(span *model.Span) []Reference {
out := make([]Reference, 0, len(span.References))
func (fd FromDomain) convertReferences(span *model.Span) []dbmodel.Reference {
out := make([]dbmodel.Reference, 0, len(span.References))
for _, ref := range span.References {
out = append(out, Reference{
out = append(out, dbmodel.Reference{
RefType: fd.convertRefType(ref.RefType),
TraceID: TraceID(ref.TraceID.String()),
SpanID: SpanID(ref.SpanID.String()),
TraceID: dbmodel.TraceID(ref.TraceID.String()),
SpanID: dbmodel.SpanID(ref.SpanID.String()),
})
}
return out
}

func (FromDomain) convertRefType(refType model.SpanRefType) ReferenceType {
func (FromDomain) convertRefType(refType model.SpanRefType) dbmodel.ReferenceType {
if refType == model.FollowsFrom {
return FollowsFrom
return dbmodel.FollowsFrom
}
return ChildOf
return dbmodel.ChildOf
}

func (fd FromDomain) convertKeyValuesString(keyValues model.KeyValues) ([]KeyValue, map[string]any) {
func (fd FromDomain) convertKeyValuesString(keyValues model.KeyValues) ([]dbmodel.KeyValue, map[string]any) {
var tagsMap map[string]any
var kvs []KeyValue
var kvs []dbmodel.KeyValue
for _, kv := range keyValues {
if kv.GetVType() != model.BinaryType && (fd.allTagsAsFields || fd.tagKeysAsFields[kv.Key]) {
if tagsMap == nil {
Expand All @@ -88,39 +89,39 @@ func (fd FromDomain) convertKeyValuesString(keyValues model.KeyValues) ([]KeyVal
}
}
if kvs == nil {
kvs = make([]KeyValue, 0)
kvs = make([]dbmodel.KeyValue, 0)
}
return kvs, tagsMap
}

func (FromDomain) convertLogs(logs []model.Log) []Log {
out := make([]Log, len(logs))
func (FromDomain) convertLogs(logs []model.Log) []dbmodel.Log {
out := make([]dbmodel.Log, len(logs))
for i, log := range logs {
var kvs []KeyValue
var kvs []dbmodel.KeyValue
for _, kv := range log.Fields {
kvs = append(kvs, convertKeyValue(kv))
}
out[i] = Log{
out[i] = dbmodel.Log{
Timestamp: model.TimeAsEpochMicroseconds(log.Timestamp),
Fields: kvs,
}
}
return out
}

func (fd FromDomain) convertProcess(process *model.Process) Process {
func (fd FromDomain) convertProcess(process *model.Process) dbmodel.Process {
tags, tagsMap := fd.convertKeyValuesString(process.Tags)
return Process{
return dbmodel.Process{
ServiceName: process.ServiceName,
Tags: tags,
Tag: tagsMap,
}
}

func convertKeyValue(kv model.KeyValue) KeyValue {
return KeyValue{
func convertKeyValue(kv model.KeyValue) dbmodel.KeyValue {
return dbmodel.KeyValue{
Key: kv.Key,
Type: ValueType(strings.ToLower(kv.VType.String())),
Type: dbmodel.ValueType(strings.ToLower(kv.VType.String())),
Value: kv.AsString(),
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Copyright (c) 2018 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0

package dbmodel
package spanstore

import (
"bytes"
Expand All @@ -17,6 +17,7 @@ import (
"github.com/stretchr/testify/require"

"github.com/jaegertracing/jaeger-idl/model/v1"
"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
)

const NumberOfFixtures = 1
Expand All @@ -31,7 +32,7 @@ func TestFromDomainEmbedProcess(t *testing.T) {
converter := NewFromDomain(false, nil, ":")
embeddedSpan := converter.FromDomainEmbedProcess(&span)

var expectedSpan Span
var expectedSpan dbmodel.Span
require.NoError(t, json.Unmarshal(jsonStr, &expectedSpan))

testJSONEncoding(t, i, jsonStr, embeddedSpan)
Expand Down Expand Up @@ -107,35 +108,35 @@ func TestConvertKeyValueValue(t *testing.T) {
key := "key"
tests := []struct {
kv model.KeyValue
expected KeyValue
expected dbmodel.KeyValue
}{
{
kv: model.Bool(key, true),
expected: KeyValue{Key: key, Value: "true", Type: "bool"},
expected: dbmodel.KeyValue{Key: key, Value: "true", Type: "bool"},
},
{
kv: model.Bool(key, false),
expected: KeyValue{Key: key, Value: "false", Type: "bool"},
expected: dbmodel.KeyValue{Key: key, Value: "false", Type: "bool"},
},
{
kv: model.Int64(key, int64(1499)),
expected: KeyValue{Key: key, Value: "1499", Type: "int64"},
expected: dbmodel.KeyValue{Key: key, Value: "1499", Type: "int64"},
},
{
kv: model.Float64(key, float64(15.66)),
expected: KeyValue{Key: key, Value: "15.66", Type: "float64"},
expected: dbmodel.KeyValue{Key: key, Value: "15.66", Type: "float64"},
},
{
kv: model.String(key, longString),
expected: KeyValue{Key: key, Value: longString, Type: "string"},
expected: dbmodel.KeyValue{Key: key, Value: longString, Type: "string"},
},
{
kv: model.Binary(key, []byte(longString)),
expected: KeyValue{Key: key, Value: hex.EncodeToString([]byte(longString)), Type: "binary"},
expected: dbmodel.KeyValue{Key: key, Value: hex.EncodeToString([]byte(longString)), Type: "binary"},
},
{
kv: model.KeyValue{VType: 1500, Key: key},
expected: KeyValue{Key: key, Value: "unknown type 1500", Type: "1500"},
expected: dbmodel.KeyValue{Key: key, Value: "unknown type 1500", Type: "1500"},
},
}

Expand All @@ -150,36 +151,36 @@ func TestConvertKeyValueValue(t *testing.T) {
func TestNewSpanTags(t *testing.T) {
testCases := []struct {
spanConverter FromDomain
expected Span
expected dbmodel.Span
name string
}{
{
spanConverter: NewFromDomain(true, []string{}, ""),
expected: Span{
Tag: map[string]any{"foo": "bar"}, Tags: []KeyValue{},
Process: Process{Tag: map[string]any{"bar": "baz"}, Tags: []KeyValue{}},
expected: dbmodel.Span{
Tag: map[string]any{"foo": "bar"}, Tags: []dbmodel.KeyValue{},
Process: dbmodel.Process{Tag: map[string]any{"bar": "baz"}, Tags: []dbmodel.KeyValue{}},
},
name: "allTagsAsFields",
},
{
spanConverter: NewFromDomain(false, []string{"foo", "bar", "rere"}, ""),
expected: Span{
Tag: map[string]any{"foo": "bar"}, Tags: []KeyValue{},
Process: Process{Tag: map[string]any{"bar": "baz"}, Tags: []KeyValue{}},
expected: dbmodel.Span{
Tag: map[string]any{"foo": "bar"}, Tags: []dbmodel.KeyValue{},
Process: dbmodel.Process{Tag: map[string]any{"bar": "baz"}, Tags: []dbmodel.KeyValue{}},
},
name: "definedTagNames",
},
{
spanConverter: NewFromDomain(false, []string{}, ""),
expected: Span{
Tags: []KeyValue{{
expected: dbmodel.Span{
Tags: []dbmodel.KeyValue{{
Key: "foo",
Type: StringType,
Type: dbmodel.StringType,
Value: "bar",
}},
Process: Process{Tags: []KeyValue{{
Process: dbmodel.Process{Tags: []dbmodel.KeyValue{{
Key: "bar",
Type: StringType,
Type: dbmodel.StringType,
Value: "baz",
}}},
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Copyright (c) 2018 Uber Technologies, Inc.
// SPDX-License-Identifier: Apache-2.0

package dbmodel
package spanstore

import (
"encoding/json"
Expand All @@ -12,9 +12,11 @@ import (
"github.com/kr/pretty"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"

"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
)

func CompareJSONSpans(t *testing.T, expected *Span, actual *Span) {
func CompareJSONSpans(t *testing.T, expected *dbmodel.Span, actual *dbmodel.Span) {
sortJSONSpan(expected)
sortJSONSpan(actual)

Expand All @@ -28,35 +30,35 @@ func CompareJSONSpans(t *testing.T, expected *Span, actual *Span) {
}
}

func sortJSONSpan(span *Span) {
func sortJSONSpan(span *dbmodel.Span) {
sortJSONTags(span.Tags)
sortJSONLogs(span.Logs)
sortJSONProcess(span.Process)
}

type JSONTagByKey []KeyValue
type JSONTagByKey []dbmodel.KeyValue

func (t JSONTagByKey) Len() int { return len(t) }
func (t JSONTagByKey) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
func (t JSONTagByKey) Less(i, j int) bool { return t[i].Key < t[j].Key }

func sortJSONTags(tags []KeyValue) {
func sortJSONTags(tags []dbmodel.KeyValue) {
sort.Sort(JSONTagByKey(tags))
}

type JSONLogByTimestamp []Log
type JSONLogByTimestamp []dbmodel.Log

func (t JSONLogByTimestamp) Len() int { return len(t) }
func (t JSONLogByTimestamp) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
func (t JSONLogByTimestamp) Less(i, j int) bool { return t[i].Timestamp < t[j].Timestamp }

func sortJSONLogs(logs []Log) {
func sortJSONLogs(logs []dbmodel.Log) {
sort.Sort(JSONLogByTimestamp(logs))
for i := range logs {
sortJSONTags(logs[i].Fields)
}
}

func sortJSONProcess(process Process) {
func sortJSONProcess(process dbmodel.Process) {
sortJSONTags(process.Tags)
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion internal/storage/v1/elasticsearch/spanstore/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (
"go.uber.org/zap"

"github.com/jaegertracing/jaeger-idl/model/v1"
"github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch/spanstore/internal/dbmodel"
"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
"github.com/jaegertracing/jaeger/pkg/es"
cfg "github.com/jaegertracing/jaeger/pkg/es/config"
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import (
"go.uber.org/zap/zaptest"

"github.com/jaegertracing/jaeger-idl/model/v1"
"github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch/spanstore/internal/dbmodel"
"github.com/jaegertracing/jaeger/internal/storage/elasticsearch/dbmodel"
"github.com/jaegertracing/jaeger/internal/testutils"
"github.com/jaegertracing/jaeger/pkg/es"
"github.com/jaegertracing/jaeger/pkg/es/config"
Expand Down
Loading
Loading