Elasticsearch Data Source
Elasticsearch is a distributed search and analytics engine. Grafana’s Elasticsearch data source allows you to query logs, metrics, and perform complex aggregations for visualization.Overview
The Elasticsearch data source supports:- Lucene query syntax for log searching
- Bucket and metric aggregations
- Time series metrics visualization
- Log exploration and filtering
- Template variables from Elasticsearch data
Source:
public/app/plugins/datasource/elasticsearch/Configuration
Connection Settings
Data Source Options
Index name or pattern. Supports:
- Wildcards:
logs-* - Time patterns:
[prefix-]YYYY.MM.DD - Multiple indices: Use comma-separated list in queries
Field name containing the timestamp. Must be a date type in Elasticsearch.
Minimum time interval for auto-interval calculation (e.g.,
10s, 1m).Maximum number of concurrent shard requests. Lower values reduce cluster load.
Field to display as the log message in log views.
Field containing log level for filtering and colorization.
Include frozen indices in search (Elasticsearch 7.0+).
Query Editor
The Elasticsearch query editor provides multiple query modes:- Metrics Query
- Logs Query
- Raw Data
Build time series queries using aggregations:
- Metric: Choose aggregation type (Count, Average, Sum, etc.)
- Group By: Add bucket aggregations (Date Histogram, Terms, etc.)
- Filters: Apply Lucene query filters
Lucene Query Syntax
Basic Queries
Field search:Query String Examples
Source:
public/app/plugins/datasource/elasticsearch/QueryBuilder.ts:197-207Metric Aggregations
Aggregation Types
Count
Count
Count number of documents:
Average
Average
Calculate average of a field:
Sum
Sum
Sum values of a field:
Min / Max
Min / Max
Get minimum or maximum value:
Percentiles
Percentiles
Calculate percentiles:
Extended Stats
Extended Stats
Get comprehensive statistics:Returns: count, min, max, avg, sum, sum_of_squares, variance, std_deviation
Bucket Aggregations
Date Histogram
Group data into time buckets:Source:
public/app/plugins/datasource/elasticsearch/QueryBuilder.ts:110-134auto: Grafana calculates based on time range1s,1m,1h,1d: Fixed intervals1w,1M,1q,1y: Calendar intervals
Terms Aggregation
Group by field values:Source:
public/app/plugins/datasource/elasticsearch/QueryBuilder.ts:53-108size: Number of buckets to return (default: 500)orderBy: Sort by_count,_term, or metric IDorder:ascordescmin_doc_count: Minimum documents per bucketmissing: Value for documents missing the field
Filters Aggregation
Create custom-named buckets with queries:Source:
public/app/plugins/datasource/elasticsearch/QueryBuilder.ts:147-160Histogram Aggregation
Group numeric values into buckets:GeoHash Grid
Group geo-points by location:Pipeline Aggregations
Perform calculations on other aggregations:Moving Average
Derivative
Cumulative Sum
Query Examples
HTTP Error Rate
Query:status:>=400
Aggregations:
- Metric: Count
- Group by: Date Histogram (@timestamp, auto interval)
- Group by: Terms (status, size: 10)
Average Response Time by Endpoint
Query:*
Aggregations:
- Metric: Average (response_time)
- Group by: Date Histogram (@timestamp, 1m)
- Group by: Terms (path, size: 20)
95th Percentile Latency
Query:service:api
Aggregations:
- Metric: Percentiles (duration, percents: [95])
- Group by: Date Histogram (@timestamp, auto)
Log Volume by Level
Query:*
Aggregations:
- Metric: Count
- Group by: Date Histogram (@timestamp, auto)
- Group by: Terms (level, order by: _count desc)
Template Variables
Terms Query
Populate variable from field values:Source:
public/app/plugins/datasource/elasticsearch/QueryBuilder.ts:400-458Using Variables in Queries
Annotations
Create annotations from Elasticsearch documents:Configure Query
- Index: Annotation index pattern
- Query: Lucene query to filter events
- Time Field: Field with timestamp
- Text Field: Field for annotation text
- Tags Field: Field for tags (comma-separated)
Performance Optimization
Use Index Patterns
Query specific indices instead of wildcards:vs.
Limit Shard Requests
Set
maxConcurrentShardRequests to reduce cluster load:Use Filters
Filter early with specific queries:Better than:
Limit Bucket Size
Reduce Terms aggregation size:Instead of default 500.
Troubleshooting
No data returned
No data returned
- Verify index pattern matches existing indices
- Check time field name and format
- Confirm time range includes data
- Review Elasticsearch logs for query errors
- Test query in Kibana/Dev Tools
Query timeout or performance issues
Query timeout or performance issues
- Reduce time range
- Add more specific filters to query
- Lower
maxConcurrentShardRequests - Use smaller aggregation bucket sizes
- Consider using Elasticsearch rollups
Field not found
Field not found
- Check field mapping in Elasticsearch
- Verify field exists in queried indices
- Use keyword subfield for text fields:
field.keyword - Refresh field list in data source settings
Incorrect aggregation results
Incorrect aggregation results
- Verify time field is correct date type
- Check for missing data in time range
- Review
min_doc_countsetting - Confirm field types match aggregation (numeric for avg/sum)
Best Practices
- Use keyword fields for aggregations:
field.keywordinstead of analyzed text fields - Set appropriate index patterns: Narrow to specific time ranges when possible
- Limit aggregation cardinality: Use filters or smaller bucket sizes
- Configure proper mappings: Set field types correctly in Elasticsearch
- Use index lifecycle management: Rotate and delete old indices
- Monitor cluster health: Watch for shard allocation and query performance