美文网首页
zabbix的自定义键值key和自动发现规则监控nginx的ap

zabbix的自定义键值key和自动发现规则监控nginx的ap

作者: 逆转之手 | 来源:发表于2019-07-11 18:43 被阅读0次

    接前一篇文章filebeat+logstash+elasticsearch+kibana解析nginx日志并展示

    1.创建三个脚本

    • 1.1 getSourceApis.sh
      利用脚本,拼写查询语句,获取最新一分钟内被调用的接口信息,存入到一个临时文件中result.json。利用crontab,设置每分钟查询一次脚本。

      执行crontab -e后,加入如下命令:

      */1 * * * * /path/to/getSourceApis.sh > /tmp/result.json
      
      • 脚本内容如下:

        #!/bin/bash
        curl -XGET -H "Content-Type:application/json" 127.0.0.1:9200/filebeat-6.5.4-*/_search -d '
        {
          "aggs": {
            "apis": {
              "terms": {
                "field": "api",
                "size": 9000
              }          
            }
          },
          "query": {
            "bool": {
              "must": [
              
                 "range": {
                    "@timestamp": {
                      "gte": "now-1m",
                      "lte": "now"
                    }
                  }
              
                {
                  "query_string": {
                    "default_field": "*",
                    "query": "(NOT nginx.access.url:*.js) AND (NOT nginx.access.url:*.css) AND (NOT nginx.access.url:*.ico) AND (NOT nginx.access.url:*.png) AND (NOT nginx.access.url:*.jpeg) AND (NOT nginx.access.url:*.jpg) AND (NOT nginx.access.url:*.gif)",
                    "analyze_wildcard": true
                  }
                }
              ]
            }
          },
          "size": 0
        }'
        

        获取的结果为json格式,包含所有的api和对应的数量。

      • 结果数据格式如下:(方便展示,对数据进行了格式化)

        {
            "took" : 48,
            "timed_out" : false,
            "_shards" : {
                "total" : 5,
                "successful" : 5,
                 "skipped" : 0,
                "failed" : 0
            },
            "hits" : {
                "total" : 494,
                "max_score" : 0.0,
                "hits" : [ ]
            },
            "aggregations" : {
                 "apis" : {
                      "doc_count_error_upper_bound" : 0,
                      "sum_other_doc_count" : 0,
                      "buckets" : [
                          {
                              "key" : "/aaa/bbb/ccc",
                              "doc_count" : 50
                          },
                          {
                              ...
                          },
                          {
                              "key" : "/ddd/eee/fff",
                              "doc_count" : 13
                          }
                     ]
                 }
            }
        }
        
      • 利用crontab设置定时器,每分钟执行一次,结果输出到一个临时文件中result.json,便于getmetrics.py脚本获取最新数据,并转换成特定的数据格式。

    • 1.2 getmetrics.py
      将临时文件result.json中的数据转换为特定的数据格式,才能被zabbix自动发现。

      • 脚本内容如下:

        import json
        with open("/tmp/result.json","r") as load_f:
            data = json.load(load_f)
        result = data['aggregations']['apis']['buckets']
        devices = []
        for one in result:
            devices.append({"{#URL}": one['key']})
        print json.dumps({'data': devices}, sort_keys=True, indent=4)
        

        设置宏变量#URL,在zabbix自动发现中可以获取宏变量的值。

      • 转换后的特定数据格式如下:

        {
            "data": [
                {
                    "{#URL}": "/aaa/bbb/ccc"
                },
                {...},
                {
                    "{#URL}": "/ddd/eee/fff"
                }
            ]
        }
        
      • 在zabbix-agent配置文件中,执行该脚本,将格式化后的数据打印在控制台中,便于zabbix获取宏变量{#URL}的值。

    • nginx_api_metrics.sh
      传入url和metic,获取该url的totaltime对应的指标值
      执行 ./nginx_api_metrics.sh <URL> <METRIC>,获取各个Api的各项指标数据。(METRIC为value_count、avg、max、min。前一分钟的数量、平均值、最大值、最小值)

      • 脚本内容为:
        #!/bin/bash
        
        HOST="127.0.0.1" PORT="9200"
        DATE=$(date +%Y.%m.%d)
        
        URL=$1
        METRIC=$2
        
        #截取json数据中的数据
        function get_json_value()
        {
          local json=$1
          local key=$2
        
          if [[ -z "$3" ]]; then
            local num=1
          else
            local num=$3
          fi
        
          local value=$(echo "${json}" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p)
        
          echo ${value}
        }
        RESPONSE=$(curl -XGET -s -H "Content-Type:application/json"  $HOST:$PORT/filebeat-6.5.4-$DATE/_search -d '
        {
          "aggs": {
            "result": {
              '\"$METRIC\"': {
                "field": "totaltime"
              }
            }
          },
          "query": {
            "bool": {
              "must": [
                {
                  "range": {
                    "@timestamp": {
                      "gte": "now-1m",
                      "lte": "now"
                    }
                  }
                },
                {
                  "match_phrase": {
                    "nginx.access.url": '\"$URL\"'
                  }
                }
              ]
            }
          },
          "size": 0
        }')
        get_json_value $RESPONSE value
        
      • 在zabbix-agent配置文件中,执行该脚本,获取具体url的metric值。

    2.zabbix-agent中的配置信息

    • zabbix_agentd.conf中,设置脚本配置文件位置
      Include=/etc/zabbix/zabbix_agentd.d/*.conf
      #以root权限执行
      AllowRoot=1
      User=root
      
    • /etc/zabbix/zabbix_agentd.d/下创建配置文件nginx_api_metrics.conf,内容如下:
      UserParameter=nginx.api.discovery,python /path/to/getmetrics.py
      #$1为`<URL>`,$2为`<METRIC>`
      UserParameter=nginx.api[*],sh /path/to/nginx_api_metrics.sh $1 $2
      
    • 注意:
      • 赋予脚本执行权限,否则不能正常获取key值。
        sudo chmod +x /path/to/getmetrics.py
        sudo chmod +x /path/to/nginx_api_metrics.sh
        

    3.重启zabbix-agent

    • 执行命令systemctl restart zabbix-agent

    4.测试键值nginx.api[<URL> <METRIC>]

    • 测试键值是否有效
      • 在zabbix-agent端执行
        #命令:./zabbix_agent -t "nginx.api[<URL> <METRIC>]"
        #结果:<key> [t|<value>]
        ./zabbix_agent -t "nginx.api[/aaa/bbb/ccc,value_count]"
        nginx.api[/aaa/bbb/ccc,value_count] [t|12]
        
      • 在zabbix-server端执行
        #命令:./zabbix_get -s 127.0.0.1 -k "nginx.api[<URL>,<METRIC>]"
        #结果:<value>
        ./zabbix_get -s 127.0.0.1 -k "nginx.api[/aaa/bbb/ccc,value_count]"
        23
        

    5.在zabbix-agent下创建发现规则、监控项原型、图形原型

    • 创建自动发现规则
      名称:nginx.api.discovery
      键值:nginx.api.discovery
      数据更新间隔:60s
      
    • 给发现规则创建监控项原型
      #四个指标(value_count、avg、max、min)
      名称:nginx.api[{#URL},value_count]
      
      键值:nginx.api[{#URL},value_count]
      
      新的应用集:nginxapimetrics
      
    • 创建图形原型
      名称:nginx.api[{#URL}] monitor
      
      添加原型,将
      nginx.api[{#URL},value_count],
      nginx.api[{#URL},max],
      nginx.api[{#URL},avg],
      nginx.api[{#URL},min]全部加入监控项中。
      
      • 时间和数据度量不一样,最好创建两个图形原型分别展示。

    6.查看最新数据和图形界面

    • 在检测->最新数据中,查看最新数据
    • 在主机->图形中,查看生成的图形。
    • 在检测->聚合图像中,创建聚合图像,多个组合展示图形。

    相关文章

      网友评论

          本文标题:zabbix的自定义键值key和自动发现规则监控nginx的ap

          本文链接:https://www.haomeiwen.com/subject/xpqjkctx.html