团队在开发流媒体服务,需要实现一个监控在线人数的功能,可以看到历史有多少人在线,当前有多少人在线的功能。 如果用mysql等关系型数据库来实现,可以用事件记录日志,然后通过PHP加上一些绘图的插件来实现,但这种方式并不好,首先用关系型数据库随着时间累积,会存在数据量越来越大,导致查询缓慢,再者需要编写这部分统计代码,因此并不是最佳选择。

我们很快找到了一个“时序性数据库”(prometheus),这种数据库会以时间节点来记录我们要存储的数据,然后结合他的一些绘图功能,我们完全可以不用写绘图的逻辑,而且prometheus还提供数据收集的功能,我们只需要把需要统计的数据按照固定的格式传递就好了。而Grafana是一个专门绘图的,支持很多种数据源,比如mysql,prometheus,es等数据库,绘图功能特别强大,因此我们便使用了这两种软件的结合实现了一个监控功能。

两个工具都是英文的,如果英文和我一样不怎么好,建议使用谷歌浏览器的网页翻译功能,可以节省很多时间
 

操作步骤:

  1. 安装
  2. 数据收集
  3. 收集验证
  4. 绘图配置
  5. 完成
1. Grafana

官方安装文档:grafana.com/grafana/dow…

mac下安装
brew install grafana
 
docker安装
docker run -d --name=grafana -p 3000:3000 grafana/grafana 
 
2. prometheus

官方安装文档:prometheus.io/docs/promet…

