Blame SOURCES/000-redis-support-wildcards-in-metric-names.patch

8f9145
diff --git a/src/datasources/redis/datasource.ts b/src/datasources/redis/datasource.ts
8f9145
index 6076585..aea11fc 100644
8f9145
--- a/src/datasources/redis/datasource.ts
8f9145
+++ b/src/datasources/redis/datasource.ts
8f9145
@@ -96,6 +96,7 @@ export class PCPRedisDatasource {
8f9145
     }
8f9145
 
8f9145
     async handleTarget(instancesValuesGroupedBySeries: Record<string, MetricValue[]>,
8f9145
+        metricNames: Record<string, string>,
8f9145
         descriptions: any, labels: any, target: QueryTarget): Promise<TargetResult> {
8f9145
         const metrics: Metric<number | string>[] = [];
8f9145
 
8f9145
@@ -125,7 +126,7 @@ export class PCPRedisDatasource {
8f9145
             }
8f9145
 
8f9145
             metrics.push({
8f9145
-                name: target.expr, // TODO: metric, not expression
8f9145
+                name: metricNames[series],
8f9145
                 instances: metricInstances
8f9145
             });
8f9145
         }
8f9145
@@ -179,10 +180,11 @@ export class PCPRedisDatasource {
8f9145
 
8f9145
         const instances = await this.pmSeriesSrv.getValues(seriesList, { start, finish, samples });
8f9145
         const descriptions = await this.pmSeriesSrv.getDescriptions(seriesList);
8f9145
+        const metricNames = await this.pmSeriesSrv.getMetricNames(seriesList);
8f9145
         const instanceValuesGroupedBySeries = _.groupBy(instances, "series");
8f9145
         const labels = this.pmSeriesSrv.getMetricAndInstanceLabels(seriesList);
8f9145
         const targetResults = await Promise.all(targets.map(target => this.handleTarget(
8f9145
-            _.pick(instanceValuesGroupedBySeries, seriesByExpr[target.expr]), descriptions, labels, target
8f9145
+            _.pick(instanceValuesGroupedBySeries, seriesByExpr[target.expr]), metricNames, descriptions, labels, target
8f9145
         )));
8f9145
         const panelData = this.transformations.transform(query, targetResults, PCPRedisDatasource.defaultLegendFormatter);
8f9145
         return {
8f9145
diff --git a/src/datasources/redis/pmseries_srv.ts b/src/datasources/redis/pmseries_srv.ts
8f9145
index e3c59c6..f3686a5 100644
8f9145
--- a/src/datasources/redis/pmseries_srv.ts
8f9145
+++ b/src/datasources/redis/pmseries_srv.ts
8f9145
@@ -8,6 +8,11 @@ export interface LabelsResponse {
8f9145
     labels: Labels;
8f9145
 }
8f9145
 
8f9145
+export interface MetricNamesResponse {
8f9145
+    series: string;
8f9145
+    name: string;
8f9145
+}
8f9145
+
8f9145
 class PmSeriesApi {
8f9145
 
8f9145
     constructor(private datasourceRequest: DatasourceRequestFn, private url: string) {
8f9145
@@ -67,6 +72,15 @@ class PmSeriesApi {
8f9145
         return _.isArray(metrics) ? metrics : []; // TODO: on error (no metrics found), pmproxy returns an object (should be an empty array)
8f9145
     }
8f9145
 
8f9145
+    async metricsSeries(series: string[]): Promise<MetricNamesResponse[]> {
8f9145
+        const response = await this.datasourceRequest({
8f9145
+            url: `${this.url}/series/metrics`,
8f9145
+            params: { series: series.join(',') }
8f9145
+        });
8f9145
+        const metricNames = response.data;
8f9145
+        return _.isArray(metricNames) ? metricNames : []; // TODO: on error (no metrics found), pmproxy returns an object (should be an empty array)
8f9145
+    }
8f9145
+
8f9145
     async labels(series: string[]): Promise<LabelsResponse[]> {
8f9145
         const response = await this.datasourceRequest({
8f9145
             url: `${this.url}/series/labels`,
8f9145
@@ -84,6 +98,7 @@ export class PmSeriesSrv {
8f9145
     private instanceCache: Record<string, Record<string, Instance>> = {}; // instanceCache[series][instance] = instance;
8f9145
     private labelCache: Record<string, Labels> = {}; // labelCache[series_or_instance] = labels;
8f9145
     private metricNamesCache: Record<string, string[]> = {}; // metricNamesCache[prefix] = name[];
8f9145
+    private metricNameOfSeriesCache: Record<string, string> = {};
8f9145
 
8f9145
     constructor(datasourceRequest: DatasourceRequestFn, url: string) {
8f9145
         this.pmSeriesApi = new PmSeriesApi(datasourceRequest, url);
8f9145
@@ -108,6 +123,17 @@ export class PmSeriesSrv {
8f9145
         return _.pick(this.descriptionCache, series);
8f9145
     }
8f9145
 
8f9145
+    async getMetricNames(series: string[]): Promise<Record<string, string>> {
8f9145
+        const requiredSeries = _.difference(series, Object.keys(this.metricNameOfSeriesCache));
8f9145
+        if (requiredSeries.length > 0) {
8f9145
+            const metricNames = await this.pmSeriesApi.metricsSeries(requiredSeries);
8f9145
+            for (const metricName of metricNames) {
8f9145
+                this.metricNameOfSeriesCache[metricName.series] = metricName.name;
8f9145
+            }
8f9145
+        }
8f9145
+        return _.pick(this.metricNameOfSeriesCache, series);
8f9145
+    }
8f9145
+
8f9145
     async getInstances(series: string[], ignoreCache = false): Promise<Record<string, Record<string, Instance>>> {
8f9145
         const requiredSeries = ignoreCache ? series : _.difference(series, Object.keys(this.instanceCache));
8f9145
         if (requiredSeries.length > 0) {