我的数据可视化处理过程

数据规整 我的数据来源一般都是来自于日志文件,不同的日志文件格式可能都不相同。所以第一步就是把数据抽取出来,并且格式化。 一般情况下我会用grep或者awk进行初步的整理。如果shell脚本处理不太方便,通常我会写个js脚本。 Node.js的readline可以实现按行取出。处理过后的输出依然是写文件。 const readline = require('readline') const fs = require('fs') const dayjs = require('dayjs') const fileName = 'data.log' const batch = dayjs().format('MMDDHHmmss') const dist = fs.createWriteStream(`${fileName}.out`) const rl = readline.createInterface({ input: fs.createReadStream(fileName) }) rl.on('line', handlerLine) function handlerLine (line) { let info = line.split(' ') let time = dayjs(`2020-${info[0]} ${info[1]}`).valueOf() let log = `rtpproxy,tag=b${batch} socket=${info[2]},mem=${info[3]} ${time}000000\n` console.log(log) dist.write(log) } 输出的文件格式如下,至于为什么是这种格式,且看下文分晓。 rtpproxy,tag=b0216014954 socket=691,mem=3106936 1581477499000000000 rtpproxy,tag=b0216014954 socket=615,mem=3109328 1581477648000000000 rtpproxy,tag=b0216014954 socket=669,mem=3113764 1581477901000000000 rtpproxy,tag=b0216014954 socket=701,mem=3114820 1581477961000000000 数据导入 以前我都会把数据规整后的输出写成一个JSON文件,然后写html页面,引入Echarts库,进行数据可视化。 但是这种方式过于繁琐,每次都要写个Echars的Options。 所以我想,如果把数据写入influxdb,然后用grafana去做可视化,那岂不是十分方便。 所以,我们要把数据导入influxdb。 启动influxdb grafana 下面是一个Makefile, 用来启动容器。 make create-network 用来创建两个容器的网络,这样grafana就可以通过容器名访问influxdb了。 make run-influxdb 启动influxdb,其中8086端口是influxdb对外提供服务的端口 make run-grafana 启动grafana, 其中3000端口是grafana对外提供服务的端口 run-influxdb: docker run -d -p 8083:8083 -p 8086:8086 --network b2 --name influxdb influxdb:latest run-grafana: docker run -d --name grafana --network b2 -p 3000:3000 grafana/grafana create-network: docker network create -d bridge --ip-range=192.168.1.0/24 --gateway=192.168.1.1 --subnet=192.168.1.0/24 b2 接着你打开localhost:3000端口,输入默认的用户名密码 admin/amdin来登录 ...

2020-02-16 14:55:15 · 1 min · Eddie Wang

故障的特征分析方法

特征维度 特征项 集中 无规律 周期性 时间 集中在某个时间点发生 按固定时间间隔发生 空间 集中在某个空间发生 人物 集中在某个人物身上发生

2020-02-14 20:08:17 · 1 min · Eddie Wang

我走过的nginx反向代理的坑

