完美:快速上手 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(&#39;execute_query: {0}&#39;.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(&#39;execute_query: {0}&#39;.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 != &#39;2006&#39; and errno_str != &#39;2013&#39; and errno_str != &#39;0&#39;:

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 = &#39;-1&#39;

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 = &#39;HelloPythond&#39;

interval = 10 # 每 10 秒钟采集上报一次。这个根据实际业务进行调节,这里仅作演示。

# if your datakit ip is 127.0.0.1 and port is 9529, you won&#39;t need use this,

# just comment it.

# def __init__(self, **kwargs):

# super().__init__(ip = &#39;127.0.0.1&#39;, 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(&#39;&#39;), config)

query_str = "select count(1) from customers where last_logined_time>=(unix_timestamp()-%s)"

sql_params = (&#39;3600&#39;)

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 = {

&#39;M&#39;:data,

&#39;input&#39;: "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 = &#39;some-python-inputs&#39; # required

# 运行 Python 采集器所需的环境变量

#envs = [&#39;LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH&#39;,]

# 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、我们知道搜索引擎在爬取的时候只识别路径,所以对于搜索引擎来说,路径中或多或少的一个字母、数字或符号就是一条新的路径。对于一些不同路径指向同一个页面的情况,我们需要设置它来统一和规范路径,集中在一条路径上,达到集中权重的目的。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线