Grafana内置的运算函数

Grafana内置了如下运算函数, 相信不少人跟我一样,对于count和sum傻傻分不清楚,下面详细介绍一下。

运算函数说明
count数据点数(在单位时间里去抓取了几次metric),一般很少用,例如,配置了Prometheus每隔15s去抓取1次数据,在1分钟内的count就是5,5分钟内的count就是21
sum这个metric获取的所有value的总和,例如, 配置了Prometheus每隔15s去抓取1次数据,在1分钟内的抓取到的这个metric对应value分别是3,4,5,4,2,那么1分钟内的sum就是3+4+5+4+2
avg平均值,相当于sum/count
max最大值
min最小值
last最后一个值
diff起始值和最终值之间的差异
percent_diff 起始值与最终值之差/起始值与最终值的平均值* 100
count_not_nullvalue不为空的count

对于count的理解稍微有些难度。count通常是指(单位时间内的)metric数据的数量(例如,我们有个名为qps的metric,在过去1分钟内,我们每隔15s去获取1次qps的值,那么过去1分钟的count(qps)就是5),如果数据源是ElasticSearch,这个count通常指单位时间内的日志条目(日志数量),这样对于统计访问者/流量是比较有用的。但是如果数据源是Prometheus的的话,由于Prometheus的配置文件指定了每隔多久去抓取1次数据,因此count的数量比较固定。

Prometheus的label处理

Prometheus能否在查询的时候对label进行2次处理呢?答案是可以的。Prometheus提供了一系列函数可以在Query的时候进行二次处理,本文要介绍的函数是label_replace()。

我们都知道,在 Prometheus 的配置文件里,不论targets里的ip是否带了:9100,最终形成的instance里面都会给你带上这个端口,形成像192.168.1.1:9100这样的格式。这个 instance本身就是一个 Prometheus 内置的label(这里指192.168.1.1:9100)。今天我们演示一下把讨厌的:9100去掉。

虽然我们也可以使用Variables功能来对instance进行正则化处理(如下图),但是处理以后的结果,在dashboard里面无法选中单个主机。因此这种方法是有bug的(不推荐使用)。

 使用Variables功能来对instance进行正则化处理
使用Variables功能来对instance进行正则化处理
继续阅读

最近对视频编码的一些研究心得

从某知名视频网站下载了一个小视频, 1080P 25帧的, 比特率是2600kbps, 格式为H.264/AVC, 视频长度为5分钟, 才98M的体积. 某天心血来潮想把它转换为H.265/HEVC格式的视频, 试了无数次才发现, 用现有的工具, 转换出来的H.265/HEVC格式的视频, 体积比它大的, 可能还没有它清晰, 体积比它小的, 清晰度就差更多了. 传说中的H.265/HEVC的优势哪里去了?

1, 一些专有名词

Constant QP (CQP)

Constant Quantization Parameter, 恒定量化编码模式, 也称 CQ (constant quantizer)模式, 英文解释为The quantization parameter defines how much information to discard from a given block of pixels (a Macroblock), 此参数控制每个宏块(Macroblock)的压缩量. 此值越大, 表示要丢弃的Macroblock就越多(压缩率越大), 视频体积越小, 同时视频质量越差. 一般是用GPU转码时, 才会有CQP选项. 不建议使用此模式, 原因如下

Setting a fixed QP means that the resulting bitrate will be varying strongly depending on each scene’s complexity, and it will result in rather inefficient encodes for your input video. You may waste space and you have no control of the actual bitrate.

Average Bitrate (ABR)

平均比特率, 这个不多说了. 不建议使用此模式. 老外的分析如下

One of the main x264 developers himself says you should never use it. Why? As the encoder doesn’t know exactly what’s ahead in time, it will have to guess how to reach that bitrate. This means that the rate itself will vary, especially at the beginning of the clip, and at some point reach the target. Especially for HAS-type streaming, this leads to huge quality variations within short segments.

继续阅读

Prometheus add custom exporter

Prometheus(中文名:普罗米修斯)是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB). 使用Go语言开发, 基本原理是通过HTTP协议周期性抓取被监控组件的状态. Prometheus获取数据的策略是Pull而不是Push, 也就是说, 它会自己去抓取, 而不用你来推送. 抓取使用的是HTTP协议, 在配置文件中指定目标程序的端口, 路径及间隔时间即可.

目前互联网公司常用的组件大部分都有exporter可以直接使用, 比如Varnish、Haproxy、Nginx、MySQL、Linux系统信息(包括磁盘、内存、CPU、网络等等).

当Prometheus的node_exporter中没有我们需要的一些监控项时,就可以如zabbix一样添加一些自定义的metrics,让其支持我们所需要的监控项。node_exporter 可在启动时指定路径,并将该路径下的 *.prom 识别为监控数据文件。

准备获取metrics的脚本

$ cat /opt/monitor/get_info.sh
#! /bin/bash

