== You can have Grafana tables with multiple values for a single metric (with Prometheus) Every so often, the most straightforward way to show some information in a Grafana dashboard is with a table, for example to list how long it is before TLS certificates expire, [[how frequently people are using your VPN servers PrometheusCountUsageOverTime]], or [[how much disk space they're using PrometheusCardinalityUnafraid]]. However, sometimes you want to present the underlying information in more than one way; for example, you might want to list both how many days until a TLS certificate expires and the date on which it will expire. The good news is that Grafana tables can do this, because ~~Grafana will merge query results with identical Prometheus label sets~~ (more or less). (There's a gotcha with this that we will come to.) In a normal Grafana table, your column fields are the labels of the metric and a 'Value' field that is whatever computed value your [[PromQL https://prometheus.io/docs/prometheus/latest/querying/basics/]] query returned. When you have several queries, the single 'Value' field turns into, eg, 'Value #A', 'Value #B', and so on, and all of them can be displayed in the table (and given more useful names and perhaps different formatting, so Grafana knows that one is a time in seconds and another is a 0.0 to 1.0 percentage). If the Prometheus queries return the same label sets, every result with the same set of labels will get merged into a single row in the table, with all of the 'Value #' fields having values. If not all sets of labels show up in all queries, the missing results will generally be shown as '-'. (Note that what matters for merging is not what fields you display, but all of the fields. Grafana will not merge rows just because your displayed fields have the same values.) The easiest way to get your label sets to be the same is to do the same query, just with different math applied to the query's value. You can do this to present TLS expiry as a duration and an absolute time, or usage over time as both a percentage and an amount of time (as seen in [[counting usage over time PrometheusCountUsageOverTime]]). A more advanced version is to do different queries while making sure that they return the same labels, possibly by either restricting what labels are returned with use of '_by (...)_' and similar operators (as sort of covered in [[this entry PrometheusCountDistinctLabels]]). When you're doing different queries of different metrics, an important gotcha comes up. When you do simple queries, Prometheus and Grafana acting together add a ((__name__)) label field with the name of the metric involved. You're probably not displaying this field, but its mere presence with a different value will block field merging. To get rid of it, you have various options, such as adding '_+ 0_' to the query or using some operator or function (as seen in the comments of [[this Grafana pull request https://github.com/grafana/grafana/pull/10050#issuecomment-393207206]] and [[this Grafana issue https://github.com/grafana/grafana/issues/12688]]). Conveniently, if you use '_by (...)_' with an operator to get rid of some normal labels, you'll get rid of ((__name__)) as well. All of this only works if you want to display two values for the same set of labels. If you want to pull in labels from multiple metrics, you need to do the merging in your PromQL query, generally using [[the usual tricks to pull in labels from other metrics PrometheusPullingInLabels]]. (I'm writing this all down because I wound up doing this recently and I want to capture what I learned before I forget how to do it.)