- Replace form_urlencoded with RFC 3986 compliant URI encoding - Implement aws_uri_encode() matching AWS SigV4 spec exactly - Unreserved chars (A-Z,a-z,0-9,-,_,.,~) not encoded - All other chars percent-encoded with uppercase hex - Preserve slashes in paths, encode in query params - Normalize empty paths to '/' per AWS spec - Fix test expectations (body hash, HMAC values) - Add comprehensive SigV4 signature determinism test This fixes the canonicalization mismatch that caused signature validation failures in T047. Auth can now be enabled for production. Refs: T058.S1
62 lines
2 KiB
Protocol Buffer
62 lines
2 KiB
Protocol Buffer
// Prometheus Remote Write Protocol v1
|
|
// Reference: https://prometheus.io/docs/concepts/remote_write_spec/
|
|
//
|
|
// This proto definition is based on the Prometheus remote write specification
|
|
// for push-based metric ingestion. It's compatible with Prometheus, VictoriaMetrics,
|
|
// and other systems that implement the remote write protocol.
|
|
|
|
syntax = "proto3";
|
|
|
|
package prometheus;
|
|
|
|
// WriteRequest is the top-level message for remote write operations.
|
|
// Clients send a WriteRequest containing multiple time series to the server.
|
|
message WriteRequest {
|
|
// Time series data to be written
|
|
repeated TimeSeries timeseries = 1;
|
|
|
|
// Metadata about the time series (optional, not used in v1)
|
|
// Reserved for future use with metadata support
|
|
// repeated MetricMetadata metadata = 3;
|
|
}
|
|
|
|
// TimeSeries represents a single time series with its labels and samples.
|
|
// A time series is uniquely identified by its label set.
|
|
message TimeSeries {
|
|
// Set of labels that uniquely identify this time series
|
|
// Must include at least one label, typically __name__ for the metric name
|
|
repeated Label labels = 1;
|
|
|
|
// Samples (data points) for this time series
|
|
// Samples must be ordered by timestamp (ascending)
|
|
repeated Sample samples = 2;
|
|
|
|
// Exemplars are optional (used for tracing correlation)
|
|
// Not implemented in initial version
|
|
// repeated Exemplar exemplars = 3;
|
|
}
|
|
|
|
// Label is a key-value pair that identifies a time series dimension.
|
|
// Examples: {__name__="http_requests_total", method="GET", status="200"}
|
|
message Label {
|
|
// Label name (e.g., "__name__", "job", "instance")
|
|
string name = 1;
|
|
|
|
// Label value
|
|
string value = 2;
|
|
}
|
|
|
|
// Sample is a single data point in a time series.
|
|
message Sample {
|
|
// Metric value (float64)
|
|
double value = 1;
|
|
|
|
// Timestamp in milliseconds since Unix epoch
|
|
int64 timestamp = 2;
|
|
}
|
|
|
|
// WriteResponse is returned after a successful write operation.
|
|
message WriteResponse {
|
|
// Empty for successful writes
|
|
// Error information is conveyed via gRPC status codes
|
|
}
|