mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-25 21:54:10 -08:00
codemirror-promql: add method to fetch flags in prometheus client (#11090)
Signed-off-by: Augustin Husson <husson.augustin@gmail.com>
This commit is contained in:
parent
d943f39f22
commit
f486efbb9a
|
@ -36,6 +36,8 @@ export interface PrometheusClient {
|
|||
// Note that the returned list can be a superset of those suggestions for the prefix (i.e., including ones without the
|
||||
// prefix), as codemirror will filter these out when displaying suggestions to the user.
|
||||
metricNames(prefix?: string): Promise<string[]>;
|
||||
// flags returns flag values that prometheus was configured with.
|
||||
flags(): Promise<Record<string, string>>;
|
||||
}
|
||||
|
||||
export interface CacheConfig {
|
||||
|
@ -209,6 +211,15 @@ export class HTTPPrometheusClient implements PrometheusClient {
|
|||
return this.labelValues('__name__');
|
||||
}
|
||||
|
||||
flags(): Promise<Record<string, string>> {
|
||||
return this.fetchAPI<Record<string, string>>(this.flagsEndpoint()).catch((error) => {
|
||||
if (this.errorHandler) {
|
||||
this.errorHandler(error);
|
||||
}
|
||||
return {};
|
||||
});
|
||||
}
|
||||
|
||||
private fetchAPI<T>(resource: string, init?: RequestInit): Promise<T> {
|
||||
return this.fetchFn(this.url + resource, init)
|
||||
.then((res) => {
|
||||
|
@ -254,6 +265,10 @@ export class HTTPPrometheusClient implements PrometheusClient {
|
|||
private metricMetadataEndpoint(): string {
|
||||
return `${this.apiPrefix}/metadata`;
|
||||
}
|
||||
|
||||
private flagsEndpoint(): string {
|
||||
return `${this.apiPrefix}/status/flags`;
|
||||
}
|
||||
}
|
||||
|
||||
class Cache {
|
||||
|
@ -263,6 +278,7 @@ class Cache {
|
|||
private metricMetadata: Record<string, MetricMetadata[]>;
|
||||
private labelValues: LRUCache<string, string[]>;
|
||||
private labelNames: string[];
|
||||
private flags: Record<string, string>;
|
||||
|
||||
constructor(config?: CacheConfig) {
|
||||
const maxAge = config && config.maxAge ? config.maxAge : 5 * 60 * 1000;
|
||||
|
@ -270,6 +286,7 @@ class Cache {
|
|||
this.metricMetadata = {};
|
||||
this.labelValues = new LRUCache<string, string[]>(maxAge);
|
||||
this.labelNames = [];
|
||||
this.flags = {};
|
||||
if (config?.initialMetricList) {
|
||||
this.setLabelValues('__name__', config.initialMetricList);
|
||||
}
|
||||
|
@ -297,6 +314,14 @@ class Cache {
|
|||
});
|
||||
}
|
||||
|
||||
setFlags(flags: Record<string, string>): void {
|
||||
this.flags = flags;
|
||||
}
|
||||
|
||||
getFlags(): Record<string, string> {
|
||||
return this.flags;
|
||||
}
|
||||
|
||||
setMetricMetadata(metadata: Record<string, MetricMetadata[]>): void {
|
||||
this.metricMetadata = metadata;
|
||||
}
|
||||
|
@ -388,7 +413,7 @@ export class CachedPrometheusClient implements PrometheusClient {
|
|||
|
||||
return this.client.metricMetadata().then((metadata) => {
|
||||
this.cache.setMetricMetadata(metadata);
|
||||
return this.cache.getMetricMetadata();
|
||||
return metadata;
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -402,4 +427,16 @@ export class CachedPrometheusClient implements PrometheusClient {
|
|||
metricNames(): Promise<string[]> {
|
||||
return this.labelValues('__name__');
|
||||
}
|
||||
|
||||
flags(): Promise<Record<string, string>> {
|
||||
const cachedFlags = this.cache.getFlags();
|
||||
if (cachedFlags && Object.keys(cachedFlags).length > 0) {
|
||||
return Promise.resolve(cachedFlags);
|
||||
}
|
||||
|
||||
return this.client.flags().then((flags) => {
|
||||
this.cache.setFlags(flags);
|
||||
return flags;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue