Grafana Loki Ingester测试执行失败,提示命令行参数未找到
问题
我有一个位于pkg/ingestor包下的checkpoint_test.go文件,是Grafana Loki Ingester模块的测试用例。执行go test checkpoint_test.go命令时出现大量编译错误,错误信息如下:
# command-line-arguments [command-line-arguments.test] ./checkpoint_test.go:27:84: undefined: Interface ./checkpoint_test.go:28:12: undefined: mockQuerierServer ./checkpoint_test.go:46:68: undefined: Config ./checkpoint_test.go:47:20: undefined: defaultIngesterTestConfig ./checkpoint_test.go:61:41: undefined: defaultLimitsTestConfig ./checkpoint_test.go:64:22: undefined: mockStore ./checkpoint_test.go:382:38: undefined: instance ./checkpoint_test.go:384:50: undefined: instance ./checkpoint_test.go:388:20: undefined: Series ./checkpoint_test.go:551:44: undefined: Chunk ./checkpoint_test.go:64:22: too many errors FAIL command-line-arguments [build failed] FAIL
测试文件代码如下:
package ingester // small util for ensuring data exists as we expect func ensureIngesterData(ctx context.Context, t *testing.T, start, end time.Time, i Interface) { result := mockQuerierServer{ ctx: ctx, } err := i.Query(&logproto.QueryRequest{ Selector: `{foo="bar"}`, Limit: 100, Start: start, End: end, }, &result) ln := int(end.Sub(start) / time.Second) require.NoError(t, err) require.Len(t, result.resps, 1) require.Len(t, result.resps[0].Streams, 2) require.Len(t, result.resps[0].Streams[0].Entries, ln) require.Len(t, result.resps[0].Streams[1].Entries, ln) } func defaultIngesterTestConfigWithWAL(t *testing.T, walDir string) Config { ingesterConfig := defaultIngesterTestConfig(t) ingesterConfig.MaxTransferRetries = 0 ingesterConfig.WAL.Enabled = true ingesterConfig.WAL.Dir = walDir ingesterConfig.WAL.CheckpointDuration = time.Second return ingesterConfig } func TestIngesterWAL(t *testing.T) { walDir := t.TempDir() ingesterConfig := defaultIngesterTestConfigWithWAL(t, walDir) limits, err := validation.NewOverrides(defaultLimitsTestConfig(), nil) require.NoError(t, err) newStore := func() *mockStore { return &mockStore{ chunks: map[string][]chunk.Chunk{}, } } i, err := New(ingesterConfig, client.Config{}, newStore(), limits, runtime.DefaultTenantConfigs(), nil) require.NoError(t, err) require.Nil(t, services.StartAndAwaitRunning(context.Background(), i)) defer services.StopAndAwaitTerminated(context.Background(), i) //nolint:errcheck req := logproto.PushRequest{ Streams: []logproto.Stream{ { Labels: `{foo="bar",bar="baz1"}`, }, { Labels: `{foo="bar",bar="baz2"}`, }, }, } start := time.Now() steps := 10 end := start.Add(time.Second * time.Duration(steps)) for i := 0; i < steps; i++ { req.Streams[0].Entries = append(req.Streams[0].Entries, logproto.Entry{ Timestamp: start.Add(time.Duration(i) * time.Second), Line: fmt.Sprintf("line %d", i), }) req.Streams[1].Entries = append(req.Streams[1].Entries, logproto.Entry{ Timestamp: start.Add(time.Duration(i) * time.Second), Line: fmt.Sprintf("line %d", i), }) } ctx := user.InjectOrgID(context.Background(), "test") _, err = i.Push(ctx, &req) require.NoError(t, err) ensureIngesterData(ctx, t, start, end, i) require.Nil(t, services.StopAndAwaitTerminated(context.Background(), i)) // ensure we haven't checkpointed yet expectCheckpoint(t, walDir, false, time.Second) // restart the ingester i, err = New(ingesterConfig, client.Config{}, newStore(), limits, runtime.DefaultTenantConfigs(), nil) require.NoError(t, err) defer services.StopAndAwaitTerminated(context.Background(), i) //nolint:errcheck require.Nil(t, services.StartAndAwaitRunning(context.Background(), i)) // ensure we've recovered data from wal segments ensureIngesterData(ctx, t, start, end, i) // ensure we have checkpointed now expectCheckpoint(t, walDir, true, ingesterConfig.WAL.CheckpointDuration*5) // give a bit of buffer require.Nil(t, services.StopAndAwaitTerminated(context.Background(), i)) // restart the ingester i, err = New(ingesterConfig, client.Config{}, newStore(), limits, runtime.DefaultTenantConfigs(), nil) require.NoError(t, err) defer services.StopAndAwaitTerminated(context.Background(), i) //nolint:errcheck require.Nil(t, services.StartAndAwaitRunning(context.Background(), i)) // ensure we've recovered data from checkpoint+wal segments ensureIngesterData(ctx, t, start, end, i) }
解决方案
1. 执行测试的正确方式
直接运行go test checkpoint_test.go只会编译单个文件,但该测试依赖ingester包下的核心代码(比如Interface、Config、New构造函数)以及同目录的测试辅助工具(mockQuerierServer、defaultIngesterTestConfig等)。正确做法:
- 切换到
pkg/ingester目录,执行:go test . - 或直接指定完整包路径执行:
go test github.com/grafana/loki/pkg/ingester
Go会自动收集该包下所有源文件和测试依赖,完成编译和测试。
2. 补全必要的导入语句
测试文件缺少所有依赖包的导入,需要在package ingester下方添加完整导入块:
import ( "context" "fmt" "time" "os" "path/filepath" "github.com/grafana/loki/pkg/ingester/client" "github.com/grafana/loki/pkg/ingester/chunk" "github.com/grafana/loki/pkg/logproto" "github.com/grafana/loki/pkg/util/services" "github.com/grafana/loki/pkg/util/user" "github.com/grafana/loki/pkg/util/validation" "github.com/grafana/loki/pkg/util/runtime" "github.com/stretchr/testify/require" )
3. 确认测试辅助代码存在
检查pkg/ingester目录下的其他测试文件(比如ingester_test.go、mock_*.go),确保mockQuerierServer、defaultIngesterTestConfig、defaultLimitsTestConfig、mockStore这些类型和函数已定义。如果是新增测试,可将这些辅助代码移到checkpoint_test.go中,或确保它们在同包的其他_test.go文件内(Go测试会自动加载同包所有测试文件)。
4. 补充未定义的辅助函数
代码中调用的expectCheckpoint函数未定义,需补充实现:
func expectCheckpoint(t *testing.T, walDir string, exists bool, timeout time.Duration) { t.Helper() deadline := time.Now().Add(timeout) for time.Now().Before(deadline) { _, err := os.Stat(filepath.Join(walDir, "checkpoint")) if exists && err == nil { return } if !exists && os.IsNotExist(err) { return } time.Sleep(100 * time.Millisecond) } t.Fatalf("checkpoint existence check timed out, expected exists: %v", exists) }
内容的提问来源于stack exchange,提问作者boycod3
相关产品推荐
相关产品推荐

