Skip to content

Commit 54a67f5

Browse files
yurishkuroFlamingSaint
authored andcommitted
[v2] Add e2e test with memory store (jaegertracing#5751)
## Which problem is this PR solving? - Even though we were using memory storage in v2-e2e-grpc test, we never had an e2e that would validate `cmd/jaeger/config.yaml` config, which uses memory storage in-process ## Description of the changes - Add the new test workflow an e2e test - Rename other test files for more readable file names / test names ## How was this change tested? - build cmd/jaeger binary - `$ STORAGE=memory go test ./cmd/jaeger/internal/integration` --------- Signed-off-by: Yuri Shkuro <github@ysh.us>
1 parent dc5efb8 commit 54a67f5

File tree

9 files changed

+107
-12
lines changed

9 files changed

+107
-12
lines changed

.github/workflows/ci-e2e-memory.yaml

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
name: CIT Memory
2+
3+
on:
4+
push:
5+
branches: [main]
6+
7+
pull_request:
8+
branches: [main]
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ (github.event.pull_request && github.event.pull_request.number) || github.ref || github.run_id }}
12+
cancel-in-progress: true
13+
14+
# See https://github.com/ossf/scorecard/blob/main/docs/checks.md#token-permissions
15+
permissions: # added using https://github.com/step-security/secure-workflows
16+
contents: read
17+
18+
jobs:
19+
memory-v2:
20+
runs-on: ubuntu-latest
21+
steps:
22+
- name: Harden Runner
23+
uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 # v2.8.1
24+
with:
25+
egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs
26+
27+
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
28+
29+
- uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
30+
with:
31+
go-version: 1.22.x
32+
33+
- name: Run Memory storage integration tests
34+
run: |
35+
STORAGE=memory_v2 make jaeger-v2-storage-integration-test
36+
37+
- name: Upload coverage to codecov
38+
uses: ./.github/actions/upload-codecov
39+
with:
40+
files: cover.out
41+
flags: memory_v2

cmd/jaeger/internal/integration/e2e_integration.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ func createStorageCleanerConfig(t *testing.T, configFile string, storage string)
177177

178178
func purge(t *testing.T) {
179179
addr := fmt.Sprintf("http://0.0.0.0:%s%s", storagecleaner.Port, storagecleaner.URL)
180+
t.Logf("Purging storage via %s", addr)
180181
r, err := http.NewRequestWithContext(context.Background(), http.MethodPost, addr, nil)
181182
require.NoError(t, err)
182183

@@ -185,6 +186,8 @@ func purge(t *testing.T) {
185186
resp, err := client.Do(r)
186187
require.NoError(t, err)
187188
defer resp.Body.Close()
189+
body, err := io.ReadAll(resp.Body)
190+
require.NoError(t, err)
188191

189-
require.Equal(t, http.StatusOK, resp.StatusCode)
192+
require.Equal(t, http.StatusOK, resp.StatusCode, "body: %s", string(body))
190193
}

cmd/jaeger/internal/integration/es_test.go cmd/jaeger/internal/integration/elasticsearch_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/jaegertracing/jaeger/plugin/storage/integration"
1010
)
1111

