You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:15:33