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

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