什么是传感器
传感器 (Sensor) 是将外部系统和事件与 StackStorm 集成的一种方式。传感器是 Python 代码片段,它们要么定期轮询某些外部系统,要么被动等待入站事件,通常示例用于每隔一段时间去轮询某一个对象,然后他们将 Trigger 注入 StackStorm,可以通过规则进行匹配,以执行潜在的 Action。
Sensor 是用 Python 编写的,并且必须遵循 StackStorm 定义的传感器接口要求。
什么是触发器
触发器 (Trigger) 是 StackStorm 中用于识别 StackStorm 的传入事件。Trigger 是类型(字符串)和可选参数(对象)的元组。编写 Rule 是为了与 Trigger 一起使用。Sensor 通常会记录 Trigger,但这并不是严格要求的。例如,有一个向 StackStorm 注册的通用Webhooks触发器,它不需要自定义传感器。
Stackstorm内置触发器
默认情况下,StackStorm 会发出一些内部 Trigger,您可以在规则中利用它们。这些触发器可以与非系统触发器区分开来,因为它们的前缀为 “st2”。
下面包含每个资源的可用 Trigger 列表:
Action
Reference | Description | Properties |
---|---|---|
core.st2.generic.actiontrigger | 封装 Action 执行完成的触发器 | execution_id, status, start_timestamp, action_name, action_ref, runner_ref, parameters, result |
core.st2.generic.notifytrigger | 通知触发器 | execution_id, status, start_timestamp, end_timestamp, action_ref, runner_ref, channel, route, message, data |
core.st2.action.file_written | 触发封装 Action,将文件写入磁盘 | ref, file_path, host_info |
core.st2.generic.inquiry | 触发器指示一个新的查询,表示已经进入 “pending” 状态 | id, route |
Sensor
Reference | Description | Properties |
---|---|---|
core.st2.sensor.process_spawn | 触发器去指示传感器,进程开始启动 | object |
core.st2.sensor.process_exit | 触发器指示传感器,进程已经结束 | object |
如何创建一个 Sensor
创建传感器涉及编写 Python 脚本和定义 Sensor 的 YAML 元数据文件。以下是一个最小化 sensor 的结构示例。
元数据文件:
|
|
相关 Python 脚本的结构,在脚本中,必须遵循该结构进行编写
|
|
上述是一个最简单的 Sensor 示例。
您的 Sensor 应生成 Python 字典形式的Trigger:
|
|
Sensor 通过使用实例化时传递到 Sensor 的 sensor_service 来注入此类 Trigger。
|
|
如果您想要一个定期轮询外部系统的传感器,您可以使用 PollingSensor 而不是 Sensor 作为基类。
|
|
上述是一个 Poll Sensor 代码部分是结构的,setup 是装载时执行,poll 是在每个 interval 执行探测,这里的机制是当完成了派发后是不会第二次派发,这里做法是维护了一个列表到类中。
例如
|
|
注:轮询传感器 (Polling Sensors) 还需要元数据文件中的 poll_interval 参数。这定义了调用
poll()
方法的频率(以秒为单位)。
Sersor如何运行
每个传感器作为单独的进程运行。 st2sensorcontainer
启动 sensor_wrapper.py
,它将您的 Sensor
类(例如上面的SampleSensor 或 SamplePollingSenso r)包装在 st2reactor.container.sensor_wrapper.SensorWrapper
中。
Sensor Service
正如您在上面的示例中看到的,sensor_service 在实例化时被传递给每个传感器类构造函数。
传感器服务 (Sensor Service) 通过公共方法向 Sensor 提供不同的服务。最重要的一种 dispatch
方法是允许 Sensor 将 Trigger 注入系统的方法。所有公共方法描述如下:
- 常用操作,Common Operations
- 数据存储管理操作 Datastore Management Operations
Common Operations
dispatch
调度:此方法允许传感器将触发器注入系统
|
|
例如:
|
|
get_logger
此方法允许 Sensor 实例检索特定于该传感器的记录器实例。
|
|
例如:
|
|
Datastore Management Operations
除了触发器注入之外,传感器服务还提供读取和操作数据存储的功能。
每个传感器都有一个本地命名空间,默认情况下,所有数据存储操作都对该 Sensor “本地命名空间” 中的键进行操作。如果要对“全局命名空间”进行操作,则需要将参数传递 local=False
给数据存储操作方法。
除其他原因外,如果想在传感器运行之间保留临时数据,此功能非常有用。
TwitterSensor 就是此功能的一个很好的例子。 Twitter 传感器在每次轮询后都会在数据存储中保留最后处理的推文的 ID。这样,如果 Trigger 重新启动或崩溃,传感器可以从中断处恢复,而无需向系统注入重复的 Trigger。
list_values
|
|
该方法允许列出数据存储中的值。您还可以通过将 prefix
参数传递给方法来按键名称前缀(键名称开头)进行过滤:
|
|
get_value
|
|
此方法允许您从数据存储中检索单个值:
|
|
set_value
|
|
该方法允许在数据存储中存储设置一个值。您还可以选择指定存储值的生存时间 (TTL):
|
|
Secret 值可以在存储中中加密:
|
|
delete_value
|
|
该方法允许从存储中删除现有值。如果未找到值,此方法将返回 False,否则返回 True。
|
|
定义一个 Sersor
例如我们需要制作一个简单 Sensor 的工作示例,每 60 秒注入一次触发器。
需要注意的部分:
Sensor 的 Python 的类必需继承 Sensor 或 PollingSensor类,这个由需求而定,必须实现 setup, poll, dispatch等方法
- 如有需求,例如变量声明,也可以重写 _init_ 类
- setup方法,用于初始化示例需要的数据或状态,例如连接三方系统的配置信息,该方法只执行一次
- Sensor runtime 會把实例化并保持运行,按 poll_interval 設置周期去运行 poll 方法
Poll方法是真实执行任务的部分,可在 poll 方法中更新示例持有的数据或状态,判断数据是否匹配,
然后运行 disptach; 按需派发数据,dispatch方法会派发数据,把数据派发给 _trigger_ref
- _trigger_ref 是 Sensor 设置的 trigger type,也就是 RabbitMQ 的 Queue 名称
元数据定义
|
|
Python 代码部分
|
|
Sensor的运行与调试
运行
一旦完成传感器的编写,可以使用以下步骤来首次运行传感器:
- 将传感器 Python 文件和 元数据文件 放入 default 包中的 /opt/stackstorm/packs/default/sensors/ ;或者您也可以根据包结构,创建出自定义包并将传感器元件放置在那里 ( /opt/stackstorm/packs/ )
- 使用
st2ctl
注册传感器 。注意传感器注册中的任何错误,一旦注册时出现错误,请修复错误并使用 重新注册 。
|
|
- 如果注册成功,传感器将自动运行。
调试
在编写时,很多时候需要调试 Sensor 的运行,而由于环境问题,我们无法做到正常Python程序的调试步骤,必须遵循 Stackstorm 的调试方式。
如果只想运行包中的单个传感器并且该传感器已注册,则可以使用 st2sensorcontainer
来仅运行该单个传感器:
|
|
例如:
|
|
示例:Jira服务台
|
|