Gnuplot 按天分组的打印HTTP状态代码

Gnuplot 按天分组的打印HTTP状态代码,gnuplot,Gnuplot,我有一个带时间戳的HTTP状态代码流: 2021-02-09T10:54:00 200 50 2021-02-09T10:57:00 200 35 2021-02-09T11:00:00 200 50 2021-02-09T11:03:00 500 150 2021-02-09T11:06:00 500 350 2021-02-09T11:09:00 500 450 2021-02-09T11:12:00 500 1000 2021-02-09T11:15:00 404 35 2021-02-0

我有一个带时间戳的HTTP状态代码流:

2021-02-09T10:54:00 200 50
2021-02-09T10:57:00 200 35
2021-02-09T11:00:00 200 50
2021-02-09T11:03:00 500 150
2021-02-09T11:06:00 500 350
2021-02-09T11:09:00 500 450
2021-02-09T11:12:00 500 1000
2021-02-09T11:15:00 404 35
2021-02-09T11:18:00 404 50
2021-02-09T11:21:00 200 50
2021-02-09T11:24:00 200 35
2021-02-09T11:27:00 200 50
2021-02-09T11:30:00 200 50
我已经成功地设置了
gnuplot
来分组日期:

set xdata time
set ydata time
set format y "%H:%M"
set timefmt "%Y-%m-%dT%H:%M:%S"
set xrange ["2021-02-08T00:00:00":"2021-02-14T23:59:59"]

plot 'availability.csv' using (timecolumn(1,"%Y-%m-%d")):(timecolumn(1,"%H-%M")):2…
我已经找到了很多样本,比如当天求和(方框/直方图)或标记每天的时间点(点)。但它们都不符合我的目标:随着时间的推移,可用性