下文的论述都以下面的配置为例子 location ^~ /p/security { rewrite /p/security/(.*) /security/$1 break; proxy_pass http://security:8080; proxy_redirect off; proxy_set_header Host $host; add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Credentials' 'true' always; } 如果dns无法解析,nginx则无法启动 security如果无法解析,那么nginx则无法启动 DNS缓存问题: nginx启动时,如果将security dns解析为1.2.3.4。如果security的ip地址变了。nginx不会自动解析新的ip地址,导致反向代理报错504。 反向代理的DNS缓存问题务必重视 跨域头配置的always 反向代理一般都是希望允许跨域的。如果不加always,那么只会对成功的请求加跨域头,失败的请求则不会。 关于**‘Access-Control-Allow-Origin’ ‘*’,如果后端服务本身就带有这个头,那么如果你在nginx中再添加这个头,就会在浏览器中遇到下面的报错。而解决办法就是不要在nginx中设置这个头。** Access to fetch at 'http://192.168.40.107:31088/p/security/v2/login' from origin 'http://localhost:5000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed. Have the server send the header with a valid value, or, if an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. 参考链接 http://nginx.org/en/docs/http/ngx_http_headers_module.html http://www.hxs.biz/html/20180425122255.html https://blog.csdn.net/xiojing825/article/details/83383524 https://cloud.tencent.com/developer/article/1470375 https://blog.csdn.net/bbg221/article/details/79886979

2020-02-13 21:21:13 · 1 min · Eddie Wang

kindle阅读器的寿命

2018年1月26日,我在京东上买了一个Kindle Paperwhite, 距离今天,大概已经2年多一点了。 我是一个重度读者,每天都会花上一些时间去阅读。最近两天发现,本来可以连续两周不用充电的kindle。基本上现在是电量以每天50%的速度减少。或许,2年,就是kindle的寿命。 刚开始读书总觉得没有什么进度,后来我就喜欢把每天读书的进度给记录下来。这样做的好处是能够督促我不要偷懒, 我读书有个习惯,每天以至少1%的进度去读一本书,并且我会将进度记录下来。基本上,我每天会读7-8本书的1%。 两年时间内我读过的书,要比我从小学到大学读过的书都要多。

2020-02-04 09:12:29 · 1 min · Eddie Wang

论禹三过家门而不入的真实原因

最早听说“三过家门而不入”,是说禹治水大公无私,路过家门都没有回家。 最近看到史记,发现这句话原本是 禹伤先人父鲧(发音和滚相同)功之不成受诛,乃劳身焦思,居外十三年,过家门不敢入 “三过家门而不入"这个短语中, 与原文少一个“敢”字,少了一个字,含义差距很大。 没有敢字,说明是自己主动的。加上敢字,则会让人思考。禹为什么不敢回家?他在怕什么呢? 这里就需要提到禹的父亲鲧。 鲧治水九年,没有把水治理好。在舜巡视的时候,被赐死在羽山。 舜登用,摄行天子之政,巡狩。行视鲧之治水无状,乃殛(发音和即相同)鲧于羽山以死 所以,如果禹治不好水,你想禹的下场是什么?

2020-01-09 13:43:47 · 1 min · Eddie Wang

进程实战

2019-12-18 09:10:04 · 0 min · Eddie Wang

docker slim

2019-12-14 11:32:27 · 0 min · Eddie Wang

wifi工作模式测试

路由器无线网络的模式有11b only ,11g only, 11n only,11bg mixed,11bgn mixed 11b:就是11M 11g:就是54M 11n:就是150M或者300M only:在此模式下,频道仅使用 802.11b标准mixed:支持混合 802.11b 和 802.11g 装置 修改路由器工作模式后,手机连接wifi,然后用腾讯手机管家对WiFi测速 工作模式 下载速度 11b 200kb/s 11g 400kb/s 11n 1.1MB/s 11bgn mixed 2.06MB/s 所以,选择11bgn是个不错的选择。

2019-12-12 10:11:47 · 1 min · Eddie Wang

influxdb时间精度到秒

var data = [] var t1 = [ ["2019-12-11T09:13:06.078545239Z",153], ["2019-12-11T09:14:06.087484224Z",118], ["2019-12-11T09:15:07.723571286Z",198], ["2019-12-11T09:16:09.534879791Z",249], ] var t2 = [ ["2019-12-11T09:13:06Z",153], ["2019-12-11T09:14:06Z",118], ["2019-12-11T09:15:07Z",198], ["2019-12-11T09:16:09Z",249], ] var data = t1.map(function(item){ return { value: [item[0], item[1]] } }) option = { title: { text: '动态数据 + 时间坐标轴' }, tooltip: { trigger: 'axis' }, xAxis: { type: 'time' }, yAxis: { type: 'value' }, series: [{ name: '模拟数据', type: 'line', showSymbol: false, hoverAnimation: false, data: data }] }; 数据集t1时间精度到秒,并且带9位小数 数据集t2时间精确到秒,不带小数 t1的绘线出现往回拐,明显有问题。不知道这是不是echars的bug ...

2019-12-11 17:48:20 · 1 min · Eddie Wang

influxdb HTTP 接口学习

查询某个字段 q=SELECT real_used_size FROM opensips WHERE time > '2019-12-05T00:10:00Z' 正常查询结果,下面是例子,和上面的sql没有关系。 :::warning 时间必须用单引号括起来,不能用双引号,格式也必须是YYYY-MM-DDTHH:MM:SSZ ::: { "results": [ { "statement_id": 0, "series": [ { "name": "cpu_load_short", "columns": [ "time", "value" ], "values": [ [ "2015-01-29T21:55:43.702900257Z", 2 ], [ "2015-01-29T21:55:43.702900257Z", 0.55 ], [ "2015-06-11T20:46:02Z", 0.64 ] ] } ] } ] } 如果有报错,数组项中的某一个会有error属性,值为报错原因 { "results":[ { "statement_id": 0, "error": "invalid operation: time and *influxql.StringLiteral are not compatible" } ] } 批次查询 语句之间用分号隔开 ...

2019-12-05 11:12:33 · 1 min · Eddie Wang