完美:快速上手 Pythond 采集器的最佳实践
优采云 发布时间: 2022-11-02 02:29完美:快速上手 Pythond 采集器的最佳实践
Pythond 是一套完整的定期触发用户自定义 Python 采集 脚本的解决方案。本文以“获取每小时登录用户数”为指标,上报中心为例。
1.1。业务介绍介绍
业务流程大致如下:采集数据库中的数据(Python脚本)->pythond 采集器触发脚本周期性上报数据(datakit)->可以从中心看到指标(网)。
数据库现在有一个名为 customers 的表,其中收录以下字段:
建表语句如下:
create table customers
(
`id` BIGINT(20) not null AUTO_INCREMENT COMMENT '自增 ID',
`last_logined_time` BIGINT(20) not null DEFAULT 0 COMMENT '登录时间 (时间戳)',
`name` VARCHAR(48) not null DEFAULT '' COMMENT '姓名',
primary key(`id`),
key idx_last_logined_time(last_logined_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
将测试数据插入上表:
INSERT INTO customers (id, last_logined_time, name) VALUES (1, 1645600127, 'zhangsan');
INSERT INTO customers (id, last_logined_time, name) VALUES (2, 1645600127, 'lisi');
INSERT INTO customers (id, last_logined_time, name) VALUES (3, 1645600127, 'wangwu');
使用以下 SQL 语句获取“每小时登录用户数”:
select count(1) from customers where last_logined_time>=(unix_timestamp()-3600);
上述数据以指标的形式上报给中心。
下面详细介绍实现上述服务的具体步骤。
1.2. 前提条件
1.2.1。Python环境
需要安装 Python,目前 Pythond 采集器 处于 alpha 阶段,兼容 Python 2.7+ 和 Python 3+。不过为了以后的兼容性,强烈建议使用 Python 3,毕竟 Python 2 官方已经不再支持了。下面的演示也使用 Python 3。
1.2.2。Python 依赖库
需要安装以下依赖项:
安装方法如下:
# python3
python3 -m pip install requests
python3 -m pip install pymysql
以上安装需要安装pip。如果没有,可以参考以下方法:
# Linux/MacOS
python3 -m ensurepip --upgrade
# Windows
py -m ensurepip --upgrade
1.3. 编写用户定义的脚本
用户需要继承DataKitFramework类,然后重写run方法。DataKitFramework类源代码文件为datakit_framework.py,路径为datakit/python.d/core/datakit_framework.py。
具体用法请参考源码文件datakit/python.d/core/demo.py。
根据以上需求,我们编写如下 Python 脚本,命名为 hellopythond.py:
from datakit_framework import DataKitFramework
import pymysql
import re
import logging
class MysqlConn():
def __init__(self, logger, config):
self.logger = logger
self.config = config
self.re_errno = re.compile(r'^\((\d+),')
try:
self.conn = pymysql.Connect(**self.config)
self.logger.info("pymysql.Connect() ok, {0}".format(id(self.conn)))
except Exception as e:
raise e
def __del__(self):
self.close()
def close(self):
if self.conn:
self.logger.info("conn.close() {0}".format(id(self.conn)))
self.conn.close()
def execute_query(self, sql_str, sql_params=(), first=True):
res_list = None
cur = None
try:
cur = self.conn.cursor()
cur.execute(sql_str, sql_params)
<p>
res_list = cur.fetchall()
except Exception as e:
err = str(e)
self.logger.error('execute_query: {0}'.format(err))
if first:
retry = self._deal_with_network_exception(err)
if retry:
return self.execute_query(sql_str, sql_params, False)
finally:
if cur is not None:
cur.close()
return res_list
def execute_write(self, sql_str, sql_params=(), first=True):
cur = None
n = None
err = None
try:
cur = self.conn.cursor()
n = cur.execute(sql_str, sql_params)
except Exception as e:
err = str(e)
self.logger.error('execute_query: {0}'.format(err))
if first:
retry = self._deal_with_network_exception(err)
if retry:
return self.execute_write(sql_str, sql_params, False)
finally:
if cur is not None:
cur.close()
return n, err
def _deal_with_network_exception(self, stre):
errno_str = self._get_errorno_str(stre)
if errno_str != '2006' and errno_str != '2013' and errno_str != '0':
return False
try:
self.conn.ping()
except Exception as e:
return False
return True
def _get_errorno_str(self, stre):
searchObj = self.re_errno.search(stre)
if searchObj:
errno_str = searchObj.group(1)
else:
errno_str = '-1'
return errno_str
def _is_duplicated(self, stre):
errno_str = self._get_errorno_str(stre)
# 1062:字段值重复,入库失败
# 1169:字段值重复,更新记录失败
if errno_str == "1062" or errno_str == "1169":
return True
return False
class HelloPythond(DataKitFramework):
__name = 'HelloPythond'
interval = 10 # 每 10 秒钟采集上报一次。这个根据实际业务进行调节,这里仅作演示。
# if your datakit ip is 127.0.0.1 and port is 9529, you won't need use this,
# just comment it.
# def __init__(self, **kwargs):
# super().__init__(ip = '127.0.0.1', port = 9529)
def run(self):
config = {
"host": "172.16.2.203",
"port": 30080,
"user": "root",
"password": "Kx2ADer7",
"db": "df_core",
"autocommit": True,
# "cursorclass": pymysql.cursors.DictCursor,
"charset": "utf8mb4"
}
mysql_conn = MysqlConn(logging.getLogger(''), config)
query_str = "select count(1) from customers where last_logined_time>=(unix_timestamp()-%s)"
sql_params = ('3600')
n = mysql_conn.execute_query(query_str, sql_params)
data = [
{
"measurement": "hour_logined_customers_count", # 指标名称。
"tags": {
"tag_name": "tag_value", # 自定义 tag,根据自己想要标记的填写,我这里是随便写的
},
"fields": {
"count": n[0][0], # 指标,这里是每个小时登录的用户数
},
},
]
in_data = {
'M':data,
'input': "pyfromgit"
}
return self.report(in_data) # you must call self.report here</p>
1.4. 将自定义脚本放在正确的位置
在Datakit安装目录的python.d目录下新建一个文件夹,命名为hellopythond。这个文件夹的名字应该和上面写的类名一样,即hellopythond。
然后把上面写的脚本hellopythond.py放到这个文件夹下,也就是最终的目录结构如下:
├── ...
├── datakit
└── python.d
├── core
│ ├── datakit_framework.py
│ └── demo.py
└── hellopythond
└── hellopythond.py
上面的core文件夹是Pythond的core文件夹,不要动。
上面是没有开启gitrepos功能的时候,如果开启了gitrepos功能,那么路径结构是这样的:
├── ...
├── datakit
├── python.d
├── gitrepos
│ └── yourproject
│ ├── conf.d
│ ├── pipeline
│ └── python.d
│ └── hellopythond
│ └── hellopythond.py
1.5。打开pythond配置文件
将 Pythond 配置文件复制出来。将pythond.conf.sample复制到conf.d/pythond目录下的pythond.conf中,配置如下:
[[inputs.pythond]]
# Python 采集器名称
name = 'some-python-inputs' # required
# 运行 Python 采集器所需的环境变量
#envs = ['LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH',]
# Python 采集器可执行程序路径(尽可能写绝对路径)
cmd = "python3" # required. python3 is recommended.
# 用户脚本的相对路径(填写文件夹,填好后该文件夹下一级目录的模块和 py 文件都将得到应用)
dirs = ["hellopythond"] # 这里填的是文件夹名,即类名
1.6. 重启数据包
sudo datakit --restart
1.7. 渲染
如果一切顺利,大约一分钟后,我们应该会在中心看到指标图。
1.8. 参考文档
#5dd2079e
【即刻体验观测云】
事实:底什么是伪静态?为什么要做伪静态?
看完这篇文章,你就可以完全理解伪静态了,因为开源字节使用比较的方法,让你实现整个 URL 链接结构的状态。我们比较了“静态页面”、“动态页面”、“真静态页面”、“伪静态页面”以及它们对应的优缺点。深入了解其概念并分析其问题。
1.静态页面
除了我们常见的.htm和.html之外,.asp.php.jsp也可以是静态的。关键是看.asp.php.jsp的页面是否调用了数据库中的东西。如果不是,它是一个静态页面,称为,是一个动态页面。
2.动态页面
其含义是网页会根据访问者的请求,从服务器数据库中过滤访问者想要的内容,并显示在访问者的浏览器上。不同的人访问同一个页面并看到不同的内容。没有数据,只有一些代码,访问者看到的都是从服务器传过来的。
相关总结:静态路径和动态路径其实就是绝对路径和相对路径。
绝对路径是一个很明确的文件存放位置,如:c:\windows\system32\cmd.exe
相对路径就是以当前位置为参考起点来确定文件的存放位置,如:Program Files\ACD Systems\acdsee.exe
它是可变的,可以是C盘,D盘,也可以在网络上。
举个通俗的例子:比如你家到单位的距离是1000米,不管你在哪里,都是1000米(绝对路径),你不在家的时候可能是5000米从您的单位,或者可能只有 200 米(相对路径)。
3.真正的静态页面
现在很多cms网站程序都可以直接从动态页面生成真正的静态页面,即访问的页面是真实的和真实的,根静态页面是一样的。这样做的好处是访问速度快,筛选服务器中的数据不需要经常读取,减轻了服务器的压力,也可以更好的被搜索引擎收录使用。
真正的静态页面的优点:
1.加载时无需调用数据库,打开速度快。
2. 减少服务器数据响应的负载。
3、从安全角度来看,纯静态网页不易被黑客攻击。
4、在网站稳定性方面,即使网站代码或数据库出现问题,静态的网站也不受影响。
缺点:真静态最大的缺点是程序生成大量文件,占用网站空间过多,增加网站的制作成本。
4.伪静态页面
伪静态 url 重写是拦截传入的 web 请求并自动将它们重定向到其他 url 的过程。收录。伪静态路径看起来像静态路径,但它是从动态路径转换而来的。
比如这个URL:***.com/?p=50就是动态路径,网站在后台经过一些设置后,URL转换成***.com/jichu/50html,这样一个URL 是静态路径。
它不是真正的静态,它只是在处理后将动态页面呈现为静态页面。本质上是一个动态页面。
伪静态的优点:
1、易于维护,网页每天自动更换,无需维护或大大减少维护量。
2. 轻松实现搜索引擎优化,方便收录搜索。
3.缩短了url长度,隐藏文件的实际路径提高了安全性,便于用户记忆和输入。
4、空间比较小,没有纯静态那么大的空间。
5、安全性能 url地址被隐藏或加密,使黑客无法找到真正的动态页面,动态文件不需要太高的权限,从而避免了木马的注入。
缺点:会占用一定的CPU使用率,增加服务器的响应时间。
为什么选择伪静态?
1、伪静电更有优势。(参考上面,已经对比解释过了)
2、对比真静态和伪静态,我们发现真假静态和伪静态对搜索引擎的影响是一样的,但是伪静态的优势是纯静态无法比拟的。
所以我们更喜欢伪静态。
当心:
1、一般来说,现在搜索引擎可以识别静态路径、伪静态路径和动态路径。我们只需要注意网站URL的路径尽量简单、短、匹配、静态、统一。这很好。
2、其实对于搜索引擎来说,动态路径和静态路径的爬取其实是没有区别的。除非动态路径中的参数个数超过三个,否则爬虫会在爬取时丢失参数,导致页面爬取失败。在大多数情况下,动态和静态路径对搜索引擎来说是同等对待的。
3. 另外,一个网站只允许设置一种路径,要么全部为动态路径,要么全部为静态路径。不允许同时进行两个路径连接。如果有第二个连接必须屏蔽,您可以使用 robots 文件对其进行屏蔽。
4、我们知道搜索引擎在爬取的时候只识别路径,所以对于搜索引擎来说,路径中或多或少的一个字母、数字或符号就是一条新的路径。对于一些不同路径指向同一个页面的情况,我们需要设置它来统一和规范路径,集中在一条路径上,达到集中权重的目的。