41.5 nginx拦截prometheus查询请求使用lua脚本做promql的检查替换

本节重点介绍 :

  • 编写lua脚本做promql的检查替换
  • nginx拦截prometheus查询请求使用lua处理

编写lua脚本做promql的检查替换

获取请求参数

function replace_work()--Nginx服务器中使用lua获取get或post参数local request_method = ngx.var.request_method;local args = {}--获取参数的值if "GET" == request_method thenargs = ngx.req.get_uri_args();elseif "POST" == request_method thenngx.req.read_body();args = ngx.req.get_post_args();endlocal q_query = args["query"];local q_start = args["start"];local q_end = args["end"];local q_step = args["step"];
end

根据查询的promql算m5d

    local md5_str = get_str_md5(q_query)if md5_str == null thenreturnend
function get_str_md5(input_s)local resty_md5 = require "resty.md5"local md5 = resty_md5:new()if not md5 thenngx.log(ngx.ERR, "failed to create md5 object")returnendlocal ok = md5:update(input_s)if not ok thenngx.log(ngx.ERR, "failed to add data")returnendlocal digest = md5:final()local str = require "resty.string"local md5_str = str.to_hex(digest)return md5_str
end

根据md5去redis中query

    local redis_query_key = "hke:heavy_expr:" .. md5_str--ngx.log(ngx.ERR, "redis_query_key: ",redis_query_key)local redis_get_res = redis_get(redis_query_key)if redis_get_res == true thenq_query = redis_query_keyend
function redis_get(key)-- start of redislocal redis = require "resty.redis"local red = redis:new()--red:set_timeouts(1000, 1000, 1000)local ok, conn_err = red:connect("localhost", 6379)if not ok thenngx.log(ngx.ERR, "[redis]failed to connect redis server:", conn_err)return falseendlocal res, get_err = red:get(key)if get_err thenngx.log(ngx.ERR, "[redis]failed to get value by key: ", key, "err:", get_err)return falseendred:set_keepalive(30000, 1000)if res ~= ngx.null thenngx.log(ngx.INFO, "[redis]success  get value by key: ", key, "value: ", res)return trueelsereturn falseend-- end of  redis
end

如果redis中有结果,就替换查询语句为聚合后的

    if redis_get_res == true thenq_query = redis_query_keyendlocal new_args = {}new_args["query"] = q_querynew_args["start"] = q_startnew_args["end"] = q_endnew_args["step"] = q_stepngx.req.set_uri_args(new_args)--ngx.req.set_uri_args("end=" .. q_end)--local arg = ngx.req.get_uri_args()--for k, v in pairs(arg) do--    ngx.say("[GET ] key:", k, " v:", v)--end

完整的 prome_redirect.lua

function get_str_md5(input_s)local resty_md5 = require "resty.md5"local md5 = resty_md5:new()if not md5 thenngx.log(ngx.ERR, "failed to create md5 object")returnendlocal ok = md5:update(input_s)if not ok thenngx.log(ngx.ERR, "failed to add data")returnendlocal digest = md5:final()local str = require "resty.string"local md5_str = str.to_hex(digest)return md5_str
endfunction redis_get(key)-- start of redislocal redis = require "resty.redis"local red = redis:new()--red:set_timeouts(1000, 1000, 1000)local ok, conn_err = red:connect("localhost", 6379)if not ok thenngx.log(ngx.ERR, "[redis]failed to connect redis server:", conn_err)return falseendlocal res, get_err = red:get(key)if get_err thenngx.log(ngx.ERR, "[redis]failed to get value by key: ", key, "err:", get_err)return falseendred:set_keepalive(30000, 1000)if res ~= ngx.null thenngx.log(ngx.INFO, "[redis]success  get value by key: ", key, "value: ", res)return trueelsereturn falseend-- end of  redis
endfunction replace_work()--Nginx服务器中使用lua获取get或post参数local request_method = ngx.var.request_method;local args = {}--获取参数的值if "GET" == request_method thenargs = ngx.req.get_uri_args();elseif "POST" == request_method thenngx.req.read_body();args = ngx.req.get_post_args();endlocal q_query = args["query"];local q_start = args["start"];local q_end = args["end"];local q_step = args["step"];local md5_str = get_str_md5(q_query)if md5_str == null thenreturnendlocal redis_query_key = "hke:heavy_expr:" .. md5_str--ngx.log(ngx.ERR, "redis_query_key: ",redis_query_key)local redis_get_res = redis_get(redis_query_key)if redis_get_res == true thenq_query = redis_query_keyendlocal new_args = {}new_args["query"] = q_querynew_args["start"] = q_startnew_args["end"] = q_endnew_args["step"] = q_stepngx.req.set_uri_args(new_args)--ngx.req.set_uri_args("end=" .. q_end)--local arg = ngx.req.get_uri_args()--for k, v in pairs(arg) do--    ngx.say("[GET ] key:", k, " v:", v)--endendreturn replace_work();

nginx拦截prometheus查询请求使用lua处理

  • ngx_prome_redirect.conf
