使用 Grafana 展示肺炎疫情动态

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 开发 Grafana Dashboard 展示新型肺炎疫情动态。

前言

新型冠状病毒疫情汹涌而来,全国各地严防死守,而疫情的实时数据也通过不同的渠道,如微信城市服务的疫情动态订阅、支付宝的疫情实时追踪、新浪新闻的疫情实时动态等等,各种平台纷纷将疫情的实时动态进行展示,确保人们可以第一时间了解疫情的发展情况。

而无论是哪一家的数据推送和展示,都是面向大众的,并不能个性化的展示我们最关心的那些数据,所以这时就需要自制一个疫情动态展示的 Dashboard 了。

说到 Dashboard,第一个联想到的当然就是 Grafana 了,Grafana 是自2014年以来推出的多平台开源分析和交互式可视化软件。连接支持的数据源,它会提供 Web 图表的展示以及报警。终端用户可以通过插件进行拓展,从而使用交互式的查询及展示复杂的监控仪表盘。

项目准备

明确目标,我们这里需要定制一个 Dashboard 用于展示疫情动态,由于我目前在上海,需要展示全国和上海的确诊、疑似、治愈和死亡病例数;同时还需要一个病例发展曲线,用来观察疫情发展趋势;各省区情况已经上海各区情况也是需要的。

Grafana 只是一个展示数据的工具,首先需要的是数据源,目前市面上并没有可以直接用于 Grafana 的疫情数据源,这里我们需要:

  • 需要一个 Grafana,无论是在你的笔记本电脑上,还是在你的 K8S 集群中(这里推荐使用 docker 进行运行 Grafana,如果部署在 K8S 集群中,那更好)。
  • 安装 SimpleJson 插件,它可以将 json 格式的数据,用作 Grafana 的数据源。

开发数据源

数据源这里使用 Python Bottle 进行开发,当然你也可以选择 flask,都是一样的,我使用 Bottle 的原因是之前开发的 Grafana 数据源是使用 Bottle 开发的,这里直接拿来就可以用,调试配置甚至用于构建 docker 镜像的 Dockerfile 和用于部署 K8S 的 deploy.yaml 都有现成可以用的。使用 Python 开发 [Grafana] 数据源很简单,只有符合 [SimpleJson] 的格式要求即可。可以根据 Oz Nahum Tiram 的博文 Visualize almost anything with Grafana and Python 来学习如果使用 Python 作为 [Grafana] 的数据源。

在对数据源的定制中,使用两种类型的的数据:

  • timeserie 类型:

    用于展示全国(含港澳台)和上海地区的疫情实时动态,展示确诊、疑似、治愈和死亡数,并且展示较昨日增加的数量,绘制了【确诊/疑似】数和【治愈/死亡】数的对比曲线。

    这里只要将全国确诊数 gntotal 与 当前时间戳组合返回即可,其他指标也是这种方式。

    @app.post('/query')
    def query():
        print(request.json)
        body = []
        all_data = getDataSync()
        time_stamp = int(round(time.time() * 1000))
        for target in request.json['targets']:
        name = target['target']
        if name == 'gntotal':
            body.append({'target': 'gntotal', 'datapoints': [[all_data['gntotal'], time_stamp]]})
        body = dumps(body)
        return HTTPResponse(body=body, headers={'Content-Type': 'application/json'})
  • table 类型:

    用于绘制中国各省确诊、疑似、治愈和死亡病例数表格,以及上海各区确诊、疑似、治愈和死亡病例数表格。

    取出数据中的名称以及确诊、疑似、治愈和死亡数,appendrows 中即可。

    @app.post('/query')
    def query():
        print(request.json)
        body = []
        all_data = getDataSync()
        sh_data = getShDataSync()
        if request.json['targets'][0]['type'] == 'table':
            rows = []
            for data in all_data['list']:
                row = [data['name'], data['value'], data['susNum'], data['cureNum'], data['deathNum']]
                rows.append(row)
            sh_rows = []
            for data in sh_data['city']:
                row = [data['name'], data['conNum'], data['susNum'], data['cureNum'], data['deathNum']]
                sh_rows.append(row)
            bodies = {'all': [{
                "columns": [
                    {"text": "省份", "type": "name"},
                    {"text": "确诊", " type": "conNum"},
                    {"text": "疑似", " type": "susNum"},
                    {"text": "治愈", "type": "cureNum"},
                    {"text": "死亡", "type": "deathNum"}
                ],
                "rows": rows,
                "type": "table"
            }],
                'sh': [{
                    "columns": [
                        {"text": "省份", "type": "name"},
                        {"text": "确诊", " type": "value"},
                        {"text": "疑似", " type": "susNum"},
                        {"text": "治愈", "type": "cureNum"},
                        {"text": "死亡", "type": "deathNum"}
                    ],
                    "rows": sh_rows,
                    "type": "table"
                }]}
    
            series = request.json['targets'][0]['target']
            body = dumps(bodies[series])
      return HTTPResponse(body=body, headers={'Content-Type': 'application/json'})

选择展示 Panel 类型

总的来说,使用了4种 Panel 进行展示:

  • 展示病例数的展示块,使用 Singlestat
  • 展示数据对比曲线,使用 Graph
  • 展示表格,使用 Table
  • 文字标题,使用 Text

配置数据源

病例数展示块:

这里只有一个值,所以要选择 First

image

病例数发展趋势图:

这里将【确诊/疑似】和【治愈/死亡】数进行对比。

image

数据表格:

image

效果

