thanos-io/thanos · error

sending metadata warning to server

Error message

sending metadata warning to server %v

What it means

When the upstream response carries a warning, the proxy forwards it as a warning metadata response; if that forward Send fails it is wrapped with 'sending metadata warning to server %v'. The warning itself could not be delivered to the caller.

Solutions

  1. Check whether the client canceled (context.Canceled/gRPC Canceled) — this is benign
  2. Ensure the client keeps the stream open until it has read all responses
  3. Investigate client-side network stability if this recurs without cancelation
  4. Log the underlying warning content so the intended warning is not lost
Defensive patterns

Strategy: try-catch

Try / catch

if err := stream.ServerSend(warnResp); err != nil {
    if status.Code(err) == codes.Canceled {
        return nil // client gone; warning undeliverable
    }
    return err
}

Prevention

When it happens

Trigger: stream.server.Send of a warning response fails — the downstream client stream is closed, canceled, or the connection broke.

Common situations: Client cancels a PxL metadata query while warnings are being forwarded; idle timeout closes the client gRPC stream mid-response.

Related errors


AI-assisted analysis of thanos-io/thanos@35b8b99117 (2026-09-07). Data as JSON: /api/errors/64596affd56b7a21. Report an issue: GitHub.

Appendix: source

Thrown at pkg/metadata/proxy.go:143

		}

		if err != nil {
			err = errors.Wrapf(err, "receiving metric metadata from metadata client %v", stream.client)

			if stream.request.PartialResponseStrategy == storepb.PartialResponseStrategy_ABORT {
				return err
			}

			if err := stream.server.Send(metadatapb.NewWarningMetadataResponse(err)); err != nil {
				return errors.Wrapf(err, "sending metadata error to server %v", stream.server)
			}

			// Not an error if response strategy is warning.
			return nil
		}

		if w := resp.GetWarning(); w != "" {
			if err := stream.server.Send(metadatapb.NewWarningMetadataResponse(errors.New(w))); err != nil {
				return errors.Wrapf(err, "sending metadata warning to server %v", stream.server)
			}
			continue
		}

		select {
		case stream.channel <- resp.GetMetadata():
		case <-ctx.Done():
			return ctx.Err()
		}
	}
}

View on GitHub (pinned to 35b8b99117)