# 使用curl创建简单的性能监控工具




cURL，全称Command Line URL viewer，是一种命令行工具，用来发送网络请求，然后得到和提取数据，显示在标准输出（stdout）。

我们可以使用curl来获取网页的源码，显示头信息，显示通讯过程等。

在做基于http的接口测试的时候，curl基本上可以完成postman所具备的大部分功能，如果你习惯于使用命令行，那么curl是一个非常有用且常用的工具。

### CURL的基本使用

#### 查看网页源码

```
curl www.itest.info

```

#### 查看response的headers

```
curl -i www.itest.info

```

#### 显示通讯过程

```
curl -v www.itest.info
```

### 常用参数

使用curl发送GET请求时有一些常用参数。

* -o: output，将输出的结果重定向到一个文件
* -s: slient, 不显示进度信息
* -w: 展示多维度的统计信息

### 统计请求耗时

使用下面的这条curl命令可以统计出请求的耗时。

```
curl www.itest.info -o /dev/null -s -w "%{time_total}\n"
```

其中我们把输出丢弃了(重定向到/dev/null里)，并且不显示进度信息，只展示请求的总耗时。

### 工具化

基于curl的统计请求耗时的能力，我们可以写一个简单的工具调用curl，然后打印出该请求的耗时。

下面是我用python写的一个简单例子。

```
# curl_tool.py
import subprocess
import sys

url = sys.argv[-1]

def get_cost(url):
    cmd_list = ['curl', '-o', '/dev/null', '-s', '-w', '%{time_total}\n']
    cmd_list.append(url)
    out = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    stdout, stderr = out.communicate()

    cost = float(stdout) * 1000
    return cost

print "%s %s\n" %(url, get_cost(url))

```

使用方式: 在命令行中运行

```
python curl_tool.py www.itest.info
```

运行结果

```
www.itest.info 42.797
```

这里的单位是毫秒。

### 改进

我们的工具只支持输入1个url然后拿到耗时的结果，这显然是跟我们日常的需求不符合的。

我们的日常需求是统计n个接口或页面的耗时，然后找出其中耗时最多的m个接口或页面。

下面我们对工具进行改进，使其可以支持多个url/接口的耗时统计。

```
import subprocess
import sys

# url = sys.argv[-1]
url_list = sys.argv[-1]

def get_cost(url):
    cmd_list = ['curl', '-o', '/dev/null', '-s', '-w', '%{time_total}\n']
    cmd_list.append(url)
    out = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    stdout, stderr = out.communicate()

    cost = float(stdout) * 1000
    return cost

with open(url_list) as f:
    for url in f.read().split("\n"):
        if url:
            print "%s %s" %(url, get_cost(url))
```

这里我们需要定义1个url列表: urls.txt。

```
http://www.itest.info/
http://www.itest.info/courses/9
http://www.itest.info/courses/7
http://www.itest.info/courses/2
http://www.itest.info/courses/6
http://www.itest.info/newclass

```

运行

```
python curl_tool.py urls.txt
```

结果

```
http://www.itest.info/ 80.16
http://www.itest.info/courses/9 40.153
http://www.itest.info/courses/7 54.118
http://www.itest.info/courses/2 56.205
http://www.itest.info/courses/6 47.896
http://www.itest.info/newclass 78.962

```

### 统计

支持了一次请求多个接口以后，我们需要对耗时进行排序，找出最耗时的那个页面和接口。

```
python curl_tool.py urls.txt | sort -k 2 -r
```

我们用sort命令对第2列进行排序，结果如下

```
http://www.itest.info/courses/2 49.519
http://www.itest.info/newclass 44.716
http://www.itest.info/courses/7 43.408
http://www.itest.info/ 43.052
http://www.itest.info/courses/9 42.869
http://www.itest.info/courses/6 38.722
```

### 持续运行

我们希望每天晚上都运行1次统计脚本。

这时候可以使用crontab。

```
30 2 * * * python curl_tool.py urls.txt | sort -k 2 -r >/res.txt 2>&1
```

这样每天早上2:30 am的时候我们就会运行统计脚本，把接口存储在res.txt中。


### 持续统计

为了可以统计一段时间内的请求耗时，我们可以把每天的结果落地到es里。这里就不展开了。

### 讨论

* 有mac/linux的同学可以亲自尝试一下
* python脚本基于python2，python3没试过
* 不错的知识广度和代码能力可以让你迅速的实现简单的测试工具
* 大道至简




原始封面

![课程图片](https://images.unsplash.com/photo-1485470733090-0aae1788d5af?w=300)