整体效果还可以,先已用作公司大屏展示疫情情况(这里我司用于展示屏幕较小,只不过是一个小米电视,故字体和展示块都做的大了一些)。

构建

将代码打包成为 docker 镜像,就可以运行在任意环境以及 K8S 集群了,镜像已上传 dockerhub 直接拉取镜像,开箱即食。

# Dockerfile
FROM python:3.7.3-alpine3.9

LABEL maintainer="sunnydog0826@gmail.com"

COPY . /app

RUN echo "https://mirrors.aliyun.com/alpine/v3.9/main/" > /etc/apk/repositories \
    && apk update \
    && apk add --no-cache gcc g++ python3-dev python-dev linux-headers libffi-dev openssl-dev make \
    && pip3 install -r /app/requestments.txt -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

WORKDIR /app

ENTRYPOINT ["uwsgi","--ini","uwsgi.ini"]

运行

  • 拉取镜像
docker pull guoxudongdocker/feiyan-datasource
  • 运行镜像
docker run -d --name datasource -p 8088:3000 guoxudongdocker/feiyan-datasource
  • 添加数据源

    选择 SimpleJson 类型的数据源,点击添加,填入数据源地址:

    datasource

  • 导入 Dashboard

    点击 Upload.json file,选择 wuhan2020-grafana/dashboard.json

    import

  • 使用 K8S 部署(可选)

    kubectl apply -f deploy.yaml

结语

截止目前(2020年2月14日),病例数还在不断的增加,但是疑似病例数趋势开始下降,可以看出,目前新型肺炎的确诊速度增加了;治愈数也在不断的增加;上海地区和其他地区比起来,虽然有大批返工人员进入,但是并没有增加特别多的病例数,各个社区严防死守的效果初显;同时上海一直保持着死亡1人的情况,而且中国首例新型肺炎治愈的也在上海。总的来说只要大家注意预防,待在家中,多消毒,多通风,一定可以战胜疫情,度过难关。

导入 Dashboard 的 json 文件和部署 K8S 的 yaml 文件都可以在 GitHub 上找到。

项目地址:https://github.com/sunny0826/wuhan2020-grafana

相关实践学习
通过可观测可视化Grafana版进行数据可视化展示与分析
使用可观测可视化Grafana版进行数据可视化展示与分析。
目录
相关文章
岩土工程监测中振弦采集仪的选型指南与市场概况
岩土工程监测中振弦采集仪的选型指南与市场概况 振弦采集仪是岩土工程监测中常用的一种设备,用于测量土体的振动特性。它的选型指南和市场概况如下:
岩土工程监测中振弦采集仪的选型指南与市场概况
|
9天前
|
监控 数据可视化 安全
看得见的安全:如何用可视化大屏提升数据监测和网络预警效率
网络安全已成各组织核心议题,传统防护难以应对复杂攻击。AnaTraf网络流量分析仪通过实时分析流量,提取关键行为,提前发现潜在威胁。其可视化大屏将数据直观呈现,助力安全人员快速捕捉风险。系统基于趋势分析构建动态风险模型,实现预判而非仅报警,成为有判断力的“网络安全参谋”。在攻击无孔不入的时代,AnaTraf提供全新认知方式,以“看得见”提升对威胁的判断力。
看得见的安全:如何用可视化大屏提升数据监测和网络预警效率
|
9月前
|
监控 关系型数据库 MySQL
【疫情监控】打造全国新冠疫情Web项目:三次优化,提升用户体验
本文分享了开发全国新冠疫情Web项目的经验和优化过程,包括调整项目结构、新增logger模块改善日志记录、实现数据实时刷新功能,以及通过spider模块代码自动更新疫情数据,提升了用户体验并简化了项目维护流程。
68 2
|
数据可视化 数据挖掘
R语言多维度视角下白领人群健康体质检测数据关系可视化分析2
R语言多维度视角下白领人群健康体质检测数据关系可视化分析
|
数据可视化 数据挖掘
R语言多维度视角下白领人群健康体质检测数据关系可视化分析1
R语言多维度视角下白领人群健康体质检测数据关系可视化分析
|
监控 安全 5G
UWB人员精准定位系统源码,实现实时定位、人机料配对、物料标签配置、智慧调度、轨迹追踪
人员定位管理系统通过在厂区、车间部署UWB定位基站,实时采集人员、机具、物料上定位标签回传的位置信息数据,采用多维定位模式,精确定位人、机具、物料的实时位置,实现实时定位、人机料配对、物料标签配置、智慧调度、轨迹追踪、工时统计、区域物料统计、电子围栏等应用功能。
215 1
|
移动开发 数据可视化 前端开发
疫情可视化平台项目
疫情可视化平台项目
71 0
|
存储 定位技术 开发工具
使用 ES 实现疫情地图或者外卖点餐功能(含代码及数据)
使用 ES 实现疫情地图或者外卖点餐功能(含代码及数据)
使用 ES 实现疫情地图或者外卖点餐功能(含代码及数据)
|
监控 数据可视化 安全
全球疫情实时监控——约翰斯·霍普金斯大学数据大屏实现方案
全球疫情实时监控——约翰斯·霍普金斯大学数据大屏实现方案
553 0
全球疫情实时监控——约翰斯·霍普金斯大学数据大屏实现方案
应用实时监控服务 ARMS 4 月功能新鲜快报
应用实时监控服务 ARMS 4 月功能新鲜快报来啦!快来点击查看~
应用实时监控服务 ARMS 4 月功能新鲜快报