mirror of
https://github.com/prometheus/prometheus.git
synced 2026-02-18 18:25:24 -05:00
Merge remote-tracking branch 'origin/release-3.8' into merge-3.8.1-to-main
Tweak RW2 change for consistency with older lines. Signed-off-by: Bryan Boreham <bjboreham@gmail.com>
This commit is contained in:
commit
950f756e9e
10 changed files with 92 additions and 11 deletions
|
|
@ -2,12 +2,15 @@
|
|||
|
||||
## main / unreleased
|
||||
|
||||
* [FEATURE] Templates: Add urlQueryEscape to template functions. #17403
|
||||
* [BUGFIX] TSDB: Register `prometheus_tsdb_sample_ooo_delta` metric properly. #17477
|
||||
|
||||
## 3.8.1 / 2025-12-16
|
||||
|
||||
* [BUGFIX] remote: Fix Remote Write receiver, so it does not send wrong response headers for v1 flow and cause Prometheus senders to emit false partial error log and metrics. #17683
|
||||
|
||||
## 3.8.0 / 2025-11-28
|
||||
|
||||
* [CHANGE] Remote-write 2 (receiving): Update to [2.0-rc.4 spec](https://github.com/prometheus/docs/blob/60c24e450010df38cfcb4f65df874f6f9b26dbcb/docs/specs/prw/remote_write_spec_2_0.md). "created timestamp" (CT) is now called "start timestamp" (ST). #17411
|
||||
* [CHANGE] Remote-write: Update receiving to [2.0-rc.4 spec](https://github.com/prometheus/docs/blob/60c24e450010df38cfcb4f65df874f6f9b26dbcb/docs/specs/prw/remote_write_spec_2_0.md). "created timestamp" (CT) is now called "start timestamp" (ST). #17411
|
||||
* [CHANGE] TSDB: Native Histogram Custom Bounds with a NaN threshold are now rejected. #17287
|
||||
* [FEATURE] OAuth2: support jwt-bearer grant-type (RFC7523 3.1). #17592
|
||||
* [FEATURE] Dockerfile: Add OpenContainers spec labels to Dockerfile. #16483
|
||||
|
|
|
|||
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
|||
3.8.0
|
||||
3.8.1
|
||||
|
|
|
|||
|
|
@ -301,6 +301,9 @@ func (c *Client) Store(ctx context.Context, req []byte, attempt int) (WriteRespo
|
|||
_ = httpResp.Body.Close()
|
||||
}()
|
||||
|
||||
// NOTE(bwplotka): Only PRW2 spec defines response HTTP headers. However, spec does not block
|
||||
// PRW1 from sending them too for reliability. Support this case.
|
||||
//
|
||||
// TODO(bwplotka): Pass logger and emit debug on error?
|
||||
// Parsing error means there were some response header values we can't parse,
|
||||
// we can continue handling.
|
||||
|
|
|
|||
|
|
@ -96,6 +96,10 @@ func isHistogramValidationError(err error) bool {
|
|||
}
|
||||
|
||||
// Store implements remoteapi.writeStorage interface.
|
||||
// TODO(bwplotka): Improve remoteapi.Store API. Right now it's confusing if PRWv1 flows should use WriteResponse or not.
|
||||
// If it's not filled, it will be "confirmed zero" which caused partial error reporting on client side in the past.
|
||||
// Temporary fix was done to only care about WriteResponse stats for PRW2 (see https://github.com/prometheus/client_golang/pull/1927
|
||||
// but better approach would be to only confirm if explicit stats were injected.
|
||||
func (h *writeHandler) Store(r *http.Request, msgType remoteapi.WriteMessageType) (*remoteapi.WriteResponse, error) {
|
||||
// Store receives request with decompressed content in body.
|
||||
body, err := io.ReadAll(r.Body)
|
||||
|
|
|
|||
|
|
@ -1608,3 +1608,74 @@ func TestHistogramsReduction(t *testing.T) {
|
|||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Regression test for https://github.com/prometheus/prometheus/issues/17659
|
||||
func TestRemoteWriteHandler_ResponseStats(t *testing.T) {
|
||||
payloadV1, _, _, err := buildWriteRequest(nil, writeRequestFixture.Timeseries, nil, nil, nil, nil, "snappy")
|
||||
require.NoError(t, err)
|
||||
payloadV2, _, _, err := buildV2WriteRequest(nil, writeV2RequestFixture.Timeseries, writeV2RequestFixture.Symbols, nil, nil, nil, "snappy")
|
||||
require.NoError(t, err)
|
||||
|
||||
for _, tt := range []struct {
|
||||
msgType remoteapi.WriteMessageType
|
||||
payload []byte
|
||||
forceInjectHeaders bool
|
||||
expectHeaders bool
|
||||
}{
|
||||
{
|
||||
msgType: remoteapi.WriteV1MessageType,
|
||||
payload: payloadV1,
|
||||
},
|
||||
{
|
||||
msgType: remoteapi.WriteV1MessageType,
|
||||
payload: payloadV1,
|
||||
forceInjectHeaders: true,
|
||||
expectHeaders: true,
|
||||
},
|
||||
{
|
||||
msgType: remoteapi.WriteV2MessageType,
|
||||
payload: payloadV2,
|
||||
expectHeaders: true,
|
||||
},
|
||||
} {
|
||||
t.Run(fmt.Sprintf("msg=%v/force-inject-headers=%v", tt.msgType, tt.forceInjectHeaders), func(t *testing.T) {
|
||||
// Setup server side.
|
||||
appendable := &mockAppendable{}
|
||||
handler := NewWriteHandler(
|
||||
promslog.NewNopLogger(),
|
||||
nil,
|
||||
appendable,
|
||||
[]remoteapi.WriteMessageType{remoteapi.WriteV1MessageType, remoteapi.WriteV2MessageType},
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
)
|
||||
|
||||
if tt.forceInjectHeaders {
|
||||
base := handler
|
||||
handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// Inject response header. This simulates PRWv1 server that uses PRWv2 response headers
|
||||
// for confirmation of samples. This is not against spec and we support it.
|
||||
w.Header().Set(rw20WrittenSamplesHeader, "2")
|
||||
|
||||
base.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
srv := httptest.NewServer(handler)
|
||||
|
||||
// Send message and do the parse response flow.
|
||||
c := &Client{Client: srv.Client(), urlString: srv.URL, timeout: 5 * time.Minute, writeProtoMsg: tt.msgType}
|
||||
|
||||
stats, err := c.Store(t.Context(), tt.payload, 0)
|
||||
require.NoError(t, err)
|
||||
|
||||
if tt.expectHeaders {
|
||||
require.True(t, stats.Confirmed)
|
||||
require.Equal(t, len(appendable.samples), stats.Samples)
|
||||
} else {
|
||||
require.False(t, stats.Confirmed)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "@prometheus-io/mantine-ui",
|
||||
"private": true,
|
||||
"version": "0.308.0",
|
||||
"version": "0.308.1",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"start": "vite",
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
"@microsoft/fetch-event-source": "^2.0.1",
|
||||
"@nexucis/fuzzy": "^0.5.1",
|
||||
"@nexucis/kvsearch": "^0.9.1",
|
||||
"@prometheus-io/codemirror-promql": "0.308.0",
|
||||
"@prometheus-io/codemirror-promql": "0.308.1",
|
||||
"@reduxjs/toolkit": "^2.10.1",
|
||||
"@tabler/icons-react": "^3.35.0",
|
||||
"@tanstack/react-query": "^5.90.7",
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@prometheus-io/codemirror-promql",
|
||||
"version": "0.308.0",
|
||||
"version": "0.308.1",
|
||||
"description": "a CodeMirror mode for the PromQL language",
|
||||
"types": "dist/esm/index.d.ts",
|
||||
"module": "dist/esm/index.js",
|
||||
|
|
@ -29,7 +29,7 @@
|
|||
},
|
||||
"homepage": "https://github.com/prometheus/prometheus/blob/main/web/ui/module/codemirror-promql/README.md",
|
||||
"dependencies": {
|
||||
"@prometheus-io/lezer-promql": "0.308.0",
|
||||
"@prometheus-io/lezer-promql": "0.308.1",
|
||||
"lru-cache": "^11.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "@prometheus-io/lezer-promql",
|
||||
"version": "0.308.0",
|
||||
"version": "0.308.1",
|
||||
"description": "lezer-based PromQL grammar",
|
||||
"main": "dist/index.cjs",
|
||||
"type": "module",
|
||||
|
|
|
|||
4
web/ui/package-lock.json
generated
4
web/ui/package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
|||
{
|
||||
"name": "prometheus-io",
|
||||
"version": "0.308.0",
|
||||
"version": "0.308.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "prometheus-io",
|
||||
"version": "0.308.0",
|
||||
"version": "0.308.1",
|
||||
"workspaces": [
|
||||
"mantine-ui",
|
||||
"module/*"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "prometheus-io",
|
||||
"description": "Monorepo for the Prometheus UI",
|
||||
"version": "0.308.0",
|
||||
"version": "0.308.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "bash build_ui.sh --all",
|
||||
|
|
|
|||
Loading…
Reference in a new issue