This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git
The following commit(s) were added to refs/heads/master by this push:
new 9cf79f7282 PromQL service: query API support RFC3399 time format.
(#12644)
9cf79f7282 is described below
commit 9cf79f728283a05c62674dc410d85dd6fd0d14b1
Author: Wan Kai <[email protected]>
AuthorDate: Wed Sep 25 13:48:08 2024 +0800
PromQL service: query API support RFC3399 time format. (#12644)
---
.github/workflows/codeql.yaml | 2 +-
docs/en/api/promql-service.md | 36 +++++++++++-----------
docs/en/changes/changes.md | 3 +-
.../oap/query/promql/handler/PromQLApiHandler.java | 11 ++++++-
.../query/promql/rt/PromQLExprQueryVisitor.java | 2 +-
test/e2e-v2/cases/promql/promql-cases.yaml | 15 ++++++++-
6 files changed, 46 insertions(+), 23 deletions(-)
diff --git a/.github/workflows/codeql.yaml b/.github/workflows/codeql.yaml
index 4ab92bb148..a547a09ac6 100644
--- a/.github/workflows/codeql.yaml
+++ b/.github/workflows/codeql.yaml
@@ -57,7 +57,7 @@ jobs:
with:
languages: ${{ matrix.language }}
- - run: ./mvnw -q -Dmaven.test.skip=true clean install || ./mvnw -q
-Dmaven.test.skip=true clean install
+ - run: ./mvnw -q -Dmaven.test.skip=true clean install -Dgpg.skip ||
./mvnw -q -Dmaven.test.skip=true clean install -Dgpg.skip
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
diff --git a/docs/en/api/promql-service.md b/docs/en/api/promql-service.md
index 88861ae03e..9b7b3f4874 100644
--- a/docs/en/api/promql-service.md
+++ b/docs/en/api/promql-service.md
@@ -145,11 +145,11 @@ sum(http_requests_total{service='$service',
layer='$layer'})
GET|POST /api/v1/query
```
-| Parameter | Definition
| Support |
Optional |
-|-----------|-------------------------------------------------------------------------------------------------------------------------------------|---------|------------|
-| query | prometheus expression
| yes |
no |
-| time | **The latest metrics value from current time to this time is
returned. If time is empty, the default look-back time is 2 minutes.** | yes
| yes |
-| timeout | evaluation timeout
| **no** |
**ignore** |
+| Parameter | Definition
| Support | Optional |
+|-----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------|------------|
+| query | prometheus expression
| yes | no |
+| time | **The latest metrics value from current time to this time is
returned. If time is empty, the default look-back time is 2 minutes.** time
format: RFC3399 or unix_timestamp in seconds | yes | yes |
+| timeout | evaluation timeout
| **no** | **ignore** |
For example:
```text
@@ -191,8 +191,8 @@ GET|POST /api/v1/query_range
| Parameter | Definition
| Support | Optional |
|-----------|--------------------------------------------------------------------------------------|---------|------------|
| query | prometheus expression
| yes | no |
-| start | start timestamp, **seconds**
| yes | no |
-| end | end timestamp, **seconds**
| yes | no |
+| start | start timestamp, format: RFC3399 or unix_timestamp in seconds
| yes | no |
+| end | end timestamp, format: RFC3399 or unix_timestamp in seconds
| yes | no |
| step | **SkyWalking will automatically fit Step(DAY, HOUR, MINUTE)
through start and end.** | **no** | **ignore** |
| timeout | evaluation timeout
| **no** | **ignore** |
@@ -256,11 +256,11 @@ Result:
GET|POST /api/v1/series
```
-| Parameter | Definition | Support | Optional |
-|-----------|------------------------------|---------|----------|
-| match[] | series selector | yes | no |
-| start | start timestamp, **seconds** | yes | no |
-| end | end timestamp, **seconds** | yes | no |
+| Parameter | Definition | Support |
Optional |
+|-----------|-----------------------------------------------------|---------|----------|
+| match[] | series selector | yes |
no |
+| start | start, format: RFC3399 or unix_timestamp in seconds | yes |
no |
+| end | end, format: RFC3399 or unix_timestamp in seconds | yes |
no |
For example:
```text
@@ -321,7 +321,7 @@ GET|POST /api/v1/labels
| Parameter | Definition
| Support | Optional |
|-----------|---------------------------------------------------------------------------------|---------|----------|
| match[] | series selector
| yes | yes |
-| start | start timestamp
| **no** | yes |
+| start | start, format: RFC3399 or unix_timestamp in seconds
| **no** | yes |
| end | end timestamp, if end time is not present, use current time as
default end time | yes | yes |
For example:
@@ -351,11 +351,11 @@ Result:
GET /api/v1/label/<label_name>/values
```
-| Parameter | Definition
| Support | Optional |
-|-----------|---------------------------------------------------------------------------------|---------|----------|
-| match[] | series selector
| yes | yes |
-| start | start timestamp
| **no** | yes |
-| end | end timestamp, if end time is not present, use current time as
default end time | yes | yes |
+| Parameter | Definition
| Support | Optional |
+|-----------|---------------------------------------------------------------------------------------------------------------------|---------|----------|
+| match[] | series selector
| yes | yes |
+| start | start, format: RFC3399 or unix_timestamp in seconds
| **no** | yes |
+| end | end, format: RFC3399 or unix_timestamp in seconds, if end time
is not present, use current time as default end time | yes | yes |
For example:
```text
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 1c89cbd470..5ecf53a009 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -66,12 +66,13 @@
* Fix the previous analysis result missing in the ALS `k8s-mesh` analyzer.
* Fix `findEndpoint` query require `keyword` when using BanyanDB.
* Support to analysis the ztunnel mapped IP address in eBPF Access Log
Receiver.
-* Adapt BanyanDB Java Client 0.7.0-rc3.
+* Adapt BanyanDB Java Client 0.7.0.
* Add SkyWalking Java Agent self observability dashboard.
* Add Component ID(5022) for the GoFrame framework.
* Bump up protobuf java dependencies to 3.25.5.
* BanyanDB: support using native term searching for `keyword` in query
`findEndpoint` and `getAlarm`.
* BanyanDB: support TLS connection and configuration.
+* PromQL service: query API support RFC3399 time format.
#### UI
diff --git
a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
index 8371b0df7d..85652125e4 100644
---
a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
+++
b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/handler/PromQLApiHandler.java
@@ -100,6 +100,7 @@ import
org.apache.skywalking.oap.server.library.util.StringUtil;
import org.apache.skywalking.promql.rt.grammar.PromQLLexer;
import org.apache.skywalking.promql.rt.grammar.PromQLParser;
import org.joda.time.DateTime;
+import org.joda.time.format.ISODateTimeFormat;
import static
org.apache.skywalking.oap.query.promql.rt.PromOpUtils.formatDoubleValue;
@@ -582,7 +583,15 @@ public class PromQLApiHandler {
}
private static long formatTimestamp2Millis(String timestamp) {
- return Double.valueOf(timestamp).longValue() * 1000;
+ long time;
+ try {
+ // if Unix timestamp in seconds, such as 1627756800
+ time = Double.valueOf(timestamp).longValue() * 1000;
+ } catch (NumberFormatException e) {
+ // if RFC3399 format, such as 2024-09-19T20:11:00.781Z
+ time = ISODateTimeFormat.dateTime().parseMillis(timestamp);
+ }
+ return time;
}
private List<String> buildLabelNames(Scope scope,
ValueColumnMetadata.ValueColumn metaData) {
diff --git
a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/rt/PromQLExprQueryVisitor.java
b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/rt/PromQLExprQueryVisitor.java
index f46bf2ddd0..e96dd72b0b 100644
---
a/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/rt/PromQLExprQueryVisitor.java
+++
b/oap-server/server-query-plugin/promql-plugin/src/main/java/org/apache/skywalking/oap/query/promql/rt/PromQLExprQueryVisitor.java
@@ -312,7 +312,7 @@ public class PromQLExprQueryVisitor extends
PromQLParserBaseVisitor<ParseResult>
}
String timeRange = ctx.DURATION().getText().toUpperCase();
- long endTS = System.currentTimeMillis();
+ long endTS = this.duration.getEndTimestamp();
long startTS = endTS - formatDuration(timeRange).getMillis();
duration = DurationUtils.timestamp2Duration(startTS, endTS);
ParseResult result = visit(ctx.metricInstant());
diff --git a/test/e2e-v2/cases/promql/promql-cases.yaml
b/test/e2e-v2/cases/promql/promql-cases.yaml
index c32dd53ff3..3548d54e50 100644
--- a/test/e2e-v2/cases/promql/promql-cases.yaml
+++ b/test/e2e-v2/cases/promql/promql-cases.yaml
@@ -17,6 +17,9 @@ cases:
# traffics query
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/series -d
'match[]=service_traffic{layer="GENERAL"}&start='$(($(date
+%s)-1800))'&end='$(date +%s)
expected: expected/service-traffic.yml
+ #RFC3399
+ - query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/series -d
'match[]=service_traffic{layer="GENERAL"}&start='$(($(date
+%s)-1800))'&end='$(date -u +%Y-%m-%dT%H:%M:%S.111Z)
+ expected: expected/service-traffic.yml
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/series -d
'match[]=instance_traffic{layer="GENERAL",
service="e2e-service-provider"}&start='$(($(date +%s)-1800))'&end='$(date +%s)
expected: expected/instance-traffic.yml
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/series -d
'match[]=endpoint_traffic{layer="GENERAL", service="e2e-service-provider",
keyword="POST:/users"}&start='$(($(date +%s)-1800))'&end='$(date +%s)
@@ -29,11 +32,15 @@ cases:
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/series -d
'match[]=endpoint_cpm&start='$(($(date +%s)-1800))'&end='$(date +%s)
expected: expected/endpoint-metric-series.yml
# metrics names query
- - query: curl -X GET
http://${oap_host}:${oap_9090}/api/v1/label/__name__/values
+ - query: curl -X GET
http://${oap_host}:${oap_9090}/api/v1/label/__name__/values
+ expected: expected/metrics-names.yml
+ - query: curl -X GET
http://${oap_host}:${oap_9090}/api/v1/label/__name__/values -d
'start='$(($(date +%s)-1800))'&end='$(date -u +%Y-%m-%dT%H:%M:%S.111Z)
expected: expected/metrics-names.yml
# labels query
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/labels -d
'match[]=service_cpm'
expected: expected/service-metric-label.yml
+ - query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/labels -d
'match[]=service_cpm&start='$(($(date +%s)-1800))'&end='$(date -u
+%Y-%m-%dT%H:%M:%S.111Z)
+ expected: expected/service-metric-label.yml
- query: |
sleep 30;
curl -X GET http://${oap_host}:${oap_9090}/api/v1/labels -d
'match[]=service_percentile'
@@ -54,6 +61,9 @@ cases:
expected: expected/service-metric-vector.yml
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query -d
'query=service_sla{service="e2e-service-consumer", layer="GENERAL"}[30m]'
expected: expected/service-metric-matrix.yml
+ #RFC3399
+ - query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query -d
'query=service_sla{service="e2e-service-consumer",
layer="GENERAL"}[30m]&time='$(date -u +%Y-%m-%dT%H:%M:%S.111Z)
+ expected: expected/service-metric-matrix.yml
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query -d
'query=service_percentile{service="e2e-service-consumer", layer="GENERAL",
p="50,75,90"}'
expected: expected/service-metric-labeled-vector.yml
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query -d
'query=service_percentile_old{service="e2e-service-consumer", layer="GENERAL",
labels="0,1,2", relabels="P50,P75,P90"}'
@@ -72,6 +82,9 @@ cases:
## query_range
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query_range -d
'query=service_sla{service="e2e-service-consumer",
layer="GENERAL"}&start='$(($(date +%s)-1800))'&end='$(date +%s)
expected: expected/service-metric-matrix.yml
+ #RFC3399
+ - query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query_range -d
'query=service_sla{service="e2e-service-consumer",
layer="GENERAL"}&start='$(($(date +%s)-1800))'&end='$(date -u
+%Y-%m-%dT%H:%M:%S.111Z)
+ expected: expected/service-metric-matrix.yml
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query_range -d
'query=service_percentile{service="e2e-service-consumer", layer="GENERAL",
p="50,75,90"}&start='$(($(date +%s)-1800))'&end='$(date +%s)
expected: expected/service-metric-labeled-matrix.yml
- query: curl -X GET http://${oap_host}:${oap_9090}/api/v1/query_range -d
'query=sum by (p) (service_percentile{service="e2e-service-consumer",
layer="GENERAL", p="50,75,90"})&start='$(($(date +%s)-1800))'&end='$(date +%s)