在此页面上
为 Junos PyEZ 操作表定义用于解析非结构化输出的视图
Junos PyEZ 操作 (op) 表,用于从在 Junos 设备上执行的 CLI 命令或在给定灵活 PIC 集中器 (FPC) 上执行的 vty 命令的文本输出中提取数据。表与视图相关联, 视图用于访问表项中的字段并将其映射到用户定义的 Python 变量。通过将属性包含在 view
表定义中来将表与特定视图相关联,该定义将视图名称作为其参数。
视图将用户定义的变量映射到所选表项中的数据。视图使您能够将输出中的特定字段作为变量访问,这些变量具有可在 Python 中操作的属性。Junos PyEZ 处理将数据提取到 Python 以及任何类型的转换或数据规范化。视图中定义的键必须是有效的 Python 变量名称。
本主题讨论视图的不同组件。
视图中用于解析非结构化输出的参数摘要
Junos PyEZ 视图与表一样,使用 YAML 进行格式化。解析非结构化输出的视图可以包含许多参数, 表 1 汇总了这些参数。
查看参数 |
描述 |
---|---|
视图名称 |
视图的用户定义标识符。 |
|
(可选)命令输出中的列标题列表。 |
|
(可选)一个或多个键值对的关联数组或字典,用于将用户定义的键映射到包含数学表达式的字符串。对于数据的每次迭代,将使用 Python |
|
(可选)将用户定义的键映射到字符串的键值对的关联数组或字典。如果输出中存在该字符串,则该变量设置为 True,否则,该变量设置为 False。 |
|
(可选)键值对的关联数组或字典,用于将用户定义的键映射到解析命令输出的特定部分的嵌套表的名称。 |
|
(可选)在 下 |
|
(可选)匹配所需内容的正则表达式列表。 |
视图名称
视图名称是用户定义的视图标识符。通过将表与特定视图相关联,可以在 view
表定义中包含属性并提供视图名称作为其参数。
下面的示例定义一个名为 的视图,view
该视图ChassisFanView
由表的参数引用:
--- ChassisFanTable: command: show chassis fan key: fan-name view: ChassisFanView ChassisFanView: columns: fan-name: Item fan-status: Status fan-rpm: RPM fan-measurement: Measurement
列
您可以在视图中使用该 columns
参数来提取和分析以行和列格式设置的命令输出。
请考虑以下命令 show ospf neighbor
输出:
Address Interface State ID Pri Dead 198.51.100.2 ge-0/0/0.0 Full 192.168.0.2 128 37 198.51.100.6 ge-0/0/1.0 Full 192.168.0.3 128 34
若要提取数据,请在视图中包含 columns
参数,并将 Python 变量名称映射到列名称。应用程序将从该列的命令输出中提取的键和值存储为给定项的字典中的键值对。
以下视图从命令输出中 show ospf neighbor
的每一列中提取数据:
--- OspfNeighborTable: command: show ospf neighbor key: Address view: OspfNeighborView OspfNeighborView: columns: neighbor_address: Address interface: Interface neighbor_state: State neighbor_id: ID neighbor_priority: Pri activity_timer: Dead
在 Junos PyEZ 应用程序中检索和打印数据时,每个邻接方的数据都包含列键和相应的数据。
from jnpr.junos import Device from jnpr.junos.command.ospf_neighbor import OspfNeighborTable from pprint import pprint import json with Device(host='router1.example.com') as dev: stats = OspfNeighborTable(dev) stats.get() pprint(json.loads(stats.to_json()))
user@host:~$ python3 junos-pyez-ospf-neighbors.py {'198.51.100.2': {'activity_timer': 39, 'interface': 'ge-0/0/0.0', 'neighbor_address': '198.51.100.2', 'neighbor_id': '192.168.0.2', 'neighbor_priority': 128, 'neighbor_state': 'Full'}, '198.51.100.6': {'activity_timer': 36, 'interface': 'ge-0/0/1.0', 'neighbor_address': '198.51.100.6', 'neighbor_id': '192.168.0.3', 'neighbor_priority': 128, 'neighbor_state': 'Full'}}
若要筛选数据以仅包含所选列中的数据,请在视图中包括该 filters
参数。有关详细信息,请参阅 筛选器。
某些命令输出包含跨多行的列标题,例如:
FI interrupt statistics ----------------------- -------------------------------------------------------------------------------- Stream Total RLIM Total Cell timeout Total Reorder Total cell Total number request PT/MALLOC Ignored cell timeout drops in of times counter Usemeter errors secure mode entered into saturation Drops secure mode -------------------------------------------------------------------------------- 36 0 0 1 1 0 0 128 0 0 1 49 0 0 142 0 0 1 53 0 0 -------------------------------------------------------------------------------- ...
若要在视图中定义多行列标题,请将列键元素设置为等于该标题每行中的单词列表。以下视图定义了上一个命令输出的列:
CChipFiStatsTable: command: show mqss {{ chip_instance }} fi interrupt-stats target: fpc8 args: chip_instance: 0 key: Stream view: CChipFiStatsView CChipFiStatsView: columns: stream: Stream req_sat: - Total RLIM - request - counter - saturation cchip_fi_malloc_drops: - Total - PT/MALLOC - Usemeter - Drops cell_timeout_ignored: - Cell timeout - Ignored cchip_fi_cell_timeout: - Total Reorder - cell timeout - errors drops_in_secure: - Total cell - drops in - secure mode times_in_secure: - Total number - of times - entered into - secure mode
评估表达式 (eval)
您可以使用可选 eval
参数在表视图返回的最终数据中添加或修改键值对。该 eval
参数将键名称映射到包含由 Python eval
函数计算的数学表达式的字符串。您可以在表和视图中包含 eval
参数,并且可以 eval
定义和计算多个值。
在表中使用 eval
时,它会引用用于计算的完整数据字典,并且键和计算值将作为单个附加项添加到字典中。在视图中使用 eval
时,表达式将在数据的每次迭代时计算,并将计算值添加到该迭代的数据中。 eval
如果键名称与视图中定义的键匹配, eval
则将该键的值替换为计算值。 eval
如果键名称与视图中定义的键不匹配, eval
则会将新键和计算值添加到数据中。
表达式 eval
可以引用视图返回的 data
字典。表达式必须使用 Jinja 模板变量进行引用 data
,以便 Junos PyEZ 可以在计算表达式时将变量替换为字典。
以下示例在视图定义中使用 eval
。该 cpu
条目修改数据字典中每个项目的字段的 cpu
现有值,并且该 max
条目为数据字典中的每个项目创建新的键值对。
--- FPCThread: command: show threads target: Null key: Name view: FPCThreadView FPCThreadView: columns: pid-pr: PID PR state: State name: Name stack: Stack Use time: Time (Last/Max/Total) cpu: cpu eval: cpu: "'{{ cpu }}'[:-1]" max: "('{{ time }}'.split('/'))[1]"
请考虑 vty 命令的 show threads
以下示例输出:
PID PR State Name Stack Use Time (Last/Max/Total) cpu --- -- ------- --------------------- --------- --------------------- 1 H asleep Maintenance 680/32768 0/5/5 ms 0% 2 L running Idle 1452/32768 0/22/565623960 ms 80% 3 H asleep Timer Services 1452/32768 0/7/1966 ms 0% ...
View 的 eval
参数修改每个 cpu
条目以省略百分号 (%)。因此,数据包含“0”而不是“0%”。此外,它还为每个项目添加一个新键 max
、 及其计算值。
'Maintenance': {'cpu': '0', 'max': '5', 'name': 'Maintenance', 'pid-pr': '1 H', 'stack': '680/32768', 'state': 'asleep', 'time': '0/5/5 ms'}, 'Timer Services': {'cpu': '0', 'max': '7', 'name': 'Timer Services', 'pid-pr': '3 H', 'stack': '1452/32768', 'state': 'asleep', 'time': '0/7/1966 ms'}, ...
有关在表定义中使用的eval
示例,请参阅评估表达式 (eval)。
存在
您可以在视图中使用可选 exists
参数来指示命令输出中是否存在字符串。 exists
是键值对的字典,它将用户定义的 Python 变量名称映射到要在命令输出中匹配的字符串。如果输出中存在该字符串,则该变量设置为 True
。否则,变量设置为 False
。
show host_loopback status-summary
考虑 vty 命令输出。
SENT: Ukern command: show host_loopback status-summary Host Loopback Toolkit Status Summary: No detected wedges No toolkit errors
下表定义了 exists
用于测试命令输出是否包含 No detected wedges
字符串或 No toolkit errors
字符串:
--- HostlbStatusSummaryTable: command: show host_loopback status-summary target: fpc1 view: HostlbStatusSummaryView HostlbStatusSummaryView: exists: no_detected_wedges: No detected wedges no_toolkit_errors: No toolkit errors
使用表和视图在 Junos PyEZ 应用程序中测试字符串并打印结果值时,在这种情况下,这两个变量都将设置为 True
。
{'no_detected_wedges': True, 'no_toolkit_errors': True}
领域
命令输出可能冗长而复杂,您可能需要不同的逻辑来分析输出的不同部分。在某些情况下,您无法使用单个表和视图充分分析命令输出。若要分析此类型的输出,可以在视图中包含可选 fields
参数。 fields
是一个键值对字典,用于将用户定义的键映射到选择命令输出的特定部分的嵌套表的名称。每个嵌套表都可以引用自己的视图,该视图用于分析该表选择的数据。
show xmchip 0 pt stats
考虑 vty 命令输出,其中包含两个不同的数据部分:
SENT: Ukern command: show xmchip 0 pt stats WAN PT statistics (Index 0) --------------------------- PCT entries used by all WI-1 streams : 0 PCT entries used by all WI-0 streams : 0 PCT entries used by all LI streams : 0 CPT entries used by all multicast packets : 0 CPT entries used by all WI-1 streams : 0 CPT entries used by all WI-0 streams : 0 CPT entries used by all LI streams : 0 Fabric PT statistics (Index 1) ------------------------------ PCT entries used by all FI streams : 0 PCT entries used by all WI (Unused) streams : 0 PCT entries used by all LI streams : 0 CPT entries used by all multicast packets : 0 CPT entries used by all FI streams : 0 CPT entries used by all WI (Unused) streams : 0 CPT entries used by all LI streams : 0
以下XMChipStatsView
视图使用该fields
参数定义两个附加表,用于分析命令输出的两个不同部分。_WANPTStatTable
和_FabricPTStatTable
表分别从和部分Fabric PT statistics
中提取WAN PT statistics
数据。在这种情况下,表使用该delimiter
参数来提取和拆分数据,因此它们不需要引用单独的视图。
XMChipStatsTable: command: show xmchip 0 pt stats target: fpc1 view: XMChipStatsView XMChipStatsView: fields: wan_pt_stats: _WANPTStatTable fabric_pt_stats: _FabricPTStatTable _WANPTStatTable: title: WAN PT statistics (Index 0) delimiter: ":" _FabricPTStatTable: title: Fabric PT statistics (Index 1) delimiter: ":"
在 Junos PyEZ 应用程序中检索和打印数据时,下 fields
定义的每个密钥都包含相应表选择和解析的数据。
{'fabric_pt_stats': {'CPT entries used by all FI streams': 0, 'CPT entries used by all LI streams': 0, 'CPT entries used by all WI (Unused) streams': 0, 'CPT entries used by all multicast packets': 0, 'PCT entries used by all FI streams': 0, 'PCT entries used by all LI streams': 0, 'PCT entries used by all WI (Unused) streams': 0}, 'wan_pt_stats': {'CPT entries used by all LI streams': 0, 'CPT entries used by all WI-0 streams': 0, 'CPT entries used by all WI-1 streams': 0, 'CPT entries used by all multicast packets': 0, 'PCT entries used by all LI streams': 0, 'PCT entries used by all WI-0 streams': 0, 'PCT entries used by all WI-1 streams': 0}}
再举一个例子,考虑 show ttp statistics
vty 命令输出:
TTP Statistics: Receive Transmit ---------- ---------- L2 Packets 4292 1093544 L3 Packets 542638 0 Drops 0 0 Netwk Fail 0 0 Queue Drops 0 0 Unknown 0 0 Coalesce 0 0 Coalesce Fail 0 0 TTP Transmit Statistics: Queue 0 Queue 1 Queue 2 Queue 3 ---------- ---------- ---------- ---------- L2 Packets 1093544 0 0 0 L3 Packets 0 0 0 0 TTP Receive Statistics: Control High Medium Low Discard ---------- ---------- ---------- ---------- ---------- L2 Packets 0 0 4292 0 0 L3 Packets 0 539172 3466 0 0 Drops 0 0 0 0 0 Queue Drops 0 0 0 0 0 Unknown 0 0 0 0 0 Coalesce 0 0 0 0 0 Coalesce Fail 0 0 0 0 0 TTP Receive Queue Sizes: Control Plane : 0 (max is 4473) High : 0 (max is 4473) Medium : 0 (max is 4473) Low : 0 (max is 2236) TTP Transmit Queue Size: 0 (max is 6710)
FPCTTPStatsView
视图使用该fields
参数引用多个嵌套表,这些表提取输出不同部分中的数据。每个表引用自己的视图或使用delimiter
参数来分析该节中的数据。
--- FPCTTPStatsTable: command: show ttp statistics target: fpc2 view: FPCTTPStatsView FPCTTPStatsView: fields: TTPStatistics: _FPCTTPStatisticsTable TTPTransmitStatistics: _FPCTTPTransmitStatisticsTable TTPReceiveStatistics: _FPCTTPReceiveStatisticsTable TTPQueueSizes: _FPCTTPQueueSizesTable _FPCTTPStatisticsTable: title: TTP Statistics view: _FPCTTPStatisticsView _FPCTTPStatisticsView: columns: rcvd: Receive tras: Transmit _FPCTTPTransmitStatisticsTable: title: TTP Transmit Statistics view: _FPCTTPTransmitStatisticsView _FPCTTPTransmitStatisticsView: columns: queue0: Queue 0 queue1: Queue 1 queue2: Queue 2 queue3: Queue 3 filters: - queue2 _FPCTTPReceiveStatisticsTable: title: TTP Receive Statistics key: name key_items: - Coalesce view: _FPCTTPReceiveStatisticsView _FPCTTPReceiveStatisticsView: columns: control: Control high: High medium: Medium low: Low discard: Discard _FPCTTPQueueSizesTable: title: TTP Receive Queue Sizes delimiter: ":"
在 Junos PyEZ 应用程序中检索和打印数据时,每个 fields
密钥都包含由相应表提取和分析的数据。
{'TTPQueueSizes': {'Control Plane': '0 (max is 4473)', 'High': '0 (max is 4473)', 'Low': '0 (max is 2236)', 'Medium': '0 (max is 4473)'}, 'TTPReceiveStatistics': {'Coalesce': {'control': 0, 'discard': 0, 'high': 0, 'low': 0, 'medium': 0, 'name': 'Coalesce'}}, 'TTPStatistics': {'Coalesce': {'name': 'Coalesce', 'rcvd': 0, 'tras': 0}, 'Coalesce Fail': {'name': 'Coalesce Fail', 'rcvd': 0, 'tras': 0}, 'Drops': {'name': 'Drops', 'rcvd': 0, 'tras': 0}, 'L2 Packets': {'name': 'L2 Packets', 'rcvd': 4292, 'tras': 1093544}, 'L3 Packets': {'name': 'L3 Packets', 'rcvd': 542638, 'tras': 0}, 'Netwk Fail': {'name': 'Netwk Fail', 'rcvd': 0, 'tras': 173}, 'Queue Drops': {'name': 'Queue Drops', 'rcvd': 0, 'tras': 0}, 'Unknown': {'name': 'Unknown', 'rcvd': 0, 'tras': 0}}, 'TTPTransmitStatistics': {'L2 Packets': {'queue2': 0}, 'L3 Packets': {'queue2': 0}}}
过滤 器
该 columns
参数从以行和列格式设置的命令输出中提取数据。在视图中包括参数 columns
时,可以选择包含该 filters
参数以筛选最终输出中包含的列数据。该 filters
参数定义在 下 columns
定义的一个或多个键的列表。最后一组数据仅包括所选列中的数据。您可以在视图定义中提供默认过滤器,也可以在 Junos PyEZ 应用程序中定义或覆盖过滤器值。
show ospf neighbor
考虑命令输出:
Address Interface State ID Pri Dead 198.51.100.2 ge-0/0/0.0 Full 192.168.0.2 128 37 198.51.100.6 ge-0/0/1.0 Full 192.168.0.3 128 34
在以下视图中,参数 columns
为相应命令输出中的所有列定义键,但 filters
该参数仅包含数据字典中 和 Address
State
列中的数据。
--- OspfNeighborFiltersTable: command: show ospf neighbor key: Address view: OspfNeighborFiltersView OspfNeighborFiltersView: columns: neighbor_address: Address interface: Interface neighbor_state: State neighbor_id: ID neighbor_priority: Pri activity_timer: Dead filters: - neighbor_address - neighbor_state
以下 Junos PyEZ 代码首次调用get()
时不带任何参数,它将使用视图中定义的筛选器的默认列表检索数据。对包含参数的get()
filters
第二次调用将覆盖视图中定义的筛选器列表。
from jnpr.junos import Device from Tables.show_ospf_neighbor_filter import OspfNeighborFiltersTable from pprint import pprint import json with Device(host='router1.example.com') as dev: stats = OspfNeighborFiltersTable(dev) stats.get() pprint(json.loads(stats.to_json())) print('\n') stats.get(filters=['neighbor_address', 'neighbor_id', 'neighbor_state']) pprint(json.loads(stats.to_json()))
执行应用程序时,第一次调用 使用 get()
视图中定义的筛选器,第二次调用使用调用中定义的筛选器,这些筛选器将覆盖视图中定义的筛选器。
user@host:~$ python3 junos-pyez-ospf-filters.py {'198.51.100.2': {'neighbor_address': '198.51.100.2', 'neighbor_state': 'Full'}, '198.51.100.6': {'neighbor_address': '198.51.100.6', 'neighbor_state': 'Full'}} {'198.51.100.2': {'neighbor_address': '198.51.100.2', 'neighbor_id': '192.168.0.2', 'neighbor_state': 'Full'}, '198.51.100.6': {'neighbor_address': '198.51.100.6', 'neighbor_id': '192.168.0.3', 'neighbor_state': 'Full'}}
Regex
您可以使用视图中的可选 regex
参数来匹配和提取命令输出中的特定字段。 regex
是将键映射到正则表达式的字典。如果对应的表没有定义 item: '*'
,Junos PyEZ 将正则表达式组合在一起,并将结果与每行输出进行匹配。但是,如果表定义为 item: '*'
将数据提取为单个文本字符串,则 Junos PyEZ 会将每个单独的正则表达式与整个文本字符串进行匹配。
正则表达式中定义的捕获组确定从字段提取并存储在数据字典中的数据。如果定义捕获组,则数据中仅存储该组的值。否则,Junos PyEZ 将存储与完整表达式匹配的值。例如, (d+.d+)
从字符串搜索表达式中检索和存储浮点值,而 (d+).d+
仅存储数据的整数部分。如果定义多个组,则仅存储第一个组的值。
Junos PyEZ 利用该 pyparsing
模块定义了许多内置关键字,您可以使用这些关键字来代替正则表达式。 表 2 列出了关键字、简要说明和相应的表达式,其中 pp
派生自 import pyparsing as pp
。
关键 字 |
描述 |
表达 |
---|---|---|
|
仅包含十六进制字符的单词 |
hex_numbers = pp.OneOrMore(pp.Word(pp.nums, min=1)) & pp.OneOrMore(pp.Word('abcdefABCDEF', min=1)) |
|
由整数或浮点值组成的单词 |
numbers = (pp.Word(pp.nums) + pp.Optional(pp.Literal('.') + pp.Word(pp.nums))).setParseAction(lambda i: ''.join(i)) |
|
由数字和尾随百分号 (%) 组成的单词 |
percentage = pp.Word(pp.nums) + pp.Literal('%') |
|
一个或多个由可打印字符组成的单词(任何非空格字符) |
printables = pp.OneOrMore(pp.Word(pp.printables)) |
|
由字母或字母数字字符组成的单词 |
word = pp.Word(pp.alphanums) | pp.Word(pp.alphas) |
|
|
words = (pp.OneOrMore(word)).setParseAction(lambda i: ' '.join(i)) |
请考虑以下命令 show icmp statistics
输出。输出的每个部分都位于特定的部分标题下,数据由数字和一个或多个单词组成。
ICMP Statistics: 0 requests 0 throttled 0 network unreachables 0 ttl expired 0 redirects 0 mtu exceeded 0 source route denials 0 filter prohibited 0 other unreachables 0 parameter problems 0 ttl captured 0 icmp/option handoffs 0 igmp v1 handoffs 0 tag te requests 0 tag te to RE ICMP Errors: 0 unknown unreachables 0 unsupported ICMP type 0 unprocessed redirects 0 invalid ICMP type 0 invalid protocol 0 bad input interface 0 bad route lookup 0 bad nh lookup 0 bad cf mtu 0 runts ICMP Discards: 0 multicasts 0 bad source addresses 0 bad dest addresses 0 IP fragments 0 ICMP errors 0 unknown originators ICMP Debug Messages: 0 throttled ICMP Rate Limit Settings: 500 pps per iff 1000 pps total
为了解析前面的输出,主视图定义了 fields
,它引用嵌套的表和视图,这些表和视图解析输出的每个部分。嵌套视图定义 regex
要与相应表提取的数据匹配的参数。
--- ICMPStatsTable: command: show icmp statistics target: fpc1 view: ICMPStatsView ICMPStatsView: fields: discards: _ICMPDiscardsTable errors: _ICMPErrorsTable rate: _ICMPRateTable _ICMPDiscardsTable: title: ICMP Discards key: name view: _ICMPDiscardsView _ICMPDiscardsView: regex: value: \d+ name: '(\w+(\s\w+)*)' _ICMPErrorsTable: title: ICMP Errors key: name view: _ICMPErrorsView _ICMPErrorsView: regex: error: numbers name: words _ICMPRateTable: title: ICMP Rate Limit Settings key: name view: _ICMPRateView _ICMPRateView: regex: rate: numbers name: words
例如, _ICMPDiscardsTable
表选择命令输出中该部分下 ICMP Discards
的数据。视图 _ICMPDiscardsView
定义了两个键, value
和 name
,它们映射到正则表达式。 value
匹配一个或多个数字,并 name
匹配一个或多个单词。由于 表未定义 item: '*'
,正则表达式将组合并与该部分中的每一行数据进行匹配。
_ICMPDiscardsTable: title: ICMP Discards key: name view: _ICMPDiscardsView _ICMPDiscardsView: regex: value: \d+ name: '(\w+(\s\w+)*)'
表选择 _ICMPErrorsTable
命令输出中该 ICMP Errors
部分下的数据。 _ICMPErrorsView
视图定义 error
和 name
键,并使用内置关键字 numbers
代替 words
显式定义正则表达式。
_ICMPErrorsTable: title: ICMP Errors key: name view: _ICMPErrorsView _ICMPErrorsView: regex: error: numbers name: words
如果表定义了 item: '*'
,则提取的数据被视为一个文本字符串。在这种情况下,相应视图中的每个正则表达式都与整个字符串匹配。
show ithrottle id 0
考虑命令输出。
SENT: Ukern command: show ithrottle id 0 ID Usage % Cfg State Oper State Name -- ------- --------- ---------- -------- 0 50.0 1 1 TOE ithrottle Throttle Times: In hptime ticks In ms --------------- ------ Timer Interval 333333 5.000 Allowed time 166666 2.500 Allowed excess 8333 0.125 Start time 488655082 n/a Run time this interval 0 0.000 Deficit 0 0.000 Run time max 17712 0.266 Run time total 144154525761 2162317 Min Usage Perc: 25.0 Max Usage Perc: 50.0 AdjustUsageEnable: 1 Throttle Stats: Starts : 65708652 Stops : 65708652 Checks : 124149442 Enables : 0 Disables : 0 AdjUp : 6 AdjDown : 4
下表用于 item: '*'
将数据提取为单个字符串。视图的 regex
参数定义三个正则表达式。每个正则表达式模式都与整个字符串匹配。由于正则表达式定义捕获组,因此 Junos PyEZ 仅存储与组匹配的数据。
IthrottleIDTable: command: show ithrottle id {{ id }} args: id: 0 item: '*' target: fpc1 view: IthrottleIDView IthrottleIDView: regex: min_usage: 'Min Usage Perc: (\d+\.\d+)' max_usage: 'Max Usage Perc: (\d+\.\d+)' usg_enable: 'AdjustUsageEnable: (\d)' fields: throttle_stats: _ThrottleStatsTable _ThrottleStatsTable: title: Throttle Stats delimiter: ":"
在 Junos PyEZ 应用程序中检索和打印数据时,数据包括三个 regex
项目,其中包含与该表达式的捕获组匹配的值。
{'max_usage': 50.0, 'min_usage': 25.0, 'throttle_stats': {'AdjDown': 4, 'AdjUp': 6, 'Checks': 124149442, 'Disables': 0, 'Enables': 0, 'Starts': 65708652, 'Stops': 65708652}, 'usg_enable': 1}