sqlgrafanainfluxdbmetricsinfluxql

How can I use data from more than one measurement in a single Grafana panel?


I am attempting to create a gauge panel in Grafana (Version 6.6.2 - presume that upgrading is a last resort, but possible if necessary, for the purposes of this problem) that can represent the percentage of total available memory used by the Java Virtual Machine running a process of mine. the problem that I am running into is the following:

JVM Memory Usage full picture JVM Memory max

I have used Springboot actuator's metrics and imported them into an Influx database with Micrometer, but in the process, it has stored the two values that I would like to use in my calculation into two different measurements. jvm_memory_used and jvm_memory_max


My initial Idea was to simply call a SELECT on both of the measurements to get the value that I want, and then divide the "used" / "max" and multiply that value by 100 to get the percentage to display. Unfortunately I run into syntax errors when I try to do this manually, and I am unsure if I can do this using Grafana's query builder.

I know that the syntax is incorrect, but I am not familiar enough with InfluxQL to know how to properly structure this query. Here is what I had tried:

(SELECT last("value")
    FROM "jvm_memory_used" 
    WHERE ("area" = 'heap') 
    AND $timeFilter 
    GROUP BY time($__interval) fill(null)
) /
(SELECT last("value")
    FROM "jvm_memory_max" 
    WHERE ("area" = 'heap') 
    AND $timeFilter 
    GROUP BY time($__interval) fill(null)
)

(The AND and GROUP BY are present as a result of the default values from Grafana's query builder, I am not sure whether they are necessary or not)

I'm assuming that my parenthesis and division process is illegal, but I am not sure how to resolve it.


How can I divide these two values from separate tables?

EDIT: I have gotten slightly further but it seems that there is a new issue. I now have the following query that I am sending in:

SELECT 100 * (last("used") / sum("max")) AS "percentUsed" 
    FROM(
        SELECT last("value") AS "used" 
            FROM "jvm_memory_used" 
            WHERE ("area" = 'heap')
            AND $timeFilter
    ),(
        SELECT last("value") AS "max" 
            FROM "jvm_memory_max" 
            WHERE ("area" = 'heap')
            AND $timeFilter
    )  
    GROUP BY time($__interval) fill(null)

and the result I get is this: enter image description here

How can I now get this query to return only one gauge with data, instead of two with nulls?

I've accepted an answer that works for versions of Grafana after 7. If there are any other answers that arise that do not involve updating the version of Grafana, please provide them as well!


Solution

  • I am not particulary experienced with Influx, but since your question is how to use/combine two measurements (query results) for a Grafana panel, I can tell you about one approach:

    You can use a transformation. By that, you can keep two separate queries. With the transformation mode binary operation you can simply divide one of your values by the other one.

    In your specific case, to display the result as percentage, you can then use Percent (0.0-1.0) as unit and you should have accomplished your goal.