Aggregations
Overview
Aggregations compute metrics from your filtered data. Use them to answer questions like "How many errors per service?".
Syntax
Use the pipe operator | to chain a stats command after your filters:
<filters> | stats <function>(<field>) as <alias>Single aggregation:
level:error | stats count()Multiple aggregations:
level:error | stats count() total, count_uniq(workload) servicesWith grouping:
level:error | stats by (workload) count() errorsCounting Functions
count()
Count the number of records.
level:error | stats count()count_empty(field)
Count records where a field is empty.
* | stats count_empty(error)Logs with no error field
count_uniq(field)
Count unique values in a field.
* | stats count_uniq(user_id)Number of unique users
Numeric Aggregations
Numeric functions attempt to convert field values to numbers. Non-numeric values are treated as NULL and ignored.
avg(field)
Calculate the average (mean) value.
* | stats avg(duration_seconds)sum(field)
Calculate the total sum.
* | stats sum(bytes_sent)min(field) and max(field)
Find minimum and maximum values.
* | stats min(duration_seconds), max(duration_seconds)median(field)
Calculate the median value (50th percentile).
* | stats median(bytes)quantile(p, field)
Calculate percentiles. Use values between 0 and 1 (0.5 = 50th percentile, 0.95 = 95th percentile).
* | stats quantile(0.95, bytes_sent) p95* | stats quantile(0.5, bytes_sent) p50, quantile(0.95, bytes_sent) p95, quantile(0.99, bytes_sent) p99sum_len(field)
Sum the length of string values.
* | stats sum_len(message)Total characters in all messages
Value Aggregations
values(field)
Get all values (with duplicates).
level:error | stats values(error_message)All error messages
uniq_values(field)
Get unique values (no duplicates).
* | stats uniq_values(status_code)List of all status codes seen
Grouping with 'by'
Group results by one or more fields.
Single Field Grouping
* | stats by (workload) count()* | stats by (level) count() as log_countMultiple Field Grouping
* | stats by (workload, level) count()Multiple Functions
* | stats by (resource) count(), min(duration_seconds), max(duration_seconds), median(latency)Post-Aggregation Filtering
Filter results after aggregation.
Using filter pipe
* | stats by (workload) count() as request_count | filter request_count:>1000Workloads with more than 1000 requests
Implicit Filtering (Without filter keyword)
* | stats by (workload) count() as request_count | request_count:>1000Same as above, shorter syntax
Time-Series Aggregations
Note: In groundcover, time bucketing is configured externally through the UI time range selector, not in the query itself.
* | stats by (workload) count() as logs_per_minuteCount logs per workload (time interval set in UI)
* | stats by (status_code) count()Requests per status code over time
Last updated
