jaegertracing/jaeger · error
invalid start_time: %w
Error message
invalid start_time: %w
What it means
Same parsing path as end_time but for the start_time field of GetDependenciesInput. After end_time is resolved (default time.Now()), start_time defaults to endTime-24h; if an explicit start_time cannot be parsed, the handler wraps the parse error with "invalid start_time". It indicates malformed client input, not a backend problem.
Source
Thrown at cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/internal/handlers/get_dependencies.go:53
queryService: queryService,
}
return h.handle
}
func (h *getDependenciesHandler) handle(
ctx context.Context,
_ *mcp.CallToolRequest,
input types.GetDependenciesInput,
) (*mcp.CallToolResult, types.GetDependenciesOutput, error) {
endTime, err := parseDependencyTime(input.EndTime, time.Now())
if err != nil {
return nil, types.GetDependenciesOutput{}, fmt.Errorf("invalid end_time: %w", err)
}
defaultStart := endTime.Add(-24 * time.Hour)
startTime, err := parseDependencyTime(input.StartTime, defaultStart)
if err != nil {
return nil, types.GetDependenciesOutput{}, fmt.Errorf("invalid start_time: %w", err)
}
if !startTime.Before(endTime) {
return nil, types.GetDependenciesOutput{}, errors.New("start_time must be before end_time")
}
lookback := endTime.Sub(startTime)
deps, err := h.queryService.GetDependencies(ctx, endTime, lookback)
if err != nil {
return nil, types.GetDependenciesOutput{}, fmt.Errorf("failed to get dependencies: %w", err)
}
links := make([]types.DependencyLink, 0, len(deps))
for _, d := range deps {
links = append(links, types.DependencyLink{
Caller: d.Parent,
Callee: d.Child,
CallCount: d.CallCount,View on GitHub (pinned to 806f444784)
Solutions
- Pass start_time as an RFC3339 timestamp, e.g. "2026-08-31T08:00:00Z".
- Omit start_time to use the default 24h lookback before end_time.
- Generate the value with time.Time.Format(time.RFC3339) instead of string concatenation.
- Inspect the wrapped error for the specific parse failure.
Example fix
// before input.StartTime = "24 hours ago" // after input.StartTime = time.Now().Add(-24 * time.Hour).Format(time.RFC3339)
Defensive patterns
Strategy: validation
Validate before calling
func validStartTime(s string) bool {
if s == "" { return true } // defaults to endTime-24h
_, err := time.Parse(time.RFC3339, s)
return err == nil
} Type guard
func isRFC3339(s string) bool {
_, err := time.Parse(time.RFC3339, s)
return err == nil
} Try / catch
out, _, err := handler.Handle(ctx, req, input)
if err != nil && strings.HasPrefix(err.Error(), "invalid start_time") {
input.StartTime = time.Now().Add(-24 * time.Hour).UTC().Format(time.RFC3339)
out, _, err = handler.Handle(ctx, req, input)
} Prevention
- Build start times from time.Time arithmetic, not string templates.
- Omit start_time to accept the default 24h lookback.
- Keep timezone explicit: use trailing 'Z' or +/-hh:mm.
- Unit-test your timestamp formatting once and reuse the helper.
When it happens
Trigger: Calling get_dependencies with input.StartTime set to an unparseable value such as "24 hours ago", "2026-08-31" (date only, if unsupported format), or a malformed RFC3339 string; also triggered when start_time's format is rejected even though end_time parsed fine.
Common situations: Clients computing lookback windows with relative expressions; constructing timestamps with time formatting differences (millisecond precision with wrong separator); hard-coded dates in tests or dashboards that predate a format change.
Related errors
- invalid end_time: %w
- trace_id is required
- start_time must be before end_time
- trace_id is required
- span_ids is required and must not be empty
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/e7c802900620fbe1.
Report an issue: GitHub.