This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/master by this push:
new 96a98d9a4b feat(collector): resolve time expressions in http url and
headers (#4334)
96a98d9a4b is described below
commit 96a98d9a4b8d9a575d3a9961c2776ecf5276243e
Author: NekoPunch <[email protected]>
AuthorDate: Sat Aug 22 19:51:03 2026 -0700
feat(collector): resolve time expressions in http url and headers (#4334)
Co-authored-by: aias00 <[email protected]>
---
.../collector/collect/http/HttpCollectImpl.java | 13 +++----
.../collect/http/HttpCollectImplTest.java | 41 ++++++++++++++++++++++
home/docs/help/time_expression.md | 2 ++
.../current/help/time_expression.md | 2 ++
4 files changed, 52 insertions(+), 6 deletions(-)
diff --git
a/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImpl.java
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImpl.java
index 408d32c0ce..fd147c132c 100644
---
a/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImpl.java
+++
b/hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImpl.java
@@ -901,7 +901,7 @@ public class HttpCollectImpl extends AbstractCollect {
if (headers != null && !headers.isEmpty()) {
for (Map.Entry<String, String> header : headers.entrySet()) {
if (StringUtils.hasText(header.getValue())) {
- requestBuilder.addHeader(header.getKey(),
header.getValue());
+ requestBuilder.addHeader(header.getKey(),
TimeExpressionUtil.calculate(header.getValue()));
}
}
}
@@ -936,18 +936,19 @@ public class HttpCollectImpl extends AbstractCollect {
}
// uri encode
+ String url = TimeExpressionUtil.calculate(httpProtocol.getUrl());
String uri;
if (enableUrlEncoding) {
// if the url contains parameters directly
- if (httpProtocol.getUrl().contains("?")) {
- String path = httpProtocol.getUrl().substring(0,
httpProtocol.getUrl().indexOf("?"));
- String query =
httpProtocol.getUrl().substring(httpProtocol.getUrl().indexOf("?") + 1);
+ if (url.contains("?")) {
+ String path = url.substring(0, url.indexOf("?"));
+ String query = url.substring(url.indexOf("?") + 1);
uri = UriUtils.encodePath(path, "UTF-8") + "?" +
UriUtils.encodeQuery(query, "UTF-8");
} else {
- uri = UriUtils.encodePath(httpProtocol.getUrl(), "UTF-8");
+ uri = UriUtils.encodePath(url, "UTF-8");
}
} else {
- uri = httpProtocol.getUrl();
+ uri = url;
}
// append query params
diff --git
a/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImplTest.java
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImplTest.java
index f69a95a32e..d5059725b6 100644
---
a/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImplTest.java
+++
b/hertzbeat-collector/hertzbeat-collector-basic/src/test/java/org/apache/hertzbeat/collector/collect/http/HttpCollectImplTest.java
@@ -32,9 +32,12 @@ import java.io.InputStream;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -674,4 +677,42 @@ class HttpCollectImplTest {
assertEquals("G1 Eden Space", firstRow.getColumns(1));
capturedRows.forEach(t -> assertEquals(2, t.getColumnsList().size()));
}
+
+ @Test
+ void collectResolvesTimeExpressionsInUrlAndHeaders() throws Exception {
+ AtomicReference<String> requestUri = new AtomicReference<>();
+ AtomicReference<String> yearHeader = new AtomicReference<>();
+ HttpServer server = HttpServer.create(new
InetSocketAddress("127.0.0.1", 0), 0);
+ server.createContext("/", exchange -> {
+ requestUri.set(exchange.getRequestURI().toString());
+ yearHeader.set(exchange.getRequestHeaders().getFirst("X-Year"));
+ exchange.sendResponseHeaders(200, -1);
+ exchange.close();
+ });
+ server.start();
+
+ try {
+ HttpProtocol http = HttpProtocol.builder()
+ .method("GET")
+ .host("127.0.0.1")
+ .port(String.valueOf(server.getAddress().getPort()))
+ .url("/metrics?year=${@year}")
+ .headers(Map.of("X-Year", "${@year}"))
+ .parseType(DispatchConstants.PARSE_DEFAULT)
+ .build();
+ Metrics metrics = Metrics.builder()
+ .http(http)
+ .aliasFields(Lists.newArrayList("responseTime"))
+ .build();
+ CollectRep.MetricsData.Builder builder =
CollectRep.MetricsData.newBuilder();
+
+ httpCollectImpl.collect(builder, metrics);
+
+ String year = String.valueOf(LocalDateTime.now().getYear());
+ assertEquals("/metrics?year=" + year, requestUri.get());
+ assertEquals(year, yearHeader.get());
+ } finally {
+ server.stop(0);
+ }
+ }
}
diff --git a/home/docs/help/time_expression.md
b/home/docs/help/time_expression.md
index a174d9c28a..afb87e28a9 100644
--- a/home/docs/help/time_expression.md
+++ b/home/docs/help/time_expression.md
@@ -52,7 +52,9 @@ ${FORMATTER [{ + | - }`<DURATION>` `<TIME_UNIT>`]}
#### Where to Use
+- Request path (URL) for HTTP protocol monitoring types
- Request parameters for HTTP protocol monitoring types
+- Request headers for HTTP protocol monitoring types
- Request Body for HTTP protocol monitoring types
#### Usage Examples
diff --git
a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/time_expression.md
b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/time_expression.md
index b72d4914de..7f1bdd58f4 100644
---
a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/time_expression.md
+++
b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/help/time_expression.md
@@ -52,7 +52,9 @@ ${FORMATTER [{ + | - }`<DURATION>` `<TIME_UNIT>`]}
#### 在哪里可以使用
+- HTTP协议监控类型的请求路径(URL)
- HTTP协议监控类型的请求参数
+- HTTP协议监控类型的请求头
- HTTP协议监控类型的请求体
#### 使用示例
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]