如何修改influxdb表结构_使用nginx-lua修改influxdb API的返回结构
有一个API平台服务,所有接口都通过API平台转发到实际的服务上,然后再把实际服务的结果返回给客户端,API平台的规范是所有实际服务的接口返回都要统一结构为
{
"code": 0,
"msg": "",
"data": {}
}
否则无法处理,现在使用influxdb提供的api,他的返回结构并不是API平台需要的结构,所以需要做一层代理转发请求并修改返回结果为API平台需要的结构。
采用openresty来实现这个需求,只需安装好openresty,然后编写一个配置文件即可实现。
实现配置如下:ngx_lua_restructure_influxdb_response.conf
upstream influxdb{
server 127.0.0.1:8086;
}
server {
listen 18086;
proxy_pass_request_headers off; # handle gziped capture
location / {
proxy_pass http://influxdb/query;
}
location /query {
add_header Content-Type 'application/json; charset=utf-8'; # make sure content-type is json
content_by_lua_block {
local method_map = {
GET = ngx.HTTP_GET,
POST = ngx.HTTP_POST,
}
ngx.req.read_body()
local method = method_map[ngx.req.get_method()]
local data = ngx.req.get_body_data()
local args = ngx.req.get_uri_args()
local res = ngx.location.capture("/", {method=method, data=data, args=args})
local cjson = require "cjson"
local new_body = {}
if res.status ~= ngx.HTTP_OK then
new_body["code"] = res.status
else
new_body["code"] = 0
end
new_body["msg"] = ''
new_body["data"] = cjson.decode(res.body)
ngx.say(cjson.encode(new_body))
}
}
}
influxdb的api在8086端口,所有直接的请求返回结果为:
# curl -Gs '100.113.164.108:8086/query?db=data&q=SELECT+*+FROM+cpu+limit+1&pretty=true'
{
"results": [
{
"statement_id": 0,
"series": [
{
"name": "cpu",
"columns": [
"time",
"cpu",
"host",
"usage_guest",
"usage_guest_nice",
"usage_idle",
"usage_iowait",
"usage_irq",
"usage_nice",
"usage_softirq",
"usage_steal",
"usage_system",
"usage_user"
],
"values": [
[
"2017-12-08T08:30:00Z",
"cpu-total",
"Tencent-SNG",
0,
0,
96.92993315559063,
0.4456548651008583,
0,
0,
0,
0,
1.8321366676828983,
0.7922753157508718
]
]
}
]
}
]
}
经过18086端口的转发后得到的结果为:
# curl -Gs '100.113.164.108:18086/query?db=db_zhiyun&q=SELECT * FROM cpu limit 1&pretty=true' | python -m json.tool
{
"code": 0,
"data": {
"results": [
{
"series": [
{
"columns": [
"time",
"cpu",
"host",
"usage_guest",
"usage_guest_nice",
"usage_idle",
"usage_iowait",
"usage_irq",
"usage_nice",
"usage_softirq",
"usage_steal",
"usage_system",
"usage_user"
],
"name": "cpu",
"values": [
[
"2017-12-08T08:30:00Z",
"cpu-total",
"Tencent-SNG",
0,
0,
96.929933155591,
0.44565486510086,
0,
0,
0,
0,
1.8321366676829,
0.79227531575087
]
]
}
],
"statement_id": 0
}
]
},
"msg": ""
}
实现中遇到的坑:
使用curl请求可以得到正确结果,但是通过API平台过来的请求全部报错,错误信息为在capture后拿到的body是一传乱码,并不是json。
使用ngx.req.raw_header()查看curl和API平台请求的header信息的区别,发现curl没有设置Accept-Encoding,而API平台的请求都带有Accept-Encoding: gzip, deflate,导致capture子请求(即请求真实influxdb接口)的返回结果被gzip压缩后把json变成了乱码,
从而导致在后面cjson.decode的时候出错。
OPTION ONE
Placed:
more_clear_input_headers Accept-Encoding;
in "location /cap2"
OPTION TWO
Placed:
proxy_pass_request_headers off;
in "location /cap2"
OPTION THREE
Downloaded https://github.com/brimworks/lua-zlib :
make linux
cp zlib.so /usr/lib/lua/5.1/zlib.so
added following to conf:
local zlib = require("zlib")
local stream = zlib.inflate()
local inflated_body = stream(res1.body)
local res2 = ngx.location.capture("/cap2?"..inflated_body)
由于外层的nginx配置默认的content-type为application/octet-stream;,所以为了确保返回为json,又在/query中明确的设置了content-type
如何修改influxdb表结构_使用nginx-lua修改influxdb API的返回结构相关推荐
- 修改mysql表前缀_使用phpMyAdmin批量修改Mysql数据表前缀的方法
多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分.而如何批量修改已有数据库的前缀名呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍 ...
- influxdb数据过期_玩转时序数据库InfluxDB
一.什么是InfluxDB? InfluxDB 是一款用 Go 语言编写的开源分布式时序.事件和指标数据库,无需外部依赖.该数据库现在主要用于存储涉及大量的时间戳数据,如 DevOps 监控数据,AP ...
- nginx lua mysql 性能_深入浅出 nginx lua 为什么高性能
最近很多人问我nginx lua的优势是什么?为什么? 一.同步和异步.阻塞和非阻塞 如果要说清楚这个问题首先要了解:同步和异步.阻塞和非阻塞的关系 同步:php.java的正常代码都是同步执行的 异 ...
- mysql修改user表密码_修改MySQL数据库中表的用户名和密码
原有网站账号密码忘记了,用第一种方法解决的,感觉直观快速安全. 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表, 不过别忘了使用PASSWORD函数. 方法二 使用my ...
- java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法
java 修改 枚举类字段 在本新闻通讯中,该新闻通讯最初发表在Java专家的新闻通讯第161期中,我们研究了如何使用sun.reflect包中的反射类在Sun JDK中创建枚举实例. 显然,这仅适用 ...
- mysql修改游戏元宝数量_天龙诀数据库连接元宝修改方法
今天小编为大家带来一篇关于天龙诀数据库连接元宝的修改方法,希望对各位玩家能够有所帮助. 一.数据库连接 先用SecureCRT打开连接虚拟机192.168.128.129 root 123456 第一 ...
- 修改mysql表的字段名_mysql中修改表字段名/字段长度/字段类型详解
在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...
- 修改telnet提示并非_俊翔:修改ECU数据解除奔驰GL350尿素限制
为达到排放要求,很多乘用柴油车都要加尿素(Adblue),以降低废气排放.在轿车维修当中,最常见的有奔驰GL350.路虎揽胜出现尿素锁定. 仪表上提示加尿素,并且限制启动次数.每当把发动机熄火再启动一 ...
- 如何手动修改oracle表空间,ORACLE数据库创建和修改表空间
-建立表空间(oracle中的tablespace(表空间)) CREATE TABLESPACE data01 DATAFILE 'D:\oracle\ora92\oradata\db\DATA01 ...
最新文章
- Dubbo服务发布调用实现
- Java自动拆装箱面试_跟王老师学泛型(二):Java自动装箱与拆箱
- Java异常详解及如何处理
- 计算机原理寻址方式ppt,计算机原理_3 寻址方式和指令系统.ppt
- Java基础---数组练习(最大值、最小值的索引)
- 第10章 bit_vector位向量容器
- java集合转labelpoint_java – 向Spark ML LabeldPoint添加自定义字段
- 用户关闭浏览器页器,弹出一个提示
- 随机抽样方法正太分布 MC, MCMC, Gibbs采样 原理实现(in R)
- 水处理相关工艺控制程序汇总(RXXW_Dor)
- 从零开始学_JavaScript_系列(五)——dojo(基础,动画移动,重力模拟,动画合并,添加标签)...
- Nature:每两个月注射一次卡波替格拉韦可以让大多数人免受艾滋病毒
- Linux系统鲁大师查看CPU、内存、显卡信息
- 安卓手机如何一键去水印
- mysql笔试题15道
- 十五天学会Autodesk Inventor,看完这一系列就够了(十一),放样和螺旋扫掠(绘弹簧)
- JS 数字 、中文、 英文、判断
- 美团点评2020校招系统开发方向笔试题(编程题题解)
- 句向量 Sentence Embedding
- php和mysql 第4版下载_PHP和MySQL Web开发第4版下载_PHP和MySQL Web开发第4版官方下载-太平洋下载中心...
热门文章
- docker 安装mysql 实战文档_在docker上安装运行mysql实例
- 【控制】贪心算法(GA,Greedy Algorithm)及 Matlab 实现
- 【控制】《最优控制理论与系统》-胡寿松老师-第1章-导论
- 简单BootLoader
- Ubuntu 12.04 下编译Android 4.0.3
- 【Android工具】远程登录会话工具免费好用的SSH客户端——JuiceSSH
- 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)
- The Best Way to Export an SVG from Sketch
- 9月14日学习内容整理:初识别面向对象
- HTML5 大战移动应用(一)