mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Graphite: Expand metric names for variables (#33694)
* Allow expanding metrics names in variable queries * Simplify docs * Update docs/sources/datasources/graphite.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * Update docs/sources/datasources/graphite.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * Update docs/sources/datasources/graphite.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * Update docs/sources/datasources/graphite.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * Update docs/sources/datasources/graphite.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * Update docs/sources/datasources/graphite.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * Update docs/sources/datasources/graphite.md Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com> * Clean up docs Co-authored-by: achatterjee-grafana <70489351+achatterjee-grafana@users.noreply.github.com>
This commit is contained in:
parent
3e59ae7e56
commit
60cf0c8338
@ -138,9 +138,34 @@ For more details, see the [Graphite docs on the autocomplete API for tags](http:
|
|||||||
|
|
||||||
### Query variable
|
### Query variable
|
||||||
|
|
||||||
The query you specify in the query field should be a metric find type of query. For example, a query like `prod.servers.*` will fill the
|
The query you specify in the query field should be a metric find type of query. For example, a query like `prod.servers.*` fills the
|
||||||
variable with all possible values that exist in the wildcard position.
|
variable with all possible values that exist in the wildcard position.
|
||||||
|
|
||||||
|
The results contain all possible values occurring only at the last level of the query. To get full metric names matching the query
|
||||||
|
use expand function (`expand(*.servers.*)`).
|
||||||
|
|
||||||
|
#### Comparison between expanded and non-expanded metric search results
|
||||||
|
|
||||||
|
The expanded query returns the full names of matching metrics. In combination with regex, it can extract any part of the metric name. By contrast, a non-expanded query only returns the last part of the metric name. It does not allow you to extract other parts of metric names.
|
||||||
|
|
||||||
|
Here are some example metrics:
|
||||||
|
- `prod.servers.001.cpu`
|
||||||
|
- `prod.servers.002.cpu`
|
||||||
|
- `test.servers.001.cpu`
|
||||||
|
|
||||||
|
The following examples show how expanded and non-expanded queries can be used to fetch specific parts of the metrics name.
|
||||||
|
|
||||||
|
| non-expanded query | results | expanded query | expanded results |
|
||||||
|
|--------------|---------|----------------|------------------|
|
||||||
|
| `*` | prod, test | `expand(*)` | prod, test
|
||||||
|
| `*.servers` | servers | `expand(*.servers)` | prod.servers, test.servers |
|
||||||
|
| `test.servers` | servers | `expand(test.servers)` | test.servers |
|
||||||
|
| `*.servers.*` | 001,002 | `expand(*.servers.*)` | prod.servers.001, prod.servers.002, test.servers.001 |
|
||||||
|
| `test.servers.*` | 001 | `expand(test.servers.*)` | test.servers.001 |
|
||||||
|
| `*.servers.*.cpu` | cpu | `expand(*.servers.*.cpu)` | prod.servers.001.cpu, prod.servers.002.cpu, test.servers.001.cpu |
|
||||||
|
|
||||||
|
As you can see from the results, the non-expanded query is the same as an expanded query with a regex matching the last part of the name.
|
||||||
|
|
||||||
You can also create nested variables that use other variables in their definition. For example
|
You can also create nested variables that use other variables in their definition. For example
|
||||||
`apps.$app.servers.*` uses the variable `$app` in its query definition.
|
`apps.$app.servers.*` uses the variable `$app` in its query definition.
|
||||||
|
|
||||||
|
@ -512,6 +512,16 @@ describe('graphiteDatasource', () => {
|
|||||||
expect(requestOptions.data).toEqual('query=app.*');
|
expect(requestOptions.data).toEqual('query=app.*');
|
||||||
expect(results).not.toBe(null);
|
expect(results).not.toBe(null);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should request expanded metrics', () => {
|
||||||
|
ctx.ds.metricFindQuery('expand(*.servers.*)').then((data: any) => {
|
||||||
|
results = data;
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(requestOptions.url).toBe('/api/datasources/proxy/1/metrics/expand');
|
||||||
|
expect(requestOptions.params.query).toBe('*.servers.*');
|
||||||
|
expect(results).not.toBe(null);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -365,6 +365,8 @@ export class GraphiteDatasource extends DataSourceApi<
|
|||||||
|
|
||||||
metricFindQuery(query: string, optionalOptions?: any): Promise<MetricFindValue[]> {
|
metricFindQuery(query: string, optionalOptions?: any): Promise<MetricFindValue[]> {
|
||||||
const options: any = optionalOptions || {};
|
const options: any = optionalOptions || {};
|
||||||
|
|
||||||
|
// First attempt to check for tag-related functions (using empty wildcard for interpolation)
|
||||||
let interpolatedQuery = this.templateSrv.replace(
|
let interpolatedQuery = this.templateSrv.replace(
|
||||||
query,
|
query,
|
||||||
getSearchFilterScopedVar({ query, wildcardChar: '', options: optionalOptions })
|
getSearchFilterScopedVar({ query, wildcardChar: '', options: optionalOptions })
|
||||||
@ -386,26 +388,60 @@ export class GraphiteDatasource extends DataSourceApi<
|
|||||||
return this.getTagsAutoComplete(expressions, undefined, options);
|
return this.getTagsAutoComplete(expressions, undefined, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If no tag-related query was found, perform metric-based search (using * as the wildcard for interpolation)
|
||||||
|
let useExpand = query.match(/^expand\((.*)\)$/);
|
||||||
|
query = useExpand ? useExpand[1] : query;
|
||||||
|
|
||||||
interpolatedQuery = this.templateSrv.replace(
|
interpolatedQuery = this.templateSrv.replace(
|
||||||
query,
|
query,
|
||||||
getSearchFilterScopedVar({ query, wildcardChar: '*', options: optionalOptions })
|
getSearchFilterScopedVar({ query, wildcardChar: '*', options: optionalOptions })
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let range;
|
||||||
|
if (options.range) {
|
||||||
|
range = {
|
||||||
|
from: this.translateTime(options.range.from, false, options.timezone),
|
||||||
|
until: this.translateTime(options.range.to, true, options.timezone),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (useExpand) {
|
||||||
|
return this.requestMetricExpand(interpolatedQuery, options.requestId, range);
|
||||||
|
} else {
|
||||||
|
return this.requestMetricFind(interpolatedQuery, options.requestId, range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for metrics matching giving pattern using /metrics/find endpoint. It will
|
||||||
|
* return all possible values at the last level of the query, for example:
|
||||||
|
*
|
||||||
|
* metrics: prod.servers.001.cpu, prod.servers.002.cpu
|
||||||
|
* query: *.servers.*
|
||||||
|
* result: 001, 002
|
||||||
|
*
|
||||||
|
* For more complex searches use requestMetricExpand
|
||||||
|
*/
|
||||||
|
private requestMetricFind(
|
||||||
|
query: string,
|
||||||
|
requestId: string,
|
||||||
|
range?: { from: any; until: any }
|
||||||
|
): Promise<MetricFindValue[]> {
|
||||||
const httpOptions: any = {
|
const httpOptions: any = {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
url: '/metrics/find',
|
url: '/metrics/find',
|
||||||
params: {},
|
params: {},
|
||||||
data: `query=${interpolatedQuery}`,
|
data: `query=${query}`,
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
},
|
},
|
||||||
// for cancellations
|
// for cancellations
|
||||||
requestId: options.requestId,
|
requestId: requestId,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (options.range) {
|
if (range) {
|
||||||
httpOptions.params.from = this.translateTime(options.range.from, false, options.timezone);
|
httpOptions.params.from = range.from;
|
||||||
httpOptions.params.until = this.translateTime(options.range.to, true, options.timezone);
|
httpOptions.params.until = range.until;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.doGraphiteRequest(httpOptions)
|
return this.doGraphiteRequest(httpOptions)
|
||||||
@ -422,6 +458,46 @@ export class GraphiteDatasource extends DataSourceApi<
|
|||||||
.toPromise();
|
.toPromise();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for metrics matching giving pattern using /metrics/expand endpoint.
|
||||||
|
* The result will contain all metrics (with full name) matching provided query.
|
||||||
|
* It's a more flexible version of /metrics/find endpoint (@see requestMetricFind)
|
||||||
|
*/
|
||||||
|
private requestMetricExpand(
|
||||||
|
query: string,
|
||||||
|
requestId: string,
|
||||||
|
range?: { from: any; until: any }
|
||||||
|
): Promise<MetricFindValue[]> {
|
||||||
|
const httpOptions: any = {
|
||||||
|
method: 'GET',
|
||||||
|
url: '/metrics/expand',
|
||||||
|
params: { query },
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
},
|
||||||
|
// for cancellations
|
||||||
|
requestId,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (range) {
|
||||||
|
httpOptions.params.from = range.from;
|
||||||
|
httpOptions.params.until = range.until;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.doGraphiteRequest(httpOptions)
|
||||||
|
.pipe(
|
||||||
|
map((results: any) => {
|
||||||
|
return _map(results.data.results, (metric) => {
|
||||||
|
return {
|
||||||
|
text: metric,
|
||||||
|
expandable: false,
|
||||||
|
};
|
||||||
|
});
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.toPromise();
|
||||||
|
}
|
||||||
|
|
||||||
getTags(optionalOptions: any) {
|
getTags(optionalOptions: any) {
|
||||||
const options = optionalOptions || {};
|
const options = optionalOptions || {};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user