# 真实prometheus后端,使用前请修改
upstream real_prometheus {server 1.1.1.1:9090;server 2.2.2.2:9090;}server{listen 9992;server_name _;location / {  proxy_set_header Host $host:$server_port;proxy_pass http://real_prometheus;} location /api/v1/query_range { access_by_lua_file /usr/local/openresty/nginx/lua_files/prome_redirect.lua;proxy_pass http://real_prometheus;}}
  • grafana发来的请求经过nginx,使用lua脚本处理
  • 然后转发到真实的prometheus 查询

本节重点总结 :

  • 编写lua脚本做promql的检查替换
  • nginx拦截prometheus查询请求使用lua处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501153.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Matlab算法】基于改进人工势场法的移动机器人路径规划研究(附MATLAB完整代码)

基于改进人工势场法的移动机器人路径规划研究 结果图摘要1. 引言2. 方法说明2.1 基本原理2.2 改进策略3. 核心函数解释3.1 改进的斥力计算函数3.2 路径规划主函数4. 实验设计4.1 实验环境设置4.2 关键参数选择5. 结果分析5.1 实验结果5.2 性能分析附录:完整代码参考文献结果图…

【MySQL】--- 内置函数

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: MySQL 🏠 时间函数 约定:我们在MySQL中说的日期指的是年 月 日,时间指的是时 分 秒。 🧷 now() select n…

springboot和vue项目前后端交互

java后端开发常用springboot框架,开发简单不繁琐,容易上手。简简单单配置好一些配置项,整个web项目就能运行起来了。vue前端也是比较流行的前端开发框架,写起来简单,组件也丰富,参考资料多。 这期就应薯薯…

酒店管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

OkHttp接口自动化测试

文章目录 java环境搭建OkHttp之getOkHttp之POSTPOST发送From表单POST发送jsonPOST上传文件 OkHttp之deleteOkHttp之put java环境搭建 引入依赖 <!--okhttp3--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</art…

分数阶傅里叶变换代码 MATLAB实现

function Faf myfrft(f, a) %分数阶傅里叶变换函数 %输入参数&#xff1a; %f&#xff1a;原始信号 %a&#xff1a;阶数 %输出结果&#xff1a; %原始信号的a阶傅里叶变换N length(f);%总采样点数 shft rem((0:N-1)fix(N/2),N)1;%此项等同于fftshift(1:N)&#xff0c;起到翻…

【Rust练习】26.Package and Crate

练习题来自&#xff1a;https://practice-zh.course.rs/crate-module/crate.html 建议在命令行下操作完成本节内容&#xff0c;Windows 11/10 首选 Windows 终端&#xff0c;好看&#xff0c;支持渲染中文字体&#xff0c;缺点是功能太少了&#xff1b;其次推荐 mobaxterm&…

Python实现接口签名调用

目录: 1、第三方接口签名调用2、调用结果 1、第三方接口签名调用 import json import requests import hashlib import time import hmac access_key xxxxxxxxxxxxxxx secret_key xxxxxxxxxxxxxxx # 应用信息 def _wps4_sig(method, url, date, body): print(body)if bod…

df.replace({‘b‘: r‘\s*(\.)\s*‘}, {‘b‘: r‘\1ty‘}, regex=True)

这段代码 df.replace({b: r\s*(\.)\s*}, {b: r\1ty}, regexTrue) 用于在 DataFrame 中进行替换操作&#xff0c;具体来说是针对 b 列&#xff0c;匹配并替换符合正则表达式的值。 详细解析&#xff1a; df.replace()&#xff1a;这是 Pandas 中的 replace() 方法&#xff0c;用…

js的一些处理

1.翻转字符串 let str abcdef str str.split().reverse().join() console.log(str) 因此想到了我之前写的截取字符串获取参数跳转&#xff0c;在写一遍 let str nameJack&age18&gender男 let list str.split(&); let obj {} list.forEach((v)>{ …

单片机串口控制

1.使用微控制器输入串口指令控制LED灯亮灭 main.c #include "uart4.h"int main() {led_init(); //初始化LED相关寄存器char buf[128];while(1){gets(buf);if(mystrcmp(buf,"LED1_on") 0){led_ctl(1,1); //当在串口工具中输入"LED1_on"时控制L…

物联网开发利器:基于web的强大的可拖拽组态软件

随着互联网、物联网技术的快速发展&#xff0c;BY组态基于多年研发积累和私有部署实践打磨、以及对业务场景的深入理解&#xff0c;推出了适用于物联网应用场景的轻量型web组态软件。 该产品采用 B/S 架构&#xff0c;提供 web 管理界面&#xff0c;软件包大小仅 50MB&#xf…

【开源免费】基于SpringBoot+Vue.JS保密信息学科平台(JAVA毕业设计)

本文项目编号 T 112 &#xff0c;文末自助获取源码 \color{red}{T112&#xff0c;文末自助获取源码} T112&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

ceph文件系统

ceph文件系统&#xff1a;高度可扩展&#xff0c;分布式的存储文件系统&#xff0c;旨在提高性能&#xff0c;高可靠性和高可用的对 象存储&#xff0c;块存储&#xff0c;文件系统的存储。使用分布式的算法保证数据的高可用和一致性。 ceph的组件 1、MON&#xff1a;ceph m…

MySQL 入门大全:运算符

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Px4 V2.4.8飞控Mavlink命令控制说明

首先&#xff0c;可以使用两种方法连接飞控&#xff0c;使用虚拟机&#xff08;LINUX&#xff09;或使用地面站&#xff08;QGC&#xff09;连接。 在px4的代码文件位置打开命令终端&#xff0c;输入连接命令&#xff1a; ./Tools/mavlink_shell.py 在控制台使用help来获取所有…

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…

java Redisson 实现限流每秒/分钟/小时限制N个

1.引入maven包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>red…

C# 标准数字格式字符串

总目录 前言 当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。 一、概述 1. 基本信息 标准数字格式字符串用于格式化通用数值类型。标准数字格式字符串采用 [format specifier][precision specifier] 的形式 format specifier 格式说明符&#xff0c;负责指…

网络分析工具-tcpdump

文章目录 前言一、tcpdump基础官网链接命令选项详解常规过滤规则tcpdump输出 一、tcpdump实践HTTP协议ICMP状态抓包 前言 当遇到网络疑难问题的时候&#xff0c;抓包是最基本的技能&#xff0c;通过抓包才能看到网络底层的问题 一、tcpdump基础 tcpdump是一个常用的网络分析工…