在安装之前我们先建立好配置文件,让安装后可以直接启动,配置文件的模板在官方文档中有,下面是我使用的配置文件,也可以直接使用,记得把配置文件的(#后面的内容删除)

global: #全局配置 scrape_interval: 5s #5秒钟收集一次数据 scrape_timeout: 3s #连接超时时间 scrape_configs: #子配置 - job_name: 'media' # 任务名称为media scrape_interval: 3s # 3秒钟收集一次数据 metrics_path: "/api/v1/rrd/metrics" # 收集数据的URI static_configs: #子项配置 - targets: ['gslb.offcncloud.com:8080'] #收集数据的目标主机以及端口
mac下安装
brew install prometheus
 
docker安装

(注意配置文件得我们先建好才能运行下面的命令)

docker run -p 9090:9090 -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml  prom/prometheus
 

二、数据收集

1. 解惑

在第一步我们安装prometheus的时候就建立了一个配置文件,其中有一个任务会去收集数据,主机名为(gslb.offcncloud.com:8080),URI地址为(/api/v1/rrd/metrics),因此会不断向 gslb.offcncloud.com:8080/api/v1/rrd/… 进行请求,来获取数据。

2. 数据格式

这个时候我们需要来了解这个数据的格式是怎么样的,先来看一段我返回的数据格式。

media_network 2
media_connectNum 12 
media_on_push 2
 

在上面有三行数据,每条数据分别代表不同的key => value ,中间使用空格隔开。 比如:

  • 第一个media_network是代表当前的网络延时数量,
  • 第二项media_connectNum则是代表当前的用户连接数,
  • 第三项media_on_push 则是代表当前的推流人数。

3. 数据来源

上面的这写数据是怎么得来的呢?其实我们的系统当中并不能直接获取到当前的数量,比如连接人数,但是我们可以通过一些日志或者事件来进行统计,比如当有一个人播放视频,那么我们将会在cache中给他+1,当他离线的时候我们则会给他-1,这样便可以得到数量,我们可以来看下下面的伪代码

事件触发计数的代码部分

* @param string $name network|connectNum 要统计的名称 * @param bool $type 上线还是离线 * @param bool $clean 是否每次清空 * @return int|string public static function count(string $name, $type = true //定义名称 $name = addslashes($name); $fileName = self::BASEDATA . $name ; //定义累加值 $addNum = $type ? 1 : -1; //更新次数 $num = "cat $fileName"; $num = intval(exec($num)) + $addNum; //连接数不能小于0 $num = ($num < 0) ? 0 : $num; $cmd = "echo $num > $fileName"; exec($cmd); return $num;

prometheus来收集数据的对应代码部分

    public static function getCountNum()
        $control_arr = ['network', 'connectNum', 'on_push'];
        self::createDir();
        foreach ($control_arr as $path) {
            //存放临时数据文件
            $tmp_file = self::BASEDATA . $path;
            $num = exec("cat $tmp_file");
            switch ($path) {
                case 'network'://网络延时数量
                    system("echo 0 > $tmp_file");
                    echo "media_{$path} $num" . PHP_EOL;
                    break;
                case 'connectNum'://连接数
                    echo "media_{$path} $num" . PHP_EOL;
                    break;
                case 'on_push'://推流数
                    echo "media_{$path} $num" . PHP_EOL;
                    break;
 

在计数部分代码会根据用户是上线还是下线来处理不同的逻辑,比如上线数量会+1,下线则会-1

在获取数据部分,会根据不同的类型来处理他的逻辑,比如网络延时数量,会在获取数据后清空为0,而连接数则不在这个位置进行清空

三、数据验证

经过前面两个步骤,如果是docker安装应该已经启动了,如果是mac安装启动命令为(注意配置文件路径):

 prometheus --config.file=/tmp/prometheus.yml
 
  1. 验证收集地址正确性

当启动之后,可以打开浏览器访问如下URL地址:

http://127.0.0.1:9090/targets
 
  1. 验证数据格式

接着要验证数据格式是否正确,打开URL地址

http://127.0.0.1:9090/graph?g0.range_input=1h&g0.expr=&g0.tab=0
 

绘图时候我们采用Grafana来进行,因此我们首先得启动它,如果使用docker安装时,此时应该已经启动起来了,如果是mac系统的brew安装,启动命令为

brew services start Grafana
 

在启动之后,我们打开浏览器,访问URL地址为:

http://192.168.43.34:3000/
				
Pormetheus - Pushgateway(介绍一、Pushgateway 安装二、prometheus 命令行格式1、命令行使用2、命令行过滤3、数值过滤三、自定义编写脚本的方法,pushgateway 采集数据四、结合crontab 反复执行 pushgateway 是一种采用被动推送的方式(而不是 exporter主动获取)获取监控数据的 prometheus 插件 一、Pushgateway 安装 官网地址:https://prometheus.io/download/#pushgate
上传监控软件 cd /opt/ ;scp root@62.234.150.128:/optprometheus-2.5.0.linux-amd64.tar.gz /opt 解压安装操作 [root@localhost opt]# tar -zxvf prometheus-2.5.0.linux-amd64.tar.gz -C /usr/local/;cd /usr/local/;mv prometheus-2.5.0.linux-amd64 prometheus 设置syst.
1、关于grafana grafana是一个开源的度量分析和可视化工具,用于时序数据库的图标展示和分析,上篇文章我们也说过,prometheus的dashboard比较简单,想要达到比较好的展示效果,一般接入grafana使用。 2、安装和启动grafana grafana提供rpm方式安装,因此我们就用yum来安装,省事也比较好管理。 首先导入grafana的repo源, cat > /e...
团队在开发流媒体服务,需要实现一个监控在线人数的功能,可以看到历史有多少人在线,当前有多少人在线的功能。 如果用mysql等关系型数据库来实现,可以用事件记录日志,然后通过PHP加上一些绘图的插件来实现,但这种方式并不好,首先用关系型数据库随着时间累积,会存在数据量越来越大,导致查询缓慢,再者需要编写这部分统计代码,因此并不是最佳选择。 我们很快找到了一个“时序性数据库”(promet... 相关连接https://easyengine.io/tutorials/php/fpm-status-page https://blog.csdn.net/ffzhihua/article/details/88844259 配置PHP-FPM # ...
prometheus删除一个或多个metrics 不管什么exporter总是会收集很多没用的metrics,这些metrics我们不一定需要看它获取的监控数据,但是这些metrics依然在规定时间内收集监控数据,占用的大量的磁盘空间,造成资源浪费。 我们可以通过metric_reabel_configs模块对metrics进行正则匹配,将没有用的metrics删除。 以监控K8s Pod资源TCP连接数为例来说明如何使用metric_reabel_configs模块对metrics操作。 监控Pod资源T
nohup ./redis_exporter -redis.addr 192.168.1.136:6379 --redis.password=pMnr3glckd7iu2pF --web.listen-address=:9122 & nohup ./redis_exporter -redis.addr 192.168.5.229:6379 --redis.password=pMnr3glckd7iu2pF --web.listen-address=:9122 & 在grafana+ prometheus+php 监控系统实践文章当中已经实现了我们的第一个监控图表,现在我们有了一个新需求,需要对多个节点实现不同的监控,以及一个汇总的监控; 按照我们之前手动创建仪表盘的方法,每新增一个节点都需要手动去修改prometheus配置,并且需要去grafana系统当中创建一个仪表盘,在节点很少的时候这...
1. 启用php-fpm状态功能 php-fpm和nginx一样内建了一个状态页,对于想了解php-fpm的状态以及监控php-fpm非常有帮助。为了后续的Prometheus监控,我们需要先了解php-fpm状态页是怎么回事。 [global] pid = /usr/local/php/var/run/php-fpm.pid error_log = /usr/local/php/var/log/...