我的目标是每天有一个15分钟的酒吧。每个区块应根据max状态代码进行着色,例如HTTP.500=红色、HTTP.404=黄色、HTTP.200=绿色(只有这三种颜色,没有茶壶/重定向/怪异的颜色,颜色类似于红绿灯)。Y轴是一天中的小时,x轴是一天

  • 我在正确的轨道上吗?使用
    gnuplot
    ,这可能吗
  • using
    子句是什么样子的
  • 15分钟的间隔是如何合并到第二列的
  • 如何给特定代码上色?(这不像是根据频率计算颜色的热图)

  • 我将从以下内容开始

    • timecolumn(1,“%H-%M”)
      不从时间字符串中提取小时和分钟,如
      “2021-02-08T12:34:56”
      。据我所知,首先我们必须提取
      12:34
      部分,然后将其转换为小时和分钟:

      strtime(“%H:%M”,strcol(1)[12:17])

    • 时间戳在内部存储为秒,因此可以使用整数除法将时间戳分为15分钟(=900秒)的时间戳:
      int()/900*900.0

    • gnuplot命令,如
      使用1:(,value)绘制“A.dat”
      计算表达式并绘制值。这是用来

    • “手动”选择箱子内的最大值。脚本将遍历bin中的所有点并记住最大值。请阅读
      帮助
      。我使用三元运算符两次:一次用于检查bin,一次用于检查max值

    • 有关颜色,请阅读
      帮助设置调色板

    这是完整的脚本:

    set xdata time
    set ydata time
    set format y "%H:%M"
    set timefmt "%Y-%m-%dT%H:%M:%S"
    set xrange ["2021-02-08T00:00:00":"2021-02-14T23:59:59"]
    
    set palette defined (200 "green", 400 "yellow", 500 "red")
    unset colorbox
    
    bin = 0
    bin_before = 0
    max_value = 0
    
    
    plot 'availability.csv' using \
              (timecolumn(1,"%Y-%m-%d")):\
              (bin = (int(strptime("%H:%M", strcol(1)[12:17]))/900*900), bin):\
              (y = $2, bin == bin_before ? (y>max_value ? max_value = y : max_value = max_value) \
                                         : (max_value = y, bin_before = bin), max_value )  \
              linecolor palette pt 5 ps 2 notitle
    
    结果是:


    我认为我们还没有完成,我们应该添加一个传奇,通过
    splot
    pm3d
    检查可能性可能会很有趣。我的建议如下。这可能不是最简单的,但我认为结果看起来是合理的。它将打印样式
    与boxyError一起使用(请参见
    帮助boxyError

    从您的问题中,我了解到您希望有15分钟的装箱时间,并在该时间间隔内仅显示最大状态的颜色。为什么不为每个间隔显示不同状态的柱状图?例如:如果在间隔中存在以下HTTP状态:2x 200、1x 404和2x 500。然后,该间隔内的水平条将分为40%绿色、20%黄色和40%红色

    以下代码的基本功能:

  • 创建一些随机测试数据(仅用于说明)
  • 使用
    平滑频率
    (检查
    帮助平滑
    )组合数据,并为3种不同状态添加1,2,3秒的小偏移量
  • 重新整理一下桌子
  • 创建包含框的x、y位置的最终表格,并与装箱间隔内每个状态的相对贡献相对应
  • 为了更好地理解:

    数据块的示例数据
    $data

    2021-02-10T12:30:00   200   407
    2021-02-10T12:33:00   200   922
    2021-02-10T12:36:00   404   615
    2021-02-10T12:39:00   200   689
    2021-02-10T12:42:00   200   628
    2021-02-10T12:45:00   500   10
    2021-02-10T12:48:00   200   185
    2021-02-10T12:51:00   200   2
    2021-02-10T12:54:00   404   743
    2021-02-10T12:57:00   200   618
    
    数据块的示例数据
    $histor3

    1612960200  5  i
    1612960201  4  i
    1612960202  1  i
    1612961100  5  i
    1612961101  3  i
    1612961102  1  i
    1612961103  1  i
    
    数据块的示例数据
    $histor4

            NaN     0   nan   12:30   0     
     2021-02-10     0   0.8   12:30   1     
     2021-02-10   0.8     1   12:30   2     
            NaN     0   nan   12:45   0     
     2021-02-10     0   0.6   12:45   1     
     2021-02-10   0.6   0.8   12:45   2     
     2021-02-10   0.8     1   12:45   3   
     
    
    代码当然可以优化。所以,把它作为一个起点

    代码:

    ### status overview as date/time dependent histograms
    reset session
    
    # general settings
    myDateFmt     = "%Y-%m-%d"                    # date only format
    myTimeFmt     = "%H:%M:%S"                    # time only format
    myDateTimeFmt = myDateFmt."T".myTimeFmt       # datetime format
    SecPerDay     = 24*3600                       # seconds per day
    myStatusList  = "200 404 500"                 # possible states
    myColorList   = "0x00ff00 0xffff00 0xff0000"  # green, yellow, red
    
    # create some random test data
    set print $Data
        myTime = time(0)                                 # now
        myRandomStatus(x) = x<0.70 ? 1 : x<0.95 ? 2 : 3  # random status
        myInterval = 3                                   # interval in minutes
        do for [i=1:5000] {
            myTime = myTime + myInterval*60
            myStatus = word(myStatusList,myRandomStatus(rand(0)))  # random status
            myValue = int(rand(0)*1000)                       # random value 0-999
            print sprintf("%s   %s   %g",strftime("%Y-%m-%dT%H:%M:00",myTime),myStatus,myValue)
        }
    set print
    
    # functions
    myStatusNo(col) = column(col)==200 ? 1 : column(col)==404 ? 2 : 3
    myColor(i)      = int(i) ? int(word(myColorList,int(i))) : 1
    myDayTime(t)    = tm_hour(t)*3600 + tm_min(t)*60 + tm_sec(t)
    
    # binning 
    BinWidthSec   = 900        # in seconds 900 sec = 15 min
    BinTime(col)  = floor(myDayTime(timecolumn(col,myDateTimeFmt))/BinWidthSec)*BinWidthSec
    
    set table $Histo1
        set format x "%.0f"
        plot $Data u (timecolumn(1,myDateFmt)+BinTime(1)):(1) smooth freq
        plot $Data u (timecolumn(1,myDateFmt)+BinTime(1)+myStatusNo(2)):(1) smooth freq
    set table $Histo2
        plot $Histo1 u (sprintf("%.0f",$1)):2 w table   # remove empty lines etc.
    set table $Histo3
        set format x "%.0f"
        plot $Histo2 u 1:2 smooth freq                  # sort the events by time
    unset table
    
    # create final table
    myX(col1,col2) = int(column(col1))%4==0 ? (Sum=0.0, Total=column(col2),"NaN") : \
                     strftime(myDateFmt,column(col1))
    myXRelStart(col1,col2) = Sum/Total
    myXRelEnd(col1,col2) = int(column(col1))%4==0 ? NaN : (Sum=Sum+column(col2), Sum/Total)
    BinTimeT(col) = strftime("%H:%M",column(col))
    
    set table $Histo4
        plot $Histo3 u (sprintf("% 10s % 5g % 5g % 7s % 3d", \
             myX(1,2), myXRelStart(1,2), myXRelEnd(1,2), BinTimeT(1), tm_sec($1))) w table
    unset table
    
    # plot settings
    set format x "%d.%m." timedate
    set format y "%H:%M" timedate
    set style fill transparent solid 0.5 noborder
    set yrange [0:SecPerDay]
    set tics out
    set key out title "HTTP status"
    
    plot $Histo4 u (timecolumn(1,myDateFmt)+($3+$2)/2*SecPerDay) : \
                   (timecolumn(4,myTimeFmt)+BinWidthSec/2) : \
                   (($3-$2)/2*SecPerDay) : (BinWidthSec/2.):(myColor($5)) \
                   w boxxy lc rgb var notitle, \
         for [i=1:3] keyentry w boxes lc rgb myColor(i) title word(myStatusList,i)
    
    ### end of code
    
    ####状态概述为日期/时间相关直方图
    重置会话
    #一般设置
    myDateFmt=“%Y-%m-%d”#仅日期格式
    myTimeFmt=“%H:%M:%S”#仅限时间格式
    MyDateTimemt=myDateFmt。“T”。myTimeFmt#datetime格式
    秒/天=24*3600秒/天
    myStatusList=“200 404 500”#可能的状态
    myColorList=“0x00ff00 0xffff00 0xff0000”#绿色、黄色、红色
    #创建一些随机测试数据
    设置打印$Data
    myTime=时间(0)#现在
    
    myRandomStatus(x)=xIs您的问题得到了回答吗?如有任何回应,将不胜感激!