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]

Reply via email to