{"record":{"id":"38cd31386e69e637","repo":"thanos-io/thanos","slug":"retrieving-exemplars","errorCode":null,"errorMessage":"retrieving exemplars","messagePattern":"retrieving exemplars","errorType":"http","errorClass":"ApiError","httpStatus":500,"severity":"error","filePath":"pkg/api/query/v1.go","lineNumber":1542,"sourceCode":"\t\t}\n\t\tend, err := parseTimeParam(r, \"end\", v1.MaxTime)\n\t\tif err != nil {\n\t\t\treturn nil, nil, &api.ApiError{Typ: api.ErrorBadData, Err: err}, func() {}\n\t\t}\n\n\t\treq := &exemplarspb.ExemplarsRequest{\n\t\t\tStart:                   timestamp.FromTime(start),\n\t\t\tEnd:                     timestamp.FromTime(end),\n\t\t\tQuery:                   r.FormValue(\"query\"),\n\t\t\tPartialResponseStrategy: ps,\n\t\t}\n\n\t\ttracing.DoInSpan(ctx, \"retrieve_exemplars\", func(ctx context.Context) {\n\t\t\tdata, warnings, err = client.Exemplars(ctx, req)\n\t\t})\n\n\t\tif err != nil {\n\t\t\treturn nil, nil, &api.ApiError{Typ: api.ErrorInternal, Err: errors.Wrap(err, \"retrieving exemplars\")}, func() {}\n\t\t}\n\t\treturn data, warnings.AsErrors(), nil, func() {}\n\t}\n}\n\nfunc parseMetadataTimeRange(r *http.Request, defaultMetadataTimeRange time.Duration) (time.Time, time.Time, error) {\n\t// If start and end time not specified as query parameter, we get the range from the beginning of time by default.\n\tvar defaultStartTime, defaultEndTime time.Time\n\tif defaultMetadataTimeRange == 0 {\n\t\tdefaultStartTime = v1.MinTime\n\t\tdefaultEndTime = v1.MaxTime\n\t} else {\n\t\tnow := time.Now()\n\t\tdefaultStartTime = now.Add(-defaultMetadataTimeRange)\n\t\tdefaultEndTime = now\n\t}\n\n\tstart, err := parseTimeParam(r, \"start\", defaultStartTime)","sourceCodeStart":1524,"sourceCodeEnd":1560,"githubUrl":"https://github.com/thanos-io/thanos/blob/35b8b991177def87ed52dcf10f9b6d87f07282c8/pkg/api/query/v1.go#L1524-L1560","documentation":"Returned by the /api/v1/query_exemplars endpoint when client.Exemplars() — the RPC retrieving exemplar data from the upstream store — fails. Wrapped with errors.Wrap into an ErrorInternal (HTTP 500). It signals a backend retrieval failure, not a client input problem (bad start/end times fail earlier with BadData).","triggerScenarios":"Any GET /api/v1/query_exemplars where the Exemplars gRPC call errors: unreachable store/query node, canceled request context, deadline exceeded, or exemplar store RPC failure.","commonSituations":"Exemplar storage not backed by a healthy store-gateway, query node down, timeouts on large exemplar time ranges, TLS/network issues between frontend and stores.","solutions":["Inspect the wrapped err for the transport-level cause.","Narrow the start/end time range to reduce load, and retry on timeouts.","Verify store-gateway/query nodes serving exemplars are healthy and registered.","Check frontend-to-store TLS and gRPC connectivity."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"if (+endTs - +startTs > 24*3600*1000) console.warn('large exemplar range; expect slow queries');","typeGuard":null,"tryCatchPattern":"try { const r = await fetch(exemplarsUrl); const b = await r.json(); if (b.errorType === 'internal') await backoffRetry(); } catch (e) { /* handle network failure */ }","preventionTips":["Keep exemplar query windows small.","Verify store-gateways with exemplar support are registered with query.","Use timeouts + retries for large range scans."],"tags":["grpc","network","api","internal"],"backgroundTag":"upstream-api-error","analyzedSha":"35b8b991177def87ed52dcf10f9b6d87f07282c8","analyzedAt":"2026-09-07T01:49:59.689Z","contentChangedAt":"2026-09-07T01:49:59.689Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}