InfluxDb+Grafana数据监控
本篇文章请结合以下两篇文章观看
Grafana安装及简单使用 Windows版InfluxDB及相关软件安装与配置
这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M。爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已。
环境
InfluxDb,是目前比较流行的时间序列数据库;
Grafana,一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源
influxdb安装
pip install influxdb
原理
获取要展示的数据,包含当前的时间数据,存到InfluxDb里面,然后再到Grafana里面进行相应的配置即可展示;
安装
Grafana安装:https://blog.csdn.net/xc_zhou/article/details/88936662
InfulxDb安装:https://blog.csdn.net/xc_zhou/article/details/89478279
存数据
InfluxDb数据库的数据有一定的格式,因为我都是利用python库进行相关操作,所以下面将在python中的格式展示一下:
json_body = [
{
"measurement": "crawler",
"time": current_time,
"tags": {
"spider_name": collection_name
},
"fields": {
"count": current_count,
"increase_count": increase_amount,
"size": co_size,
"increase_size": increase_co_size
}
}
]
其中:
measurement , 表名 time ,时间 tags ,标签 fields ,字段
可以看到,就是个列表里面,嵌套了一个字典。其中,对于时间字段,有特殊要求,可以参考 这里 , 下面是python实现方法:
from datetime import datetime
current_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
完整代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time :
# @Author :
# @File :
# @Software: PyCharm
import ast,time,pymongo,traceback
import os,configparser
from configparser import SafeConfigParser,ConfigParser
from influxdb import InfluxDBClient
from datetime import datetime
from os.path import getmtime
"""
爬虫可视化存数据到InfluxDb 数据库脚本
采用热更新配置文件的方式
若修改配置的过程中,报错,则会使用上一次的配置信息(非首次,如果首次就报错,就会退出程序)
"""
class spider():
def __init__(self):
# influx配置,需要用influxdb数据库
self.infl_client = InfluxDBClient(host='192.168.10.56', port=8086)#host='localhost'
# 创建数据库
self.infl_client.create_database('test')
# 选择使用数据库
self.infl_client.switch_database('test')
# 配置文件名
self.config_name = 'settings.conf'
# self.config_name = 'config.ini'
WATCHED_FILES = [self.config_name]
'''
os.path.getatime(path)
返回path所指向的文件或者目录的最后存取时间
'''
self.WATCHED_FILES_MTIMES = [(f, getmtime(f)) for f in WATCHED_FILES]
self._count_dict = {}
self._size_dict = {}
def parse_config(self,file_name):
parser = ConfigParser()
parser.read(file_name, encoding='utf-8')
replicaset_mongo = parser.get("Mongo_25",'replicaset')
host_mongo = parser.get("Mongo_25", 'host')
host1_mongo = parser.get("Mongo_25", 'host1')
host2_mongo = parser.get("Mongo_25", 'host2')
port_mongo = parser.get("Mongo_25", 'port')
user_mongo = parser.get("Mongo_25", 'user')
passwd_mongo = parser.get("Mongo_25", 'password')
authenticate = parser.get("Mongo_25", 'authenticate')
self.interval = parser.getint('time', 'interval')
self.dbs_and_cos = ast.literal_eval(parser.get('db', 'db_co_dict'))
for db_name, collection_name in self.dbs_and_cos.items():
if replicaset_mongo: # 连接mongo集群
self.client = pymongo.MongoClient([host1_mongo, host2_mongo], replicaSet=replicaset_mongo, port=int(port_mongo))
self.client.admin.authenticate(user_mongo, passwd_mongo)
self.db = self.client[db_name]
else: # 连接mongo单机
self.client = pymongo.MongoClient(host_mongo, int(port_mongo))
self.db = self.client[db_name]
if user_mongo: # (windows 运行)
self.db.authenticate(user_mongo, passwd_mongo, source=authenticate)
self.collection = self.db[collection_name]
break
def insert_data(self):
for db_name, collection_name in self.dbs_and_cos.items():
self.db = self.client[db_name]
self.collection = self.db[collection_name]
# 集合大小
co_size = round(float(self.db.command("collstats", collection_name).get('size')) / 1024 / 1024, 2)
# 集合内数据条数
current_count = self.collection.count()
# 初始化,当程序刚执行时,初始量就设置为第一次执行时获取的数据
init_count = self._count_dict.get(collection_name, current_count)
# 初始化,当程序刚执行时,初始量就设置为第一次执行时获取的数据大小
init_size = self._size_dict.get(collection_name, co_size)
# 条数增长量
increase_amount = current_count - init_count
# 集合大小增长量
increase_co_size = co_size - init_size
current_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
# 赋值
self._size_dict[collection_name] = co_size
self._count_dict[collection_name] = current_count
json_body = [
{
"measurement": "crawler",
"time": current_time,
"tags": {
"spider_name": collection_name
},
"fields": {
"count": current_count,
"increase_count": increase_amount,
"size": co_size,
"increase_size": increase_co_size
}
}
]
print(json_body)
self.infl_client.write_points(json_body)
def auto_get_new_file(self):
# 热更新配置
self.parse_config(self.config_name)
for f, mtime in self.WATCHED_FILES_MTIMES:
while True:
if getmtime(f) != mtime:
try:
self.parse_config(self.config_name)
mtime = getmtime(f)
except:
print('setting load error')
self.insert_data()
time.sleep(self.interval)
if __name__ == '__main__':
try:
data=spider()
data.auto_get_new_file()
except Exception as e:
import traceback
ex_msg = '{exception}'.format(exception=traceback.format_exc())
print(ex_msg)
- settings.conf
# MongoDb 相关配置
[Mongo_Uri]
host = ''
user =''
passwd = ''
[Mongo_25]
replicaset =
host = 192.168.118.3
host1 =''
host2 =''
port = 27017
user =
password =
authenticate =
# [需要展示的数据的数据库,集合名]
[db]
db_co_dict = {
'dm_bond': 'bond_sentiment_news',
}
# [循环间隔时间]
[time]
interval = 7
参考:https://www.jianshu.com/p/0792053aa134 http://www.sohu.com/a/283857025_671965 http://api.mongodb.com/python/current/api/pymongo/database.html
- Ubuntu16.04安装后开发环境配置和常用软件安装
- wordpress如何屏蔽wp-json(禁用REST API)
- 贝叶斯系列——贝叶斯与其他统计流派的区别和联系
- bootstrap tab切换如何让鼠标移动自动切换内容
- css自动换行如何设置?url太长会撑开页面
- Histogram of Oriented Gridients(HOG) 方向梯度直方图
- 动态规划系列之最长递增子序列问题解答
- Git SSH Key 生成步骤
- 如何将wordpress所有文章批量改为已发布状态
- dedecms提取某栏目及子栏目名称到首页怎么弄
- Bootstrap速学教程之简要介绍
- Ubuntu 安装 JDK8 的两种方式
- git命令-切换分支
- 如何让dedecms文章点击量增加一定的数值
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 三、运行时的动态常量(学习笔记)
- Vue Cli 3 打包配置--自动忽略 console.log 语句
- git 常用命令介绍
- PAT (Basic Level) Practice (中文)1043 输出PATest (20 分)
- PAT (Basic Level) Practice (中文)1047 编程团体赛 (20 分)
- Vue中computed分析
- 半小时搞懂 HTTP、HTTPS和HTTP2
- RestPack Java实现Html转PDF文件
- 六、垃圾回收_判断对象是否存活算法_引用计数法详解
- webpack + express 实现文件精确缓存
- python提取视频中的音频
- Vue3 响应式原理
- vue-mergeable-table 动态生成的可合并行列的表格
- 【GOFLY】基于GO语言gin框架和websocket实现的全开源WEB客服即时通讯管理系统
- edgeXFoundry中modbus通信部署和测试(待续)