open-falcon 监控 nginx_status

9/11/2018 nginxopenfalcon

# openfalcon 监控 nginx 状态

主要使用 通过 agent push 数据至 server

# 思路

由于我这边有两套nginx 需要计算综合

# nginx 相关配置

# 启用nginx status配置

在默认主机里面加上location或者你希望能访问到的主机里面。

server {
    listen  *:80 default_server;
    server_name _;
    location /ngx_status
    {
        stub_status on;
        access_log off;
        #allow 127.0.0.1;
        #deny all;
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 打开status页面

curl http://127.0.0.1/ngx_status
Active connections: 11921
server accepts handled requests
 11989 11989 11991
Reading: 0 Writing: 7 Waiting: 42
1
2
3
4
5

# nginx status详解

  • active connections – 活跃的连接数量
  • server accepts handled requests — 总共处理了11989个连接 , 成功创建11989次握手, 总共处理了11991个请求
  • reading — 读取客户端的连接数.
  • writing — 响应数据到客户端的数量
  • waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.

# openfalcon 设置

# 通过shell 获取nginx 数据值

#!/bin/bash

nginx_17=${1}
nginx_18=${2}
nginx_status_name=${3}


nginx_active_connections(){
        active_connections_17=`curl -s http://${nginx_17}:18190/nginx_status | grep connections | awk '{print $3}'`
        active_connections_18=`curl -s http://${nginx_18}:18190/nginx_status | grep connections | awk '{print $3}'`
        let active_connections=($active_connections_17+$active_connections_18)
        echo $active_connections
}

nginx_reading(){
        reading_17=`curl -s http://${nginx_17}:18190/nginx_status | grep Reading | awk '{print $2}'`
        reading_18=`curl -s http://${nginx_18}:18190/nginx_status | grep Reading | awk '{print $2}'`
        let reading=($reading_17+$reading_18)
        echo $reading
}
nginx_writing(){
        writing_17=`curl -s http://${nginx_17}:18190/nginx_status | grep Reading | awk '{print $4}'`
        writing_18=`curl -s http://${nginx_18}:18190/nginx_status | grep Reading | awk '{print $4}'`
        let writing=($writing_17+$writing_18)
        echo $writing
}
nginx_waiting(){
        waiting_17=`curl -s http://${nginx_17}:18190/nginx_status | grep Reading | awk '{print $6}'`
        waiting_18=`curl -s http://${nginx_18}:18190/nginx_status | grep Reading | awk '{print $6}'`
        let waiting=($waiting_17+$waiting_18)
        echo $waiting
}



case "$nginx_status_name" in
nginx_active_connections)
nginx_active_connections
;;
nginx_reading)
nginx_reading
;;
nginx_writing)
nginx_writing
;;
nginx_waiting)
nginx_waiting
;;
*)
printf 'Usage: %s {nginx_active_connections|nginx_reading|nginx_writing|nginx_waiting}\n' "$prog"
exit 1
;;
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

# 通过 python push至 agent http API 接口

需要注意 运行python及shell 需要在同一台服务器

同时需要能访问nginx_status 端口权限

#!-*- coding:utf8 -*-
import os
import requests
import time
import json
import socket

## 环境变量
hostname = socket.gethostname()
nginx_17_ip = "IP"  ## nginx服务器IP
nginx_18_ip = "IP"

def nginx_active_connections(nginx17_ip,nginx_18_ip):
    os.environ['nginx_17_ip']=str(nginx_17_ip)
    os.environ['nginx_18_ip']=str(nginx_18_ip)
    connections_tmp =os.popen('/root/scripts/nginx_status.sh $nginx_17_ip $nginx_18_ip nginx_active_connections')
    connections = connections_tmp.read()
    #print(nginx_active_connections)
    return connections

def nginx_reading(nginx17_ip,nginx_18_ip):
    os.environ['nginx_17_ip']=str(nginx_17_ip)
    os.environ['nginx_18_ip']=str(nginx_18_ip)
    nginx_reading_tmp = os.popen('/root/scripts/nginx_status.sh $nginx_17_ip $nginx_18_ip nginx_reading')
    nginx_reading = nginx_reading_tmp.read()
    return nginx_reading

def nginx_writing(nginx17_ip,nginx_18_ip):
    os.environ['nginx_17_ip']=str(nginx_17_ip)
    os.environ['nginx_18_ip']=str(nginx_18_ip)
    nginx_writing_tmp = os.popen('/root/scripts/nginx_status.sh $nginx_17_ip $nginx_18_ip nginx_writing')
    nginx_writing = nginx_writing_tmp.read()
    return nginx_writing

def nginx_waiting(nginx17_ip,nginx_18_ip):
    os.environ['nginx_17_ip']=str(nginx_17_ip)
    os.environ['nginx_18_ip']=str(nginx_18_ip)
    nginx_waiting_tmp = os.popen('/root/scripts/nginx_status.sh $nginx_17_ip $nginx_18_ip nginx_waiting')
    nginx_waiting = nginx_waiting_tmp.read()
    return nginx_waiting

nginx_active_count = int(nginx_active_connections(nginx_17_ip,nginx_18_ip))
nginx_reading_count = int(nginx_reading(nginx_17_ip,nginx_18_ip))
nginx_writing_count = int(nginx_writing(nginx_17_ip,nginx_18_ip))
nginx_waiting_count = int(nginx_waiting(nginx_17_ip,nginx_18_ip))
nginx_waiting_count = int(nginx_waiting(nginx_17_ip,nginx_18_ip))

ts = int(time.time())
payload = [
    {
        "endpoint": hostname,
        "metric": "nginx.active.connections",
        "timestamp": ts,
        "step": 60,
        "value": nginx_active_count,
        "counterType": "GAUGE",
        "tags": "",
    },
    {
        "endpoint": hostname,
        "metric": "nginx.reading",
        "timestamp": ts,
        "step": 60,
        "value": nginx_reading_count,
        "counterType": "GAUGE",
        "tags": "",
    },
        {
        "endpoint": hostname,
        "metric": "nginx.writing",
        "timestamp": ts,
        "step": 60,
        "value": nginx_writing_count,
        "counterType": "GAUGE",
        "tags": "",
    },
        {
        "endpoint": hostname,
        "metric": "nginx.waiting",
        "timestamp": ts,
        "step": 60,
        "value": nginx_waiting_count,
        "counterType": "GAUGE",
        "tags": "",
    },
]

r = requests.post("http://127.0.0.1:1988/v1/push", data=json.dumps(payload))

print r.text


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92

# openfalcon 效果展示

通过dashboard 查询相关数据

openfalcon_check

Screen openfalcon_nginx Grafana Grafana_nginx