Skip to content

Commit 950f756

Browse files
committed
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>
2 parents 558b32f + ed75344 commit 950f756

File tree

10 files changed

+92
-11
lines changed

10 files changed

+92
-11
lines changed

CHANGELOG.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
## main / unreleased
44

5-
* [FEATURE] Templates: Add urlQueryEscape to template functions. #17403
65
* [BUGFIX] TSDB: Register `prometheus_tsdb_sample_ooo_delta` metric properly. #17477
76

7+
## 3.8.1 / 2025-12-16
8+
9+
* [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
10+
811
## 3.8.0 / 2025-11-28
912

10-
* [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
13+
* [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
1114
* [CHANGE] TSDB: Native Histogram Custom Bounds with a NaN threshold are now rejected. #17287
1215
* [FEATURE] OAuth2: support jwt-bearer grant-type (RFC7523 3.1). #17592
1316
* [FEATURE] Dockerfile: Add OpenContainers spec labels to Dockerfile. #16483

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.8.0
1+
3.8.1

storage/remote/client.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ func (c *Client) Store(ctx context.Context, req []byte, attempt int) (WriteRespo
301301
_ = httpResp.Body.Close()
302302
}()
303303

304+
// NOTE(bwplotka): Only PRW2 spec defines response HTTP headers. However, spec does not block
305+
// PRW1 from sending them too for reliability. Support this case.
306+
//
304307
// TODO(bwplotka): Pass logger and emit debug on error?
305308
// Parsing error means there were some response header values we can't parse,
306309
// we can continue handling.

storage/remote/write_handler.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ func isHistogramValidationError(err error) bool {
9696
}
9797

9898
// Store implements remoteapi.writeStorage interface.
99+
// TODO(bwplotka): Improve remoteapi.Store API. Right now it's confusing if PRWv1 flows should use WriteResponse or not.
100+
// If it's not filled, it will be "confirmed zero" which caused partial error reporting on client side in the past.
101+
// Temporary fix was done to only care about WriteResponse stats for PRW2 (see https://github.com/prometheus/client_golang/pull/1927
102+
// but better approach would be to only confirm if explicit stats were injected.
99103
func (h *writeHandler) Store(r *http.Request, msgType remoteapi.WriteMessageType) (*remoteapi.WriteResponse, error) {
100104
// Store receives request with decompressed content in body.
101105
body, err := io.ReadAll(r.Body)

storage/remote/write_handler_test.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1608,3 +1608,74 @@ func TestHistogramsReduction(t *testing.T) {
16081608
})
16091609
}
16101610
}
1611+
1612+
// Regression test for https://github.com/prometheus/prometheus/issues/17659
1613+
func TestRemoteWriteHandler_ResponseStats(t *testing.T) {
1614+
payloadV1, _, _, err := buildWriteRequest(nil, writeRequestFixture.Timeseries, nil, nil, nil, nil, "snappy")
1615+
require.NoError(t, err)
1616+
payloadV2, _, _, err := buildV2WriteRequest(nil, writeV2RequestFixture.Timeseries, writeV2RequestFixture.Symbols, nil, nil, nil, "snappy")
1617+
require.NoError(t, err)
1618+
1619+
for _, tt := range []struct {
1620+
msgType remoteapi.WriteMessageType
1621+
payload []byte
1622+
forceInjectHeaders bool
1623+
expectHeaders bool
1624+
}{
1625+
{
1626+
msgType: remoteapi.WriteV1MessageType,
1627+
payload: payloadV1,
1628+
},
1629+
{
1630+
msgType: remoteapi.WriteV1MessageType,
1631+
payload: payloadV1,
1632+
forceInjectHeaders: true,
1633+
expectHeaders: true,
1634+
},
1635+
{
1636+
msgType: remoteapi.WriteV2MessageType,
1637+
payload: payloadV2,
1638+
expectHeaders: true,
1639+
},
1640+
} {
1641+
t.Run(fmt.Sprintf("msg=%v/force-inject-headers=%v", tt.msgType, tt.forceInjectHeaders), func(t *testing.T) {
1642+
// Setup server side.
1643+
appendable := &mockAppendable{}
1644+
handler := NewWriteHandler(
1645+
promslog.NewNopLogger(),
1646+
nil,
1647+
appendable,
1648+
[]remoteapi.WriteMessageType{remoteapi.WriteV1MessageType, remoteapi.WriteV2MessageType},
1649+
false,
1650+
false,
1651+
false,
1652+
)
1653+
1654+
if tt.forceInjectHeaders {
1655+
base := handler
1656+
handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1657+
// Inject response header. This simulates PRWv1 server that uses PRWv2 response headers
1658+
// for confirmation of samples. This is not against spec and we support it.
1659+
w.Header().Set(rw20WrittenSamplesHeader, "2")
1660+
1661+
base.ServeHTTP(w, r)
1662+
})
1663+
}
1664+
1665+
srv := httptest.NewServer(handler)
1666+
1667+
// Send message and do the parse response flow.
1668+
c := &Client{Client: srv.Client(), urlString: srv.URL, timeout: 5 * time.Minute, writeProtoMsg: tt.msgType}
1669+
1670+
stats, err := c.Store(t.Context(), tt.payload, 0)
1671+
require.NoError(t, err)
1672+
1673+
if tt.expectHeaders {
1674+
require.True(t, stats.Confirmed)
1675+
require.Equal(t, len(appendable.samples), stats.Samples)
1676+
} else {
1677+
require.False(t, stats.Confirmed)
1678+
}
1679+
})
1680+
}
1681+
}

web/ui/mantine-ui/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@prometheus-io/mantine-ui",
33
"private": true,
4-
"version": "0.308.0",
4+
"version": "0.308.1",
55
"type": "module",
66
"scripts": {
77
"start": "vite",
@@ -28,7 +28,7 @@
2828
"@microsoft/fetch-event-source": "^2.0.1",
2929
"@nexucis/fuzzy": "^0.5.1",
3030
"@nexucis/kvsearch": "^0.9.1",
31-
"@prometheus-io/codemirror-promql": "0.308.0",
31+
"@prometheus-io/codemirror-promql": "0.308.1",
3232
"@reduxjs/toolkit": "^2.10.1",
3333
"@tabler/icons-react": "^3.35.0",
3434
"@tanstack/react-query": "^5.90.7",

web/ui/module/codemirror-promql/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@prometheus-io/codemirror-promql",
3-
"version": "0.308.0",
3+
"version": "0.308.1",
44
"description": "a CodeMirror mode for the PromQL language",
55
"types": "dist/esm/index.d.ts",
66
"module": "dist/esm/index.js",
@@ -29,7 +29,7 @@
2929
},
3030
"homepage": "https://github.com/prometheus/prometheus/blob/main/web/ui/module/codemirror-promql/README.md",
3131
"dependencies": {
32-
"@prometheus-io/lezer-promql": "0.308.0",
32+
"@prometheus-io/lezer-promql": "0.308.1",
3333
"lru-cache": "^11.2.2"
3434
},
3535
"devDependencies": {

web/ui/module/lezer-promql/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@prometheus-io/lezer-promql",
3-
"version": "0.308.0",
3+
"version": "0.308.1",
44
"description": "lezer-based PromQL grammar",
55
"main": "dist/index.cjs",
66
"type": "module",

web/ui/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

web/ui/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "prometheus-io",
33
"description": "Monorepo for the Prometheus UI",
4-
"version": "0.308.0",
4+
"version": "0.308.1",
55
"private": true,
66
"scripts": {
77
"build": "bash build_ui.sh --all",

0 commit comments

Comments
 (0)