Hi, I got my Grafana connected to my MySQL DB and visualize one table using a panel.
This is the sample data I want to see as a graph on hourly basis:
SELECT server_name, stat_dtm, cpu_max_usage, memory_max_usage FROM mytable where stat_type = 60;
![캡처](https://us1.discourse-cdn.com/grafanastaging/original/3X/8/7/872fb418a0a7b328a411a1ea25701be065fc73ce.png)
So I wrote the following query in Grafana panel page as below. I will set server_name value as the names of the servers I want to show.
select *
from (
select unix_timestamp(str_to_date(stat_dtm,'%Y%m%d%H%i%s')) 'time', server_name, CPU_MAX_USAGE, MEMORY_MAX_USAGE
from mytable
where stat_type = 60 and server_name = 'servername'
) as t
where $__timeFilter(time)
ORDER BY time
But what I see where the graph has to show up is ‘Data does not have a time field’, even though I set the name of timestamp as time. What am I missing to properly show the data? Thanks in advance.
have you tried changing this option
![image](https://us1.discourse-cdn.com/grafanastaging/original/3X/6/e/6e3de46c9b503328067bae11f256da559e399b7c.png)
from time series to table
btw why do you need nested query for that?
cant you use this?
and even if I need to use nested query on that
I would love to avoid SELECT *
and use column names instead
SELECT STR_TO_DATE(stat_dtm,'%Y-%m-%d %H:%i:%s') AS 'time',
server_name,
CPU_MAX_USAGE,
MEMORY_MAX_USAGE
FROM mytable
WHERE $__timeFilter(STR_TO_DATE(stat_dtm,'%Y-%m-%d %H:%i:%s'))
AND stat_type = 60
AND server_name = 'servername'
2 Likes
The reason why I nested the query was that the panel said there was no time field even though I set the column name of timestamp as ‘time’; so I tried to make the table itself in FROM clause have ‘time’ column .
hmm hmm…
let me know if my query above doesnt work
1 Like
The query that Grafana generated using yours is as below; checked the log and it said "Error 1582: Incorrect parameter count in the call to native function 'STR_TO_DATE'"
, the problem is that Grafana did not parse $__timeFilter()
correctly. This is where I had nested my weird query, to pass ‘time’ as the parameter of $__timeFilter()
not STR_TO_DATE()
. Think I have to work on this more…
SELECT STR_TO_DATE(stat_dtm,'%Y-%m-%d %H:%i:%s') AS 'time',
server_name,
CPU_MAX_USAGE,
MEMORY_MAX_USAGE
FROM mytable
WHERE STR_TO_DATE(stat_dtm BETWEEN FROM_UNIXTIME(1624303700) AND FROM_UNIXTIME(1624325300))
AND stat_type = 60
AND server_name = 'servername'
Thank you though, I really appreciate your comment.
try casting it as DATETIME
WHERE $__timeFilter(CAST(STR_TO_DATE(stat_dtm,'%Y-%m-%d %H:%i:%s') AS DATETIME))
or you can use this
WHERE STR_TO_DATE(stat_dtm,'%Y-%m-%d %H:%i:%s') BETWEEN FROM_UNIXTIME($__unixEpochFrom()) AND FROM_UNIXTIME($__unixEpochTo())
$__unixEpochFrom() and $__unixEpochTo() are functions to get date selection
the str to date format will depend on your string,
maybe yours fit more than mine: ‘%Y%m%d%H%i%s’
2 Likes
Buddy I appreciate it so much! I tested the second one you proposed, and I tried $__timeFrom()
and $__timeTo()
instead. I did not have to use $__timeFilter()
which cannot convert to the actual query correctly.
WHERE CAST(STR_TO_DATE(stat_dtm,‘%Y-%m-%d %H:%i:%s’) AS DATETIME) between $__timeFrom() AND $__timeTo()
So all I have to do now is just to set the time range and it is not a hard job at all. Your comment help me solve this problem. Hope you to enjoy your day.
For those who read this:
If you put some functions in $__timeFilter()
like $__timeFilter(fn(param))
, Grafana might convert it to fn(param BETWEEN FROM_UNIXTIME(<from>) AND FROM_UNIXTIME(<to>))
, not fn(param) BETWEEN FROM_UNIXTIME(<from>) AND FROM_UNIXTIME(<to>)
. So I recommend to use $__timeFrom()
and $__timeTo()
instead.
1 Like
if you look at the generated SQL
what is the result of $__timeFrom() AND $__timeTo()
?
*I didnt know that function haha - thanks for this new tips
I always use $__unixEpochFrom()
and then convert it to normal date haha
This is the WHERE clause I entered,
(STR_TO_DATE(stat_dtm,‘%Y%m%d%H%i%s’) between $__timeFrom() AND $__timeTo())
and this the converted one I get in the query inspector.
(STR_TO_DATE(stat_dtm,‘%Y%m%d%H%i%s’) between FROM_UNIXTIME(1619794800) AND FROM_UNIXTIME(1622473199))
Each function retrieves starting and finishing timestamps in the selected time range. The unix times above are 2021-05-01 00:00:00
and 2021-05-31 23:59:59
, respectively.
1 Like