zabbix的自定义键值key和自动发现规则监控nginx的api请求响应时间totaltime指标(每分钟指标)

接前一篇文章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.查看最新数据和图形界面

  • 在检测->最新数据中,查看最新数据
  • 在主机->图形中,查看生成的图形。
  • 在检测->聚合图像中,创建聚合图像,多个组合展示图形。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Zabbix简介 Zabbix官方网站Zabbix中文文档 本文系统环境是CentOS7x86_64, Zabbi...
    Zhang21阅读 7,968评论 0 37
  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 4,783评论 0 1
  • 前段时间有监控服务器主机、应用、交换机等的需求,所以对zabbix进行了学习,现在整理记录全过程。 1.zabbi...
    不好听丶阅读 801评论 0 4
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • 七月中元祭祖先, 荷灯引路孝儿贤。 灵魂普渡怀英烈, 取义成仁为国全。 (注:中元节。中国岁时节令有"三元":指正...
    笔名江风阅读 475评论 2 3