有一个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的返回结构相关推荐

  1. 修改mysql表前缀_使用phpMyAdmin批量修改Mysql数据表前缀的方法

    多个网站共用一个Mysql数据库时,为使数据库管理不混乱,一般采用不同的网站使用不同前缀名的方式进行区分.而如何批量修改已有数据库的前缀名呢?全部导出修改后再导入?还是一个表一个表的修改?今天我要介绍 ...

  2. influxdb数据过期_玩转时序数据库InfluxDB

    一.什么是InfluxDB? InfluxDB 是一款用 Go 语言编写的开源分布式时序.事件和指标数据库,无需外部依赖.该数据库现在主要用于存储涉及大量的时间戳数据,如 DevOps 监控数据,AP ...

  3. nginx lua mysql 性能_深入浅出 nginx lua 为什么高性能

    最近很多人问我nginx lua的优势是什么?为什么? 一.同步和异步.阻塞和非阻塞 如果要说清楚这个问题首先要了解:同步和异步.阻塞和非阻塞的关系 同步:php.java的正常代码都是同步执行的 异 ...

  4. mysql修改user表密码_修改MySQL数据库中表的用户名和密码

    原有网站账号密码忘记了,用第一种方法解决的,感觉直观快速安全. 方法一 使用phpmyadmin,这是最简单的了,修改mysql库的user表, 不过别忘了使用PASSWORD函数. 方法二 使用my ...

  5. java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法

    java 修改 枚举类字段 在本新闻通讯中,该新闻通讯最初发表在Java专家的新闻通讯第161期中,我们研究了如何使用sun.reflect包中的反射类在Sun JDK中创建枚举实例. 显然,这仅适用 ...

  6. mysql修改游戏元宝数量_天龙诀数据库连接元宝修改方法

    今天小编为大家带来一篇关于天龙诀数据库连接元宝的修改方法,希望对各位玩家能够有所帮助. 一.数据库连接 先用SecureCRT打开连接虚拟机192.168.128.129 root 123456 第一 ...

  7. 修改mysql表的字段名_mysql中修改表字段名/字段长度/字段类型详解

    在mysql中我们对数据表字段的修改命令只要使用alter就可以了,下面我来给大家详细介绍mysql中修改表字段名/字段长度/字段类型等等一些方法介绍,有需要了解的朋友可参考. 先来看看常用的方法 M ...

  8. 修改telnet提示并非_俊翔:修改ECU数据解除奔驰GL350尿素限制

    为达到排放要求,很多乘用柴油车都要加尿素(Adblue),以降低废气排放.在轿车维修当中,最常见的有奔驰GL350.路虎揽胜出现尿素锁定. 仪表上提示加尿素,并且限制启动次数.每当把发动机熄火再启动一 ...

  9. 如何手动修改oracle表空间,ORACLE数据库创建和修改表空间

    -建立表空间(oracle中的tablespace(表空间)) CREATE TABLESPACE data01 DATAFILE 'D:\oracle\ora92\oradata\db\DATA01 ...

最新文章

  1. Dubbo服务发布调用实现
  2. Java自动拆装箱面试_跟王老师学泛型(二):Java自动装箱与拆箱
  3. Java异常详解及如何处理
  4. 计算机原理寻址方式ppt,计算机原理_3 寻址方式和指令系统.ppt
  5. Java基础---数组练习(最大值、最小值的索引)
  6. 第10章 bit_vector位向量容器
  7. java集合转labelpoint_java – 向Spark ML LabeldPoint添加自定义字段
  8. 用户关闭浏览器页器,弹出一个提示
  9. 随机抽样方法正太分布 MC, MCMC, Gibbs采样 原理实现(in R)
  10. 水处理相关工艺控制程序汇总(RXXW_Dor)
  11. 从零开始学_JavaScript_系列(五)——dojo(基础,动画移动,重力模拟,动画合并,添加标签)...
  12. Nature:每两个月注射一次卡波替格拉韦可以让大多数人免受艾滋病毒
  13. Linux系统鲁大师查看CPU、内存、显卡信息
  14. 安卓手机如何一键去水印
  15. mysql笔试题15道
  16. 十五天学会Autodesk Inventor,看完这一系列就够了(十一),放样和螺旋扫掠(绘弹簧)
  17. JS 数字 、中文、 英文、判断
  18. 美团点评2020校招系统开发方向笔试题(编程题题解)
  19. 句向量 Sentence Embedding
  20. php和mysql 第4版下载_PHP和MySQL Web开发第4版下载_PHP和MySQL Web开发第4版官方下载-太平洋下载中心...

热门文章

  1. docker 安装mysql 实战文档_在docker上安装运行mysql实例
  2. 【控制】贪心算法(GA,Greedy Algorithm)及 Matlab 实现
  3. 【控制】《最优控制理论与系统》-胡寿松老师-第1章-导论
  4. 简单BootLoader
  5. Ubuntu 12.04 下编译Android 4.0.3
  6. 【Android工具】远程登录会话工具免费好用的SSH客户端——JuiceSSH
  7. 好好学python·函数进阶(递归函数,回调函数,闭包函数,匿名函数,迭代器)
  8. The Best Way to Export an SVG from Sketch
  9. 9月14日学习内容整理:初识别面向对象
  10. HTML5 大战移动应用(一)