diff --git a/CHANGES.md b/CHANGES.md index 3985ba144..e80df803a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -122,6 +122,7 @@ Release Notes. * Filtering NaN value samples when build SampleFamily * Add Thread and ClassLoader Metrics for the self-observability and otel-oc-rules * Simple optimization of trace sql query statement. Avoid "select *" query method +* Breaking Change: rename `qps` to `rpm` in LAL #### UI diff --git a/dist-material/config-examples/lal.yaml b/dist-material/config-examples/lal.yaml index f20e359a8..bc206c136 100644 --- a/dist-material/config-examples/lal.yaml +++ b/dist-material/config-examples/lal.yaml @@ -38,11 +38,11 @@ rules: sampler { if (log.service == "ImportantApp") { rateLimit("ImportantAppSampler") { - qps 300 + rpm 18000 } } else { rateLimit("OtherSampler") { - qps 30 + rpm 1800 } } } diff --git a/docs/en/concepts-and-designs/lal.md b/docs/en/concepts-and-designs/lal.md index ac6e1b764..65ef65cb2 100644 --- a/docs/en/concepts-and-designs/lal.md +++ b/docs/en/concepts-and-designs/lal.md @@ -244,8 +244,8 @@ Sampler allows you to save the logs in a sampling manner. Currently, the samplin contributions on more sampling strategies. If multiple samplers are specified, the last one determines the final sampling result. See examples in [Enforcer](#enforcer). -`rateLimit` samples `n` logs at a maximum rate of 1 second. `rateLimit("SamplerID")` requires an ID for the sampler. Sampler -declarations with the same ID share the same sampler instance, thus sharing the same `qps` and resetting logic. +`rateLimit` samples `n` logs at a maximum rate of 1 minute. `rateLimit("SamplerID")` requires an ID for the sampler. Sampler +declarations with the same ID share the same sampler instance, thus sharing the same `rpm` and resetting logic. Examples: @@ -257,11 +257,11 @@ filter { sampler { if (parsed.service == "ImportantApp") { rateLimit("ImportantAppSampler") { - qps 30 // samples 30 pieces of logs every second for service "ImportantApp" + rpm 1800 // samples 1800 pieces of logs every minute for service "ImportantApp" } } else { rateLimit("OtherSampler") { - qps 3 // samples 3 pieces of logs every second for other services than "ImportantApp" + rpm 180 // samples 180 pieces of logs every minute for other services than "ImportantApp" } } } diff --git a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/dsl/spec/sink/sampler/RateLimitingSampler.java b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/dsl/spec/sink/sampler/RateLimitingSampler.java index c629f7592..3f1c548e3 100644 --- a/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/dsl/spec/sink/sampler/RateLimitingSampler.java +++ b/oap-server/analyzer/log-analyzer/src/main/java/org/apache/skywalking/oap/log/analyzer/dsl/spec/sink/sampler/RateLimitingSampler.java @@ -31,11 +31,11 @@ import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; @Accessors(fluent = true) -@EqualsAndHashCode(of = {"qps"}) +@EqualsAndHashCode(of = {"rpm"}) public class RateLimitingSampler implements Sampler { @Getter @Setter - private volatile int qps; + private volatile int rpm; private final AtomicInteger factor = new AtomicInteger(); @@ -58,7 +58,7 @@ public class RateLimitingSampler implements Sampler { @Override public boolean sample() { - return factor.getAndIncrement() < qps; + return factor.getAndIncrement() < rpm; } @Override @@ -80,7 +80,7 @@ public class RateLimitingSampler implements Sampler { if (!started) { future = Executors.newSingleThreadScheduledExecutor() - .scheduleAtFixedRate(this::reset, 1, 1, TimeUnit.SECONDS); + .scheduleAtFixedRate(this::reset, 1, 1, TimeUnit.MINUTES); started = true; } } diff --git a/oap-server/analyzer/log-analyzer/src/test/java/org/apache/skywalking/oap/log/analyzer/dsl/DSLTest.java b/oap-server/analyzer/log-analyzer/src/test/java/org/apache/skywalking/oap/log/analyzer/dsl/DSLTest.java index 36f5451cd..95770ac87 100644 --- a/oap-server/analyzer/log-analyzer/src/test/java/org/apache/skywalking/oap/log/analyzer/dsl/DSLTest.java +++ b/oap-server/analyzer/log-analyzer/src/test/java/org/apache/skywalking/oap/log/analyzer/dsl/DSLTest.java @@ -93,13 +93,13 @@ public class DSLTest { " // use service:errorCode as sampler id so that each service:errorCode has its own sampler,\n" + " // e.g. checkoutservice:[upstreamConnectionFailure], checkoutservice:[upstreamRetryLimitExceeded]\n" + " rateLimit(\"${log.service}:${log.body.json.json}:${log.tags.getData(0).key}:${parsed?.commonProperties?.responseFlags}\") {\n" + - " qps 100\n" + + " rpm 100\n" + " }\n" + " } else {\n" + " // use service:responseCode as sampler id so that each service:responseCode has its own sampler,\n" + " // e.g. checkoutservice:500, checkoutservice:404.\n" + " rateLimit(\"${log.service}:${log.body?.type}:${log.traceContext?.traceId}:${parsed?.response?.responseCode}\") {\n" + - " qps 100\n" + + " rpm 100\n" + " }\n" + " }\n" + " }\n" + @@ -146,13 +146,13 @@ public class DSLTest { " // use service:errorCode as sampler id so that each service:errorCode has its own sampler,\n" + " // e.g. checkoutservice:[upstreamConnectionFailure], checkoutservice:[upstreamRetryLimitExceeded]\n" + " rateLimit(\"${log.service}:${(parsed?.commonProperties?.responseFlags as Map)?.keySet()}\") {\n" + - " qps 100\n" + + " rpm 100\n" + " }\n" + " } else {\n" + " // use service:responseCode as sampler id so that each service:responseCode has its own sampler,\n" + " // e.g. checkoutservice:500, checkoutservice:404.\n" + " rateLimit(\"${log.service}:${parsed?.response?.responseCode}\") {\n" + - " qps 100\n" + + " rpm 100\n" + " }\n" + " }\n" + " }\n" + diff --git a/oap-server/server-bootstrap/src/main/resources/lal/envoy-als.yaml b/oap-server/server-bootstrap/src/main/resources/lal/envoy-als.yaml index df4ac74cc..2da02922b 100644 --- a/oap-server/server-bootstrap/src/main/resources/lal/envoy-als.yaml +++ b/oap-server/server-bootstrap/src/main/resources/lal/envoy-als.yaml @@ -33,13 +33,13 @@ rules: // use service:errorCode as sampler id so that each service:errorCode has its own sampler, // e.g. checkoutservice:[upstreamConnectionFailure], checkoutservice:[upstreamRetryLimitExceeded] rateLimit("${log.service}:${parsed?.commonProperties?.responseFlags?.toString()}") { - qps 100 + rpm 6000 } } else { // use service:responseCode as sampler id so that each service:responseCode has its own sampler, // e.g. checkoutservice:500, checkoutservice:404. rateLimit("${log.service}:${parsed?.response?.responseCode}") { - qps 100 + rpm 6000 } } } diff --git a/oap-server/server-core/src/main/proto/RemoteService.proto b/oap-server/server-core/src/main/proto/RemoteService.proto index 7206b5b36..60dceaeb2 100644 --- a/oap-server/server-core/src/main/proto/RemoteService.proto +++ b/oap-server/server-core/src/main/proto/RemoteService.proto @@ -40,4 +40,4 @@ message RemoteData { } message Empty { -} \ No newline at end of file +}