{"record":{"id":"bb3d6932f0447a2c","repo":"jaegertracing/jaeger","slug":"start-time-must-be-before-end-time","errorCode":null,"errorMessage":"start_time must be before end_time","messagePattern":"start_time must be before end_time","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/internal/handlers/get_dependencies.go","lineNumber":57,"sourceCode":"\nfunc (h *getDependenciesHandler) handle(\n\tctx context.Context,\n\t_ *mcp.CallToolRequest,\n\tinput types.GetDependenciesInput,\n) (*mcp.CallToolResult, types.GetDependenciesOutput, error) {\n\tendTime, err := parseDependencyTime(input.EndTime, time.Now())\n\tif err != nil {\n\t\treturn nil, types.GetDependenciesOutput{}, fmt.Errorf(\"invalid end_time: %w\", err)\n\t}\n\n\tdefaultStart := endTime.Add(-24 * time.Hour)\n\tstartTime, err := parseDependencyTime(input.StartTime, defaultStart)\n\tif err != nil {\n\t\treturn nil, types.GetDependenciesOutput{}, fmt.Errorf(\"invalid start_time: %w\", err)\n\t}\n\n\tif !startTime.Before(endTime) {\n\t\treturn nil, types.GetDependenciesOutput{}, errors.New(\"start_time must be before end_time\")\n\t}\n\n\tlookback := endTime.Sub(startTime)\n\tdeps, err := h.queryService.GetDependencies(ctx, endTime, lookback)\n\tif err != nil {\n\t\treturn nil, types.GetDependenciesOutput{}, fmt.Errorf(\"failed to get dependencies: %w\", err)\n\t}\n\n\tlinks := make([]types.DependencyLink, 0, len(deps))\n\tfor _, d := range deps {\n\t\tlinks = append(links, types.DependencyLink{\n\t\t\tCaller:    d.Parent,\n\t\t\tCallee:    d.Child,\n\t\t\tCallCount: d.CallCount,\n\t\t})\n\t}\n\n\t// Sort by caller then callee for consistent ordering","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/internal/handlers/get_dependencies.go#L39-L75","documentation":"The get_dependencies MCP handler parses start_time and end_time (with defaults when empty) and requires start to be strictly before end. This error is thrown when startTime >= endTime, because GetDependencies takes an end timestamp plus a lookback duration — a non-positive lookback is meaningless.","triggerScenarios":"Passing start_time >= end_time, e.g. swapped RFC3339 values, same timestamp for both, or a custom end_time earlier than the parsed default start; also when a user passes only end_time earlier than the default lookback start.","commonSituations":"Reversed argument order (start/end swapped); timezone offsets making the intended order flip after parsing; milliseconds-vs-seconds unit confusion; an LLM generating end before start.","solutions":["Ensure start_time < end_time before calling; swap the values if reversed","Omit both fields to use the handler's sensible defaults","Normalize both timestamps to the same timezone/unit (RFC3339) before passing them"],"exampleFix":"// before\ninput := types.GetDependenciesInput{StartTime: end, EndTime: start} // swapped\n// after\nif start.After(end) {\n    start, end = end, start\n}\ninput := types.GetDependenciesInput{StartTime: start, EndTime: end}","handlingStrategy":"validation","validationCode":"start, err1 := time.Parse(time.RFC3339, input.StartTime)\nend, err2 := time.Parse(time.RFC3339, input.EndTime)\nif err1 != nil || err2 != nil { return errors.New(\"bad timestamps\") }\nif !start.Before(end) { return errors.New(\"start_time must be before end_time\") }","typeGuard":null,"tryCatchPattern":"out, err := handler.Handle(ctx, req, input)\nif err != nil && strings.Contains(err.Error(), \"start_time must be before end_time\") {\n    // swap or clamp the range and retry once\n    input.StartTime, input.EndTime = input.EndTime, input.StartTime\n    out, err = handler.Handle(ctx, req, input)\n}","preventionTips":["Always parse and normalize both timestamps to RFC3339 UTC before sending","Assert start < end in unit tests for any time-range helper","Beware timezone and unit (s vs ms) conversions when constructing ranges"],"tags":["jaeger","mcp","validation","time-range"],"backgroundTag":"invalid-time-range","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}