12-
func TestESStorage(t *testing.T) {
12+
func TestElasticsearchStorage(t *testing.T) {
1313
integration.SkipUnlessEnv(t, "elasticsearch")
1414

1515
s := &E2EStorageIntegration{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Copyright (c) 2024 The Jaeger Authors.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package integration
5+
6+
import (
7+
"testing"
8+
9+
"github.com/jaegertracing/jaeger/plugin/storage/integration"
10+
)
11+
12+
func TestMemoryStorage(t *testing.T) {
13+
integration.SkipUnlessEnv(t, "memory_v2")
14+
15+
s := &E2EStorageIntegration{
16+
ConfigFile: "../../config.yaml",
17+
StorageIntegration: integration.StorageIntegration{
18+
SkipArchiveTest: true,
19+
CleanUp: purge,
20+
},
21+
}
22+
s.e2eInitialize(t, "memory")
23+
t.Cleanup(func() {
24+
s.e2eCleanUp(t)
25+
})
26+
s.RunAll(t)
27+
}

cmd/jaeger/internal/integration/os_test.go cmd/jaeger/internal/integration/opensearch_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/jaegertracing/jaeger/plugin/storage/integration"
1010
)
1111

12-
func TestOSStorage(t *testing.T) {
12+
func TestOpenSearchStorage(t *testing.T) {
1313
integration.SkipUnlessEnv(t, "opensearch")
1414
s := &E2EStorageIntegration{
1515
ConfigFile: "../../config-opensearch.yaml",

cmd/jaeger/internal/integration/storagecleaner/extension.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/gorilla/mux"
1414
"go.opentelemetry.io/collector/component"
1515
"go.opentelemetry.io/collector/extension"
16+
"go.uber.org/zap"
1617

1718
"github.com/jaegertracing/jaeger/cmd/jaeger/internal/extension/jaegerstorage"
1819
"github.com/jaegertracing/jaeger/storage"
@@ -29,15 +30,15 @@ const (
2930
)
3031

3132
type storageCleaner struct {
32-
config *Config
33-
server *http.Server
34-
settings component.TelemetrySettings
33+
config *Config
34+
server *http.Server
35+
telset component.TelemetrySettings
3536
}
3637

37-
func newStorageCleaner(config *Config, telemetrySettings component.TelemetrySettings) *storageCleaner {
38+
func newStorageCleaner(config *Config, telset component.TelemetrySettings) *storageCleaner {
3839
return &storageCleaner{
39-
config: config,
40-
settings: telemetrySettings,
40+
config: config,
41+
telset: telset,
4142
}
4243
}
4344

@@ -74,10 +75,11 @@ func (c *storageCleaner) Start(_ context.Context, host component.Host) error {
7475
Handler: r,
7576
ReadHeaderTimeout: 3 * time.Second,
7677
}
78+
c.telset.Logger.Info("Starting storage cleaner server", zap.String("addr", c.server.Addr))
7779
go func() {
7880
if err := c.server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
7981
err = fmt.Errorf("error starting cleaner server: %w", err)
80-
c.settings.ReportStatus(component.NewFatalErrorEvent(err))
82+
c.telset.ReportStatus(component.NewFatalErrorEvent(err))
8183
}
8284
}()
8385

cmd/jaeger/internal/integration/storagecleaner/extension_test.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/stretchr/testify/assert"
1616
"github.com/stretchr/testify/require"
1717
"go.opentelemetry.io/collector/component"
18+
"go.uber.org/zap/zaptest"
1819

1920
"github.com/jaegertracing/jaeger/cmd/jaeger/internal/extension/jaegerstorage"
2021
"github.com/jaegertracing/jaeger/storage"
@@ -92,7 +93,9 @@ func TestStorageCleanerExtension(t *testing.T) {
9293
TraceStorage: "storage",
9394
Port: Port,
9495
}
95-
s := newStorageCleaner(config, component.TelemetrySettings{})
96+
s := newStorageCleaner(config, component.TelemetrySettings{
97+
Logger: zaptest.NewLogger(t),
98+
})
9699
require.NotEmpty(t, s.Dependencies())
97100
host := storagetest.NewStorageHost()
98101
host.WithExtension(jaegerstorage.ID, &mockStorageExt{
@@ -118,7 +121,9 @@ func TestStorageCleanerExtension(t *testing.T) {
118121

119122
func TestGetStorageFactoryError(t *testing.T) {
120123
config := &Config{}
121-
s := newStorageCleaner(config, component.TelemetrySettings{})
124+
s := newStorageCleaner(config, component.TelemetrySettings{
125+
Logger: zaptest.NewLogger(t),
126+
})
122127
host := storagetest.NewStorageHost()
123128
host.WithExtension(jaegerstorage.ID, &mockStorageExt{
124129
name: "storage",
@@ -136,6 +141,7 @@ func TestStorageExtensionStartError(t *testing.T) {
136141
}
137142
var startStatus atomic.Pointer[component.StatusEvent]
138143
s := newStorageCleaner(config, component.TelemetrySettings{
144+
Logger: zaptest.NewLogger(t),
139145
ReportStatus: func(status *component.StatusEvent) {
140146
startStatus.Store(status)
141147
},

plugin/storage/memory/factory.go

+9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package memory
1717

1818
import (
19+
"context"
1920
"flag"
2021

2122
"github.com/spf13/viper"
@@ -36,6 +37,7 @@ var ( // interface comformance checks
3637
_ storage.ArchiveFactory = (*Factory)(nil)
3738
_ storage.SamplingStoreFactory = (*Factory)(nil)
3839
_ plugin.Configurable = (*Factory)(nil)
40+
_ storage.Purger = (*Factory)(nil)
3941
)
4042

4143
// Factory implements storage.Factory and creates storage components backed by memory store.
@@ -126,3 +128,10 @@ func (*Factory) CreateLock() (distributedlock.Lock, error) {
126128
func (f *Factory) publishOpts() {
127129
safeexpvar.SetInt("jaeger_storage_memory_max_traces", int64(f.options.Configuration.MaxTraces))
128130
}
131+
132+
// Purge removes all data from the Factory's underlying Memory store.
133+
// This function is intended for testing purposes only and should not be used in production environments.
134+
func (f *Factory) Purge(ctx context.Context) error {
135+
f.store.purge(ctx)
136+
return nil
137+
}

plugin/storage/memory/memory.go

+7
Original file line numberDiff line numberDiff line change
@@ -337,3 +337,10 @@ func flattenTags(span *model.Span) model.KeyValues {
337337
}
338338
return retMe
339339
}
340+
341+
// purge supports Purger interface.
342+
func (st *Store) purge(context.Context) {
343+
st.Lock()
344+
st.perTenant = make(map[string]*Tenant)
345+
st.Unlock()
346+
}

0 commit comments

Comments
 (0)