echo Logical_CPU_core_total  `cat /proc/cpuinfo| grep processor| wc -l`
echo logined_users_total     `who | wc -l`;
echo procs_total `ps aux|wc -l`
echo procs_zombie       `ps axo pid=,stat=|grep Z|wc -l`

测试脚本执行情况

$ bash get_info.sh
Logical_CPU_core_total 2
logined_users_total 1
procs_total 148
procs_zombie 0

设置定时任务

* * * * * bash /opt/monitor/get_info.sh > /opt/monitor/get_info.prom

启动 node_exporter

启动 node_exporter 时指定*.prom 数据文件的路径

./node_exporter --collector.textfile.directory=/opt/monitor/

验证metrics

$ curl 127.0.0.1:9100/metrics|grep -E Logical_CPU_core_total|logined_users_total|procs_total|procs_zombie
# TYPE Logical_CPU_core_total untyped
Logical_CPU_core_total 2
# HELP logined_users_total Metric read from /opt/monitor/get_info.prom
# TYPE logined_users_total untyped
logined_users_total 1
# HELP procs_total Metric read from /opt/monitor/get_info.prom
# TYPE procs_total untyped
procs_total 151
# HELP procs_zombie Metric read from /opt/monitor/get_info.prom
# TYPE procs_zombie untyped
procs_zombie 0

参考文档:
Prometheus 自定义exporter 监控key

Windows平台iPhone音乐管理软件

Windows平台上好用且免费的iPhone音乐管理软件不多。今天发现这款免费的DearMob iPhone Music Manager。好用,且免费。

优点:

  • 最重要的一点,免费
  • 不依赖iTunes,网上很多类似的软件需要事先安装iTunes,这款不需要
  • 自动转换.flac等不支持的音乐格式为.mp3/.aac格式然后导入,且转换后的专辑封面/tag等信息均在
  • 界面上可以编辑音乐文件的tag信息

下载地址
https://www.5kplayer.com/iphone-manager/iphone-music-transfer-guide.htm

特别注意:
1,DearMob iPhone Music Manager 本身是免费的,它是DearMob iPhone Manager的其中一个组件。但是DearMob iPhone Manager是收费的,所以下载的时候,需要特别注意,我们要下载的是DearMob iPhone Music Manager,而不是DearMob iPhone Manager。
2,该厂商还提供一个免费的DearMob iPhone Photo Manager,同样是免费的,且是DearMob iPhone Manager的一个免费组件。介绍页面上显示该软件可以把PC上的照片重新拷贝回iPhone中,未尝试。

logstash的drop过滤器插件

logstash在filter段对日志进行解析的时候, 可以直接筛选出我们想要的日志内容, 如果日志内容里不包括某些字段, 我们可以把整条日志直接扔掉, 下面是配置.

input {
    kafka {
        bootstrap_servers => "k1.zhukun.net:6687 k2.zhukun.net:6687"
        #topics_pattern => "zhukun.net.log.rms-api.*"  # 如果收取多个kafaka topic里的消息可以用此写法
        topics => ["zhukun.net_console.log"]
        group_id => "logstash-mp-ops"
        consumer_threads => 10
        decorate_events => true
        auto_offset_reset => "latest"
    }
}

filter {

    # 如果message里不以2019/2020/2021开头, 则直接丢弃整条日志
    if [message] !~ /^[2020|2021|2019]/ {
        drop { }
    }
	
    # 直接打印出来原始日志看看
    #ruby {
    #    code => 'puts event("message")'
    #}
	
    # grop正则匹配
    grok {
        match => { "message" => '%{TIMESTAMP_ISO8601:time_local}\s*\[%{DATA:service}\]\s*%{LOGLEVEL:loglevel}\s*%{DATA:message}$' }
        overwrite => ["message"]
    }

    # 日期处理
    date {
        # 将time_local赋给@timestamp字段, 右侧是time_local的实际格式, 例如2019-03-18 08:12:45.006
        match => ["time_local", "yyyy-MM-dd HH:mm:ss.SSS"]
        target => "@timestamp"    # 默认target就是@timestamp
    }

    # 如果把整条日志都解析出来以后(已经解析到各个tag之中), 原始日志应该也没什么用了, 可以考虑直接扔掉原始日志
    #mutate {
    #    remove_field => [ "message" ]
    #}

}

output {
    elasticsearch {
        hosts => ["10.18.4.24:9200","10.18.4.25:9200","10.18.4.77:9200","10.18.4.78:9200", "10.11.149.69:9200","10.16.22.149:9200"]
        index => "zhukun.net_console.log-%{+yyyy.MM.dd}"
    }
    #stdout {
    #   codec => rubydebug {
    #       metadata => true
    #    }
    #}
}
继续阅读

使用Grafana的Templates功能实现主机分组

有时候,Grafana里展示的主机太多了,我们可能需要将主机进行分组展示,例如把主机根据使用的项目分组,或者按照使用部门进行分组。这个时候,就需要用到Grafana的Templates(模板)功能了。实际效果见下图:

使用Grafana的Templates功能实现主机分组

首先,我们看看Prometheus的配置文件:

继续阅读