当前位置: 首页 > news >正文

使用zabbix 监控nginx cache的缓存命中率(openresty版)

为什么80%的码农都做不了架构师?>>>   hot3.png

上一篇介绍了nginx cache的配置[使用nginx cache加速H5加载速度],及通过分析访问日志来实现缓存命中率的统计,因为笔者使用的是openresty,后来想到不如使用ngx.shared.DICT 用lua脚本实时统计更方便,使用zabbix 进行采集,做成一体化。

36.4.49.117 - [31/Jan/2018:13:17:14 +0800] "GET /page/140019?code=nLfrSW&time=1517338888000 
HTTP/1.1" 200 9848 "https://xxxxxx" 
"Mozilla/5.0 (Linux; Android 5.0.2; vivo Y33 Build/LRX21M; wv) AppleWebKit/537.36 
(KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 
TBS/043906 Mobile Safari/537.36 MicroMessenger/6.6.1.1220(0x26060135) NetType/WIFI Language/zh_CN"  "36.4.49.117" "-" "-" "-" "0.001" "HIT"

 

使用access log统计太low,不实时,而且速度慢,当然有离线的优势,不用引入其他模块。

闲话休述,进入正题。

 

openresty 配置

lua脚本如下:

local cache = ngx.shared.cache_stat
local upstream_cache_status = ngx.var.upstream_cache_status;
local newval, err = cache:incr(upstream_cache_status,1)
if not newval and err == "not found" then
        cache:add(upstream_cache_status,1)
end
local total = "TOTAL"
local newval1, err1 = cache:incr(total,1)
if not newval1 and err1 == "not found" then
     cache:add(total, 1)
end

cache:incr是atomic操作,不会丢失,放在openresty配置文件中是摘个样子: 

#使用1m内存(有点浪费,只有几个metric,可以改为10k这种)
 lua_shared_dict cache_stat 1m;

server {
......

          location /page {
                proxy_cache page_cache;
                proxy_cache_key $scheme$uri?code=$arg_code&time=$arg_time;
                proxy_cache_valid 200 5d;
                      
                log_by_lua '

                  local cache = ngx.shared.cache_stat
                  local upstream_cache_status = ngx.var.upstream_cache_status;
                  local newval, err = cache:incr(upstream_cache_status,1)
                  if not newval and err == "not found" then
                       cache:add(upstream_cache_status,1)
                  end
                  local total = "TOTAL"
                  local newval1, err1 = cache:incr(total,1)
                  if not newval1 and err1 == "not found" then
                        cache:add(total, 1)
                  end
               '
            }
}

当然脚本也可以放到一个独立的文件中,使用log_by_lua_file指定文件路径,显得简洁些。

写一个location,对外开放,用来实时采集统计:

     location /cache-status {
        allow 127.0.0.1;
        deny all;
        default_type 'text/plain' ;
        content_by_lua '
                local cache = ngx.shared.cache_stat
                local keys = cache:get_keys()
                for idx, key in pairs(keys) do
                    ngx.say(key .. " " .. cache:get(key))
                end
                local hit = cache:get("HIT")
                local total = cache:get("TOTAL")
                ngx.say("RATIO ".. string.format("%.2f", hit * 100/total))
        ';

    }
 

 

测试一把就是摘个样子:

133245_XLXG_586215.png

 

Zabbix 监控采集配置

在这台openresty机器的zabbix agent的scripts目录新建脚本ngx_cache_stat.sh,内容咋个样子:

#!/bin/bash
HOST=127.0.0.1
PORT=80
# Functions to return cache stats
function hit {
/usr/bin/curl "http://$HOST:$PORT/cache-status" 2>/dev/null| grep 'HIT' | awk '{print $2}'
             }
function miss {
      /usr/bin/curl "http://$HOST:$PORT/cache-status" 2>/dev/null| grep 'MISS' | awk '{print $2}'
            }
function expired {
      /usr/bin/curl "http://$HOST:$PORT/cache-status" 2>/dev/null| grep 'EXPIRED' | awk '{print $2}'
            }
function updating {
      /usr/bin/curl "http://$HOST:$PORT/cache-status" 2>/dev/null| grep 'UPDATING' | awk '{print $2}'
            }
function stale {
      /usr/bin/curl "http://$HOST:$PORT/cache-status" 2>/dev/null|grep 'STALE' |  awk '{print $2}'
            }
function bypass {
      /usr/bin/curl "http://$HOST:$PORT/cache-status" 2>/dev/null|grep 'BYPASS' |  awk '{print $2}'
            }
function ratio {
      /usr/bin/curl "http://$HOST:$PORT/cache-status" 2>/dev/null|grep 'RATIO' |  awk '{print $2}'
            }
$1

upstream_cache_status包含以下几种状态:

  • ·MISS 未命中,请求被传送到后端
  • HIT 缓存命中
  • EXPIRED 缓存已经过期请求被传送到后端
  • UPDATING 正在更新缓存,将使用旧的应答
  • ·STALE 将得到过期的应答
  • ·BYPASS 穿透缓存,进入后端

测试下:

sh ngx_cache_stat.sh hit

有数字内容输入代表ok了,

在Zabbix Agent HOME 的 etc/zabbix_agentd.conf.d/中新建文件ngx_cache_stat.conf,内容如下

#ngx_cache_stat.conf

Timeout=10
UnsafeUserParameters=1
UserParameter=nginx.cache.status[*],/usr/local/zabbix/script/ngx_cache_stat.sh $1
 

重启zabbix-agentd,
 

killall zabbix_agentd

 

zabbix server执行:zabbix_get测试下
 

./zabbix_get -s 10.0.x.x -k nginx.cache.status[ratio]

得到正确值就ok了。

从github获取zabbix模板,导入zabbix中,

https://github.com/Jijun/zabbix-template-ngx-cache-lua/blob/master/zabbix_template/proxy_cache_stat.xml

采集开始后监控信息如下,缓存命中率95%左右

140649_eJUP_586215.png

以下监控的是HIT,MISS,EXPIRED的增量值(30秒)

155223_Yr1O_586215.png

所有脚本和模板在github:

https://github.com/Jijun/zabbix-template-ngx-cache-lua.git

 

请作者喝咖啡:

 

 

 

 

转载于:https://my.oschina.net/osgit/blog/1616112

相关文章:

  • 栈实现走出迷宫(C++)
  • Vue | 一个支持数据抓取的JSON树组件
  • css + css3技术总结报告
  • JDK1.8环境下依然报错 Unsupported major.minor version 52.0
  • 在SpringBoot中使用FluentValidator验证插件
  • Nginx学习之开启Gzip压缩提升页面加载速度
  • 10.系统设计
  • Vue实现简单选项卡
  • Bzoj4872: [Shoi2017]分手是祝愿
  • android开发 获取logcat日志并记录(方便离线调试)
  • 微服务概述之架构演变
  • 数据分区------《Designing Data-Intensive Applications》读书笔记9
  • MySQL数据库锁定机制
  • mybatis架构分析
  • SQL必知必会笔记
  • JS 中的深拷贝与浅拷贝
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • exports和module.exports
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Linux CTF 逆向入门
  • Median of Two Sorted Arrays
  • MySQL的数据类型
  • Python语法速览与机器学习开发环境搭建
  • - 概述 - 《设计模式(极简c++版)》
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 前端之Sass/Scss实战笔记
  • 三分钟教你同步 Visual Studio Code 设置
  • 我是如何设计 Upload 上传组件的
  • 中文输入法与React文本输入框的问题与解决方案
  • Python 之网络式编程
  • # .NET Framework中使用命名管道进行进程间通信
  • $jQuery 重写Alert样式方法
  • (C++17) optional的使用
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (六)vue-router+UI组件库
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (小白学Java)Java简介和基本配置
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)SpringBoot3---尚硅谷总结
  • (一)WLAN定义和基本架构转
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • .form文件_SSM框架文件上传篇
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Standard 的管理策略
  • .Net 路由处理厉害了
  • .NET 使用配置文件
  • .NET/C# 的字符串暂存池
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET文档生成工具ADB使用图文教程
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET中两种OCR方式对比