欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

NSE/Stock Exchange 第四代通信网关监控开发

最编程 2024-04-28 08:38:27
...

一、背景

虽然北交所已经从股转公司独立出来,但其交易、行情程序还是和股转公司一样,沿用深证通的四代通信网关。四代网关的功能没有五代网关强大,如要实现集中监控,需要利用网关自身的监控接口结合第三方监控开展。实现不难,为了省钱我们自己开发即可。

四代交易网关,走的还是DBF落地文件

五代交易网关,已经是XML流式报文且支持热备和集中监控了,上线后没出过一次事故

二、前期准备

1、四代网关两个(行情+交易),已有待配置
2、监控脚本(python),待开发
3、监控集中展示(redis、grafana),已有待配置

三、开发过程

1、网关配置

网关的监控端口默认是关闭的,需要手工开启。开启程序后,点开参数配置界面,在通信设置页签中点击勾选,启用网关监控,端口设置为8888(交易)、8889(行情),确定后需要重启网关程序才可生效。


image.png

2、脚本开发

根据深证通文档指引,可以用telnet和socket两种方式实现python脚本,我们选择socket。具体逻辑为,连接网关监控端口,执行1条监控指令,获取回显数据并通过接口上传至redis,由grafana展示。
需要注意的是,监控指令要用二进制,且结尾需要有两个换行符,如b"type=heartbeat\n\n"。
代码如下:

# -*- coding:gbk  -*-
import socket
import requests
import time
import json

url="http://172.21.234.30/jsondata/neeq_gw"
def neeq(gwip,gwport,gwtype):
    con = socket.create_connection((gwip,gwport))
    time.sleep(1)
    con.send(b'type=queryrunstatus\n\n')
    time.sleep(1)
    result = con.recv(1024).split(b'\r\n')
    gwstat = []
    for g in result:
        if g != b'':
            gwstat.append(g.decode('gbk'))
    gwdict = dict((l.split('=',1) for l in gwstat))
    if gwtype=='trade':
        value=[{"网关类型":"交易网关",
               "网关号":gwdict['userId'],
               "待发委托":gwdict['pendingOrderCount'],
               "已发委托":gwdict['sentOrderCount'],
               "成功委托":gwdict['successOrderCount'],
               "非法委托":gwdict['invalidOrderCount'],
               "成交回报":gwdict['tradeCount'],
               "通信状态":gwdict['commStatus'],
               "市场状态":gwdict['marketStatus']
                }]
    elif gwtype=='quote':
        value=[{"网关类型":"行情网关",
               "网关号":gwdict['userId'],
               "TCP状态":gwdict['tcpCommStatus'],
               "UDP状态":gwdict['ucpCommStatus'],
               "待处理包数":gwdict['numOfToDealPkts'],
               "乱序包数":gwdict['numOfSeqErrPkts'],
               "错报数":gwdict['numOfErrPkts'],
               "总包数":gwdict['numOfPkts'],
               "总字节数":gwdict['numOfBytes'],
               "市场状态":gwdict['marketStatus'],
               "证券信息条数":gwdict['numOf_NQXX'],
               "证券信息更新时间":gwdict['NQXX_QuotaTime'],
               "证券行情条数":gwdict['numOf_NQHQ'],
               "证券行情更新时间":gwdict['NQHQ_QuotaTime']
                }]
    return(json.dumps(value))
if __name__ == '__main__':
    pushvalue = []
    broketgw = neeq('172.21.237.95','8888','trade')
    brokemdgw = neeq('172.21.237.95','8889','quote')
    pushvalue = json.loads(broketgw) + json.loads(brokemdgw)
    pushvalue = json.dumps(pushvalue)
    re = requests.post(url, data=pushvalue)
    print(re)

3、grafana配置

table插件不好使,列序总是变,还不知道怎么调整