首页

    influxdb counter with grafana

    标签:influxdb,grafana

    博客迁移到kubernetes,并且开了几个pod后,之前的监控就不能用了,因为kubernetes对pod的访问有负载均衡.prometheus scrape时,访问127.0.0.1:9145,每次的instance都不一样。
    可以使用prometheus的pushgateway,参见WHEN TO USE THE PUSHGATEWAY
    这里用influxdb,因为在之前文章try influxdb with openresty in kubernetes中,已经把供prometheus拉取的metrics数据也存入influxdb了,后面就是解决如何将influxdb里的数据展示成prometheus counter这种效果

    Influx Query Language (InfluxQL)

    COUNT()

    COUNT() function和sql类似,不过可以group by时间间隔,比如

    SELECT count("url") FROM request WHERE type= 'other' AND $timeFilter GROUP BY time(1m)
    

    $timeFilter是grafana的内置变量,表示当前选定的时间范围的表达式,如选定Last 7 days,此时$timeFilter表示time > now() - 7d,上面的InfluxQL等价于

    SELECT count("url") FROM request WHERE type= 'other' AND time > now() - 7d GROUP BY time(1m)
    

    CUMULATIVE_SUM()

    上图很像gauge,还不是counter效果。不过用influxdb提供的CUMULATIVE_SUM() function,就能接近counter效果了。

    SELECT cumulative_sum(count("url")) FROM request WHERE type= 'other' AND $timeFilter GROUP BY time(1m)
    

    然而y轴起始点为0,很尴尬

    grafana template variable

    可以使用grafana的template variable定义一个变量,表示y轴初始值,像这样

    select count(*) from request where type='other' and time<now()-12h
    

    select时加上这个初始值

    SELECT cumulative_sum(count("url"))+$other_init_count FROM request WHERE type= 'other' AND $timeFilter GROUP BY time(1m)
    

    效果

    query $timeFilter

    上面定义variable时,query里面的InfluxQL where语句对时间是写死的.可不可以用grafana的内置变量(如$timeFilter)替换呢?
    不可以,参见Handle built-in variables (such as $timeFilter) in template variables

    但是对于postgres,mysql,可以替换,参见

    mysql: pass timerange for template variable queries
    postgres: pass timerange for template variable queries

    time range value for template variable

    其实即便influxdb支持variable query使用内置变量,也有问题,就是获取初始值的influxQL where语句需要的是time<选定time range的开始时间

    select count(*) from request where type='other' and time<now()-12h
    

    但是目前不能通过grafana内置变量获取选定time range的起始时间和结束时间,参见Time range from & to as template variables.如果一定要获取,可以参考链接,用angularjs获取time range部分的html,再从中提取起始结束时间

    temporary solution

    我没有折腾angularjs那种方法,而是

    • 另外定义了一个变量range_start

    • 把之前获取初始值的influxQL改为
    select count(*) from request where type='other' and time<now()-$range_start
    
    • 后面每次改变time range时,range_start也对应改一下


    不定期更新